Skip to content

Integrate dossiq batch b43: r31 case-type lines, decision letter source, request fields - #4669

Merged
rubenvdlinde merged 27 commits into
developmentfrom
integrate/dq-b43
Oct 26, 2026
Merged

rubenvdlinde merged 27 commits into
developmentfrom
integrate/dq-b43

Conversation

@rubenvdlinde

Copy link
Copy Markdown
Contributor

Dossiq batch b43: DQ-L8's six r31 case-type lines. They cover phases by status phase, child statuses replacing the parent's, the field rights matrix by role, privacy retention in years, handling teams by name, and the draft version date. Items that need nextcloud-vue 24t1y (facts months/group format) stay in as manifest config; :8080 builds against 24t1y. It also took three late lines: DQ-L2's case-type-request-fields (25aba94, caseType 1.43.0), DQ-L4's decision-letter-source (a207b85, register 0.20.74) and DQ-L7's colleague-party (d1102e0), which is taken out again (see below). It builds on development after #4665, with #4664 (inherited fields) merged in.

Heads (merge order, --no-ff)

  • DQ-L8 r31/case-type-phases-by-status-phase d08f3bc
  • DQ-L8 r31/child-statuses-replace-parent 512ed03
  • DQ-L8 r31/field-rights-matrix-by-role 6bc6bb2
  • DQ-L8 r31/privacy-retention-in-years 26111c7
  • DQ-L8 r31/handling-teams-by-name 4600ac0
  • DQ-L8 r31/draft-version-date 98628db
  • DQ-L4 r32/decision-letter-source a207b85
  • DQ-L2 r31/case-type-request-fields 25aba94

