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
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
評価
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 初心者へのやさしさ
- 42/100
調査の方向性
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.
索引モデルが issue の本文から書いたものです。
説明
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.
- 主要言語
- Java
- スター
- 278
- フォーク
- 97
- 平均マージ
- 18時間 57分
- マージ済み PR(30日)
- 249
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
eclipse-dirigible/dirigible のほかの issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 80/100
eclipse-dirigible/dirigible#7958 ·
メンテナーはふだん 1 日以内に返信
-
intent: a create-from without fromStatus answers 200 on a missing or unknown source id (no 400/404)オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
eclipse-dirigible/dirigible#7945 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 74/100
eclipse-dirigible/dirigible#7891 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 74/100
eclipse-dirigible/dirigible#6538 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 65/100
eclipse-dirigible/dirigible#4812 ·
メンテナーはふだん 1 日以内に返信
eclipse-dirigible/dirigible の issue をすべて見る
似ている issue
-
status: needs-triage
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
JabRef/jabref#17546 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 86/100
hiero-ledger/hiero-sdk-java#3010 ·
メンテナーはふだん 1 日以内に返信
-
Optimize consumer version heatmap aggregation to avoid repeated scans対応中かも @praykaria31 が今日担当しました。 オープンtype/enhancement
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
Apicurio/apicurio-registry#10662 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
a:false-positive
難易度 2/5 1〜3時間 初心者へのやさしさ 77/100
メンテナーはふだん 1 日以内に返信
-
status: waiting-for-triage
難易度 2/5 1〜3時間 初心者へのやさしさ 74/100
spring-projects/spring-boot#52347 ·
メンテナーはふだん 2 日以内に返信