Beancount言語構文
Beancount言語の構文をまとめるが、網羅するのではなく覚えておいたほうが良いことだけを抜粋する。公式ドキュメントはBeancount Language Syntaxにある。
Beancountはファイルを読み込んだ後で、特定の順番にソートするので、日付が前後していても問題ない。ただしこれに関連して、ソートの順序には特徴があるので以下に同日で優先度が高い(早く処理される)順に並べる。
- open
- balance
- これら以外のディレクティブ
- txn
- close
これはbeancount/core/data.py:695,705で書かれているコメントを参照した。
勘定科目の設定(Account)
Section titled “勘定科目の設定(Account)”open ディレクティブでBeancountの勘定科目を設定する。日本の場合はあらかじめ決まった勘定科目しか使えないらしいが、Beancountではルートの項目以外はなんでもいい様子。
取引記録(Transaction)
Section titled “取引記録(Transaction)”txn ディレクティブで取引の記録を記述する。txn は省略可能なので、一般的にはフラグを使って txn は省略することが多い。
2024-10-15 ! "ツクモex" "PCパーツ" Liabilities:Amex:CreditCard 45,000 JPY Expenses:Shopping 45,000 JPY
2024-10-18 * "リバティ長岡" "食材" Expenses:Food:Groceries 1,300 JPY Assets:Cash -1,300 JPYこれを一般化すると次のようなルールとなる。
YYYY-MM-DD [txn|Flags] [[Payee] Narrattion] [[key: value] ...] [Flags] Account Amountトランザクションの各行にはメタデータで id を与えられるらしいので、インポートした場合に重複があるかどうかの判定はこれを使うといいのだろう。
価格と金額とコスト
Section titled “価格と金額とコスト”取引記録では価格(Amount)が必須となっている。Amount の構文ではひとつの数値を書くだけではなく演算も行えるが、それ以外にも通貨の両替を伴う場合は @ を使って「支払った通貨1ユニット」の金額(Price)を与えたり、@@ で「支払った価格の合計」金額(Cost)を与えることも可能になっている。
2,996 - 221 JPY
3000 USD @ 158 JPY3000 USD @@ 475,365 JPYなんだけど、内部的に @@ は @ と解釈されるようで、4.40 USD @@ 729 JPY とすると 4.40 USD @ 165.6818.. となって端数が生まれてしまった。この場合は {} でも同じ。
4.40 USD { 729 JPY }端数は金額の有効桁数で調整するらしいが、理解できていない。
原価は {} で指示するらしいが、たぶん使わない。
稀に使うディレクティブ
Section titled “稀に使うディレクティブ”txn の他にもいくつかあるが、主に使うのはこの辺り。
- balance
- pad
- price
pad は balance と合わせて使う。pad 直後に balance があれば、その値で埋めるらしい。ただし pad を 記述した日付に 埋め合わせるための金額を txn で生成するので、balance と同じ日付にすると