Giter VIP home page Giter VIP logo

deb-sig / double-entry-generator Goto Github PK

View Code? Open in Web Editor NEW
516.0 6.0 78.0 1.97 MB

Rule-based double-entry bookkeeping importer (from Alipay/WeChat/Huobi etc. to Beancount/Ledger).

Home Page: https://github.com/deb-sig/double-entry-generator

License: Apache License 2.0

Go 82.24% Makefile 3.23% Shell 8.13% Nix 0.59% HTML 4.71% JavaScript 1.11%
alipay-records beancount wechat alipay double-entry-accounting double-entry-bookkeeping hacktoberfest ledger

double-entry-generator's Introduction

double-entry-generator

根据账单生成复式记账语言的代码。目前账单支持:

  • 支付宝
  • 微信
  • 火币-币币交易
  • 海通证券
  • **工商银行
  • Toronto-Dominion Bank
  • Bank of Montreal

目前记账语言支持:

  • BeanCount
  • Ledger

架构支持扩展,如需支持新的账单(如银行账单等),可添加 provider。如需支持新的记账语言,可添加 compiler

┌───────────┐  ┌──────────┐  ┌────┐  ┌──────────┐  ┌──────────┐
│ translate │->│ provider │->│ IR │->│ compiler │->│ analyser │
└───────────┘  └──────────┘  └────┘  └──────────┘  └──────────┘
                  alipay               beancount      alipay
                  wechat               ledger         wechat
                  huobi                               huobi
                  htsec                               htsec
                  icbc                                icbc
                  td                                  td
                  bmo                                 bmo

安装

Homebrew

使用 Homebrew 安装:

brew install deb-sig/tap/double-entry-generator

使用 Homebrew 更新软件:

brew upgrade deb-sig/tap/double-entry-generator

二进制安装

GitHub Release 页面中下载相应架构的二进制文件到本地即可。

源码安装

go get -u github.com/deb-sig/double-entry-generator

使用

请见使用文档

示例

Beancount

支付宝

double-entry-generator translate \
  --config ./example/alipay/config.yaml \
  --output ./example/alipay/example-alipay-output.beancount \
  ./example/alipay/example-alipay-records.csv

其中 --config 是配置文件,默认情况下,使用支付宝作为提供方,也可手动指定 --provider。具体参考使用文档。默认生成的文件是 default_output.beancount,若有 --output-o 指定输出文件,则会输出到指定的文件中。如上述例子会将转换结果输出至 ./example/alipay/example-alipay-output.beancount 文件中。

微信

double-entry-generator translate \
  --config ./example/wechat/config.yaml \
  --provider wechat \
  --output ./example/wechat/example-wechat-output.beancount \
  ./example/wechat/example-wechat-records.csv

Huobi Global (Crypto)

double-entry-generator translate \
  --config ./example/huobi/config.yaml \
  --provider huobi \
  --output ./example/huobi/example-huobi-output.beancount \
  ./example/huobi/example-huobi-records.csv

海通证券

double-entry-generator translate \
  --config ./example/htsec/config.yaml \
  --provider htsec \
  --output ./example/htsec/example-htsec-output.beancount \
  ./example/htsec/example-htsec-records.xlsx

**工商银行

double-entry-generator translate \
  --config ./example/icbc/credit/config.yaml \
  --provider icbc \
  --output ./example/icbc/credit/example-icbc-credit-output.beancount \
  ./example/icbc/credit/example-icbc-credit-records.csv

Toronto-Dominion Bank

double-entry-generator translate \
  --config ./example/td/config.yaml \
  --provider td \
  --output ./example/td/example-td-output.beancount \
  ./example/td/example-td-records.csv

Bank of Montreal

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

支付宝

double-entry-generator translate \
  --config ./example/alipay/config.yaml \
  --target ledger \
  --output ./example/alipay/example-alipay-output.ledger \
  ./example/alipay/example-alipay-records.csv

微信

double-entry-generator translate \
  --config ./example/wechat/config.yaml \
  --provider wechat \
  --target ledger \
  --output ./example/wechat/example-wechat-output.ledger \
  ./example/wechat/example-wechat-records.csv

Huobi Global (Crypto)

double-entry-generator translate \
  --config ./example/huobi/config.yaml \
  --provider huobi \
  --target ledger \
  --output ./example/huobi/example-huobi-output.ledger \
  ./example/huobi/example-huobi-records.csv

海通证券

double-entry-generator translate \
  --config ./example/htsec/config.yaml \
  --provider htsec \
  --target ledger \
  --output ./example/htsec/example-htsec-output.ledger \
  ./example/htsec/example-htsec-records.xlsx

**工商银行

double-entry-generator translate \
  --config ./example/icbc/credit/config.yaml \
  --provider icbc \
  --target ledger \
  --output ./example/icbc/credit/example-icbc-credit-output.ledger \
  ./example/icbc/credit/example-icbc-credit-records.csv

Toronto-Dominion Bank

double-entry-generator translate \
  --config ./example/td/config.yaml \
  --provider td \
  --target ledger \
  --output ./example/td/example-td-output.ledger \
  ./example/td/example-td-records.csv

Bank of Montreal

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

账单下载与格式问题

支付宝

下载方式

v1.0.0 及以上的版本请参考此文章获取支付宝账单。

v0.2.0 及以下版本请使用此方式获取账单:登录 PC 支付宝后,访问 这里,选择时间区间,下拉到页面底端,点击下载查询结果。注意:请下载查询结果,而非收支明细

格式示例

example-alipay-records.csv

此示例为从「支付宝」APP 获取的账单格式。

转换后的结果示例:exmaple-alipay-output.beancount.

微信

下载方式

微信支付的下载方式见此

格式示例

example-wechat-records.csv

转换后的结果示例:exmaple-wechat-output.beancount.

Huobi Global (Crypto)

目前该项目只保证币币交易订单的转换,暂未测试合约、杠杆等交易订单。

PR welcome :)

下载方式

登录火币 Global 网站,进入币币订单的成交明细页面,选择合适的时间区间后,点击成交明细右上角的导出按钮即可。

格式示例

exmaple-huobi-records.csv

转换后的结果示例:exmaple-huobi-output.beancount.

海通证券

下载方式

登录e海通财PC独立交易版PC客户端,左侧导航栏选择查询-交割单,右侧点击查询按钮导出交割单excel文件。

格式示例

example-htsec-records.csv

转换后的结果示例:exmaple-htsec-output.beancount.

**工商银行

下载方式

**工商银行账单的下载方式见此

格式示例

double-entry-generator 能够自动识别出**工商银行的账单类型(借记卡/信用卡)。

借记卡账单示例: example-icbc-debit-records.csv

借记卡账单转换后的结果示例:example-icbc-debit-output.beancount.