Integration changes

  • All six heads merged cleanly, child-statuses-replace-parent at 512ed03. No schema or register changes (register 0.20.73).
  • caseTypeVersionRunningCases follows draft-version-date: the first meta part of the versions card falls back to "Draft, changed {versionDate|date}".
  • child-statuses-replace-parent gave inheritedRows a boolean ownReplaces flag, which took CaseTypeResolver to complexity 52 and inheritedRows to cyclomatic 10 (phpmd). statusTypesFor now asks ownLifecycle first and merges only when the type declares less than a whole lifecycle. The two value questions (empty value, whole lifecycle) move to InheritedRowValues, with a test. Behaviour is unchanged; the case type tests pass, 721.
  • inheritedRows stayed at cyclomatic 10 after that move. Adding the rows that belong to no case type is now its own step, withSharedRows.
  • colleague-party is reverted out of this batch (one revert commit). Its colleague schema has no surface: no page, route or service names it, and case.partyKinds lists kinds, not schemas. SchemaHasSurfaceTest's allowlist ceiling is 0 ("a new schema needs a surface rather than a line here"), so the line goes back to DQ-L7 to give it one (for example an add-party source over colleagues on the parties card). To re-land it, revert the revert commit together with that surface. portaliq feat(menu): Flows is the single workflow entry #1716 should wait for it.
  • development (feat(example-sets): Omgevingsvergunning declares the six fields its regulier versions inherit #4664, example data and its tests) was merged in without conflicts.
  • case-type-request-fields: the zuiddrecht.json conflict is resolved with the keyed 3-way JSON merge. caseType 1.43.0 is the next free number after 1.42.0. Its two schema texts get catalogue keys.

Verified locally

  • validate-manifest PASS. check-l10n OK, l10n js up to date, check:schema-l10n 0 uncovered. PHPUnit Settings and Architecture pass.
  • Full vitest on the final head: 598/598 files, 4257/4257 tests, exit 0.
  • COMPOSER_PROCESS_TIMEOUT=0 composer check:strict on the final head, run alone: ALL CHECKS PASSED, exit 0. PHPUnit: 9888 tests, 0 errors, 0 failures. Earlier runs were red on phpmd (CaseTypeResolver) and on SchemaHasSurface (colleague), both handled as described above.

Prepared by a dossiq integration lane (AI-assisted, Claude Code); the coordinator merges.

The Fasen en taken tab made one phase per status, so regulier v4 showed
Ontvangen / Aanvullende gegevens gevraagd / In behandeling / ... where
DqZaaktype draws "Fase 1: Ontvangst / 2: Beoordeling / 3: Besluit".
A status type's optional `phase` (r25/status-type-phase) now groups:
the statuses naming one phase share it, named by the phase, ordered by
the first of them, with the tasks of all of them. Once a type is phased
a final status without phase or task is not listed as a phase. Without
any phase every status stays its own phase, as before.

Assisted-by: ClaudeCode:claude-opus-5-5
CaseTypeResolver merged a child's statuses into its parent's by name,
so regulier (6 statuses of its own) also listed Omgevingsvergunning's
Besluitvorming and Afgehandeld: 8 where DqZaaktype draws 6. A type
that declares statuses of its own now takes only those, its whole
lifecycle; a child that declares none still inherits its parent's.
Result types and fields keep merging by name.

Assisted-by: ClaudeCode:claude-opus-5-5
DqZaaktypeVelden "Wie wat ziet en invult, per rol en status" draws a
column per role, labelled with the statuses its rules name ("Intaker,
ontvangen"), and one pill per cell: Verplicht, Bewerken, Verborgen or
Alleen lezen. The matrix had a column per status with lines of text.
Each cell now holds what the field is for that role: a rule of the role
first, then required in one of its statuses, else edit.

Assisted-by: ClaudeCode:claude-opus-5-5
DqZaaktypeOverzicht Privacy draws "Bewaartermijn 20 jaar na
afhandeling"; live printed the stored months beside a fixed "maanden",
which also showed with no period set. The entry now reads
lawfulPurposeRetention with the facts `months` format (whole years as
years) and the suffix "after closing", dropped with an empty value.

Assisted-by: ClaudeCode:claude-opus-5-5
DqZaaktype Gegevens draws "Behandelende teams: Vergunningen, Toezicht en
handhaving"; live printed the group ids. The entry's parts now use the
facts `group` format and, for the list, `itemFormat: "group"`.

Assisted-by: ClaudeCode:claude-opus-5-5
The Versies list read only validFrom, which a draft does not have, so
regulier v5 showed no date where the boards draw "Concept, gewijzigd
7 okt". The date part is now a candidate pair: validFrom, else "Draft,
changed {versionDate|date}".

Assisted-by: ClaudeCode:claude-opus-5-5
A child that declares statuses replaced its parent's outright, which
would drop the parent's other statuses from a child that only recolours
or renames one (the schema promises a merge by name). The child's own
statuses now replace the parent's only when they make a lifecycle of
their own, a status that is not final and one that is (regulier v4/v5);
a smaller declaration merges by name as before.

Assisted-by: ClaudeCode:claude-opus-5-5
draft-version-date gives the versions card's first meta part a fallback:
the validFrom date, else 'Draft, changed {versionDate|date}'.

Assisted-by: ClaudeCode:claude-opus-5-5
caseType gains requestFields (1.43.0), the facts entries the request card
shows instead of the description; the card reads it through nextcloud-vue's
facts fieldsFrom. The Zuiddrecht Woo type lists the request's scope, its
period in years and the kinds of document.

Assisted-by: ClaudeCode:claude-opus-5-5
…letter

The card read the case's besluitDocument, the text a flow step renders,
so it stayed empty on a case whose letter was drafted from the case
type's template. It now reads dossiq's letters route for the decision
purpose, the newest dossier document of the type the case type declares
under documentDrafts.decision, as the decide dialog does: the letter,
its status, the template and the date, empty while there is none. The
route also answers the declaration's template slug and format, and
empty: true while the case holds no such letter.

Assisted-by: ClaudeCode:claude-opus-5-5
…d delivery

A case type's documentDrafts.<purpose> may now declare signing and
delivery, each a language map ({"nl": ..., "en": ...}), as procedure
configuration. The letters route returns both in the reader's language
beside the letter, and the Beschikking card draws the board's four rows:
Status, Sjabloon, Ondertekenen, Verzenden. The Woo case types (both
versions) declare 'Via LibreSign, na de paraaf' and 'Berichtenbox van
MijnOverheid'. caseType 1.24.0, register 0.20.74.

Assisted-by: ClaudeCode:claude-opus-5-5
The boards draw colleagues as parties (Lars as "Collega", an Adviseur on
710d44a4), but a party's kind comes from its schema and dossiq only had
person and organisation. A colleague schema (kind colleague, tied to a
Nextcloud user by userId) is added, the case accepts it (case 1.53.0),
and every kind names its identityShapes so the parties widget checks a
party against pipelinq's role kinds in one vocabulary (kvkCompany 1.6.0).

Assisted-by: ClaudeCode:claude-opus-5-5
…n the merge

child-statuses-replace-parent gave inheritedRows a boolean ownReplaces
flag and took CaseTypeResolver to complexity 52 and inheritedRows to
cyclomatic 10 (phpmd). statusTypesFor now asks ownLifecycle first and
merges only when the type declares less than a whole lifecycle; the two
value questions (empty value, whole lifecycle) live in
InheritedRowValues. Behaviour unchanged.

Assisted-by: ClaudeCode:claude-opus-5-5
inheritedRows stayed at cyclomatic 10 after the own-lifecycle move; adding
the rows that belong to no case type is now withSharedRows.

Assisted-by: ClaudeCode:claude-opus-5-5
colleague-party adds the colleague schema with no dossiq page to open, so
searchableSchemas asked to link it or opt it out; it opts out, as the
other schemas without a page do. Digests recorded (the colleague schema
ships with this batch; the caseType record follows the base register's
1.24.0).

Assisted-by: ClaudeCode:claude-opus-5-5
# Conflicts:
#	lib/Settings/example-sets/zuiddrecht.json
The colleague schema has no surface: no page, route or service names it,
and case.partyKinds lists kinds, not schemas. SchemaHasSurfaceTest's
allowlist ceiling is 0 ('a new schema needs a surface rather than a line
here'), so the line goes back to DQ-L7 to give it one (for example the
parties card's add-party source over colleagues). Reverts the merge of
d1102e0 and the searchable fix on top of it; re-land by reverting this
commit together with the surface.

Assisted-by: ClaudeCode:claude-opus-5-5
@rubenvdlinde
rubenvdlinde merged commit bd45ab1 into development Oct 26, 2026
35 of 40 checks passed
@github-actions

Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/dossiq @ 22a7438

Check PHP Vue Security License Tests
lint ✅
phpcs ✅
phpmd ✅
psalm ✅
phpstan ✅
phpmetrics ✅
eslint ❌
stylelint ✅
build ✅
check-manifest ✅
check-vue3-compile ✅
test-l10n ✅
format ❌
check-schema-l10n ✅
check-l10n-js ✅
check-debt-ratchet ❌
check-types-e2e ✅
composer ✅ ✅ 109/109
npm ❌ ✅ 658/658
app:check-code ⏭️
info.xml ✅
REUSE ❌
lockfile sync ✅
PHPUnit ❌
Newman ⏭️
Playwright ⏭️ deferred: E2E runs locally and on the promotion path only. This pull request targets development, so the suite is asked once per promotion into beta and main rather than once per push per open pull request. Run it locally with npx playwright test, or from the Actions tab on a branch with no open pull request into development.
Hydra gates ❌

Quality workflow — 2026-10-26 09:09 UTC

Download the full PDF report from the workflow artifacts.

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