CR #888
open[CR-075] POC-07 消費通知真機驗證發現:六類參數未實作(7-1~2)/收費退費未實作(7-3~4)/數位優先決無(7-7)/PUSH·LINE通道無真實實作(7-8~11)/取消退貨事件未見(7-5~6)
0%
Description
【發現情境】POC-07 消費通知 真機驗證(2026-10-24,notification-service 8097;品質 notification 136 測 0 失敗)。
已具備:樣板與變數驗證(樣板不存在 CC-NOT-1001/變數不足 CC-NOT-1003)、停用名單(曾永久退信或投訴者不再寄送)、
Email fromAddress 必填、授權核准事件通知(AuthApprovedListener)、SureNotify webhook(退信/投訴處理)。
以下為缺口/待驗證:
【消費通知六類參數 — 未實作(影響 7-1/7-2)】
- BRD 可設定參數:首年免收費註記、永久免收費註記、關閉每月退款功能、簡訊發給正卡人或持卡人、國外交易是否發送簡訊、發送簡訊金額。
- 程式查證(grep threshold/門檻/國外/正卡人/免收費/退款/1000)全部無結果 → 條件判斷無法設定,7-1「1,000 元以上發」與 7-2「500 元不發」皆不成立。
【收費與退費 — 未實作(7-3/7-4)】
- 需求:每月 28 日收 360 元;當期帳單滿 2 萬退 30 元。
- notification-service 查無收費/退費/「每月 28 日」排程邏輯(屬帳務範疇,需與 posting/statement 一併規劃)。
【數位優先決 — 未實作(7-7)】
- 查無「數位優先決/通路擇優」邏輯,亦無卡別(鼎鈦御卡)5,000 元門檻。
【PUSH/LINE 通道 — 未實作(7-8~7-11)】
- 程式註解明載:「PUSH/LINE 等通道無真實實作,亦無測試收件人概念」。
- 故 7-8 PUSH、7-9 LINE BC、7-10 LINE AOA、7-11 多通路併發皆無法成立;7-10 之「LINEPAY 卡綁定手機號碼」綁定關係亦未見。
【7-5/7-6 取消/退貨事件 — 未見】
- 事件監聽僅見
AuthApprovedListener(授權核准),未見取消/退貨交易之通知處理與抑制邏輯。
【可觀測性(附帶)】
- 本次未能成功送出一次通知:所需變數名稱未揭露、
details為空(與既有「服務層錯誤訊息被吞」同型態),不利整合與除錯。建議補樣板變數說明與錯誤 details。
【交付】docs/09-demo/poc-07-notification/(overview+7-1~7-11);證據 docs/08-evidence/POC-07_*;poc-flows/POC-07 已標「已驗證(部分)」。
RA Updated by Redmine Admin 1 day ago
【追蹤中(#A-389)】缺口:①消費通知六類參數(首年/永久免收費、關閉每月退款、簡訊發給正卡人或持卡人、國外交易是否發、發送簡訊金額)grep 全無 → 7-1/7-2 不成立;②收費 360 元與退費 30 元、每月 28 日排程未實作(7-3/7-4,屬帳務需併 posting/statement 規劃);③數位優先決(通路擇優+卡別 5000 門檻)未實作(7-7);④PUSH/LINE 通道無真實實作(程式註載)→ 7-8~7-11 不成立;⑤取消/退貨事件通知未見(僅 AuthApprovedListener)。附帶可觀測性:未能成功送出一次(變數名未揭露、details 空)。已具備:樣板/變數驗證(CC-NOT-1001/1003)、停用名單、Email fromAddress、SureNotify webhook、136 測 0 失敗。證據 docs/08-evidence/POC-07_*;動畫 docs/09-demo/poc-07-notification/。本 CR 暫不結案。
RA Updated by Redmine Admin about 19 hours ago
【GAP-003 登錄(2026-10-25,#A-396)】本 CR 之缺口已逐項整理進 docs/00-governance/GAP-003_功能補齊清單_CR-073-075-078.md:5 組(六類參數 M 為 7-x 共同前置/7-56 事件 M/7-7 優先決 M/7-811 stub 先行 M~L/7-3~4 跨帳務 L 建議與 5-11 同批設計)+可觀測性 S(樣板變數說明+details 補強,建議先行);須裁定:通道驗收可否以 stub+LOG 佐證。
RA Updated by Redmine Admin about 18 hours ago
【GAP-003② 可觀測性補強完成(2026-10-25,#A-396)】規格先行:SCS-016 v1.9 新增 §7.8.1「整合可觀測性」;契約重產(新端點+TemplateVariablesView,0 錯誤)。實作:①GET /api/v1/notification-templates/{templateCode}/variables——逐啟用通道列出必填變數(自內文解析、依出現序去重)+樣板變數說明,查無 → 404 CC-NOT-4040;②CC-NOT-1003 details 逐缺漏變數(field=variables.<名>)+requiredVariables 完整清單;③CC-NOT-1001 details 帶樣板代碼與端點指引(原 details 空)。品質:notification 138 測 0 失敗(+2)。真機(8097):variables → 200(AUTH_APPROVED 四通道:EMAIL/SMS 含 cardLast4、PUSH/LINE_BC 不含);查無 → 404;缺變數 → 422 details 四列;未知樣板 → 422 details 指引。證據 docs/08-evidence/CR-075_GAP003-2_可觀測性_20261025/。★ GAP-003② 完成;餘:六類參數、7-5/7-6 事件、7-7、7-811、7-34(見 GAP-003 清單)——CR 維持 In Progress。
RA Updated by Redmine Admin about 18 hours ago
【GAP-003⑤ 7-5/7-6 完成(2026-10-25,#A-396)】規格先行:SCS-016 v1.10 §7.15(事件×行為表);SDD-006 v1.28(posting.transaction.reversed.v1 payload 增可選 accountId/currency/txNo/merchantId——原無歸戶與幣別,通知端無從建單;不升版);V7 遷移新增 TXN_POSTED/TXN_REVERSED 樣板(SMS)。實作:TransactionNotificationService(路由決策權威:PURCHASE→TXN_POSTED/REFUND 抑制/reversed→TXN_REVERSED;冪等鍵=eventId;樣板缺失 WARN 不拋)+TransactionPostedListener(訂閱 cc.posting.transaction.posted/reversed)。品質:notification 144 測 0 失敗(+6)。真機(8087/8097):PURCHASE → 通知 97→98(TXN_POSTED);REFUND → 98 不變(INFO log「交易事件不發通知(依規則)」);沖正 → 98→99(TXN_REVERSED)。★ 如實記錄:通知 status=FAILED 係 SMS 通道未設定(既有通道限制),路由與建立皆成功;金額門檻等六類參數屬 7-1/7-2(GAP-003⑥⑦)。證據 docs/08-evidence/CR-075_7-5_7-6_通知事件_20261025/。下一步 GAP-003⑥(5-1 參數 CRUD,定義 A+B 骨架)。
RA Updated by Redmine Admin about 17 hours ago
【GAP-003⑦ 7-1/7-2 完成(2026-10-25,#A-396)】規格先行:SCS-016 v1.11 §7.16(六類參數表/CRUD 語意/發送決策);契約 141 端點 0 錯誤。實作:V8 通知參數表(六類;唯一索引沿用 V21 教訓)+NotificationParameter(值域檢核:布林/PRIMARY-SUPPLEMENTARY/非負門檻)+NotificationParameterService(upsert/list/停用 404)+shouldSendPurchaseSms(門檻 < 不發、SEND_OVERSEAS_SMS=false 且非 TWD 不發、未設參數維持既有行為)接入 TransactionNotificationService。品質:notification 152 測 0 失敗(+8)。真機(8097/8087):設門檻 100000+國外不發+收件人 PRIMARY(201×3、列出 3);7-1 1,200 元→通知 99→100;7-2 500 元→100 不變(log 未達門檻);USD→100 不變(log 國外不發);DELETE→200 INACTIVE、再刪→404;停用後 500 元恢復發送 100→101(證明「現行生效」語意)。★ 如實揭露:收件人切換僅儲存(通道層 ⑨);免收費/退款參數僅儲存(帳務批次 ⑪);國外判定以幣別為代理(事件未帶商戶國別)。證據 docs/08-evidence/CR-075_7-1_7-2_通知參數_20261025/。下一步 GAP-003⑧(7-7 數位優先決)。
RA Updated by Redmine Admin about 17 hours ago
【GAP-003⑧ 7-7 免費簡訊完成(2026-10-25,#A-396)】規格先行:SCS-016 v1.12 §7.17;契約 enum 擴充(141 端點 0 錯誤)。實作:DigitalFirstPolicy(純函式:卡等 ∈ FREE_SMS_CARD_TIERS 且金額 ≥ FREE_SMS_THRESHOLD(預設 5,000 元)→ 簡訊免費;卡等未知/未設清單/未達門檻 → 不免費,不臆測;卡等比對不分大小寫、清單可多值)+V9 擴充三類參數(CARD_TIER/FREE_SMS_CARD_TIERS/FREE_SMS_THRESHOLD)+路由記 LOG 佐證。品質:notification 159 測 0 失敗(+7)。真機(8097/8087):設三參數(201×3);6,000 元 → waived=true(reason:卡等 PLATINUM 且金額 ≥ 門檻 → 簡訊免費 BRD 7-7);4,000 元 → waived=false(未達門檻)。★ 如實揭露:①卡等暫由參數 CARD_TIER 提供(交易事件未帶卡等;正式應自 card-service 同步,列 ⑨);②「免費」為判定與紀錄,費用實際減免屬帳務(7-3/7-4,⑪)。證據 docs/08-evidence/CR-075_7-7_免費簡訊_20261025/。下一步 GAP-003⑨(7-8~11 通道 stub)。
RA Updated by Redmine Admin about 17 hours ago
【GAP-003⑨ 7-8~7-11 通道 stub 完成(2026-10-25,#A-396)】規格先行:SCS-016 v1.13 §7.18。根因:通道擇優(LINE_BC>LINE_AOA>PUSH>EMAIL>SMS)與 stand-in 通道(LoggingNotificationChannel 全通道可遞送+LOG)早已存在,缺的是①TXN_POSTED/TXN_REVERSED 僅 SMS 樣板(byChannel 選不到 PUSH/LINE)②resolver 對 PUSH/LINE 一律回 empty(無測試收件人概念)。實作:V10 補 6 樣板(PUSH 200/LINE 1000 字元上限內);resolver 增 push/line-bc/line-aoa 測試收件人(預設空=誠實失敗、設定記 WARN、絕不可用於 SIT/UAT/PROD)。品質:notification 160 測 0 失敗(+1)。真機(8097):V10 套用、啟動 WARN 顯示三通道已設;7-8 PUSH→[PUSH] SENT;7-9 LINE_BC→[LINE_BC] SENT;7-10 LINE_AOA→[LINE_AOA] SENT;7-11 →[LINE_BC,LINE_AOA,PUSH] 三筆遞送 SENT;皆不含 SMS;[stand-in] 遞送成功 LOG 佐證(未呼叫真實閘道)。★ 如實揭露:真實 PUSH/LINE 閘道屬外部依賴;7-10 之 LINEPAY 卡↔手機綁定關係未實作(以測試收件人代替)。證據 docs/08-evidence/CR-075_7-8至7-11_通道_20261025/。下一步 GAP-003⑩(5-9/5-10 商戶請款)。
RA Updated by Redmine Admin about 14 hours ago
h2. GAP-003⑫ 完成:7-3/7-4 通知服務費收費與退費(2026-10-25,#A-396)
緣由:BRD-004 POC-07 業務流程末端為「每月 28 日收費 → 當期帳單滿 2 萬退 30 元」,驗收標準為「收費與退費金額正確計入帳單」。原實作無收費、無退費、無排程。
h3. 交付
- 端點:@POST /api/v1/notification-fee-billings@(@accountIds[]@/@businessDate?@/@currency?@),可重跑且冪等。
- 規則:每月 28 日 @FEE@ 360 元(@PERMANENT_FEE_WAIVER=true@ 免收);當期帳單 ≥ 2 萬元 且 @DISABLE_MONTHLY_REFUND=false@ → @REBATE@ 30 元。
-
新增交易型別 @REBATE@(
SubAccount.FEE、sign −1)——@REFUND@ 綁原交易五規則(CR-0735-7)、@ADJUSTMENT@ 為 +1(增加欠款)、@REWARD_REDEEM@/@CHARGEBACK@ 語意不符;@V14@ 擴充 @CK_TRANSACTIONS_TX_TYPE@。 - 架構:@notification → posting@ 由「無同步呼叫」新增為 @S@(@SAD-002 §5@ 新增呼叫者列+ACL 重產)。
- 規格:@SCS-016 §7.19@/@SDD-006 v1.32@;決策 D-055;契約 146 端點 0 錯誤。
h3. 真機驗證
| 帳戶 | 當期帳單 | 收費 | 退費 | 判定 |
| @…0003@ | 1,490,734(14,907 元) | 36,000 | 0 | 7-4 正確 |
| @…0010@ | 10,033,822,032 | 36,000 | 3,000 | 7-3 正確 |
批次共跑 3 次,DB 僅 @FEE 2 筆(72,000)+REBATE 1 筆(3,000)@——無重複收退。
h3. ★ 實測挖出的兩個問題(皆已修)
我的查證失誤:以 @search_condition_vc LIKE '%TX_TYPE%'@ 查 CHECK 只回 NOT NULL,誤判「@tx_type@ 無值域約束」→ 直接新增 @REBATE@ → 真機 @ORA-02290@。實際約束 @CK_TRANSACTIONS_TX_TYPE@ 的條件文字是 @tx_type IN (…)@(不含 @TX_TYPE@ 字樣),大小寫敏感 LIKE 漏抓。→ @V14@ 補值域。查證工具本身也要被驗證。¶
@posting.post()@ 對重複冪等鍵是「回 409 拒絕」,不是「重播」(只有 @reverse()@ 重播)。原本假設會重播 → 批次重跑全部 409 失敗。→ 兩端客戶端(notification/installment)把 409 視為「已入帳」。¶
h3. 併同修正
@PostingEventFactoryTest@ 自 CR-075 7-5 起就是紅的(payload 欄數斷言未隨新增欄位更新)——當時只編譯 posting、未跑其測試。已補為完整欄位斷言(10 欄)。
h3. 如實揭露
@FIRST_YEAR_FEE_WAIVER@(首年免收)未實作——需「開戶日」,通知服務無此資料。¶
收費 360/退費 30 為常數(BRD 未要求可調)。¶
帳戶清單由呼叫端提供(正式應由帳戶主檔批次驅動)。¶
「當期帳單金額」取 posting 之 @totalAmount@(帳戶總欠款),非嚴格「當期帳單」;若客戶要求嚴格口徑需改接 @statement@。¶
h3. 證據
@docs/08-evidence/CR-075_7-3_7-4_收費退費_20261025/@(README+4 份原始輸出)
h3. 進度
CR-075 之 5 組缺口全部收斂(7-1/7-2、7-5/7-6、7-7、7-8~7-11、7-3/7-4)。