信用卡账单示例: example-icbc-credit-records.csv

信用卡账单转换后的结果示例:example-icbc-credit-output.beancount.

Toronto-Dominion Bank

  1. 登录TD 网页版本: https://easyweb.td.com/
  2. 点击指定的账户
  3. 选择账单范围 -> "Select Download Format" -> Spreadsheet(.csv) -> Download

格式示例

example-td-records.csv

Bank of Montreal

  1. 登录 BMO 网页版本: https://www.bmo.com/en-ca/main/personal/
  2. 选择指定账户
  3. Transactions -> Download 选择时间范围

格式示例

example-bmo-record.csv

京东

  1. 打开京东手机 APP
  2. 前往我的 -> 我的钱包 -> 账单
  3. 点击右上角 Icon(三条横杠)
  4. 选择“账单导出(仅限个人对账)”

格式示例

example-jd-records.csv

配置

支付宝

支付宝配置文件示例
defaultMinusAccount: Assets:FIXME
defaultPlusAccount: Expenses:FIXME
defaultCurrency: CNY
title: 测试
alipay:
  rules:
    - category: 日用百货
      targetAccount: Expenses:Groceries
    - category: 餐饮美食
      time: 11:00-14:00
      targetAccount: Expenses:Food:Lunch
    - category: 餐饮美食
      time: 16:00-22:00
      targetAccount: Expenses:Food:Dinner

    - peer: 滴露
      targetAccount: Expenses:Groceries
    - peer: 苏宁
      targetAccount: Expenses:Electronics
    - item: 相互宝
      targetAccount: Expenses:Insurance

    - method: 余额
      fullMatch: true
      methodAccount: Assets:Alipay
    - method: 余额宝
      fullMatch: true
      methodAccount: Assets:Alipay
    - method: 招商银行(9876)
      fullMatch: true
      methodAccount: Assets:Bank:CN:CMB-9876:Savings

    - type: 收入 # 其他转账收款
      targetAccount: Income:FIXME
      methodAccount: Assets:Alipay
    - type: 收入 # 收款码收款
      item: 商品
      targetAccount: Income:Alipay:ShouKuanMa
      methodAccount: Assets:Alipay

    # 交易类型为其他
    - type: 其他
      item: 收益发放
      methodAccount: Income:Alipay:YuEBao:PnL
      targetAccount: Assets:Alipay
    - type: 其他
      item: 余额宝-单次转入
      targetAccount: Assets:Alipay
      methodAccount: Assets:Alipay

    - peer: 基金
      type: 其他
      item: 黄金-买入
      methodAccount: Assets:Alipay
      targetAccount: Assets:Alipay:Invest:Gold
    - peer: 基金
      type: 其他
      item: 黄金-卖出
      methodAccount: Assets:Alipay:Invest:Gold
      targetAccount: Assets:Alipay
      pnlAccount: Income:Alipay:Invest:PnL
    - peer: 基金
      type: 其他
      item: 买入
      methodAccount: Assets:Alipay
      targetAccount: Assets:Alipay:Invest:Fund
    - peer: 基金
      type: 其他
      item: 卖出
      methodAccount: Assets:Alipay:Invest:Fund
      targetAccount: Assets:Alipay
      pnlAccount: Income:Alipay:Invest:PnL

defaultMinusAccount, defaultPlusAccountdefaultCurrency 是全局的必填默认值。其中 defaultMinusAccount 是默认金额减少的账户,defaultPlusAccount 是默认金额增加的账户。 defaultCurrency 是默认货币。

alipay is the provider-specific configuration. Alipay provider has rules matching mechanism.

alipay 蚂蚁账单相关的配置。它提供基于规则的匹配。可以指定:

  • peer(交易对方)的完全/包含匹配。
  • item(商品说明)的完全/包含匹配。
  • type(收/支)的完全/包含匹配。
  • method(收/付款方式)的完全/包含匹配。
  • category(交易分类)的完全/包含匹配。
  • time(交易时间)的区间匹配。

    交易时间可写为以下两种形式:

    • 11:00-13:00
    • 11:00:00-13:00:00 24 小时制,起始时间和终止之间之间使用 - 分隔。

在单条规则中可以使用分隔符(sep)填写多个关键字,在同一对象中,每个关键字之间是或的关系。

在单条规则中可以使用 fullMatch 来设置字符匹配规则,true 表示使用完全匹配(full match),false 表示使用包含匹配(partial match),不设置该项则默认使用包含匹配。

在单条规则中可以使用 tag 来设置流水的 Tag,使用 sep 作为分隔符。

在单条规则中可以使用 ignore 来设置是否忽略匹配上该规则的交易,true 表示忽略匹配上该规则的交易,fasle 则为不忽略,缺省为 false

匹配成功则使用规则中定义的 targetAccountmethodAccount 等账户覆盖默认定义账户。

规则匹配的顺序是:从 rules 配置中的第一条开始匹配,如果匹配成功仍继续匹配。也就是后面的规则优先级要高于前面的规则。

支付宝提供了“交易方式”字段来标识资金出入账户。这样就可以直接通过“交易方式”,并辅以“收/支”字段确认该账户为增加账户还是减少账户。而复式记账法每笔交易至少需要两个账户,另一个账户则可通过“交易对方”(peer)、“商品”(item)、“收/支”(type)以及“交易方式”(method)的多种包含匹配得出。匹配成功则使用规则中定义的 targetAccountmethodAccount ,并通过确认该笔交易是收入还是支出,决定 targetAccountmethodAccount 的正负关系,来覆盖默认定义的增减账户。

targetAccountmethodAccount 的增减账户关系如下表:

收/支 交易分类 minusAccount plusAccount
收入 * targetAccount methodAccount
收入 退款 targetAccount methodAccount
支出 * methodAccount targetAccount
其他 * methodAccount targetAccount
其他 退款 targetAccount methodAccount

当交易类型为「其他」时,需要自行手动定义借贷账户。此时本软件会认为 methodAccount 是贷账户,targetAccount 是借账户。

微信

