Skip to content

Business Rules Execution

RONL Business API delegates all business rule execution to Operaton, an open-source BPMN/DMN engine (Apache 2.0 licence) hosted on the VM at operaton.open-regels.nl. The Business API acts as a secure, authenticated proxy: it validates the user's identity and then invokes Operaton on their behalf.


What Operaton handles

  • Executing BPMN 2.0 workflows that orchestrate multi-step government processes
  • Evaluating DMN 1.3 decision tables (e.g. eligibility rules, benefit calculations)
  • Managing process instances: start, status, variables, completion
  • Business rule versioning — multiple versions of a process definition can coexist

The Business API hides the complexity of Operaton's REST API behind simple, purpose-built endpoints such as POST /v1/decision/:key/evaluate and POST /v1/process/:key/start.


Supported processes

Currently configured processes include:

Zorgtoeslag (healthcare allowance calculation)
Evaluates four eligibility criteria against a DMN decision table and returns whether the applicant qualifies and the calculated monthly amount.

Input variables mapped from the JWT and request body:

Variable Type Source
ingezeteneVanNederland boolean Request body
18JaarOfOuder boolean Request body
zorgverzekeringInNederland boolean Request body
inkomenEnVermogen number Request body
initiator string JWT sub claim
municipality string JWT municipality claim

Output: { "eligible": true, "amount": 1150 }


Process execution flow Zorgtoeslag

sequenceDiagram
    participant F as Frontend
    participant B as Business API
    participant O as Operaton
    participant D as PostgreSQL

    F->>B: POST /v1/process/zorgtoeslag/start
    B->>B: Validate JWT, extract claims
    B->>B: Map claims → process variables
    B->>O: POST /process-definition/key/zorgtoeslag/start
    O->>O: Execute BPMN workflow
    O->>O: Evaluate DMN decision table
    O->>B: Return process result
    B->>D: Write audit log entry
    B->>F: Return { eligible, amount }

AWB Kapvergunning (tree felling permit)
A two-layer BPMN process implementing the Dutch Administrative Law Act (Awb) procedural requirements.

The outer shell (AwbShellProcess) manages the six AWB phases: receipt acknowledgement, completeness check, decision subprocess, and citizen notification. It sets receiptDate, awbDeadlineDate (8 weeks per Awb 4:13), and dossierReference.

The inner subprocess (TreeFellingPermitSubProcess) handles the substantive decision: it evaluates TreeFellingDecision.dmn and ReplacementTreeDecision.dmn, creates a Sub_CaseReview user task for caseworker review, and writes the final permitDecision, status, and finalMessage variables back to the parent process.

After the subprocess completes, the AWB shell creates a Task_Phase6_Notify user task requiring the caseworker to confirm citizen notification before the process ends.


Process execution flow Tree Felling permit

sequenceDiagram
    participant C as Citizen (Frontend)
    participant B as Business API
    participant O as Operaton
    participant CW as Caseworker (Frontend)
    participant D as PostgreSQL

    C->>B: POST /v1/process/AwbShellProcess/start<br/>(treeDiameter, protectedArea)
    B->>B: Validate JWT, inject tenant variables
    B->>O: POST /process-definition/key/AwbShellProcess/start
    O->>O: Phase 1 — set applicantId, productType, applicationDate
    O->>O: Phase 2 — set receiptDate, awbDeadlineDate, dossierReference
    O->>O: Phase 3 — evaluate AwbCompletenessCheck DMN
    O->>O: Call Activity → TreeFellingPermitSubProcess
    O->>O: Evaluate TreeFellingDecision DMN → permitDecision
    O->>O: Evaluate ReplacementTreeDecision DMN → replacementDecision
    O-->>O: Create user task: Sub_CaseReview
    B->>D: Write audit log entry
    B->>C: Return { processInstanceId, dossierReference }

    Note over O: Process suspended — awaiting caseworker

    CW->>B: GET /v1/task
    B->>O: GET /task?processVariables=municipality_eq_utrecht
    O->>B: Return task list
    B->>CW: Return open tasks

    CW->>B: POST /v1/task/:id/claim
    B->>O: POST /task/:id/claim
    CW->>B: POST /v1/task/:id/complete<br/>(reviewAction, reviewPermitDecision?)
    B->>O: POST /task/:id/complete
    O->>O: Set final status, decisionType, finalMessage
    O-->>O: Create user task: Task_Phase6_Notify

    Note over O: Process suspended — awaiting notification confirmation

    CW->>B: POST /v1/task/:id/complete<br/>(notificationMethod, applicantNotified)
    B->>O: POST /task/:id/complete
    O->>O: Phase 6 complete — process ends
    B->>D: Write audit log entry

The key structural differences from Zorgtoeslag worth noting:

  • Two suspension points — the process does not complete in a single request
  • Two actors — citizen initiates, caseworker drives both decision and notification
  • Subprocess — the material decision happens inside TreeFellingPermitSubProcess, which writes its variables back to the AWB shell
  • No result in the start response — the citizen receives only a dossierReference; the actual decision is only available later via /v1/process/history

From v2.2.0, citizen and caseworker interaction with the AWB process is driven entirely by Camunda Forms — JSON schemas authored in the LDE Form Editor and deployed alongside the BPMN in Operaton. The citizen start form is fetched and rendered dynamically; the caseworker review and notification forms are fetched per task. A Decision Viewer in the citizen dashboard fetches the final variable state of completed applications via the Operaton history API. See Dynamic Forms for the full implementation detail.


API endpoints for business rules

Method Endpoint Description
POST /v1/decision/:key/evaluate Evaluate a DMN decision table by key
POST /v1/process/:key/start Start a BPMN process instance
GET /v1/process/:id/status Get process instance status
GET /v1/process/:id/variables Get process instance output variables
DELETE /v1/process/:id Cancel a process instance
GET /v1/task List open tasks for the caseworker's municipality
GET /v1/task/:id/variables Get process variables for a task
POST /v1/task/:id/claim Claim a task
POST /v1/task/:id/complete Complete a task with caseworker-submitted variables
GET /v1/process/history List process history for the authenticated citizen
GET /v1/process/:key/start-form Fetch the deployed Camunda Form schema for a process start event
GET /v1/task/:id/form-schema Fetch the deployed Camunda Form schema for a task
GET /v1/process/:id/historic-variables Fetch final variable state of a completed process instance
GET /v1/process/:id/decision-document Fetch the DocumentTemplate bundled in the Operaton deployment for a completed process instance

All endpoints require a valid JWT in the Authorization: Bearer header.


Operaton environment

Operaton runs as a Docker container on the VM, exposed via Caddy reverse proxy at https://operaton.open-regels.nl. It is shared between ACC and PROD environments, using separate process definition version tags to isolate deployments.

The Operaton Cockpit (management UI) is available at the same URL for inspecting running processes, viewing audit history, and managing deployments.