GnuCashでクレジット決済の記帳がめんどくさくてしょうがないので、自動化できないかと検討しているので、帳簿ファイルのXMLを調べてみたメモ。
シーンとしては、2009/10/13にスーパーで1418円分の品物を、あるクレジットカードで決済したというものを想定します。
この場合、「2009/10/13に、クレジットカードが食費に1418円支払った」というエントリと、「2009/11/10に、銀行口座がクレジットカードに1418円支払う」という2つのエントリを作ることになります。
※ただし、このスタイルが正しいのかどうかよくわかりません。少なくとも、俺はそうしています、という話です。
XMLによる帳簿の表記ですが、基本的には「あらゆる要素にID(GUID)がある」というルールがあります。
さらに、複式簿記なので「借方」「貸方」の2つについて金額を記録します。そのため、「取引全体に対するID」「その取引での貸方ID」「その取引での借方ID」という3つのIDが存在します。'*:id type="guid"'というものがそれです。
では、早速XMLを見ていきます。まずは、「2009/10/13に、クレジットカードが食費に1418円支払った」というエントリ。
<gnc:transaction version="2.0.0"> <trn:id type="guid">この買い物エントリのGUID</trn:id> <trn:currency> <cmdty:space>ISO4217</cmdty:space> <cmdty:id>JPY</cmdty:id> </trn:currency> <trn:date-posted> <ts:date>2009-10-13 00:00:00 +0900</ts:date> </trn:date-posted> <trn:date-entered> <ts:date>2009-10-13 19:01:43 +0900</ts:date> </trn:date-entered> <trn:description>食料品091013</trn:description> <trn:splits> <trn:split> <split:id type="guid">買い物・食費エントリのGUID</split:id> <split:reconciled-state>n</split:reconciled-state> <split:value>1418/1</split:value> <split:quantity>1418/1</split:quantity> <split:account type="guid">科目:食費を意味するGUID</split:account> </trn:split> <trn:split> <split:id type="guid">買い物・クレジットエントリのGUID</split:id> <split:reconciled-state>n</split:reconciled-state> <split:value>-1418/1</split:value> <split:quantity>-1418/1</split:quantity> <split:account type="guid">科目:決済に使ったクレジットを意味するGUID</split:account> </trn:split> </trn:splits> </gnc:transaction>
まずは取引(トランザクション)のIDと通貨情報です。
<gnc:transaction version="2.0.0"> <trn:id type="guid">この買い物エントリのGUID</trn:id> <trn:currency> <cmdty:space>ISO4217</cmdty:space> <cmdty:id>JPY</cmdty:id> </trn:currency>
cmdty:space は通貨コード空間を指定しています。ISO4217は、アルファベット3文字で世界中の通貨を表現する通貨コードです。(see: http://ja.wikipedia.org/wiki/ISO_4217 )
cmdty:id でその通貨コード空間でのIDを指定しています。JPYは御存知日本円(JaPan-Yen)です。
次に、決済日時と登録日時が続きます。
<trn:date-posted> <ts:date>2009-10-13 00:00:00 +0900</ts:date> </trn:date-posted> <trn:date-entered> <ts:date>2009-10-13 19:01:43 +0900</ts:date> </trn:date-entered>
trn:date-posted が取引を実際に実行する日時で、"YYYY-MM-DD hh:mm:ss +UTC_OFFSET"の形式です。
date-entered は取引エントリを入力した日時です。
さらに、摘要(説明)が続きます。
<trn:description>食料品091013</trn:description>
trn:description でその取引の摘要(GnuCashでの「説明」)を記述します。そのままですね。
最後に、スプリット取引リストが来ます。trn:splits の中に trn:split が任意回数だけ格納されます。
<trn:splits> <trn:split> <split:id type="guid">買い物・食費エントリのGUID</split:id> <split:reconciled-state>n</split:reconciled-state> <split:value>1418/1</split:value> <split:quantity>1418/1</split:quantity> <split:account type="guid">科目:食費を意味するGUID</split:account> </trn:split> <trn:split> <split:id type="guid">買い物・クレジットエントリのGUID</split:id> <split:reconciled-state>n</split:reconciled-state> <split:value>-1418/1</split:value> <split:quantity>-1418/1</split:quantity> <split:account type="guid">科目:決済に使ったクレジットを意味するGUID</split:account> </trn:split> </trn:splits>
split:id はそのスプリット取引のIDです。
split:reconciled-state は、その取引の照合状態を表すアルファベットです。
split:value はそのスプリット取引の金額のようですが、最後に"/1"という文字がついています。この意味は今のところわかりません…
split:quantity は…どういう意味でしょう?総額、という意味かもしれませんが、今のところvalueと同じ値がセットされています。
split:account は、貸方/借方のIDです。
次に、「2009/11/10に、銀行口座がクレジットカードに1418円支払う」というエントリ。
<gnc:transaction version="2.0.0"> <trn:id type="guid">このクレジット引き落としエントリのGUID</trn:id> <trn:currency> <cmdty:space>ISO4217</cmdty:space> <cmdty:id>JPY</cmdty:id> </trn:currency> <trn:date-posted> <ts:date>2009-11-10 00:00:00 +0900</ts:date> </trn:date-posted> <trn:date-entered> <ts:date>2009-10-12 19:02:12 +0900</ts:date> <ts:ns>752500000</ts:ns> </trn:date-entered> <trn:description>食料品091013</trn:description> <trn:slots> <slot> <slot:key>notes</slot:key> <slot:value type="string"></slot:value> </slot> </trn:slots> <trn:splits> <trn:split> <split:id type="guid">引き落とし・クレカエントリのGUID</split:id> <split:reconciled-state>n</split:reconciled-state> <split:value>1418/1</split:value> <split:quantity>1418/1</split:quantity> <split:account type="guid">科目:決済に使ったクレジットを意味するGUID</split:account> </trn:split> <trn:split> <split:id type="guid">引き落とし・口座エントリのGUID</split:id> <split:reconciled-state>n</split:reconciled-state> <split:value>-1418/1</split:value> <split:quantity>-1418/1</split:quantity> <split:account type="guid">科目:引き落とし口座を意味するGUID</split:account> </trn:split> </trn:splits> </gnc:transaction>
基本的には一緒ですが、一部異なっています。
<trn:date-entered> <ts:date>2009-10-12 19:02:12 +0900</ts:date> <ts:ns>752500000</ts:ns> </trn:date-entered>
ts:nsという要素が追加されていますが、どういう意味なんでしょうかこれ…?
<trn:slots> <slot> <slot:key>notes</slot:key> <slot:value type="string"></slot:value> </slot> </trn:slots>
trn:slots, trn:slot という要素が追加されていますが、空っぽのようです。