diff --git a/README.md b/README.md index 622084c..e9a46fb 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ - 海通证券 - 中国工商银行 - Toronto-Dominion Bank +- Bank of Montreal 目前记账语言支持: @@ -26,6 +27,7 @@ htsec htsec icbc icbc td td + bmo bmo ``` ## 安装 @@ -123,6 +125,16 @@ double-entry-generator translate \ ./example/td/example-td-records.csv ``` +#### Bank of Montreal + +```bash +double-entry-generator translate \ + --config ./example/bmo/credit/config.yaml \ + --provider bmo \ + --output ./example/bmo/credit/example-bmo-output.beancount \ + ./example/bmo/credit/example-bmo-records.csv +``` + ### Ledger #### 支付宝 @@ -190,6 +202,17 @@ double-entry-generator translate \ ./example/td/example-td-records.csv ``` +#### Bank of Montreal + +```bash +double-entry-generator translate \ + --config ./example/bmo/debit/config.yaml \ + --provider bmo \ + --target ledger \ + --output ./example/bmo/debit/example-bmo-output.ledger \ + ./example/bmo/debit/example-bmo-records.csv +``` + ## 账单下载与格式问题 ### 支付宝 @@ -279,6 +302,19 @@ double-entry-generator translate \ + Beancount 转换的结果示例: [example-td-out.beancount](./example/td/example-td-output.beancount) + Ledger 转换的结果示例: [example-td-out.ledger](./example/td/example-td-output.ledger) +### Bank of Montreal + +1. 登录 BMO 网页版本: https://www.bmo.com/en-ca/main/personal/ +2. 选择指定账户 +3. Transactions -> Download 选择时间范围 + +#### 格式示例 + +[example-bmo-record.csv](./example/bmo/debit/example-bmo-records.csv) + ++ Beancount 转换的结果示例: [example-bmo-out.beancount](./example/bmo/debit/example-bmo-output.beancount) ++ Ledger 转换的结果示例: [example-bmo-out.ledger](./example/bmo/debit/example-bmo-output.ledger) + ## 配置 ### 支付宝 @@ -761,6 +797,64 @@ TD账单中的记账金额中存在收入/支出之分,通过这个机制就 | 收入 | targetAccount | defaultCashAccount | | 支出 | defaultCashAccount | targetAccount | +#### Bank of Montreal + +
+ + BMO银行配置文件示例 + + +```yaml +defaultMinusAccount: Assets:FIXME +defaultPlusAccount: Expenses:FIXME +defaultCashAccount: Assets:DebitCard:BMOChequing +defaultCurrency: CAD +title: 测试 +bmo: + rules: + - item: "T T" + targetAccount: Expenses:Grocery + tag: tt_tag + - item: "DOLLARAMA" + targetAccount: Expenses:Grocery + tag: grocery_tag1,cheap_tag2 + - item: "DEVELOPM MSP" + targetAccount: Income:Salary + - type: 收入 + item: "SEND E-TFR" + targetAccount: Income:FIXME + +``` + +

+ +`defaultMinusAccount`, `defaultPlusAccount`, `defaultCashAccount` 和 `defaultCurrency` 是全局的必填默认值。其中 `defaultMinusAccount` 是默认金额减少的账户,`defaultPlusAccount` 是默认金额增加的账户, `defaultCashAccount` 是该配置中默认使用的银行卡账户(等同于支付宝/微信中的 `methodAccount` )。 `defaultCurrency` 是默认货币。 + +`bmo` 是 Toronto-Dominion Bank相关的配置。它提供基于规则的匹配。因为BMO本身的账单较简单,所以可以指定的规则不多: +- `item`:(交易商品)的完全/包含匹配。 +- `type`:(收/支)的完全/包含匹配。 + +在单条规则中可以使用分隔符 `sep` 填写多个关键字,在同一对象中,每个关键字之间是或的关系。 + +在单条规则中可以使用 `fullMatch` 来设置字符匹配规则,`true` 表示使用完全匹配(full match),`false` 表示使用包含匹配(partial match),不设置该项则默认使用包含匹配。 + +在单条规则中可以使用 `tag` 来设置流水的 [Beancount Tag](https://beancount.github.io/docs/beancount_language_syntax.html#tags)或[Ledger Meta Tag](https://ledger-cli.org/doc/ledger3.html#Metadata-tags),使用 `sep` 作为分隔符。 + +在单条规则中可以使用 `ignore` 来设置是否忽略匹配上该规则的交易,`true` 表示忽略匹配上该规则的交易,`fasle` 则为不忽略,缺省为 `false` 。 + +匹配成功则使用规则中定义的 `targetAccount` 账户覆盖默认定义账户。 + +规则匹配的顺序是:从 `rules` 配置中的第一条开始匹配,如果匹配成功仍继续匹配。也就是后面的规则优先级要**高于**前面的规则。 + +BMO账单中的记账金额中存在收入/支出之分,通过这个机制就可以判断银行卡账户在交易中的正负关系。如支付宝配置类似,匹配成功则使用规则中定义的 `targetAccount` 和全局值 `defaultCashAccount` ,并通过确认该笔交易是收入还是支出,决定 `targetAccount` 和 `defaultCashAccount` 的正负关系,来覆盖默认定义的增减账户。 + +`targetAccount` 与 `defaultCashAccount` 的增减账户关系如下表: + +| 收/支 | minusAccount | plusAccount | +| ----- | ------------------ | ------------------ | +| 收入 | targetAccount | defaultCashAccount | +| 支出 | defaultCashAccount | targetAccount | + ## Special Thanks - [dilfish/atb](https://github.com/dilfish/atb) convert alipay bill to beancount version