Zum Inhalt springen

Skonto-Erinnerung

Einen Tag nach der Freigabe einer Eingangsrechnung prüft das Skript, ob das Skonto noch gilt. Solange die Frist läuft, erinnert es die Buchhaltung mit dem letzten Zahltag und dem Betrag, den Sie sparen, und versieht die Rechnung mit dem Schlagwort „Skonto“. Skontofrist und Skontosatz sind Felder, die der Workflow selbst anlegt. Ohne Skript geht es mit einer Karte: Skontofrist überwachen liest die Skontobedingungen und gibt das Skontodatum der Freigabe als Frist.

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: skonto-reminder
name: Skonto-Erinnerung
template: custom
trigger:
documentType: incoming-invoice
fields:
- key: discountDays
kind: number
labelDe: Skontofrist (Tage)
labelEn: Discount period (days)
documentTypes:
- incoming-invoice
- key: discountPercent
kind: number
labelDe: Skonto (%)
labelEn: Discount (%)
documentTypes:
- incoming-invoice
start: approve
steps:
- 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: wait
onRejected: rejected
- kind: timer
name: wait
label: Einen Tag warten
days: 1
daysBefore: 0
next: remind
- kind: script
name: remind
label: An Skonto erinnern
script: remind.ts
hook: onTimer
inputs:
- kind: field
key: invoiceNumber
type: text
- kind: field
key: invoiceDate
type: date
- kind: field
key: totalGross
type: money
- kind: field
key: discountDays
type: number
- kind: field
key: discountPercent
type: number
returns: []
exits: []
next: approved
- kind: end
name: approved
label: Freigegeben
outcome: approved
- kind: end
name: rejected
label: Zurückgewiesen
outcome: rejected

Hook: onTimer · Eingaben: invoiceNumber, invoiceDate, totalGross, discountDays, discountPercent · Rückgaben: keine

import { date, defineScript, money } from '@acriva/workflow-sdk';
export default defineScript({
hook: 'onTimer',
run(ctx) {
const { invoiceNumber, invoiceDate, totalGross, discountDays, discountPercent } =
ctx.document.fields;
// Without the invoice date, the discount period or the discount there is nothing to remind of.
if (invoiceDate == null || discountDays == null || discountPercent == null) return;
// The discount applies up to and including the last day of its period, counted in whole days.
const deadline = date.addDays(invoiceDate, Math.trunc(discountDays));
if (ctx.today() > deadline) {
ctx.log('Discount expired on', date.format(deadline));
return;
}
const percent = String(discountPercent).replace('.', ',');
const saving =
totalGross == null
? ''
: ` Das sind ${money.format(money.round((totalGross * discountPercent) / 100))}.`;
ctx.notify({
to: [{ role: 'Buchhaltung' }],
text:
`Die Rechnung ${invoiceNumber ?? 'ohne Nummer'} ist freigegeben. ` +
`Bei Zahlung bis ${date.format(deadline)} ziehen Sie ${percent} % Skonto ab.${saving}`,
});
ctx.addTag('Skonto');
},
});

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

  • Eingabe: invoiceNumber RE-2026-0815, invoiceDate 2026-10-15, totalGross 1190, discountDays 14, discountPercent 2, Ergebnis der letzten Aufgabe Approved, heute 2026-10-22
  • Ausgang: der Standard-Nachfolger
  • Änderungen: Benachrichtigung an die Rolle Buchhaltung: „Die Rechnung RE-2026-0815 ist freigegeben. Bei Zahlung bis 29.10.2026 ziehen Sie 2 % Skonto ab. Das sind 23,80 €.“; Schlagwort „Skonto“
  • Eingabe: invoiceNumber RE-2026-0702, invoiceDate 2026-10-01, totalGross 499.8, discountDays 10, discountPercent 3, Ergebnis der letzten Aufgabe Approved, heute 2026-10-22
  • Ausgang: der Standard-Nachfolger
  • Änderungen: keine
  • Eingabe: invoiceNumber RE-2026-0911, invoiceDate 2026-10-20, totalGross 250, discountDays null, discountPercent null, Ergebnis der letzten Aufgabe Approved
  • Ausgang: der Standard-Nachfolger
  • Änderungen: keine