Skip to content

Integrate dossiq batch b44: decision letter, payment and term labels, colleague party, case objects, access purpose - #4672

Merged
rubenvdlinde merged 30 commits into
developmentfrom
integrate/dq-b44
Oct 26, 2026
Merged

rubenvdlinde merged 30 commits into
developmentfrom
integrate/dq-b44

Conversation

@rubenvdlinde

@rubenvdlinde rubenvdlinde commented Oct 26, 2026 •

Copy link
Copy Markdown
Contributor

Dossiq batch b44:

  • DQ-L4: the decision letter footnote and the review that skips drafted letters.
  • DQ-L8: the fields table fitting its card, and the access-purpose handler.
  • DQ-L2: the payment state labels and the Termijn en betaling board labels.
  • DQ-L7: colleague-party re-landed with its surface.
  • DQ-OBJREG: the case objects linked to public space (dossiq feat(example-sets): Zuiddrecht cases link trees, play equipment and market pitches #4671, landed here) and the catalogue object count.

It builds on development after b43 (#4669). Known dependency: r32/access-purpose-handler adds accessPurpose to the CaseDetail page config. That needs nextcloud-vue schema 2.157.0 from 24t2a (feat/access-purpose-check-and-option-hint 8aac5b1a21). Against development's nextcloud-vue (2.143.0, schema 2.155.0), check:manifest refuses those keys. This is the 24t2a dependency, not a defect; :8080 builds against 24t2a, and the bump follows that release.

Heads (merge order, --no-ff)

  • DQ-L4 r33/decision-letter-footnote 11d1093
  • DQ-L8 r31/case-type-fields-fit-card af830d7
  • DQ-L2 r31/case-payment-state-labels 310a3d9
  • DQ-L2 r31/term-and-payment-board-labels 02a451f
  • DQ-L7 feat/colleague-party b165500
  • DQ-L4 r34/review-skips-drafted-letters 7adb3f1
  • DQ-OBJREG feat/exset-case-objects-link-public-space 8ba282b
  • DQ-OBJREG feat/exset-case-objects-link-public-space 6213d7a
  • DQ-OBJREG feat/catalogue-object-count a78d22f
  • DQ-L8 r32/access-purpose-handler 0c11d24

Integration changes

  • colleague-party re-landed: my b43 revert is reverted, then DQ-L7's head b165500 is merged. That head adds an Add party action on the case parties card, which is the colleague schema's surface, so SchemaHasSurface holds at ceiling 0. The colleague schema is searchable: false.
  • Case schema versions in claim order: colleague-party keeps case 1.53.0 (claimed in b43). case-payment-state-labels moves to 1.54.0 and the statutory extension (term-and-payment-board-labels) to 1.55.0. Each still moves past the one before it. Fragments, notes, proposals and digest records follow. Register 0.20.75.
  • case.statutoryExtension gets a search declaration (exact match, text input, as statutoryTerm), and its two schema texts get catalogue keys.
  • caseTypeFieldsColumns follows fit-card's wrapped Field column.
  • exset-case-objects-link-public-space is at its tip 6213d7a (the Objects tab sorts on objectIdentification). review-skips-drafted-letters 7adb3f1 was already in the branch through the decision-letter lines. The feat/example-set-* entries under b44 have no dossiq branch.
  • development was merged in before the final checks.

Verified locally

  • check-l10n OK, l10n js up to date, check:schema-l10n 0 uncovered. PHPUnit Settings 690 OK, SchemaHasSurface 9/9.
  • validate-manifest against development's nextcloud-vue (schema 2.155.0): FAIL on exactly two errors, /pages/6/config/accessPurpose and /pages/6/config/accessPurpose/options/0 (additionalProperties). That is the known 24t2a dependency (schema 2.157.0).
  • Full vitest once: 595/599 files, 4254/4261 tests. All 7 reds trace to the same accessPurpose keys: the three built-manifest schema checks (landingViews, simpleCasePage, simpleListAndDashboard) and four validateManifestLag cases, whose check:manifest run exits 1 on them. No other red.
  • COMPOSER_PROCESS_TIMEOUT=0 composer check:strict, run alone: ALL CHECKS PASSED, exit 0. PHPUnit: 9910 tests, 0 errors, 0 failures.

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

The board draws a muted line under the rows: once signed the letter
cannot change, and the six-week objection period starts on the day it
is announced. The card carries it as the facts widget's footnote
(nextcloud-vue feat/facts-footnote; without it the line is not drawn).

Assisted-by: ClaudeCode:claude-opus-5-5
With the origin pills, the grip and the one-line head controls the
fields table ran to its one-line width (916px probed against a 754px
card). It now fits the card (`fitWidth`), every column at its content
and the field name wrapping (`cn-cell--wrap`), so it takes the table's
smallest width, as DqZaaktypeVelden draws it.

Assisted-by: ClaudeCode:claude-opus-5-5
paymentState gets x-enum-labels (case 1.53.0), so Termijn en betaling reads
"Geen leges voor dit zaaktype" rather than the stored code.

Assisted-by: ClaudeCode:claude-opus-5-5
The colleague schema had no surface (SchemaHasSurfaceTest). Board
DqZaakBetrokkenen draws "Partij toevoegen" on the case parties card, so
the card gets manage.add with residents, organisations and colleagues as
picker sources; the role is one the case declares. Config only.

Assisted-by: ClaudeCode:claude-opus-5-5
Assisted-by: ClaudeCode:claude-opus-5-5
The decision letter drafted from the case type's template (documentDrafts)
is linked to the case like any document, so the review counted it: one
more document to assess ('4 van 8') and outstanding in the decide dialog.
The review corpus now leaves out every document whose type is one of the
case type's drafted document types (by name or catalogue id), for every
purpose. Driven by the case type's declaration, nothing Woo-specific.

Assisted-by: ClaudeCode:claude-opus-5-5
…arket pitches

Nine caseObject rows link the two felling permits, the neighbourhood party,
the spring-rider report and the market-pitch objection to their objects in
OpenRegister's public-space register, so the object type catalogue lists
Boom, Speeltoestel and Standplaats with their schema.

Assisted-by: ClaudeCode:claude-opus-5-5
The case carries its type's extension period (case 1.54.0), and the term
card reads "Wettelijke termijn: 4 weken, te verdagen met 2" and
"Laatst gecontroleerd" through nextcloud-vue's duration format.

Assisted-by: ClaudeCode:claude-opus-5-5
… follows fit-card

term-and-payment-board-labels adds case.statutoryExtension without a
search declaration (caseSearchDeclarations): exact text, as
statutoryTerm. case-type-fields-fit-card wraps the Field column.

Assisted-by: ClaudeCode:claude-opus-5-5
DQ-L7 gave the colleague schema its surface (b165500, an Add party
action on the case parties card); its two new commits merge next.

Assisted-by: ClaudeCode:claude-opus-5-5
colleague-party took case 1.53.0 first (b43, re-landed here), so the
payment state labels move to 1.54.0 and the statutory extension to
1.55.0 (fragments, notes, proposals, digest records). Each still moves
past the version before it.

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

Passing CaseDocumentDrafts through WOODocumentAssessmentService raised
its coupling to 13 (phpmd). It now takes the review's
OutstandingDocuments as the container builds it, which already carries
the drafted document types, and builds one itself only without it.

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

ObjectTypeSchemaResolver also counts the objects the register holds in the
schema (null when the count fails), and each catalogue row carries
objects and schemaLine, the schema title with the count in the reader's
language ("Bomenregister · 5 objecten"). The Objecttypen table's line
under the type reads schemaLine.

Assisted-by: ClaudeCode:claude-opus-5-5
Board DqZaakGerelateerd lists the cycle path (BGT wgl.0505.1234) before
the masts LM-0014 and LM-0015, which is the identification order.

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

Ruben, 26 Oct (DQ-ZERO "the access-purpose modal"):
- GET /api/cases/{id}/access-purpose answers whether the reader must
  state a purpose. A reader who holds a configured generic role on the
  case (default handler: the assignee or a handler role binding) does
  not: the configured purpose (default handling) is recorded for them,
  marked automatic, and the case page opens without the dialog
  (nextcloud-vue accessPurpose.checkUrl).
- The dialog's intro says it shows because the reader is not this
  case's handler.
- A purpose can bind the reader to a generic role (default handling ->
  handler): after the purpose, a role binding is added with the case
  type's own role type for that generic role, else a shared one, and a
  second trail entry dossiq.case.access-role says so. The option says it
  before the reader confirms (options[].hint).
- The rules are app config access_purpose_roles (AccessPurposeRules),
  not procedure code. User docs explain the dialog.

openspec change access-purpose-handler. Needs nextcloud-vue
feat/access-purpose-check-and-option-hint (schema 2.157.0).

Assisted-by: ClaudeCode:claude-opus-5-5
…o count

The catch-return-null ratchet allows no new swallowing catch, and the
catalogue already lets a refused read fail the endpoint (503) rather than
show a wrong number.

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

check:strict: CaseRoleHolder::rows() caught a failed search and answered
[], a new swallowing catch against the ceiling (ServiceCatchReturnsNull).
The lookup now throws, and the access-purpose service decides what a
failure means: the reader is asked for a purpose (the safe side), and a
binding that could not be made leaves the recorded purpose and the open
case as they are. Both are logged at warning.

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

Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/dossiq @ 31d5a45

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 10:35 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