Projektbudget prüfen
Rechnungen zu einem Projekt liegen in seiner Akte vom Akten-Typ Projekt. Budget und bisher verbrauchten Betrag jedes Projekts führen Sie in einer Datentabelle projekte mit der Projektnummer als Schlüsselspalte, so wie die Akten nummeriert sind; den verbrauchten Betrag kann Ihr Controlling regelmäßig per Upload oder über die API aktualisieren. Das Skript sucht das Projekt der Rechnung in der Tabelle: Passt die Rechnung ins Restbudget, geht sie mit dem verbleibenden Budget als Hinweis zur normalen Freigabe; übersteigt sie es, gibt die Geschäftsführung frei. Eine Rechnung ohne Projektakte geht ohne Prüfung zur normalen Freigabe.
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: project-budgetname: Projektbudget prüfentemplate: customtrigger: documentType: incoming-invoicefields: []start: budgetsteps: - kind: script name: budget label: Projektbudget prüfen script: budget.ts hook: onDocumentArrived inputs: - kind: field key: totalGross type: money - kind: table key: projekte returns: - key: budget type: enumeration values: - within - exceeded branch: budget exits: - value: within next: approve - value: exceeded next: managementApproval 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: humanTask name: managementApproval label: Freigabe Geschäftsführung taskKind: approve assignees: - when: null assignee: kind: role role: Geschäftsführung 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 budget.ts
Abschnitt betitelt „Das Skript budget.ts“Hook: onDocumentArrived · Eingaben: totalGross, Datentabelle projekte · Rückgaben: budget (within, exceeded)
import { defineScript, money } from '@acriva/workflow-sdk';
export default defineScript({ hook: 'onDocumentArrived', outputs: { budget: ['within', 'exceeded'] }, async run(ctx) { // An invoice outside a project's Akte goes on to its default next step, the normal approval. const project = ctx.document.files.find((file) => file.type === 'project'); if (!project) return; const row = await ctx.tables.lookup('projekte', project.number); if (row === null || row.budget === null) { ctx.hint( `Das Projekt ${project.number} steht nicht in der Projektliste; sein Budget ist nicht geprüft.`, ); return; } const name = row.bezeichnung ?? project.number; const left = money.round(row.budget - (row.verbraucht ?? 0)); const total = ctx.document.fields.totalGross ?? 0; if (total > left) { ctx.hint( `Die Rechnung über ${money.format(total)} übersteigt das Restbudget des Projekts ${name} von ${money.format(left)}.`, ); return ctx.branch('exceeded'); } ctx.hint( `Projekt ${name}: Nach dieser Rechnung bleiben ${money.format(money.round(left - total))} vom Budget.`, ); return ctx.branch('within'); },});Was es tut
Abschnitt betitelt „Was es tut“Ein Test führt jeden dieser Fälle in der Sandbox aus und vergleicht das Ergebnis.
Eine Rechnung ohne Projekt
Abschnitt betitelt „Eine Rechnung ohne Projekt“- Eingabe:
totalGross119 - Ausgang: der Standard-Nachfolger
- Änderungen: keine
Eine Rechnung über dem Restbudget
Abschnitt betitelt „Eine Rechnung über dem Restbudget“- Eingabe:
totalGross11900 - Datentabelle
projekte: 2 ZeilenprojektnummerP-2026-014,bezeichnungUmbau Lager Nord,budget50000,verbraucht41250.5projektnummerP-2026-021,bezeichnungMesse Hannover,budget18000,verbraucht2400
- Ausgang:
exceeded - Änderungen: Hinweis an der nächsten Aufgabe: „Die Rechnung über 11.900,00 € übersteigt das Restbudget des Projekts Umbau Lager Nord von 8.749,50 €.“
Ein Projekt, das nicht in der Liste steht
Abschnitt betitelt „Ein Projekt, das nicht in der Liste steht“- Eingabe:
totalGross595 - Datentabelle
projekte: 2 ZeilenprojektnummerP-2026-014,bezeichnungUmbau Lager Nord,budget50000,verbraucht41250.5projektnummerP-2026-021,bezeichnungMesse Hannover,budget18000,verbraucht2400
- Ausgang: der Standard-Nachfolger
- Änderungen: Hinweis an der nächsten Aufgabe: „Das Projekt P-2026-099 steht nicht in der Projektliste; sein Budget ist nicht geprüft.“
Eine Rechnung im Budget
Abschnitt betitelt „Eine Rechnung im Budget“- Eingabe:
totalGross2380 - Datentabelle
projekte: 2 ZeilenprojektnummerP-2026-014,bezeichnungUmbau Lager Nord,budget50000,verbraucht41250.5projektnummerP-2026-021,bezeichnungMesse Hannover,budget18000,verbraucht2400
- Ausgang:
within - Änderungen: Hinweis an der nächsten Aufgabe: „Projekt Umbau Lager Nord: Nach dieser Rechnung bleiben 6.369,50 € vom Budget.“