Kostenstelle vom Lieferanten
Rechnungen bekannter Lieferanten bekommen ihre Kostenstelle und ihr Sachkonto aus einer Tabelle im Skript. Für einen unbekannten Lieferanten hängt das Skript einen Hinweis an die Freigabe, damit die Rechnung von Hand kontiert wird. Die Felder Kostenstelle und Sachkonto deklariert der Workflow selbst. Wer freigibt, richtet sich nach der Kontierung der Rechnung in den Finanzen, nicht nach dem Feld Kostenstelle. Ohne Skript geht es mit einer Karte und einer Datentabelle: Kontierung aus einer Datentabelle setzt die Kontierung der Rechnung in den Finanzen.
Der Workflow
Abschnitt betitelt „Der Workflow“Der Workflow startet für jedes Dokument vom Typ incoming-invoice. Seine Datei workflow.yaml:
$schema: 'https://docs.acriva.de/schemas/workflow.schema.json'format: 1schemaVersion: 4sdk: '1.0.0'key: cost-center-from-vendorname: Kostenstelle vom Lieferantentemplate: customtrigger: documentType: incoming-invoicefields: - key: costCenter kind: text labelDe: Kostenstelle labelEn: Cost center documentTypes: - incoming-invoice - key: glAccount kind: text labelDe: Sachkonto labelEn: G/L account documentTypes: - incoming-invoicestart: allocatesteps: - kind: script name: allocate label: Kostenstelle vom Lieferanten script: allocate.ts hook: onDocumentArrived inputs: - kind: field key: vendorName type: text returns: [] exits: [] next: approve - kind: humanTask name: approve label: Freigabe taskKind: approve assignees: - when: null assignee: kind: costCenterResponsible fallback: kind: role role: Buchhaltung options: excludeRequester: true excludeActorsOfSteps: [] pickFile: false next: approved onRejected: rejected - kind: end name: approved label: Freigegeben outcome: approved - kind: end name: rejected label: Zurückgewiesen outcome: rejectedDas Skript allocate.ts
Abschnitt betitelt „Das Skript allocate.ts“Hook: onDocumentArrived · Eingaben: vendorName · Rückgaben: keine
import { defineScript } from '@acriva/workflow-sdk';
/** Cost center and G/L account (SKR 03) per vendor; a vendor matches when its name starts with the entry's name. */const ALLOCATION: readonly { vendor: string; costCenter: string; glAccount: string }[] = [ { vendor: 'Telekom', costCenter: '4400', glAccount: '4920' }, { vendor: 'Bürobedarf Schmidt', costCenter: '4200', glAccount: '4930' }, { vendor: 'Deutsche Bahn', costCenter: '4300', glAccount: '4663' },];
export default defineScript({ hook: 'onDocumentArrived', run(ctx) { const vendor = ctx.document.fields.vendorName; if (vendor == null) return; const match = ALLOCATION.find((entry) => vendor.toLowerCase().startsWith(entry.vendor.toLowerCase()), ); if (!match) { ctx.hint( `Für „${vendor}“ ist keine Kostenstelle hinterlegt. Bitte kontieren Sie die Rechnung von Hand.`, ); return; } ctx.setField('costCenter', match.costCenter); ctx.setField('glAccount', match.glAccount); },});Was es tut
Abschnitt betitelt „Was es tut“Ein Test führt jeden dieser Fälle in der Sandbox aus und vergleicht das Ergebnis.
Ein bekannter Lieferant
Abschnitt betitelt „Ein bekannter Lieferant“- Eingabe:
vendorNameTelekom Deutschland GmbH - Ausgang: der Standard-Nachfolger
- Änderungen: Feld
costCenter=4400; FeldglAccount=4920
Ein unbekannter Lieferant
Abschnitt betitelt „Ein unbekannter Lieferant“- Eingabe:
vendorNameNeue Firma AG - Ausgang: der Standard-Nachfolger
- Änderungen: Hinweis an der nächsten Aufgabe: „Für „Neue Firma AG“ ist keine Kostenstelle hinterlegt. Bitte kontieren Sie die Rechnung von Hand.“