微信配置文件示例
defaultMinusAccount: Assets:FIXME
defaultPlusAccount: Expenses:FIXME
defaultCommissionAccount: Expenses:Commission:FIXME
defaultCurrency: CNY
title: 测试
wechat:
  rules:
    # type (additional condition)
    - type: 收入 # 微信红包
      method: /
      item: /
      targetAccount: Income:Wechat:RedPacket
    - type: / # 转入零钱通
      txType: 转入零钱
      peer: /
      item: /
      targetAccount: Assets:Digital:Wechat:Cash
    - type: / # 零钱提现
      txType: 零钱提现
      targetAccount: Assets:Digital:Wechat:Cash
      commissionAccount: Expenses:Wechat:Commission
    - type: / # 零钱充值
      txType: 零钱充值
      targetAccount: Assets:Digital:Wechat:Cash
    - type: / # 零钱通转出-到工商银行(9876)
      txType: 零钱通转出-到工商银行(9876)
      targetAccount: Assets:Bank:CN:ICBC:Savings

    - peer: 云膳过桥米线,餐厅
      sep: ','
      time: 11:00-15:00
      targetAccount: Expenses:Food:Meal:Lunch
    - peer: 云膳过桥米线,餐厅
      sep: ','
      time: 16:30-21:30
      targetAccount: Expenses:Food:Meal:Dinner
    - peer: 餐厅
      time: 23:55-00:10 # test T+1
      targetAccount: Expenses:Food:Meal:MidNight
    - peer: 餐厅
      time: 23:50-00:05 # test T-1
      targetAccount: Expenses:Food:Meal:MidNight

    - peer: 房东
      type: 支出
      targetAccount: Expenses:Housing:Rent

    - peer: 用户
      type: 收入
      targetAccount: Income:Service

    - peer: 理财通
      type: /
      targetAccount: Assets:Trade:Tencent:LiCaiTong

    - peer: 建设银行
      txType: 信用卡还款
      targetAccount: Liabilities:Bank:CN:CCB

    - method: / # 一般为收入,存入零钱
      methodAccount: Assets:Digital:Wechat:Cash
    - method: 零钱
      fullMatch: true
      methodAccount: Assets:Digital:Wechat:Cash
    - method: 零钱通
      fullMatch: true
      methodAccount: Assets:Digital:Wechat:Cash
    - method: 工商银行
      methodAccount: Assets:Bank:CN:ICBC:Savings
    - method: **银行
      methodAccount: Assets:Bank:CN:BOC:Savings

defaultMinusAccount, defaultPlusAccountdefaultCurrency 是全局的必填默认值。其中 defaultMinusAccount 是默认金额减少的账户,defaultPlusAccount 是默认金额增加的账户。 defaultCurrency 是默认货币。

defaultCommissionAccount 是默认的服务费账户,若无服务费相关交易,则不需要填写。但笔者还是建议填写一个占位 FIXME 账户,否则遇到带服务费的交易,转换器会报错退出。

wechat is the provider-specific configuration. WeChat provider has rules matching mechanism.

wechat 是微信相关的配置。它提供基于规则的匹配。可以指定:

  • peer(交易对方)的完全/包含匹配。
  • item(商品名称)的完全/包含匹配。
  • type(收/支)的完全/包含匹配。
  • txType(交易类型)的完全/包含匹配。
  • method(支付方式)的完全/包含匹配。
  • time(交易时间)的区间匹配。

    交易时间可写为以下两种形式:

    • 11:00-13:00
    • 11:00:00-13:00:00 24 小时制,起始时间和终止之间之间使用 - 分隔。

在单条规则中可以使用分隔符(sep)填写多个关键字,在同一对象中,每个关键字之间是或的关系。

在单条规则中可以使用 fullMatch 来设置字符匹配规则,true 表示使用完全匹配(full match),false 表示使用包含匹配(partial match),不设置该项则默认使用包含匹配。

在单条规则中可以使用 tag 来设置流水的 Tag,使用 sep 作为分隔符。

在单条规则中可以使用 ignore 来设置是否忽略匹配上该规则的交易,true 表示忽略匹配上该规则的交易,fasle 则为不忽略,缺省为 false

匹配成功则使用规则中定义的 targetAccountmethodAccount 等账户覆盖默认定义账户。

规则匹配的顺序是:从 rules 配置中的第一条开始匹配,如果匹配成功仍继续匹配。也就是后面的规则优先级要高于前面的规则。

微信账单提供了“交易方式”字段来标识资金出入账户。这样就可以直接通过“交易方式”,并辅以“收/支”字段确认该账户为增加账户还是减少账户。而复式记账法每笔交易至少需要两个账户,另一个账户则可通过“交易对方”(peer)、“商品”(item)、“收/支”(type)以及“交易方式”(method)的多种包含匹配得出。如支付宝配置类似,匹配成功则使用规则中定义的 targetAccountmethodAccount ,并通过确认该笔交易是收入还是支出,决定 targetAccountmethodAccount 的正负关系,来覆盖默认定义的增减账户。

targetAccountmethodAccount 的增减账户关系如下表:

收/支 minusAccount plusAccount
收入 targetAccount methodAccount
支出 methodAccount targetAccount

Huobi Global (Crypto)

火币-币币交易配置文件示例
defaultCashAccount: Assets:Huobi:Cash
defaultPositionAccount: Assets:Huobi:Positions
defaultCommissionAccount: Expenses:Huobi:Commission
defaultPnlAccount: Income:Huobi:PnL
defaultCurrency: USDT
title: 测试
huobi:
  rules:
    - item: BTC/USDT,BTC1S/USDT  # multiple keywords with separator
      type: 买入
      txType: 币币交易
      fullMatch: true
      sep: ','  # define separator as a comma
      cashAccount: Assets:Rule1:Cash
      positionAccount: Assets:Rule1:Positions
      CommissionAccount: Expenses:Rule1:Commission
      pnlAccount: Income:Rule1:PnL

defaultCashAccount, defaultPositionAccount, defaultCommissionAccount, defaultPnlAccountdefaultCurrency 是全局的必填默认值。

huobi is the provider-specific configuration. Huobi provider has rules matching mechanism.

huobi 是火币相关的配置。它提供基于规则的匹配。可以指定:

  • item(交易对)的完全/包含匹配。
  • type(交易方向)的完全/包含匹配。
  • txType(交易类型)的完全/包含匹配。
  • time(交易时间)的区间匹配。

    交易时间可写为以下两种形式:

    • 11:00-13:00
    • 11:00:00-13:00:00 24 小时制,起始时间和终止之间之间使用 - 分隔。

在单条规则中可以使用分隔符(sep)填写多个关键字,在同一对象中,每个关键字之间是或的关系。

在单条规则中可以使用 fullMatch 来设置字符匹配规则,true 表示使用完全匹配(full match),false 表示使用包含匹配(partial match),不设置该项则默认使用包含匹配。

在单条规则中可以使用 ignore 来设置是否忽略匹配上该规则的交易,true 表示忽略匹配上该规则的交易,fasle 则为不忽略,缺省为 false

匹配成功则使用规则中定义的 cashAccount, positionAccount, commissionAccountpnlAccount 覆盖默认定义。

规则匹配的顺序是:从 rules 配置中的第一条开始匹配,如果匹配成功仍继续匹配。也就是后面的规则优先级要高于前面的规则。

