---
title: "Document-lifecycle"
space: "Frappe Framework"
url: "https://www.prilk.com/nl/docs/frappe-framework/documentlifecycle"
updated: "2026-05-14"
---

## 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:

1. De controller-methode van het DocType (bv. `before_save(self)`)
2. App `doc_events` hooks (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.
