Ledger CLIで家計簿をつけたい！入門2 クレジットカード

[←前編](https://qiita.com/kikeg/items/36c2905bb30148fed9b9)

前回は銀行の帳簿の付け方でしたが、今回はクレカです。クレカというのは御存知の通り買い物した瞬間に借金が発生してそれを毎月返済するという、デビットカードの何倍も複雑な仕組みになっています。まだインストールしていない人はこちらから↓

https://qiita.com/kikeg/items/07c2794e226b9ae18205

# お買い物

買い物については前編のデビットカードにかなり仕組みが似ています。銀行の口座からではなく、カードの**負債**口座から買い物できるわけです。

では仮にイエローカード（架空です）というクレカを持ってるとして、`card/yellow/2022.ledger`に記録をしていきます。ちょっと面倒なので11月から記録してることにしましょう。

```ledger
2022/11/01 ! 初期残高
    Liabilities:Card:Yellow                        0
    Equity:Opening Balances

2022/11/02 * とあるスーパー
    Liabilities:Card:Yellow
    Expenses:Grocery                           2,300 JPY

2022/11/02 * ゲームショップ
    Liabilities:Card:Yellow                   -6,578 JPY
    Expenses:Fun:Game                          6,578 JPY

2022/11/03 * 新幹線のチケット
    Liabilities:Card:Yellow                  -10,000 JPY
    Expenses:Travel

```

まず初期残高ですが、ある時点でのカードの残高をしっかり確認するのはかなり難しいです。ここではとりあえず`0`だったとして進めています。ちなみに、金額は**0のときだけは通貨単位はいりません**。0円も0ドルも0には違いないからです。

どれも`Liabilities:Card:Yellow`から`Expenses`にお金が移動している、つまりカードから支出があったということになります。どっちかだけ、あるいは両方の仕訳[^entry]に金額を書くのかは完全に個人の好みです。 

ちなみに注意しておきたいのは、**1回払だろうが2回払だろうがリボ払いだろうが買い物時の仕訳は一緒**なことです。考えてみれば当然ですが、支払い方法は負債の返済方法に過ぎないので、いくら支出するかにはなんの影響もありません。

# 支払い(naive approach)

買い物時の記録は銀行からの引き出しや買い物と大差なかったですが、支払い時が厄介なのがクレカです。ここでは11月15日に締めて支払額決定、12月10日に支払いというモデルを考えます。

:::note info
これから紹介する方法は**ベストではない**ナイーブな手法です。

[明日もっといい方法を紹介](https://qiita.com/kikeg/items/d46f6b8c5faa54575f5d)します。
:::

まず一番簡単な1回払いの場合です。11/15日にクレジットカード会社の明細を確認すると、どうやら次回の支払いは25000円のようです。

```ledger

; 続き... 他に買い物はなかった

2022/11/15 * 支払額決定
    Liabilities:Card:Yellow                        0 = -25,000 JPY

```

これは「負債の残高は支払額が決定したとき増えも減りもしていない」「その時の残高はマイナス2万5千円だった（負債なのでマイナス）」という記録です。これで残高を確認するとエラーになります。

```shell-session
$ ledger -f card/yellow/2022.ledger
...
While parsing posting:
  Liabilities:Card:Yellow                        0 = -25,000 JPY
                                                     ^^^^^^^^^^^
Error: Balance assertion off by -6,122 JPY (expected to see -18,878 JPY)
```

当然といえば当然です、最初の残高が0で18,878円分しか買い物してないのに2万5千円払うのは記録がおかしいです。6122円分ズレが有る、つまり記録されてない出費があるはずなので、最初の残高を次のように修正します。

```ledger
2022/12/01 ! 初期残高
    Liabilities:Card:Yellow                   -6,122 JPY
    Equity:Opening Balances

```

これでエラーが無くなり無事残高を表示できるようになります。一件落着、と言いたいところですが、この方式、結構な欠陥があります。この後引き続きクレカで買い物をして,
10日の支払日を迎えたとしましょう。

```ledger
2022/11/20 * コンビニ
    Liabilities:Card:Yellow
    Expenses:Grocery                             135 JPY

2022/11/30 * コンビニ
    Liabilities:Card:Yellow
    Expenses:Grocery                             200 JPY

2022/12/5 * コンビニ
    Liabilities:Card:Yellow
    Expenses:Grocery                             135 JPY

2022/12/10 * 支払い
    Liabilities:Card:Yellow
    Assets:Bank:Okane                        -25,000 JPY

```

ここでまず基本的な問題があります。カードの支払いというイベントはクレジットカード側でも銀行の通帳側でも観測できる事象です。なら、**どちらの口座側で記録すべきなのでしょう**?両方の口座に同じことを記録してはいけません。そうすると全体で二重に支払いがカウントされてしまいます。でも、こっちに支払いを記録したせいで、銀行の口座に記録できなくなるのはミスの発生源ですし、自動化には不便です。他の問題もあります。この方式でカード残高の推移を見てみましょう。

```shell-session
$ ledger -f card/yellow/2022.ledger reg "Liabilities:Card:Yellow" | awk '{print "|",$1, "|", $2, "|", $4, $5, "|", $6, $7 "|"}'
```

結果は次のようになります

| 日付 | 摘要 | 金額 | 残高 |
|:-:|:-:|:-:|:-:|
| 22-Nov-01 | 初期残高 | -6,122 JPY | -6,122 JPY|
| 22-Nov-02 | とあるスーパー | -2,300 JPY | -8,422 JPY|
| 22-Nov-02 | ゲームショップ | -6,578 JPY | -15,000 JPY|
| 22-Nov-03 | 新幹線のチケット | -10,000 JPY | -25,000 JPY|
| 22-Nov-20 | コンビニ | -135 JPY | -25,135 JPY|
| 22-Nov-30 | コンビニ | -200 JPY | -25,335 JPY|
| 22-Dec-05 | コンビニ | -135 JPY | -25,470 JPY|
| 22-Dec-10 | 支払い | 25,000 JPY | -470 JPY|

カードの未払い残高自体はちゃんと追跡できてますが、支払いが記録されるまでは今月のカード代と翌月のカード代がごちゃまぜにされています。次回はこの問題を解決する方法を紹介します。

[→後編](https://qiita.com/kikeg/items/d46f6b8c5faa54575f5d)

[^entry]: これを仕訳と呼ぶのか、取引をこのように整理することが仕訳なのか自信がありません