其中:

  • defaultCashAccount 是默认资本账户,一般用于存储 USDT。
  • defaultPositionAccount 是默认持仓账户。
  • defaultCommissionAccount 是默认手续费账户。
  • defaultPnlAccount 是默认损益账户。
  • defaultCurrency 是默认货币。

海通证券

海通证券交割单配置文件示例
defaultCashAccount: Assets:Htsec:Cash
defaultPositionAccount: Assets:Htsec:Positions
defaultCommissionAccount: Expenses:Htsec:Commission
defaultPnlAccount: Income:Htsec:PnL
defaultCurrency: CNY
title: 测试
htsec:
  rules:
    - item: 兴业转债
      type: 
      sep: ','
      cashAccount: Assets:Rule1:Cash
      positionAccount: Assets:Rule1:Positions
      CommissionAccount: Expenses:Rule1:Commission
      pnlAccount: Income:Rule1:PnL

defaultCashAccount, defaultPositionAccount, defaultCommissionAccount, defaultPnlAccountdefaultCurrency 是全局的必填默认值。

htsec is the provider-specific configuration. Htsec provider has rules matching mechanism.

htsec 是海通证券相关的配置。它提供基于规则的匹配。可以指定:

  • item(交易方向-证券编码-证券市值)的完全/包含匹配。
  • type(交易方向)的完全/包含匹配。
  • time(交易时间)的区间匹配。

    交易时间可写为以下两种形式:

    • 11:00-13:00
    • 11:00:00-13:00:00 > 24 小时制,起始时间和终止之间之间使用 - 分隔。

在单条规则中可以使用分隔符(sep)填写多个关键字,在同一对象中,每个关键字之间是或的关系。

在单条规则中可以使用 fullMatch 来设置字符匹配规则,true 表示使用完全匹配(full match),false 表示使用包含匹配(partial match),不设置该项则默认使用包含匹配。

在单条规则中可以使用 ignore 来设置是否忽略匹配上该规则的交易,true 表示忽略匹配上该规则的交易,fasle 则为不忽略,缺省为 false

匹配成功则使用规则中定义的 cashAccount, positionAccount, commissionAccountpnlAccount 覆盖默认定义。

规则匹配的顺序是:从 rules 配置中的第一条开始匹配,如果匹配成功仍继续匹配。也就是后面的规则优先级要高于前面的规则。

其中:

  • defaultCashAccount 是默认资本账户,一般用于存储证券账户可用资金。
  • defaultPositionAccount 是默认持仓账户。
  • defaultCommissionAccount 是默认手续费账户。
  • defaultPnlAccount 是默认损益账户。
  • defaultCurrency 是默认货币。

**工商银行

**工商银行配置文件示例
defaultMinusAccount: Assets:FIXME
defaultPlusAccount: Expenses:FIXME
defaultCashAccount: Liabilities:Bank:CN:ICBC
defaultCurrency: CNY
title: 测试
icbc:
  rules:
    - peer: 财付通,支付宝
      ignore: true
    - peer: 广东联合电子收费股份
      targetAccount: Expenses:Transport:Highway
    - txType: 人民币自动转帐还款
      targetAccount: Assets:Bank:CN:ICBC:Savings
    - peer: XX旗舰店
      targetAccount: Expenses:Joy

defaultMinusAccount, defaultPlusAccount, defaultCashAccountdefaultCurrency 是全局的必填默认值。其中 defaultMinusAccount 是默认金额减少的账户,defaultPlusAccount 是默认金额增加的账户, defaultCashAccount 是该配置中默认使用的银行卡账户(等同于支付宝/微信中的 methodAccount )。 defaultCurrency 是默认货币。

icbc 是**工商银行相关的配置。它提供基于规则的匹配。可以指定:

  • peer(交易对方)的完全/包含匹配。
  • type(收/支)的完全/包含匹配。
  • txType(交易类型)的完全/包含匹配。

在单条规则中可以使用分隔符 sep 填写多个关键字,在同一对象中,每个关键字之间是或的关系。

在单条规则中可以使用 fullMatch 来设置字符匹配规则,true 表示使用完全匹配(full match),false 表示使用包含匹配(partial match),不设置该项则默认使用包含匹配。

在单条规则中可以使用 tag 来设置流水的 Tag,使用 sep 作为分隔符。

在单条规则中可以使用 ignore 来设置是否忽略匹配上该规则的交易,true 表示忽略匹配上该规则的交易,fasle 则为不忽略,缺省为 false

匹配成功则使用规则中定义的 targetAccount 账户覆盖默认定义账户。

规则匹配的顺序是:从 rules 配置中的第一条开始匹配,如果匹配成功仍继续匹配。也就是后面的规则优先级要高于前面的规则。

**工商银行账单中的记账金额中存在收入/支出之分,通过这个机制就可以判断银行卡账户在交易中的正负关系。如支付宝配置类似,匹配成功则使用规则中定义的 targetAccount 和全局值 defaultCashAccount ,并通过确认该笔交易是收入还是支出,决定 targetAccountdefaultCashAccount 的正负关系,来覆盖默认定义的增减账户。

targetAccountdefaultCashAccount 的增减账户关系如下表:

收/支 minusAccount plusAccount
收入 targetAccount defaultCashAccount
支出 defaultCashAccount targetAccount

Toronto-Dominion Bank

TD银行配置文件示例
defaultMinusAccount: Assets:FIXME
defaultPlusAccount: Expenses:FIXME
defaultCashAccount: Assets:DebitCard:TDChequing
defaultCurrency: CAD
title: 测试
td:
  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, defaultCashAccountdefaultCurrency 是全局的必填默认值。其中 defaultMinusAccount 是默认金额减少的账户,defaultPlusAccount 是默认金额增加的账户, defaultCashAccount 是该配置中默认使用的银行卡账户(等同于支付宝/微信中的 methodAccount )。 defaultCurrency 是默认货币。

td 是 Toronto-Dominion Bank相关的配置。它提供基于规则的匹配。因为TD本身的账单较简单,所以可以指定的规则不多:

  • item:(交易商品)的完全/包含匹配。
  • type:(收/支)的完全/包含匹配。

在单条规则中可以使用分隔符 sep 填写多个关键字,在同一对象中,每个关键字之间是或的关系。

在单条规则中可以使用 fullMatch 来设置字符匹配规则,true 表示使用完全匹配(full match),false 表示使用包含匹配(partial match),不设置该项则默认使用包含匹配。

在单条规则中可以使用 tag 来设置流水的 Beancount TagLedger Meta Tag,使用 sep 作为分隔符。

在单条规则中可以使用 ignore 来设置是否忽略匹配上该规则的交易,true 表示忽略匹配上该规则的交易,fasle 则为不忽略,缺省为 false

匹配成功则使用规则中定义的 targetAccount 账户覆盖默认定义账户。

