Skip to content

feat: adopt x-openregister-lifecycle on 7 procest schemas#306

Open
rubenvdlinde wants to merge 8 commits intodevelopmentfrom
feature/declarative-annotation-pilot
Open

feat: adopt x-openregister-lifecycle on 7 procest schemas#306
rubenvdlinde wants to merge 8 commits intodevelopmentfrom
feature/declarative-annotation-pilot

Conversation

@rubenvdlinde
Copy link
Copy Markdown
Contributor

Annotates task, document, voorstel, hearingSession, adviesAanvraag, handhavingsactie, and inspectieChecklist schemas. Companion: ConductionNL/openregister#1357. Verified end-to-end via /api/objects/{id}/transition.

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.
Literal string replacement in docblock @author tags.

Template fix in nextcloud-app-template PR #19 prevents recurrence.
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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant