Project

General

Profile

Actions

CR #898

open
RA

[CR-083] 額度「佔用 → 已用」之跨服務缺口(消費不會推升 `used_amount`)

CR #898: [CR-083] 額度「佔用 → 已用」之跨服務缺口(消費不會推升 `used_amount`)

Added by Redmine Admin about 15 hours ago. Updated about 15 hours ago.

Status:
New
Priority:
P1-High
Assignee:
-
Target version:
-
Start date:
Due date:
% Done:

0%

Estimated time:
Story Points:

Description

h2. 來源文件
/Users/ecsrevamp/Documents/GitHub/WorkBuddy/cardcore/docs/05-change-requests/CR-083_額度佔用結算(佔用→已用)之跨服務缺口.md

h2. 摘要(節錄自文件)

項目 內容
文件編號 CR-083
版本 1.0
日期 2026-10-25
提出者 WorkBuddy AI(開發團隊)
緣起 CR-073 GAP-003⑪-1(5-11 每期出帳)之事實查證(GAP-003 §1.5 B)
狀態 待 BEAM PMO 核定(本文件為提案)
影響範圍 limit-service(主要)、installment-service(消費端)、authorization-service(未來)、契約、SCS-002、ACL
關聯 CR-073 #886、SCS-002、SCS-009 §7.8、SDD-001 §3.4、SDD-005 §3

1. 現象(不是推論,是實查)

目前專案中沒有任何路徑會因為「消費」而增加 CC_LIM.ACCOUNT_LIMITS.USED_AMOUNT。

查證項 實查結果
LimitRepository 之寫入方法 createHold/releaseHold/restoreUsedAmount(減)/reoccupyUsedAmount(加,但語意為「繳款沖正後重新佔用」)/applyAdjustedAmount/raiseTemporary/lowerTemporary
LimitController 之端點 只有 5 個:查帳戶額度、查載具額度、建佔用、查專用額度適用、釋放佔用——無 settle/consume
restoreUsedAmount/reoccupyUsedAmount 之呼叫者 僅 JdbcPaymentPostedProjectionRepository(繳款入帳→恢復)與 JdbcPaymentReoccupyProjectionRepository(繳款沖正→重新佔用)
PostingTransactionPostedListener(limit 端) 只做 8-6 專用額度迄日校正(CR-035 §2.4),不更新 used_amount
StatementIssuedListener(limit 端) 只做 8-6 迄日校正,不更新 used_amount

後果:used_amount 在現行系統中只會「因繳款而減少、因繳款沖正而加回」,
不會因刷卡/分期出帳而增加——它是一個只降不升的欄位。

2. 影響

# 影響 嚴重度
1 BRD-004 5-11「出帳金額佔卡人額度」無法成立(CR-073 唯一未交付條文) 高(POC 驗收項)
2 可用額度之計算失真:available = permanent + temporary − used − hold。消費若只留在 hold,則交易一旦被「釋放」(取消/逾期)額度就全回來,已實際消費的金額從未計入已用 高(資金風險)
3 帳單金額與額度已用不一致:帳單有金額、used_amount 卻沒動 → 對帳差異無法解釋 高
4 CC_LIM 之 used_amount 實質成為「歷史殘值」,報表/風控引用即失真 中

⚠️ 第 2 點意味著本缺口不只影響 5-11,而是全專案消費鏈路的共同缺口。

3. 選項與建議

完整內容以版本受控文件為準(GOV-008 §2 單一真實來源)。

RA Updated by Redmine Admin about 15 hours ago Actions #1

h2. 實作完成並閉環(2026-10-25,#A-396)

狀態:由「待核定」→ 已實作並真機驗證。

h3. 交付

  • 端點:@POST /api/v1/limit-holds/{holdId}/settlements@(body @{amount}@)——@released_amount += n@、@settled_amount += n@、@used_amount += n@(兩步同交易)→ 淨效果 @available@ 不變(消費不應讓可用額度回升)。
  • 遷移:@V22@ 加 @SETTLED_AMOUNT@(@CHECK settled <= released@)。
  • ★ @V23@ 修既有潛在缺陷:@LIMIT_HOLDS.STATUS@ 為 @VARCHAR2(16)@,但 CHECK 宣告之 @'PARTIALLY_RELEASED'@ 長 18 → 永遠寫不進去(@ORA-12899@)。既有 @releaseHold@ 之 SQL 為 @ELSE status END@(部分釋放保留 @HELD@),故從未寫入該值、長期未浮現;本 CR 首次寫入即撞牆。→ 放寬至 @VARCHAR2(24)@(值域/CHECK 不變)。
  • 消費端:@installment@ 出帳由 @release@ 改 @settle@,使 BRD-004 5-11「出帳金額佔卡人額度」成立。
  • 規格:@SCS-002 §7.23@、@SDD-006 v1.31@(@CC-LIM-3001@ 描述擴充)、@SCS-009 §7.8@;決策 D-054;契約 145 端點 0 錯誤。

h3. 真機驗證(8 項)

出帳前:@used=200,000@、@hold=1,073,334@、@avail=8,726,666@

出帳 @2027-01-25@:11 期中 10 成功、1 期失敗(見下)

出帳後:@used=473,334@、@hold=800,000@、@avail=8,726,666@(不變)

失敗那期:500 @ORA-12899@ → 修正後以 API 重放 200 成功(@used@ 再 +400,000)

超額/已全釋放 → 409 @CC-LIM-3001@

查無 hold → 409 @CC-LIM-3001@

純 @releases@ → @used@ 不變(既有語意未回歸)

DB:@E56DB478@/@0816869F@ 之 @settled=0@(取消交易→純釋放)、@625497A6@ 之 @settled=13,334@(出帳→結算)——同一欄位可區分

h3. 如實揭露

未發射 @limit.hold.settled@ 事件——下游(報表/風控)目前只能靠查詢得知。

@used_amount@ 之既有殘值不追認(如 @…0003@ 的 200,000),未重算。

@authorization@ 之「授權→請款→已用」鏈路未改——本 CR 只讓 @installment@ 使用 settle,授權端仍 hold→release,屬另案。

驗證在開發 DB 產生真實 @used@/@hold@ 變動,未清理。

h3. 證據
@docs/08-evidence/CR-083_佔用結算_20261025/@(README+4 份原始輸出)

h3. 影響
@CR-073@ 之 8/8 缺口全部收斂(5-11 之 ⑪-1+⑪-2 完成)。

Actions

Also available in: PDF Atom