规则匹配的顺序是:从 rules 配置中的第一条开始匹配,如果匹配成功仍继续匹配。也就是后面的规则优先级要高于前面的规则。

TD账单中的记账金额中存在收入/支出之分,通过这个机制就可以判断银行卡账户在交易中的正负关系。如支付宝配置类似,匹配成功则使用规则中定义的 targetAccount 和全局值 defaultCashAccount ,并通过确认该笔交易是收入还是支出,决定 targetAccountdefaultCashAccount 的正负关系,来覆盖默认定义的增减账户。

targetAccountdefaultCashAccount 的增减账户关系如下表:

收/支 minusAccount plusAccount
收入 targetAccount defaultCashAccount
支出 defaultCashAccount targetAccount

Bank of Montreal

BMO银行配置文件示例
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, defaultCashAccountdefaultCurrency 是全局的必填默认值。其中 defaultMinusAccount 是默认金额减少的账户,defaultPlusAccount 是默认金额增加的账户, defaultCashAccount 是该配置中默认使用的银行卡账户(等同于支付宝/微信中的 methodAccount )。 defaultCurrency 是默认货币。

bmo 是 Toronto-Dominion Bank相关的配置。它提供基于规则的匹配。因为BMO本身的账单较简单,所以可以指定的规则不多:

  • item:(交易商品)的完全/包含匹配。
  • type:(收/支)的完全/包含匹配。

在单条规则中可以使用分隔符 sep 填写多个关键字,在同一对象中,每个关键字之间是或的关系。

在单条规则中可以使用 fullMatch 来设置字符匹配规则,true 表示使用完全匹配(full match),false 表示使用包含匹配(partial match),不设置该项则默认使用包含匹配。

在单条规则中可以使用 tag 来设置流水的 Beancount TagLedger Meta Tag,使用 sep 作为分隔符。

在单条规则中可以使用 ignore 来设置是否忽略匹配上该规则的交易,true 表示忽略匹配上该规则的交易,fasle 则为不忽略,缺省为 false

匹配成功则使用规则中定义的 targetAccount 账户覆盖默认定义账户。

规则匹配的顺序是:从 rules 配置中的第一条开始匹配,如果匹配成功仍继续匹配。也就是后面的规则优先级要高于前面的规则。

BMO账单中的记账金额中存在收入/支出之分,通过这个机制就可以判断银行卡账户在交易中的正负关系。如支付宝配置类似,匹配成功则使用规则中定义的 targetAccount 和全局值 defaultCashAccount ,并通过确认该笔交易是收入还是支出,决定 targetAccountdefaultCashAccount 的正负关系,来覆盖默认定义的增减账户。

targetAccountdefaultCashAccount 的增减账户关系如下表:

收/支 minusAccount plusAccount
收入 targetAccount defaultCashAccount
支出 defaultCashAccount targetAccount

京东

defaultMinusAccount: Assets:FIXME
defaultPlusAccount: Expenses:FIXME
defaultCurrency: CNY
title: 测试
jd:
  rules:
    - method: 京东白条
      methodAccount: Liabilities:Baitiao
    - method: 小金库零用钱
      methodAccount: Assets:EPay:JD
    - item: 椰子
      targetAccount: Expenses:Food
    - item: 京东小金库-转入
      peer: 京东金融
      targetAccount: Assets:EPay:JD
    - category: 美妆个护
      targetAccount: Expenses:MakeUp
    - item: "食品酒饮"
      targetAccount: Assets:Food
    - peer: 亲密卡
      targetAccount: Expenses:Prpaid
    - item: 白条,还款
      targetAccount: Liabilities:Baitiao
    - item: 京东小金库收益
      fullMatch: true
      targetAccount: Income:PnL:JD
      methodAccount: Assets:EPay:JD

京东账单的格式总体上和支付宝类似。

京东账单在交易类别为不计收支时,账户的处理分为两种情况:

  1. 一般情况:收/付款方式(即method匹配的字段) 一般为支出账户, 交易分类(即 category 匹配的字段)一般为收入账户。例如银行卡资金转入京东小金库时,收/付款方式 为银行卡,交易分类 为小金库; 白条还款时,收/付款方式 为银行卡或小金库零用钱,交易分类 为白条。

  2. 特殊情况:交易说明(即item匹配的字段)的前缀为冻结-解冻-时为不计收支的特殊情况。冻结-情形下, 收/付款方式为支出账户; 解冻-情形下 收/付款方式为收入账户但是金额为 0。目前所有和冻结 , 解冻 相关的交易会被忽略。

targetAccountmethodAccount 的增减账户关系如下表:

收/支 minusAccount plusAccount
收入 targetAccount methodAccount
支出 methodAccount targetAccount
不计收支 methodAccount targetAccount

Special Thanks

double-entry-generator's People

Contributors

aur3l14no avatar cnlhc avatar ehco1996 avatar gaocegege avatar geno1024 avatar notzhan avatar oxalica avatar p3psi-boo avatar ppodxiang avatar ramsayleung avatar shuxiao9058 avatar triple-z avatar wchen9 avatar wych42 avatar z2z23n0 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

double-entry-generator's Issues

[bug] Alipay refund

2020-11-02 * "肯德基会员官方旗舰店" "退款-【狂欢价】电子券码 肯德基原味圣代(北美蓝莓/冲绳黑糖珍珠酱)买2送2兑换券"
	Expenses:FIXME 21.00 CNY
	Assets:FuckAliPay -21.00 CNY

This program ignores the closing transaction, but no ignores the refund transaction.

image

[doc] Cannot work with overlap rules

    - peer: 基金
      type: 其他
      item: 黄金-买入
      methodAccount: Assets:Alipay
      targetAccount: Assets:Invest:Gold
    - peer: 基金
      type: 其他
      item: 黄金-卖出
      methodAccount: Assets:Invest:Gold
      targetAccount: Assets:Alipay
    - peer: 基金
      type: 其他
      item: 买入
      methodAccount: Assets:Alipay
      targetAccount: Assets:Invest:Fund
    - peer: 基金
      type: 其他
      item: 卖出
      methodAccount: Assets:Invest:Fund
      targetAccount: Assets:Alipay

The Assets:Invest:Gold does not work well with these configuration rules.

[feat] support matching accounts via all rules

AFAIK, with WeChat bills, using peer can generally decide the plusAccount(usually Expanse accounts) and using method can decide the minusAccount(usually Asset accounts) .

So I suggest that wechat provider should support a config format like this to find the proper plusAccount and minusAccount:

- method: 零钱
      minusAccount: Assets:Digital:Wechat:Cash
- peer: 地铁
      plusAccount: Expenses:Transport:Metro
- peer: 滴滴
      plusAccount: Expenses:Transport:Taxi

An example bill:

peer: 广州地铁
method: 零钱通

and you can get:

plusAccount: Expenses:Transport:Metro
minusAccount: Assets:Digital:Wechat:Cash

[feature] Support time condition in rules

Example rule:

- peer: 餐厅
  time: 11:00-15:00
  targetAccount: Expenses:Food:Meal:Lunch

Explanation:

  • If the transaction's peer contains 餐厅,
    • And transaction's time is between 11:00 and 15:00,
  • Then targetAccount is Expenses:Food:Meal:Lunch.

feat: add metadata for beancount postings

Add metadata for generated beancount postings, like the following example.

- 2021-05-20 * "苏宁易购官方旗舰店" "【礼遇价】三星128g内存卡microSD存储卡tf卡行车记录仪卡switch监控摄像头"  ; 支出-交易成功-数码电器
+ 2021-05-20 * "苏宁易购官方旗舰店" "【礼遇价】三星128g内存卡microSD存储卡tf卡行车记录仪卡switch监控摄像头"
	Expenses:Electronics 87.90 CNY
	Assets:Bank:CN:CMB-9876:Savings -87.90 CNY
+       source: "支付宝"
+       payTime: "2021-05-20 12:34"
+       category: "数码电器"
+       status: "交易成功"
+       txStatus: "支出"
+       note: "支出-交易成功-数码电器"

We can also move the comment Note to metadata.

[bug] Failed to get the tx type in WeChat bills

Currently wechat provider only support these following tx types:

const (
	TxTypeConsume  TxType = "商户消费"
	TxTypeLucky           = "微信红包"
	TxTypeTransfer        = "转账"
	TxTypeUnknown         = "Unknown"
)

However, the WeChat bills have more transaction types than that:
image

支付宝似乎更新了帐单格式

2021-12-12测试导出的支付宝账单
.csv文件里,交易时间隐去了秒,对方账号多了双引号等
目前alipay导入工具暂不适配

同学,您这个项目引入了107个开源组件,存在4个漏洞,辛苦升级一下

检测到 deb-sig/double-entry-generator 一共引入了107个开源组件,存在4个漏洞

