Schlagwort nach Stichwort
Nennt der Lieferant oder der Verwendungszweck einer Rechnung Bahn, Hotel oder Lufthansa, bekommt sie das Schlagwort Reisekosten; Telekom, Vodafone oder Miete ergeben Fixkosten. Die Stichwörter stehen in einer kleinen Tabelle im Skript, und Groß- und Kleinschreibung zählt nicht.
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: tag-by-keywordname: Schlagwort nach Stichworttemplate: customtrigger: documentType: incoming-invoicefields: - key: purpose kind: text labelDe: Verwendungszweck labelEn: Purpose documentTypes: - incoming-invoicestart: tagsteps: - kind: script name: tag label: Schlagwort nach Stichwort script: tag.ts hook: onDocumentArrived inputs: - kind: field key: vendorName type: text - kind: field key: purpose 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 tag.ts
Abschnitt betitelt „Das Skript tag.ts“Hook: onDocumentArrived · Eingaben: vendorName, purpose · Rückgaben: keine
import { defineScript, type TagName } from '@acriva/workflow-sdk';
/** The tag a document gets when its vendor or its purpose holds one of the keywords as a whole word, in any case. */const KEYWORDS: readonly { tag: TagName; keywords: readonly string[] }[] = [ { tag: 'Reisekosten', keywords: ['bahn', 'hotel', 'lufthansa', 'flug'] }, { tag: 'Fixkosten', keywords: ['telekom', 'vodafone', 'miete', 'versicherung'] },];
export default defineScript({ hook: 'onDocumentArrived', run(ctx) { const { vendorName, purpose } = ctx.document.fields; // Both fields may be empty; the search reads the words of what is there, in lower case, so "Bahn" never matches // "Bahnhofsbäckerei". const words = new Set( [vendorName, purpose] .filter((part) => part != null) .join(' ') .toLowerCase() .split(/[\s,.;:()/&+-]+/), ); // Tag names don't depend on case, so a tag the document has in another spelling counts too. const has = new Set(ctx.document.tags.map((tag) => tag.toLowerCase())); KEYWORDS.filter((entry) => entry.keywords.some((keyword) => words.has(keyword))) .filter((entry) => !has.has(entry.tag.toLowerCase())) .forEach((entry) => ctx.addTag(entry.tag)); },});Was es tut
Abschnitt betitelt „Was es tut“Ein Test führt jeden dieser Fälle in der Sandbox aus und vergleicht das Ergebnis.
Fixkosten, schon mit Schlagwort
Abschnitt betitelt „Fixkosten, schon mit Schlagwort“- Eingabe:
vendorNameTelekom Deutschland GmbH,purposenull, Schlagwörter „Fixkosten“ - Ausgang: der Standard-Nachfolger
- Änderungen: keine
Kein Stichwort
Abschnitt betitelt „Kein Stichwort“- Eingabe:
vendorNameBürobedarf Schmidt KG,purposeDruckerpapier - Ausgang: der Standard-Nachfolger
- Änderungen: keine
Ein Verwendungszweck mit „Hotel“
Abschnitt betitelt „Ein Verwendungszweck mit „Hotel““- Eingabe:
vendorNameSeehof GmbH,purposeHOTEL Messe Hannover, 2 Nächte - Ausgang: der Standard-Nachfolger
- Änderungen: Schlagwort „Reisekosten“
Ein Lieferant für Reisen
Abschnitt betitelt „Ein Lieferant für Reisen“- Eingabe:
vendorNameDeutsche Bahn AG,purposenull - Ausgang: der Standard-Nachfolger
- Änderungen: Schlagwort „Reisekosten“