Zum Inhalt springen

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 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: project-budget
name: Projektbudget prüfen
template: custom
trigger:
documentType: incoming-invoice
fields: []
start: budget
steps:
- 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: rejected

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

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

  • Eingabe: totalGross 119
  • Ausgang: der Standard-Nachfolger
  • Änderungen: keine
  • Eingabe: totalGross 11900
  • Datentabelle projekte: 2 Zeilen
    • projektnummer P-2026-014, bezeichnung Umbau Lager Nord, budget 50000, verbraucht 41250.5
    • projektnummer P-2026-021, bezeichnung Messe Hannover, budget 18000, verbraucht 2400
  • 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 €.“
  • Eingabe: totalGross 595
  • Datentabelle projekte: 2 Zeilen
    • projektnummer P-2026-014, bezeichnung Umbau Lager Nord, budget 50000, verbraucht 41250.5
    • projektnummer P-2026-021, bezeichnung Messe Hannover, budget 18000, verbraucht 2400
  • 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.“
  • Eingabe: totalGross 2380
  • Datentabelle projekte: 2 Zeilen
    • projektnummer P-2026-014, bezeichnung Umbau Lager Nord, budget 50000, verbraucht 41250.5
    • projektnummer P-2026-021, bezeichnung Messe Hannover, budget 18000, verbraucht 2400
  • Ausgang: within
  • Änderungen: Hinweis an der nächsten Aufgabe: „Projekt Umbau Lager Nord: Nach dieser Rechnung bleiben 6.369,50 € vom Budget.“