Skip to content

fix(split-meow): 混幣行程顯示警告並停止跨幣別錯誤加總#449

Merged
s123104 merged 1 commit into
mainfrom
fix/split-meow-mixed-currency
Jun 26, 2026
Merged

fix(split-meow): 混幣行程顯示警告並停止跨幣別錯誤加總#449
s123104 merged 1 commit into
mainfrom
fix/split-meow-mixed-currency

Conversation

@s123104

@s123104 s123104 commented Jun 26, 2026

Copy link
Copy Markdown
Contributor

背景

Codex 三方 review(Q3)發現 split-meow 的 production bug(已隨 #445 上線):當同一行程記到多種幣別(使用者在 Settings 中途切換全域幣別)時,totalSpent/balances/settlements 直接把不同幣別的數字相加,並以單一幣別標籤顯示——產生看似精準實則錯誤的總額與結算,Codex 評為「比沒有總額更糟」。

註:tripCurrency = tripExpenses[length-1] 取的是最舊一筆(store prepend),這與註解「trip 建立時的幣別」意圖一致,非 bug;真正問題是跨幣別加總。

修法(最小生產級安全修復)

  • 偵測 isMixedCurrency(trip 內出現 >1 種幣別)。
  • 混幣時:隱藏單一總額與結算區塊,改顯示警告(四語系 zh-TW/en/ko/ja),引導改用單一幣別記帳。
  • 分享/匯出文字同步以警告取代錯誤總額與結算。
  • per-expense 個別金額顯示維持正確(各自快照幣別),不受影響。
  • 單一幣別行程(常態)行為完全不變。

完整 mixed-currency UX(按幣別分組 vs 換算成 base currency)為產品決策,Codex 已列為待拍板,本 PR 先止血避免顯示錯誤數字。

驗證

  • split-meow typecheck ✓ · vitest HomeAndHistorySmoke 19 tests(含 2 新混幣/單幣測試)✓
  • changeset @app/split-meow patch

🤖 Generated with Claude Code

- 偵測 trip 內多幣別時隱藏單一總額與結算,改顯示警告(四語系)
- 跨幣別直接相加 totalSpent/settlements 為無效運算,避免顯示誤導金額
- 分享文字同步以警告取代錯誤總額與結算
- 補 HistoryTab 混幣/單幣行程行為測試(Codex review Q3)

測試:split-meow typecheck 通過;vitest HomeAndHistorySmoke 19 tests 通過
@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Deprecation Warning: The deny-licenses option is deprecated for possible removal in the next major release. For more information, see issue 997.

Dependency Review

✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.

Scanned Files

None

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8d6d91c5e0

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".


{/* 結清方式 */}
{settlements.length > 0 && (
{settlements.length > 0 && !isMixedCurrency && (

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Hide balances when currency is mixed

這裡只用 !isMixedCurrency 隱藏「結清方式」,但同一個 balances 物件接著仍會渲染「各人結算」並在摘要與展開合計中用 tripCurrency 格式化跨幣別相加後的 amount。當同一行程同時有 TWD 與 KRW 費用時,使用者雖看不到總額與 settlement,仍會看到錯誤的應收/應付金額,保留了這次修復要避免的誤導性結算結果。

Useful? React with 👍 / 👎.

// 取得單筆記錄的顯示幣別(優先使用記帳當下快照,舊資料 fallback 主導幣別)。
const expenseCurrency = (exp: ExpenseRecord): CurrencyCode => exp.currency ?? tripCurrency;
// 混幣行程:跨幣別直接相加的總額與結算為無效運算,改顯示警告而非誤導數字。
const isMixedCurrency = new Set(tripExpenses.map((exp) => expenseCurrency(exp))).size > 1;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Treat legacy expenses as TWD in mixed-currency detection

isMixedCurrency 透過 expenseCurrency(exp) 判斷,但舊 expense 沒有 currency 時會 fallback 到 tripCurrency;若使用者從舊版 TWD 資料升級後切到 KRW 並新增費用,最舊那筆無 currency 的資料會被當成目前的 KRW,Set 只剩一種幣別,混幣警告不會出現,總額與結算又會把 TWD 與 KRW 直接相加。store 的型別註解已說舊資料缺欄位應視為 TWD,因此偵測時需要用 TWD 作為 legacy fallback。

Useful? React with 👍 / 👎.

@s123104 s123104 merged commit 9de159a into main Jun 26, 2026
16 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant