intent: a process status setter overwrites a roll-up-owned status - a PAID invoice goes back to SENT when its Send task completes after the payment
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 42/100
Research direction
Start with the generated setter template at components/template/template-application-events-java/.../events/SetField.java.template and the roll-up ownership logic in components/ide/ide-template/.../model/RollupAggregates.java. Trace how DisplacedStatus and owned statuses are handled, then inspect the declarative transitions: runner and updateProperty transition actions mentioned in the issue. Done means setters preserve roll-up-owned Status while recording the intended lifecycle status, which is restored when the roll-up relinquishes ownership.
Written by the indexing model from the issue text.
Description
What happens
A process status setter generated from SetField.java.template (<Process>MarkSent, MarkIssued, MailSent, Confirmed, ... - every ${JavaTask} that sets the lifecycle Status) writes its target status with a targeted single-column updateProperty(id, "Status", n), unconditionally. When the entity's status is at that moment owned by a roll-up (statusWhenFull / statusWhenPartial, the PARTIAL/PAID of a settled document), the setter overwrites it, and nothing ever restores it: the roll-up listener (RollupAggregates) re-asserts PARTIAL/PAID only when the summed amount changes.
Reproduced on a production tenant (BusinessIntents Suite, platform 14.76.0, base-sales-invoices):
2026-09-11 11:49Z CustomerPayment 3 (4 800.00) allocated to SalesInvoice 16 (Payable 4 800.00)
-> roll-up invoicePaid: Paid 4800, Balance 0, Status 7 (PAID)
2026-10-05 12:34:36Z the "Send" user task of SalesInvoiceApproval instance 2501 is completed (action markAsSent)
process variables snapshotted at that moment: Status=PAID, Paid=4800, Balance=0
2026-10-05 12:34Z SalesInvoiceApprovalMailSent (SetField): updateProperty(16, "Status", 4) -> SENT
2026-10-05 12:35Z the async mailInvoice job fails (SMTP) and dead-letters; the process is stuck before Confirm
2026-10-16 the invoice still reads Status SENT, Paid 4 800.00, Balance 0.00, DisplacedStatus null
The generated listener's own relinquish logic (#7022) would have done the right thing had the roles been reversed: when the sum goes back to zero it restores DisplacedStatus. The process side has no such awareness.
What should happen
A lifecycle setter must not take a status the roll-up holds. When the current Status is one of the entity's roll-up-owned statuses (statusWhenFull / statusWhenPartial of any roll-up on it):
- write the setter's value into
DisplacedStatusinstead ofStatus(the status the document would hold if it were not settled), publish the transition as today; - leave
Statusto the roll-up, which restoresDisplacedStatuswhen the sum returns to zero (#7022) - so "payment deleted" then yields SENT/CONFIRMED, not ISSUED.
The same guard belongs in the declarative transitions: runner and in updateProperty-based transition actions, since any of them can run after the money arrived. For bank-transfer customers "Send/Confirm completed after the payment is in" is the normal order, not an edge case.
Where
components/template/template-application-events-java/.../events/SetField.java.template(the generated<Process><Step>setters)components/ide/ide-template/.../model/RollupAggregates.java(the roll-up side: ownsDisplacedStatus, knows the owned statuses)
Found while investigating BusinessIntents/base-sales-invoices (prod invoice 16); the AP twin is BusinessIntents/base-purchase-invoices.
- Dominant language
- Java
- Stars
- 278
- Forks
- 97
- Avg merge
- 19h 30m
- Merged PRs (30d)
- 242
Getting set up
- No Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from eclipse-dirigible/dirigible
-
Difficulty 2/5 1-3 hours Newbie friendliness 80/100
eclipse-dirigible/dirigible#7958 ·
Maintainers usually reply within 1 day
-
intent: a create-from without fromStatus answers 200 on a missing or unknown source id (no 400/404)Open
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
eclipse-dirigible/dirigible#7945 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
eclipse-dirigible/dirigible#7891 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
eclipse-dirigible/dirigible#6538 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 65/100
eclipse-dirigible/dirigible#4812 ·
Maintainers usually reply within 1 day
All issues in eclipse-dirigible/dirigible
Similar issues
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
navikt/mock-oauth2-server#1129 ·
Maintainers usually reply within 1 day
-
bug main ui
Difficulty 2/5 1-3 hours Newbie friendliness 65/100
openhab/openhab-webui#4600 ·
Maintainers usually reply within 4 days
-
`DeepSeekChatModel` streaming returns no content when chunks have no `id`Possibly taken @lejuho claimed this today. Openstatus: waiting-for-triage
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
spring-projects/spring-ai#7214 ·
Maintainers usually reply within 2 days
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
QuiltMC/update-quilt-meta#28 ·
-
awaiting triage Documentation P3
Difficulty 1/5 1-3 hours Newbie friendliness 86/100
Maintainers usually reply within 1 day