Document-lifecycle
Elk Frappe-document doorloopt een vaste lifecycle. Hooks vuren bij elke fase — apps kunnen valideren, reageren of vetoen.
Fasen
| Fase | Wanneer | Veel gebruikt voor |
|---|---|---|
before_insert |
Net voor eerste opslag (record bestaat nog niet) | Defaults berekenen uit context |
after_insert |
Na eerste opslag | Gerelateerde records maken |
validate |
Voor elke opslag (insert OF update) | Business-regelchecks |
before_save |
Voor elke opslag | Laatste aanpassingen |
on_update |
Na elke opslag | Syncen naar externe systemen |
before_submit |
Voor indienen | Eindchecks voor vergrendeling |
on_submit |
Na indienen | GL-records, workflow triggeren |
before_cancel |
Voor annuleren | Verifieer dat annulering mag |
on_cancel |
Na annuleren | GL-records terugdraaien |
on_trash |
Voor verwijderen | Cleanup |
Indien-bare documenten
Documenten als Verkoopfactuur, Voorraadboeking, Journaalpost zijn submittable:
| docstatus | Betekenis | Bewerkbaar? |
|---|---|---|
| 0 | Concept | Ja |
| 1 | Ingediend (gefinaliseerd; GL-records gemaakt) | Nee — Annuleren + Amenderen |
| 2 | Geannuleerd (teruggedraaid) | Nee |
Ingediende documenten worden niet verwijderd — wel geannuleerd en (optioneel) geamendeerd.
Hook-resolutie
Voor elke fase draait Frappe:
- De controller-methode van het DocType (bv.
before_save(self)) - App
doc_eventshooks (in install-volgorde)
Meerdere apps kunnen hetzelfde event hooken. Fouten in een hook aborten de save — partiële state blijft nooit hangen.
Idempotentie
Reken niet erop dat hooks slechts één keer vuren per "gebruikersactie". Een retry, queued job of script kan hetzelfde event meermaals triggeren. Ontwerp hooks idempotent — herhaalt u dan boekt u niet dubbel.
Last updated 3 days ago
Was this helpful?