fix(notifications): revive the overdue notification and correct a leftover Dutch default - #846
Merged
rubenvdlinde merged 1 commit intoAug 22, 2026
Conversation
…tover Dutch default
Two defects from the Dutch->English value rename, both silent.
1. actionOverdue could never fire. Its scheduled filter was {taskStatus:
'overdue'} — a strict-equality shortcut against a status nothing in the app
ever writes. ActionItemWriter::mapStatus() has no 'overdue' entry, and
overdue-ness is derived at read time in ActionItemAnalyticsService instead.
The daily job ran, matched nothing, and notified nobody.
Replaced with the condition the app actually means, in the dialect
ScheduledFilterEvaluator implements (equals|notEquals|withinNext|olderThan,
entries ANDed): dueDate olderThan PT0S AND taskStatus notEquals completed.
Overdue is now derived by the filter rather than depending on a stored
status that no writer maintains.
2. ProxyAuthorization.signatureStatus defaulted to 'ongetekend', which is not
in its own enum (unsigned|signed|refused) and disagrees with the lifecycle's
initial state 'unsigned'. The enum and lifecycle were migrated by
RenameDutchDecideskValues; default, example and the prose were left behind.
Refs #845
rubenvdlinde
requested review from
WilcoLouwerse,
bbrands02 and
rjzondervan
as code owners
August 22, 2026 10:09
rubenvdlinde
deleted the
fix/dead-overdue-notification-and-enum-default
branch
August 22, 2026 10:37
Contributor
Quality Report — ConductionNL/decidiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| check-nav-ceiling | ✅ | ||||
| test-l10n | ✅ | ||||
| format | ✅ | ||||
| composer | ✅ | ✅ 104/104 | |||
| npm | ✅ | ✅ 538/538 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| PHPUnit | ✅ | ||||
| Newman | ✅ | ||||
| Playwright | ✅ | ||||
| Hydra gates | ✅ |
Quality workflow — 2026-08-22 10:46 UTC
Download the full PDF report from the workflow artifacts.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #845
Two silent defects, both fallout from the Dutch→English value rename (
lib/Repair/RenameDutchDecideskValues.php).1.
actionOverduecould never fireThe scheduled filter was:
That is the strict-equality shortcut against a status nothing in the app ever writes:
ActionItemWriteris the only write path (the schema is a read-only VTODO projection) and itsmapStatus()mapsopen|in-progress|completed|cancelled— nooverdueentry.ActionItemAnalyticsService(dueDate < today) for dashboard grouping, never persisted.So the daily job ran, matched nothing, and notified nobody — while reading as configured and enabled.
The fix, in the dialect the engine actually implements
I checked
ScheduledFilterEvaluatorbefore writing the replacement rather than copying an existing example. It supports exactly four operators —equals,notEquals,withinNext,olderThan— as a flatfield => specmap with entries ANDed:Overdue is now derived by the filter instead of depending on a stored status no writer maintains.
ContractObligation.obligationDeadlineuses{"all":[{"field":…,"operator":"notIn",…}]}.ScheduledFilterEvaluatorhas noall/any/notIn/before— it would read"all"as a field name, compare$objectData['all'] ?? nullagainst an array, and never match. Had I copied it, I would have replaced one dead notification with another. Being reported separately, together with the validator gap that lets that shape through at save time.2.
ProxyAuthorization.signatureStatusdefaulted outside its own enum"default": "ongetekend"againstenum: [unsigned, signed, refused], and disagreeing with the lifecycle'sinitial: unsigned. The enum and lifecycle were migrated;default,exampleand the prose were left in Dutch. Corrected all three.The notification triggers on this schema already used the English values correctly, so nothing else was firing blind here.
Not changed (recorded so it is not lost)
Several long
_note/descriptionprose blocks in fragment 63 still narrate the state machine in Dutch (getekend/geweigerd). I corrected the lifecycle_noteand thesignatureStatusdescription — the two that document the machine this PR touches — and left the rest, since they are descriptive text with no runtime effect. The seed slugmachtiging-alv-jansen-ongetekendis deliberately untouched (changing it would change object identity).Context
Found during the ADR-098 fleet task inventory (ConductionNL/hydra#609).