Compare commits
base: eho:feat/15-beoordeling-escalation
eho:main
eho:feat/14-dmn-diploma-eligibility
eho:feat/15-beoordeling-escalation
eho:fix/portal-nginx-resolver
eho:fix/local-eventsubscriber-acl
eho:feat/12-withdrawal-portal
eho:fix/91-local-compose-parity
eho:feat/12-withdrawal-bff
eho:feat/12-withdrawal-workflow
eho:feat/12-withdrawal
eho:feat/13-behandel-portal
eho:feat/13-behandel-decide
eho:feat/13-behandel-bff-auth-werkbak
eho:feat/13-workflow-user-tasks
eho:feat/13-behandel-decision-model
eho:chore/release-2026.07.0
eho:feat/78-reference-correlation
eho:feat/75-approval-flow
eho:feat/10-openbaar-portal
eho:chore/73-ci-speedups
eho:feat/68-e2e
eho:feat/67-self-service-form
eho:feat/66-api-client
eho:feat/65-nx-workspace
eho:feat/8-bff
eho:feat/6-domain-service
eho:feat/7-event-subscriber-projection
eho:feat/56-nrc-notification-wiring
eho:test/46-acl-openzaak-integration
eho:feat/47-acl-mutation-baseline
eho:ci/30-gitea-actions-ci
eho:feat/5-acl-open-zaak
eho:feat/4-flowable
eho:feat/3-keycloak
eho:feat/2-opennotificaties
eho:feat/2-catalogus-seed
eho:feat/10-openzaak-compose
eho:feat/32-docs-scaffold
eho:feat/31-contributor-workflow
eho:feat/30-gitea-actions-ci
eho:feat/29-bff-docker-compose
eho:chore/remove-bootstrap-scripts
eho:feat/28-bff-health
eho:docs/split-s00
..
compare: eho:main
eho:feat/14-dmn-diploma-eligibility
eho:main
eho:feat/15-beoordeling-escalation
eho:fix/portal-nginx-resolver
eho:fix/local-eventsubscriber-acl
eho:feat/12-withdrawal-portal
eho:fix/91-local-compose-parity
eho:feat/12-withdrawal-bff
eho:feat/12-withdrawal-workflow
eho:feat/12-withdrawal
eho:feat/13-behandel-portal
eho:feat/13-behandel-decide
eho:feat/13-behandel-bff-auth-werkbak
eho:feat/13-workflow-user-tasks
eho:feat/13-behandel-decision-model
eho:chore/release-2026.07.0
eho:feat/78-reference-correlation
eho:feat/75-approval-flow
eho:feat/10-openbaar-portal
eho:chore/73-ci-speedups
eho:feat/68-e2e
eho:feat/67-self-service-form
eho:feat/66-api-client
eho:feat/65-nx-workspace
eho:feat/8-bff
eho:feat/6-domain-service
eho:feat/7-event-subscriber-projection
eho:feat/56-nrc-notification-wiring
eho:test/46-acl-openzaak-integration
eho:feat/47-acl-mutation-baseline
eho:ci/30-gitea-actions-ci
eho:feat/5-acl-open-zaak
eho:feat/4-flowable
eho:feat/3-keycloak
eho:feat/2-opennotificaties
eho:feat/2-catalogus-seed
eho:feat/10-openzaak-compose
eho:feat/32-docs-scaffold
eho:feat/31-contributor-workflow
eho:feat/30-gitea-actions-ci
eho:feat/29-bff-docker-compose
eho:chore/remove-bootstrap-scripts
eho:feat/28-bff-health
eho:docs/split-s00
1 Commits
feat/15-be
...
main
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
| 7bcbc726ce |
feat(workflow): beoordeling escalation to teamlead after 14 days (S-14, closes #15) (#99)
All checks were successful
## What & why S-14: a beoordeling a behandelaar does not pick up within **14 days** escalates to the **teamlead**. A non-interrupting `P14D` boundary timer on the `Beoordelen` user task fires an external-worker task (`BeoordelingEscaleren`); the domain's escalation worker reassigns the still-open task's candidate group from `behandelaar` to `teamlead`. The task keeps its identity — only who may claim it changes. The escalation-via-external-worker decision is recorded in **ADR-0015** (proposal #98); it upholds §8.2 (the Workflow Client stays the only code that talks to Flowable) and keeps Flowable a stock image. Closes #15 ## Definition of Done - [x] Linked Gitea issue (above). - [x] Failing test committed before the implementation. - [x] Implementation makes the test pass; refactor commit if structure improved. - [x] Conventional Commits referencing the issue (`refs #NN`). - [x] CI green — all Gitea Actions jobs. - [x] `docker compose up` from a fresh clone reaches green health checks within 3 minutes (no new services; escalation is additive to the domain worker). - [x] Docs updated (ADR-0015, demo note). - [x] ADR added (`docs/architecture/adr-0015-beoordeling-escalation.md`). - [x] Demo note in `docs/demo-script.md`. ## How it was built (TDD) - **Workflow Client** (`IBeoordelingEscalatieClient`): acquire `BeoordelingEscaleren` jobs → find the open `Beoordelen` task in the instance → add `teamlead`/remove `behandelaar` candidate group → complete the job. Red → green. - **Escalation drain loop** (`BeoordelingEscalatieProcessor`) + hosted `BeoordelingEscalatiePump`, mirroring the OpenZaak worker. Red → green. - **BPMN**: non-interrupting `P14D` boundary timer on `Beoordelen` → external task → escalation end. - **Both branches** (escalate after timeout; no-op when completed in time) covered by the `Een beoordeling escaleren` acceptance scenarios + Workflow Client unit tests. - **Live integration**: `verify-domain` fires the timer early via Flowable's management API and asserts the reassignment to teamlead. ## Notes for reviewers - Interface segregation: escalation is on `IBeoordelingEscalatieClient`, separate from the OpenZaak worker's `IExternalWorkerClient`. - Reassignment is two REST hops (add teamlead, remove behandelaar); idempotent on redelivery — see ADR-0015 consequences. - Local checks green: domain unit tests (104), acceptance (13), `dotnet format --verify-no-changes`, Release build (0 errors), **domain mutation 96.69%** (break 90). The `run-domain-check.sh` escalation path is CI-verified on verify-stack (local full-stack run is constrained here). - `BeoordelingEscalatiePump` excluded from mutation, mirroring the existing `OpenZaakJobPump` exclusion. Reviewed-on: #99 |