Zum Inhalt springen

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 startet für jedes Dokument vom Typ incoming-invoice. Seine Datei workflow.yaml:

$schema: 'https://docs.acriva.de/schemas/workflow.schema.json'
format: 1
schemaVersion: 4
sdk: '1.0.0'
key: cost-center-from-vendor
name: Kostenstelle vom Lieferanten
template: custom
trigger:
documentType: incoming-invoice
fields:
- key: costCenter
kind: text
labelDe: Kostenstelle
labelEn: Cost center
documentTypes:
- incoming-invoice
- key: glAccount
kind: text
labelDe: Sachkonto
labelEn: G/L account
documentTypes:
- incoming-invoice
start: allocate
steps:
- 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: rejected

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);
},
});

Ein Test führt jeden dieser Fälle in der Sandbox aus und vergleicht das Ergebnis.

  • Eingabe: vendorName Telekom Deutschland GmbH
  • Ausgang: der Standard-Nachfolger
  • Änderungen: Feld costCenter = 4400; Feld glAccount = 4920
  • Eingabe: vendorName Neue 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.“