Skip to content

feat: 周期账单支持选择货币 (#444) - #446

Merged
TNT-Likely merged 2 commits into
mainfrom
claude/issue-444-6c0b0e
Aug 17, 2026
Merged

feat: 周期账单支持选择货币 (#444)#446
TNT-Likely merged 2 commits into
mainfrom
claude/issue-444-6c0b0e

Conversation

@TNT-Likely

Copy link
Copy Markdown
Owner

Closes #444

问题

周期账单从来没有币种概念,三处叠加导致外币周期账单根本记不了:

  1. 编辑页账户候选被硬过滤成「= 账本本位币」(recurring_transaction_edit_page.dart 旧 672 行)→ 外币账户选不到;
  2. 没有记账页那样的手选币种入口(多币种设计 L12「无账户手选币种」),周期页缺失;
  3. 生成器调 addTransaction 不传 currencyCode,靠 repo 从账户兜底 —— 而账户又只能是本位币 → 生成的交易永远落本位币。

多币种 phase 2 的技术设计里其实已经预设了「周期模板挂外币账户」这条路径(02-tech-design-app.md §兜底),只是编辑页的老过滤把入口焊死了。

改动

改动
DB v32:recurring_transactions.currency_code(可空)。不回填 —— NULL = 账本本位币,存量模板行为一字不差
Repository add/updateRecurringTransactioncurrencyCode(接口 + 本地实现 + LocalRepository 委托),统一大写存储
生成器 有账户 → 以账户币种为准(账户内不混币,§4.1);无账户 → 用模板币种;nativeAmount 不传,由 repo 按生成当日有效汇率折算
编辑页 新增「币种」字段(复用 showCurrencyPickerSheet);币种优先联动:改币种即按新币种过滤账户候选并清空已选账户
列表页 外币模板在金额左侧标 ISO 码
配置导出/导入 currency_code 往返

几个刻意的取舍

  • 汇率不锁在模板上:周期账单的语义是「每月 10 美元」,不是「每月固定 72 元」,所以每次生成按当日有效汇率折算,编辑页也不展示折算预览(免得暗示"这笔换算已定")。生成当时若本地无该币种汇率 → nativeAmount 回落 = amount,正好命中 L11 检测条件,统计页「按当前汇率重算」横幅可捞回。
  • 列表页标 ISO 码而不是币种符号:JPY 和 CNY 的符号都是「¥」,只换符号的话 5000 日元和 5000 元长得一模一样(这条是真机上发现的,一开始写的是 showCurrency)。
  • 跨币种转账仍不支持(§4.4):转账两端按同一有效币种过滤,天然同币种;该币种没有可选转入账户时给一句空态,不让用户对着空白弹窗猜。
  • 顺手修了 _selectAccountcurrentLedgerIdProvider 而不是页面上所选账本的老问题。

周期账单不参与云同步(只进 config 导出/导入),服务端零改动

验证

  • flutter test 全绿:620 passed(新增 11 条)
    • test/services/data/recurring_transaction_currency_test.dart:外币模板落币种 + 按当日汇率折算 / 无汇率回落 / 模板币种为 null 保持存量 / 挂外币账户 / 模板币种与账户币种漂移时以账户为准 / v32 列可空
    • test/widgets/recurring_edit_currency_test.dart:币种字段默认本位币、外币回显、账户候选按有效币种过滤(核心修复)、本位币模板旧行为不回归
    • test/data/sync_pull_errors_schema_test.dart 的 schemaVersion 守卫同步到 32
  • iOS 模拟器真机走查(iPhone 16 / iOS 18.6,全新干净设备):新建周期账单 → 币种字段渲染正常 → 选日元 → 存 5000 → 列表显示 JPY -5,000

周期账单此前完全没有币种概念:编辑页的账户候选被硬过滤成「账本本位币」,
外币账户根本选不到;也没有记账页那样的手选币种入口(L12),生成的交易
永远落本位币。

- DB v32:`recurring_transactions.currency_code`(可空,NULL = 账本本位币,
  不回填 → 存量模板行为一字不差)
- 编辑页:新增币种字段(复用 showCurrencyPickerSheet);币种优先联动 ——
  改币种即按新币种过滤账户候选并清空已选账户;账户过滤同时修掉「读
  currentLedgerId 而非所选账本」的老问题
- 生成器:有账户以账户币种为准(账户内不混币),无账户用模板币种;
  nativeAmount 不锁在模板上,每次生成按当日有效汇率折算 —— 周期账单的
  语义是「每月 10 美元」,不是「每月固定 72 元」
- 列表页:外币模板金额前带币种符号
- 配置导出/导入:currency_code 往返

跨币种转账仍不支持(多币种设计 §4.4):转账两端按同一有效币种过滤,
天然同币种。周期账单不参与云同步,服务端零改动。
真机走查发现:JPY 和 CNY 的 getCurrencySymbol 都是「¥」,只换符号的话
5000 日元和 5000 元长得一模一样,等于没标 —— 改成金额左侧标 ISO 码。
@TNT-Likely
TNT-Likely force-pushed the claude/issue-444-6c0b0e branch from 39bdad7 to cdc2d8e Compare August 17, 2026 01:57
@TNT-Likely
TNT-Likely merged commit 890f36a into main Aug 17, 2026
@TNT-Likely
TNT-Likely deleted the claude/issue-444-6c0b0e branch August 17, 2026 02:02
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.

[Feature] 週期帳單不支持選擇貨幣

1 participant