feat: adopt x-openregister-lifecycle on 7 procest schemas#306
feat: adopt x-openregister-lifecycle on 7 procest schemas#306rubenvdlinde wants to merge 8 commits into
Conversation
Before: 1540 errors across 47 lib/ files After: 393 errors across 45 lib/ files Remaining violations are non-auto-fixable (named-parameter rewrites, operator !/=== FALSE swaps, implicit truthy, inline-if rewrites) and need human or reviewer judgment.
Adds two coverage reports produced by /opsx-coverage-scan:
- coverage-report.pilot.{md,json} — 2026-04-20 file-level pilot run (PHP
only, 89 files, ~180 Bucket 1 candidates estimated)
- coverage-report.{md,json} — 2026-04-20 full per-method pass (PHP + Vue/TS,
764 PHP methods + 318 frontend units classified; 678 Bucket 1, 96 Bucket
2a / 7 clusters, 206 Bucket 2b / 9 clusters, 73 Bucket 3b, 115 Bucket 4
findings across 3 ADR rules)
Read-only — no code changes. Feeds the /opsx-annotate and /opsx-reverse-spec
retrofit commands.
- docs/development.md: document local Greenmail setup for mail-driven flows (case intake from citizen email, behandelaar notifications). Includes IMAP/SMTP config + seed-mail.sh pointer to the shared openregister stack. - l10n: sync en/nl strings — add "All cases active", "Case Map", "Cases by status"; drop 4 stale case-type template strings.
Broken l10n/nl.js entries with unescaped quotes caused a JavaScript parse error that silently failed OC.L10N.register(), so ALL Procest translations fell back to English regardless of user language setting. The stale entries were cleaned up in 51edd53; this commit fills in the remaining coverage gaps that made the dashboard appear half-translated. l10n additions (nl.js, en.js, en.json): - Widget titles: Deadline Alerts, Task Due Reminders, Stalled Cases, Case Map, SLA Compliance, Work Queue, Map - Empty states: No items found, No task reminders, All cases active, No SLA targets - Action labels: View all, View all deadline alerts - Lowercase "Open cases" / "Cases by status" aliases to match bundle output Source fixes (require rebuild): - Dashboard.vue: wrap hardcoded 'CASE'/'TASK' badges in t() and pass :empty-label="t(...)" to the 5 CnStatsBlock KPI widgets so their default 'No items found' string becomes translatable - dashboardHelpers.js, doorlooptijdHelpers.js: wrap 'Unknown' fallback strings in t() (imports translate from @nextcloud/l10n) Build config: - webpack.config.js: add scss/sass-loader rule — needed for the new CnCard component from @conduction/nextcloud-vue which uses <style lang="scss">; procest had no SCSS rule and built fine until CnCard was added upstream - package.json: add sass-loader to devDependencies
- Collapse duplicate DEFAULT_LAYOUT entries that rendered every top-row widget twice - Add missing </template> for #widget-case-map slot - Drop redundant card border/background/padding from DeadlineAlerts, TaskDueReminders, StalledCases (CnDashboardPage already wraps each widget) - Remove inner overflow-y on __list containers to fix double scrollbar - Fix broken NcAppNavigationItem nesting between Map and Voorstellen in MainMenu - Document seed-cases.sh in development.md
Annotates every schema in the procest register that has a status enum
with the platform's declarative lifecycle annotation:
| Schema | Actions |
|---------------------|---------|
| task | activate, complete, terminate, disable |
| document | submit, adopt, archive, sendBack |
| voorstel | startParafering, paraferingDone, accord, submit, decide, archive, sendBack, revise |
| hearingSession | invite, execute, cancel, waive |
| adviesAanvraag | receive, expire |
| handhavingsactie | forfeit, execute, withdraw |
| inspectieChecklist | activate, archive |
OpenRegister's LifecycleValidationListener now enforces every status
move on these schemas. Apps no longer need hand-written transition
matrices to validate state changes — saves go through OR's normal
ObjectUpdating event and the listener stops invalid transitions with
HookStoppedException, surfaced as HTTP 422.
Verified live in dev container — inspectieChecklist:
POST /api/objects/{id}/transition action=activate → status: active
POST /api/objects/{id}/transition action=archive → status: archived
Companion: ConductionNL/openregister#1357
Same call as besluiten-management — the original framing called this an "abstract extension of OpenRegister's RBAC" but every requirement uses ZGW vocabulary (zaaktype, vertrouwelijkheidaanduiding, Zaakcatalogus, ZGW Autorisaties API, VNG compliance) and every zaaktype implementation in the workspace already lives in Procest: - lib/Controller/AcController.php (ZGW Autorisaties endpoints) - lib/Controller/ZtcController.php (zaaktypecatalogus) - lib/Service/ZgwBusinessRulesService.php - lib/Service/ZgwMappingService.php - lib/Service/ZgwZrcRulesService.php Zero zaaktype code in OpenRegister. The spec is implementation work for ZGW Autorisaties on top of OpenRegister's RBAC primitives, not a generic RBAC pattern document — so it belongs adjacent to the existing zaaktype-configuratie change here. OpenRegister continues to provide the underlying primitives the relocated spec composes against (PermissionHandler, MagicRbacHandler, ConditionMatcher). Spec content unchanged from the original. Top-of-proposal note added to record the relocation rationale + date. Companion change in openregister will remove the misplaced spec.
|
Branch too stale to rebase. |
|
Superseded by #419 — this branch ( |
Annotates task, document, voorstel, hearingSession, adviesAanvraag, handhavingsactie, and inspectieChecklist schemas. Companion: ConductionNL/openregister#1357. Verified end-to-end via /api/objects/{id}/transition.