Ga naar inhoud

Een nieuw (systeem)formulier toevoegen — alles in één map

Een formulier-proces is een feature-bundle: één map waarin álles staat wat bij dat formulier hoort. Een developer voegt één map toe; de deploys van beide stacks (zgw = Open Forms/Open Zaak, portal = Operaton/Laravel) pakken er automatisch hun deel uit.

portal/development/features/<naam>/
├── manifest.json            # de lijm: namen, proces-key, zaaktype, OF-slug
├── objecttype.json          # datacontract (Objects-API)            → zgw
├── formulier.py             # Open Forms-formulier + bevestigingsmail → zgw
└── <naam>.bpmn              # het proces (Operaton)                  → portal

Eén bron van waarheid. De bundle is de enige plek waar deze bestanden staan. De zgw-stack leest de map via FEATURES_DIR (default: de portal-repo naast de zgw-repo, instelbaar in zgw/.env).

Wat hoort er níét in de bundle

Onderdeel Waar Waarom
Gedeelde subprocessen (zaak-aanmaken, zaak-status-zetten, …) development/subprocessen/ herbruikt door meerdere features
External-task handlers development/handlers/<Domein>/ (eigen) of portal app/ExternalTasks (platform) PHP-classes (PSR-4 autoloading); auto-discovery is recursief — zie external-tasks.md
Zaaktype-bootstrap development/zaaktypen/bootstrap-<naam>-zaaktype.sh zaakgericht-werken-logica (Open Zaak)

De manifest.json

{
  "naam": "Autorisatieverzoek",
  "objecttypeNaam": "Autorisatieverzoek",
  "procesKey": "autorisatieverzoek",
  "zaaktypeIdentificatie": "Autorisatieverzoek",
  "ofSlug": "autorisatieverzoek",
  "bestanden": { "objecttype": "objecttype.json", "formulier": "formulier.py", "bpmn": "autorisatieverzoek.bpmn" }
}
Veld Gebruikt door Betekenis
objecttypeNaam seeder matcht name in objecttype.json; UUID wordt per omgeving opgezocht
procesKey seeder = de proces-id in de BPMN = Operaton process-key
zaaktypeIdentificatie seeder het zaaktype dat het proces aanmaakt
naam seeder weergavenaam van de dossierdefinitie

De vier bestanden

  1. objecttype.json — het datacontract. Standaard additionalProperties: false, dus élk veld dat het formulier wegschrijft moet erin staan — ook type, kenmerk, of_referentie, pdf (en bijlagen bij bijlagen). Bevat envVar (bv. OBJECTTYPE_<NAAM>_UUID) waarin de bootstrap de UUID schrijft.
  2. formulier.py — de Open Forms-definitie: componenten (showInEmail voor de bevestigingsmail-samenvatting), de registratie-mapping (elk veld → objecttype- property, inclusief public_reference → of_referentie en pdf_url → pdf), en de bevestigingsmail. Gebruik OBJECTTYPE_UUID/OBJECTTYPE_VERSION uit env (niet hardcoden — die geeft de deploy mee).
  3. <naam>.bpmn — het proces. De proces-id = procesKey uit het manifest. Service-tasks krijgen een camunda:topic (handler in development/handlers/ (of een config-worker)).
  4. manifest.json — zie hierboven.

Versie staat niet in .env. De bootstrap publiceert automatisch een nieuwe objecttype-versie bij een schemawijziging; welke versie het formulier gebruikt, bepaalt de deploy just-in-time (zgw/scripts/objecttype-version.sh → hoogste gepubliceerde versie).


Klaar? Committen en een PR openen

Je werk zit op één plek: de map development/features/<naam>/ in portal (plus evt. een zaaktype-script in zgw). Commit, push en open een PR.

Live brengen = serverbeheerder

Het uitrollen gebeurt niet door de developer (geen terminaltoegang). Na het mergen rolt de serverbeheerder het uit — zie Een formulier/proces live brengen.

Wat gebeurt er bij een inzending?

inzending → OF schrijft object → Objects-API-notificatie
         → portal-webhook → dossierdefinitie gevonden → proces gestart → zaak + workers

Checklist (developer)

  • [ ] Map development/features/<naam>/ met manifest.json, objecttype.json, formulier.py, <naam>.bpmn.
  • [ ] In objecttype.json: additionalProperties:false + álle weggeschreven velden + envVar.
  • [ ] In de BPMN: proces-id == procesKey uit het manifest; elke camunda:topic heeft een handler in development/handlers/ (of een config-worker).
  • [ ] Zaaktype-script aangemaakt (development/zaaktypen/bootstrap-<naam>-zaaktype.sh) en in bootstrap.sh gewired (bij een nieuw zaaktype).
  • [ ] Gecommit + PR geopend. (Uitrollen + verificatie doet de serverbeheerder.)

Zie ook

  • docs/external-tasks.md — workers/handlers.
  • E-mail — uitgaande mail (bevestigings-/notificatiemails).
  • zgw/docs/formulieren-tips.md — de Open Forms-/modeler-kant.