漏洞标题:jwt-go 安全漏洞
缺陷组件:github.com/dgrijalva/[email protected]+incompatible
漏洞编号:CVE-2020-26160
漏洞描述:jwt-go是个人开发者的一个Go语言的JWT实现。
jwt-go 4.0.0-preview1之前版本存在安全漏洞。攻击者可利用该漏洞在使用[]string{} for m[\"aud\"](规范允许)的情况下绕过预期的访问限制。
影响范围:(∞, 4.0.0-preview1)
最小修复版本:4.0.0-preview1
缺陷组件引入路径:github.com/deb-sig/double-entry-generator@->github.com/dgrijalva/[email protected]+incompatible

另外还有4个漏洞,详细报告:https://mofeisec.com/jr?p=abf58e

关于支付宝的 0 元支出记录

想问下 0 元的记录是不是没啥意义,可以直接忽略吗?

例子:

2022-09-02 * "哈啰出行" "哈啰单车骑行"
	category: "交通出行"
	merchantId: "CPR220902160932501179xxxxD"
	method: "单车骑行卡抵扣"
	orderId: "202209022200149456144204xxxx"
	payTime: "2022-09-02 16:09:32 +0800 CST"
	source: "支付宝"
	status: "交易成功"
	txType: "支出"
	Expenses:Unknown 0.00 CNY
	Assets:FIXME -0.00 CNY

Nix Package Support

Is your feature request related to a problem? Please describe.
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

Describe the solution you'd like
Add packages to flake outputs.

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Additional context
Add any other context or screenshots about the feature request here.

Issue with Alipay refund transactions with txType as "收入"

在处理支付宝账单的时候,遇到「收/支」一列标记为「收入」的退款交易。如图:
image

转换后,预期这笔交易的plusAccount是methodAccount,即对应的银行卡账户。实际上银行卡账户是minusAccount。导致支出交易和退款交易都在银行卡账户上记录了minus金额。

有问题的example csv:
example-alipay-records.csv

对应配置:

defaultMinusAccount: Assets:FIXME
defaultPlusAccount: Expenses:FIXME
defaultCurrency: CNY
title: 测试
alipay:
  rules:
    - peer: 神州租车
      targetAccount: Expenses:Rental:Car
    
    - method: 招商银行(9876)
      fullMatch: true
      methodAccount: Assets:Bank:CN:CMB-9876:Savings

输出结果

option "title" "测试"
option "operating_currency" "CNY"

1970-01-01 open Assets:Bank:CN:CMB-9876:Savings
1970-01-01 open Assets:FIXME
1970-01-01 open Expenses:FIXME
1970-01-01 open Expenses:Rental:Car

2023-01-21 * "神州租车" "神州租车产品"
	category: "交通出行"
	merchantId: "yyy   "
	method: "招商银行(9876)"
	orderId: "xxx"
	payTime: "2023-01-21 09:31:32 +0800 CST"
	source: "支付宝"
	status: "交易关闭"
	txType: "支出"
	Expenses:Rental:Car 278.98 CNY
	Assets:Bank:CN:CMB-9876:Savings -278.98 CNY

2023-01-21 * "神州租车" "退款-神州租车产品"
	category: "退款"
	merchantId: "yyy   "
	method: "招商银行(9876)"
	orderId: "xxx1371263536677"
	payTime: "2023-01-21 09:35:43 +0800 CST"
	source: "支付宝"
	status: "退款成功"
	txType: "收入"
	Expenses:Rental:Car 278.98 CNY
	Assets:Bank:CN:CMB-9876:Savings -278.98 CNY

feat[ledger]: add support for `ledger-cli`

Hi, Thanks for your great work on this project.

Context

我也在用复式记账,但是使用的是 ledger 而非 beancount.

Feature Request

目前 double-entry-generator 尚且只支持 beancount, 而 beancountledger 的记账语法类似,所以我希望 double-entry-generator 也可以支持 ledger.

TODO List

目前我已经给 double-entry-generator 增加了 ledger 的支持,代码部分已经写完并且自测可行。
但只实现对部分 provider 的支持:

  • 普通消费账单的模板
  • 火币模板1
  • 火币模板2
  • 火币卖出模板
  • 海通买入模板
  • 海通卖出模板

Action

在发起 PR 之前,我想先在 issue 分享一下这个 增加对 ledger 支持的feature 的想法.

如果能达成共识的话,我倾向将功能拆分成多个PR, 以避免单个 PR 过大,导致不易 Review.

支付宝账单更新了新格式

不知道我是被灰度了还是所有人都是这样,示例如下:

------------------------------------------------------------------------------------
导出信息:
姓名:xx
支付宝账户:[email protected]
起始时间:[2023-02-10 00:00:00]    终止时间:[2023-02-13 23:59:59]
导出交易类型:[全部]
导出时间:[2023-02-13 09:12:52]
共66笔记录
收入:1笔 28.50元
支出:63笔 16.54元
不计收支:2笔 16.37元

特别提示:
1.本回单内容可表明支付宝受理了相应支付交易申请,因系统原因或通讯故障等偶发因素导致本回单与实际交易结果不符时,以实际交易情况为准;
2.请勿将本回单作为收款方发货的凭据使用,请查证账户实际到账情况后再进行发货操作;
3.支付宝快捷支付等非余额支付方式可能既产生支付宝交易也同步产生银行交易,因此请勿使用本回单进行重复记账;
4.本回单如经任何涂改、编造,均立即失去效力;
5.部分账单如:充值提现、账户转存或者个人设置收支等不计入为收入或者支出,记为不计收支类;
6.因统计逻辑不同,明细金额直接累加后,可能会和下方统计金额不一致,请以实际交易金额为准;
7.禁止将本回单用于非法用途;
8.本明细仅展示当前账单中的交易,不包括已删除的记录;
9.本明细仅供个人对账使用。

------------------------支付宝(**)网络技术有限公司  电子客户回单------------------------
交易时间            ,交易分类                ,交易对方                ,对方账号                ,商品说明                ,收/支                 ,金额                  ,收/付款方式              ,交易状态                ,交易订单号     ,商家订单号           ,备注                  ,
2023-02-12 21:32:14 ,亲友代付                ,xxxxxxxxxxxx          ,/                   ,亲情卡                 ,支出                  ,49.74               ,交通银行信用卡(7449)       ,交易成功                ,202302xxxxxx0011000103xxxxxx	,20230xxxxxxx014741014xxxxxx	,                    ,

[feat] support multiple rules with separator in config

If the rules have the same targetAccount, we should write rules like the following:

- peer: 云膳过桥米线
  targetAccount: Expenses:Food:Meal
- peer: 餐厅
  targetAccount: Expenses:Food:Meal

In order to reduce writing nonsense configs, the WeChat provider should support multiple rules at the same time.

An ideal config is like the following, it should be equal to the above rules:

- peer: 云膳过桥米线,餐厅
  targetAccount: Expenses:Food:Meal

In fact, we implicit the separator as a comma character ,. Users also can specify the separator manually:

- peer: 云膳过桥米线?餐厅
  separator: ?
  targetAccount: Expenses:Food:Meal

v2.5.0 版本的可执行文件如何下载?

请教大佬,v2.5.0 版本的可执行文件如何建构/下载,目前通过 Homebrew 只能安装到 v2.1.0,微信账单的功能受限,求助……是否有可直接执行的二进制文件,或者建构的方法?谢谢!

wechat: Failed to get the tx type 购买理财通 和 零钱通转出-到零钱

还有一种小韭菜的交易类型也会报错

 Failed to translate: Failed to translate bill: line 149: Failed to get the tx type 购买理财通: <nil>

这是账单数据

2020-02-14 01:32:14,购买理财通,理财通,"鹏华增值宝(000569)",/,¥10000.00,浦发银行,支付成功,1800007367312002141165262215	,1800007308102002143430655989	,"/"
2020-02-14 01:24:33,购买理财通,理财通,"中欧医疗健康混合C(003096)",/,¥3000.00,浦发银行,支付成功,1800045030312002144223548046	,1800007030102002143310679508	,"/"

对于 status 状态是还款失败的记录

支付宝会自动进行花呗的还款,当还款失败时,status 是还款失败。

2023-02-21 * "花呗|信用购" "花呗|信用购自动还款"
category: "信用借还"
orderId: "2023022129020999990142745710"
payTime: "2023-02-21 08:43:53 +0800 CST"
source: "支付宝"
status: "还款失败"
type: "不计收支"
Liabilities:HuaBei 11448.29 CNY
Assets:FIXME -11448.29 CNY

怎么写配置可以忽略还款失败的条目?

wechat: Failed to get the tx type 亲属卡交易

发现一个类型好像没有被支持。
“亲属卡交易”这个类型提示:Failed to translate: Failed to translate bill: line 43: Failed to get the tx type 亲属卡交易:
,会报错停止

目前是手动修改类型暂时解决。

亲属卡交易

2021-10-19 16:08:00,亲属卡交易,哈哈,"亲属卡",支出,¥2243.46,零钱通,支付成功,42000011202110191201583411 ,XSFF-SD2021101916055813620 ,"/"

[refact] clarify the `type` and `txType`

This is a historical problem for this project.

For the rules in YAML file, the type always stands for "income/expense", and txType stands for detailed transaction category.

However, for the implementation in provider/*/types.go, provider/*/parse.go, analyser/*/*.go, and provider/*/convert.go (like this case). the type and txType 's definition are different in these files, and easily get confused between them.

Originally posted by @Triple-Z in #59 (comment)

[Feat] Add BMO provider support

Hi, Thanks for your great work on this project.

Is your feature request related to a problem? Please describe.

我个人会使用 BMO 银行的服务,BMO 也支持导出CSV 格式的账单, 但是目前 double-entry-generator 还不支持 BMO 银行

Describe the solution you'd like

目前 double-entry-generator 尚不支持 BMO 银行,我希望可以给 double-entry-generator 增加对 BMO provider的支持

Describe alternatives you've considered
None

Additional context

也像之前 增加 TD provider的支持那样,我会分多次PR 提交.

[feat] discuss the useless fields

Is your feature request related to a problem? Please describe.

我发现 compiler/beancount/template 里面, htsec 卖出和买入模板的三个字段是被定义与赋值了,但是未在模板中使用的.

type HtsecTradeBuyOrderVars struct {
	PayTime           time.Time
	Peer              string
	TxTypeOriginal    string
	TypeOriginal      string
	Item              string
	CashAccount       string
	PositionAccount   string
	CommissionAccount string
	PnlAccount        string
	Amount            float64
	Money             float64
	Commission        float64
	Price             float64
	BaseUnit          string // 未使用
	TargetUnit        string // 未使用
	CommissionUnit    string // 未使用
	Currency          string
}

Describe the solution you'd like

删除掉htsec模板中的 BaseUnit, TargetUnit, CommissionUnit 无用字段.

微信赞赏码无法识别

【报错信息】
[Provider-Wechat] 2022/10/04 03:19:43 Failed to translate: Failed to translate bill: line 40: Failed to get the tx type 赞赏码:

【对应条目信息】
2022-09-24 02:24:20,赞赏码,YingDev,"/",支出,¥36.99,零钱,朋友已收钱,100010810122092400064222561891707533 ,1000108101202209241820542253348 ,"/"

wechat: Failed to get the tx type 信用卡还款

信用卡还款也有这个问题

 Failed to translate: Failed to translate bill: line 44: Failed to get the tx type 信用卡还款: <nil>

这是我的账单数据

2017-10-20 18:36:44,信用卡还款,建设银行信用卡还款,"/",/,¥548.58,零钱,支付成功,4200000069201710299246843141	,1000019741201710201961089024	,"/"

Originally posted by @milkyfox in #26 (comment)

关于 There is a mole, The tx is canceled.

我在使用支付宝导入时,我参考这篇教程:

通常交易的directives是txn 但是因为这个是beancount里最常见的记录,因此允许用户省略 通常 * 表示交易数据无误,而!表示交易数据可能有错。

但是我观察到,即使是交易关闭的记录Flag仍然是 ”*“,请问是否可以在 There is a mole, The tx is canceled. 的过程中,把对应的记录设置为 ”!“ 呢?

Failed to get the tx type when met transfer cash to bank card transation

issue

如果有转帐到银行卡的交易则会报错。

Output

>>> double-entry-generator translate -p wechat 微信支付账单\(20210708-20210717\).csv
Using config file: /home/arc/.double-entry-generator.yaml
[Provider-Wechat] 2021/07/17 18:45:24 Failed to translate: Failed to translate bill: line 44: Failed to get the tx type 零钱提现: <nil>

Error columns in source file

2021-07-15 16:29:37,零钱提现,招商银行(),"/",/,¥100.10,招商银行(),提现已到账,207210715100077148235523883175	,/	,"服务费¥0.10"
2021-07-14 22:18:10,零钱提现,招商银行(),"/",/,¥10.10,招商银行(),提现已到账,207210714100077147459276708175	,/	,"服务费¥0.10"
2021-07-11 14:17:52,零钱提现,招商银行(),"/",/,¥1001.10,招商银行(),提现已到账,207210711100077147832088993175	,/	,"服务费¥1.00"

feat(docs): i18n

Some US-based users asked if we could provide README in English.

config file for ICBC not work

Describe the bug
I am using ICBC bill translator, the result has no account name in the last two lines in each transaction.
I delete the config.yaml, and get the same result. It seems that the translator do not recognize the config file.
OS version: Windows 10
generator version: 2023/9/10 master branch, golang version

config.yaml:

defaultMinusAccount: Assets:FIXME
defaultPlusAccount: Expenses:FIXME
defaultCashAccount: Assets:DebitCard:工商银行
defaultCurrency: CNY
title: 测试
icbc:
  rules:
    - peer: 财付通-,支付宝
      sep: ","
      ignore: true

translate shell command:

./double-entry-generator translate --append  --config ../config/icbc/config.yaml --provider icbc --output ../tmp/icbc-output.bean ../tmp/icbc_record.csv

result:

2023-01-03 * "财付通-满座儿万科店 深圳市财付通支付科技有限公司"
	balances: "53635.87"
	currency: "人民币"
	peerAccount: "深圳市财付通支付科技有限公司"
	source: "**工商银行"
	txType: "消费"
	type: "支出"
	 22.80 
	 -22.80 

2023-01-03 * "财付通-满座儿万科店 深圳市财付通支付科技有限公司"
	balances: "53613.54"
	currency: "人民币"
	peerAccount: "深圳市财付通支付科技有限公司"
	source: "**工商银行"
	txType: "消费"
	type: "支出"
	 22.33 
	 -22.33 

Is it more appropriate to use full match than partial match in some positions?

Using partial matches in some items of the config file may cause problems.

For example, when I make the following settings:

method: 余额
methodAccount: Assets:Alipay:Balance

It will also match this record, which means you use two payment accounts:

...
method: "招商银行储蓄卡(8888)&余额"
...

This will result in only one payment account being generated and will not be marked with FIXME, so you may have difficulty finding errors.

So should we consider using full matches instead of partial matches in some items?

[feat] Add TD bank provider support

Hi, Thanks for your great work on this project.

Context

我个人会使用类似 TD银行和其他一些的海外银行的服务,TD 也支持导出CSV 格式的账单, 但是目前 double-entry-generator 还不支持 TD和其他的海外银行

Feature Request

目前 double-entry-generator 尚不支持 TD 银行,我希望可以给 double-entry-generator 增加对 TD provider的支持

Action & TODO

我还没有具体调研过 TD 账单的格式和编写一个新的 provider的需要的工作量, 所以想先分享讨论一下这个增加对 TD provider feature 的想法.

如果能达成共识的话,有时间我再会去调研 TD 的账单和 provider 的实现.

Support HSBC debit card

Is your feature request related to a problem? Please describe.
N/A

Describe the solution you'd like
Support HSBC debit card bills translate to beancount bills.

Describe alternatives you've considered
N/A

Additional context
Example bills:

 21 Aug 2023,转账/OR/CN**************/AC/6211234567890123456/BENM/李四Submitted on: 19AUG23 09:53:18YPI******网上银行,"-1.00"
 21 Aug 2023,转账/OR/CN**************/ORDP/张三/REMI/生活费Submitted on: 19AUG23 03:30:19YPI******系统生成,"1.00"
 18 Aug 2023,转账Transaction Function TestingYCRE*****系统生成,"-1.00"
 18 Aug 2023,转账Transaction Function TestingYCRE*****系统生成,"1.00"

[feat] add PnL account for Alipay

PnL stands for "profit and loss", can be used when retrieving funds.

2999-01-01 "ant funds" "sell fund 1"
    Asset:Alipay:Funds                     -100.00 CNY ; this should be the fund cost
    Asset:Alipay:Cash                        150.00 CNY
    Income:Alipay:Funds:PnL ; profit or loss

So the config should support PnL account:

    - peer: 基金
      item: 卖出
      minusAccount: Assets:Trade:Alipay:Funds
      plusAccount: Assets:Bank:CN:ICBC:Savings
+     pnlAccount: Income:Trade:Alipay:Funds:PnL

Still got a question here: how to find the cost for each fund?

2023年微信账单,导入零钱通,“转入零钱通-来自零钱“

2023年1月微信账单,csv账单中关于对零钱通的交易类型是”转入零钱通-来自零钱“
但是provider中,好像没有进行更新
程序会返回 Get an unusable tx type, ignore it: 转入零钱通-来自零钱

我尝试以下规则,但是都不好用

  • type: / # 转入零钱通
    txType: 转入零钱
    peer: /
    item: /
    targetAccount: Assets:Digital:Wechat:零钱通
    methodAccount: Assets:Digital:Wechat:Juzi

  • type: / # 转入零钱通
    txType: 转入零钱通-来自零钱
    peer: /
    item: /
    targetAccount: Assets:Digital:Wechat:零钱通
    methodAccount: Assets:Digital:Wechat:Juzi

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.