しょんぼり技術メモ

まいにちがしょんぼり

GnuCashのXML(の取引部分)を読む

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 という要素が追加されていますが、空っぽのようです。