Zum Inhalt springen

Kostenstellen-Zuordnung aus einer Datentabelle

Wie Kostenstelle vom Lieferanten, nur steht die Zuordnung nicht im Skript, sondern in einer Datentabelle kostenstellenZuordnung: eine Zeile je Zuordnung mit Lieferant, Kostenstelle und Sachkonto, die die Buchhaltung ohne neue Version des Workflows ändert oder aus Excel hochlädt. Das Skript fragt alle Zeilen des Lieferanten ab. Bei genau einer setzt es Kostenstelle und Sachkonto, zwei Felder, die der Workflow selbst deklariert; bei keiner oder mehreren bekommt die Freigabe einen Hinweis, damit die Rechnung von Hand kontiert oder aufgeteilt wird. Der Lieferant muss so in der Tabelle stehen, wie er auf der Rechnung erkannt wird. Steht in der Tabelle eine Zeile je Lieferant, setzt eine Karte die Kontierung der Rechnung ohne Skript: Kontierung aus einer Datentabelle.

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-mapping
name: Kostenstellen-Zuordnung aus einer Datentabelle
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 zuordnen
script: allocate.ts
hook: onDocumentArrived
inputs:
- kind: field
key: vendorName
type: text
- kind: table
key: kostenstellenZuordnung
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, Datentabelle kostenstellenZuordnung · Rückgaben: keine

import { defineScript } from '@acriva/workflow-sdk';
export default defineScript({
hook: 'onDocumentArrived',
async run(ctx) {
const vendor = ctx.document.fields.vendorName;
if (vendor == null) return;
// Every row of the vendor: a vendor may be mapped to more than one cost center.
const [mapping, ...others] = await ctx.tables.query('kostenstellenZuordnung', {
lieferant: vendor,
});
if (mapping === undefined) {
ctx.hint(
`Für „${vendor}“ gibt es keine Kostenstellen-Zuordnung. Bitte kontieren Sie die Rechnung von Hand.`,
);
return;
}
if (others.length > 0) {
const costCenters = [mapping, ...others].map((row) => row.kostenstelle).join(', ');
ctx.hint(
`„${vendor}“ ist mehreren Kostenstellen zugeordnet (${costCenters}). Bitte teilen Sie die Rechnung von Hand auf.`,
);
return;
}
if (mapping.kostenstelle) ctx.setField('costCenter', mapping.kostenstelle);
if (mapping.sachkonto) ctx.setField('glAccount', mapping.sachkonto);
},
});

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

  • Eingabe: vendorName Neue Firma AG
  • Datentabelle kostenstellenZuordnung: 3 Zeilen
    • nummer Z-001, lieferant Telekom Deutschland GmbH, kostenstelle 4400, sachkonto 4920
    • nummer Z-002, lieferant Deutsche Bahn AG, kostenstelle 4300, sachkonto 4663
    • nummer Z-003, lieferant Deutsche Bahn AG, kostenstelle 4100, sachkonto 4663
  • Ausgang: der Standard-Nachfolger
  • Änderungen: Hinweis an der nächsten Aufgabe: „Für „Neue Firma AG“ gibt es keine Kostenstellen-Zuordnung. Bitte kontieren Sie die Rechnung von Hand.“
  • Eingabe: vendorName Telekom Deutschland GmbH
  • Datentabelle kostenstellenZuordnung: 3 Zeilen
    • nummer Z-001, lieferant Telekom Deutschland GmbH, kostenstelle 4400, sachkonto 4920
    • nummer Z-002, lieferant Deutsche Bahn AG, kostenstelle 4300, sachkonto 4663
    • nummer Z-003, lieferant Deutsche Bahn AG, kostenstelle 4100, sachkonto 4663
  • Ausgang: der Standard-Nachfolger
  • Änderungen: Feld costCenter = 4400; Feld glAccount = 4920
  • Eingabe: vendorName Deutsche Bahn AG
  • Datentabelle kostenstellenZuordnung: 3 Zeilen
    • nummer Z-001, lieferant Telekom Deutschland GmbH, kostenstelle 4400, sachkonto 4920
    • nummer Z-002, lieferant Deutsche Bahn AG, kostenstelle 4300, sachkonto 4663
    • nummer Z-003, lieferant Deutsche Bahn AG, kostenstelle 4100, sachkonto 4663
  • Ausgang: der Standard-Nachfolger
  • Änderungen: Hinweis an der nächsten Aufgabe: „„Deutsche Bahn AG“ ist mehreren Kostenstellen zugeordnet (4300, 4100). Bitte teilen Sie die Rechnung von Hand auf.“