17.1. 得意先請求書または仕入先請求書のインポート

インポートを動作させるには、データが固定フィールド、コンマ区切りのデータでなければいけません。 ダウンロードした注文を変換するPythonスクリプト例を次に示します。

import sys
import csv

VENDOR_ID="000013"
INFILE=sys.argv[1]
INV_ID=sys.argv[2]
try:
  ACCOUNT=sys.argv[3]
except:
  ACCOUNT="Expenses:Materials General"

Reader = csv.reader(open(INFILE), delimiter=',')

# Need to ignore 1st and last rows

for row in Reader:
  if row[0].isdigit(): # We only use numbered lines
    outline=(INV_ID + ",," + VENDOR_ID + ",,,," + row[1] + " > " + row[4] + ",ea," +
      ACCOUNT + "," + row[2] + "," + row[5].replace("GBP", "") + ",,,,no,,,,,,,,")
  print outline
      

Rapid Electronics (UK) からダウンロードした仕入先注文の例は次のようになります。

line number,product code,quantity,availability,product description,unit price,discounts,line total,delivery,sub total,vat,grand total
1,47-3524,100,100 Available,BC848C SOT-23 NPN TRANSISTOR (INF) (RC),GBP0.03,GBP0.00,GBP0.03
2,47-3278,30,30 Available,L78L05ACZ 0.1A +5V VOLTAGE REG (ST) (RC),GBP0.18,GBP0.00,GBP0.18
3,22-0120,1,1 Available,Tube 34 14pin DIL socket, narrow7.62mm, without central support,GBP1.05,GBP0.00,GBP1.05
4,22-0127,1,0 Available<br />1 on Back Order,Tube 17 28pin DIL socket, wide15.24mm, without central support,GBP1.22,GBP0.00,GBP1.22
5,62-0368,1,1 Available,820R CR25 0.25W CF Resistor Pk 100,GBP0.50,GBP0.00,GBP0.50
6,47-3130,100,100 Available,1N4001 1A 50V SILICON RECTIFIER DIODE RC,GBP0.01,GBP0.00,GBP0.01
7,17-0310,1,1 Available,PROFESSIONAL MINATURE PROBE HOOK RED RC,GBP0.90,GBP0.00,GBP0.90
8,17-0312,1,1 Available,PROFESSIONAL MINATURE PROBE HOOK BLACKRC,GBP0.90,GBP0.00,GBP0.90
9,34-0655,1,1 Available,PROTOBLOC 2 BREADBOARD,GBP4.39,GBP0.00,GBP4.39
10,18-0200,1,1 Available,PP3 9V ALKALINE BATTERY "Not For Retail Sale",GBP1.37,GBP0.00,GBP1.37
,,,,,,,,GBP4.95,GBP24.93,GBP4.35,GBP29.28
      

Pythonスクリプトで処理した後の同じファイルは次のようになります。

MEC-0071,,000013,,,,34-0655 > PROTOBLOC 2 BREADBOARD,ea,Expenses:Materials General,1,4.39,,,,no,,,,,,,,
MEC-0071,,000013,,,,18-0105 > PP3 / PP6 BATTERY CLIP 150MM (RC),ea,Expenses:Materials General,10,0.06,,,,no,,,,,,,,
MEC-0071,,000013,,,,62-0370 > 1k CR25 0.25W CF Resistor Pk 100,ea,Expenses:Materials General,1,0.50,,,,no,,,,,,,,
MEC-0071,,000013,,,,62-0354 > 220R CR25 0.25W CF Resistor Pk 100,ea,Expenses:Materials General,1,0.50,,,,no,,,,,,,,
MEC-0071,,000013,,,,34-5548 > PLAIN DOCUMENT WALLET ASSORTED PK 50 RE,ea,Expenses:Materials General,1,6.95,,,,no,,,,,,,,
MEC-0071,,000013,,,,62-0386 > 4k7 CR25 0.25W CF Resistor Pk 100,ea,Expenses:Materials General,1,0.50,,,,no,,,,,,,,
MEC-0071,,000013,,,,34-0860 > COPPER CLAD SRBP SS 100 X 160 (RC),ea,Expenses:Materials General,5,0.50,,,,no,,,,,,,,
MEC-0071,,000013,,,,18-0163 > PP3 BATTERY HOLDER WITH FLYING LEADS RC,ea,Expenses:Materials General,5,0.23,,,,no,,,,,,,,
MEC-0071,,000013,,,,73-4290 > ATMEGA8-16PU 8-BIT MICRO 8K DIL-28 (RC),ea,Expenses:Materials General,3,1.99,,,,no,,,,,,,,
MEC-0071,,000013,,,,81-0014 > BC108 NPN GP TRANSISTOR RC,ea,Expenses:Materials General,20,0.16,,,,no,,,,,,,,
MEC-0071,,000013,,,,DELIVERY,ea,Expenses:Postage,1,4.95,,,,no,,,,,,,,
MEC-0071,,000013,,,,VAT,tax,Expenses:VAT,1,4.35,,,,no,,,,,,,,
        

見て分かる通りいくつかのフィールドは空白で、いくつかのフィールドはインポートには必要ありません。 最初の行は不要です。また、GnuCashが注文金額を合計するので最後の行も余計です。 必要なのは、欲しい項目を選択してGnuCashにインポートできる正しい形式で出力ファイルを生成することです。 この場合、パーツ番号と説明文列を連結してGnuCash得意先請求書/仕入先請求書の説明欄に入力します。 また、数量と単価の列も必要です。 反対にVAT(付加価値税)列は含まれず、常に0になっています。VATは最後の行で注文の合計金額に対して計算しています。

注記

これは後々問題の原因となります。

この例では、資金移動勘定科目として費用:一般部材勘定科目を割り当てています。 勘定科目や他のデータはインポート後に通常の方法で変更することができます。 費用:一般部材勘定科目が無い場合は、フィールドを空にしておき、インポート時に手動で設定します。 #で始まる行はコメントとして無視されます。

スクリプトは次のコマンドで呼び出します。

python importer.py file_to_import, invoice_id > file_to_save_as.csv

この短いスクリプトはダウンロード形式に合わせて容易に変更できます。 今のところ残っている唯一の制限はフィールド数が固定ということです。 インポートツールはフィールド数に誤りがある行を無視します。 (将来のバージョンでは修正されます) VENDOR_IDは仕入先を特定するために割り当てるIDです。 raw[N] 項は行内のデータがあるフィールド位置を表します。 最初のフィールドがraw[1]ではなくraw[0]であることに注意が必要です。

ファイルの変換が完了したら、ビジネス得意先請求書&仕入先請求書のインポートを選択し、新規インポートウィンドウを開きます。 作成したファイルを選択し、仕入先請求書または得意先請求書を選択します。そしてコンマ(,)区切り形式を選択します。 この時点でデータを確認するウィンドウが表示されます。 OKを選択する前に、正しい列にフィールドデータがあることを確認します。 いったんインポートしたら、請求書は通常通編集し、記帳することができます。

VAT(付加価値税)、その他の購入時にかかる税金 (日本の場合は消費税) に関して注意が必要です。 前に説明したRapid Electronicsは仕入先請求書総額に対してVATを計算しています。 一方、GnuCashでは、行の合計ごとにVATを計算し、VATの金額を合計しています。 これにより、VATの金額に数セントの不整合が生じ、購入に使用した銀行またはクレジットカード勘定科目を照合する時に問題が発生する場合があります。 差し当たり、それをどう克服するかについては、個人の良心と会計方法に依存します。 VATを別の行に、配送料と併せて手動で入力する人もいます。 利用者にとっていくつかの作業が残りますが、すべての行を入力するつまらない作業は省くことができます。

今後の課題: 現在、インポート形式は非常に制限されており、多くの利用者にとって変換方法に課題があります。 すべての業者のCSV形式に関するテンプレートを加えることは大きすぎて不可能な作業です。また、業者はGnuCashチームに連絡しないで形式を変更します。 今後のインポート機能拡張は利用者からのフィードバックに基づきます。うまくいけば、処理をより簡単であるか、または、より柔軟にすることができます。 しばしば、簡単柔軟は両立しないことに注意します。

注記

Python (または他の利用可能な言語) が分からない場合、GnuCash利用者メーリングリストにダウンロードしたCSVの例と併せて要望を投稿してください。誰かが変換用のPythonスクリプトを書いてくれるかもしれません。

17.1.1. Python作者への備考

インポートを成功させるには、フィールド数を守らなければいけません。よって行末にあるコンマの数も重要です。

必須フィールドの全リストは次の通りです。

id, date_opened, owner_id, billingid, notes, date, desc, action, account, quantity, price, disc_type, disc_how, discount, taxable, taxincluded, tax_table, date_posted, due_date, account_posted, memo_posted, accu_splits,

注記

行末のコンマに注意してください。

17.1.2. それぞれのフィールドの簡単な説明

  • id - 得意先/仕入先請求書番号です。 すべての行がこれを含まなければいけません。さもなければ、行は拒絶されます。

  • date_opened - 空欄の場合、今日の日付が使用されます。

  • owner_id - 得意先または仕入先のID番号です。 すべての行がこれを含まなければいけません。さもなければ、行は拒絶されます。

  • billingid - 請求IDです。

  • notes - 請求書の備考です。

  • date - 項目行の日付です。 空欄の場合、今日の日付が使用されます。

  • desc - 通常の得意先/仕入先請求書の説明です。

  • action - 仕入先請求書では、通常eaにします。

  • account - 商品の資金移動勘定科目です。

  • quantity - 商品の数量です。 すべての行がこれを含まなければいけません。さもなければ、行は拒絶されます。

  • price - 商品の単価です。 すべての行がこれを含まなければいけません。さもなければ、行は拒絶されます。

  • disc_type - 値引のタイプです。%またはTODOで指定します。得意先請求書にのみ当てはまります。 実験では、通貨によってはこのフィールドが必要になります。

  • disc_how - 得意先請求書にのみ適用されます。

  • discount - 適用する割引の量です。得意先請求書にのみ適用されます。

  • taxable - 商品に税金を適用するかどうかを指定します。yまたは空欄にします。

  • taxincluded - 商品価格に税金が含まれているかどうかを指定します。yまたは空欄にします。

  • tax_table - 商品に適用する税額表を指定します。

  • date_posted - 記帳する場合、記帳日を指定します。 通常は空欄のままにし、請求書を編集した後に手動で記帳します。

  • due_date - 支払期日を指定します。

  • account_posted - 記帳先勘定科目を指定します。

  • memo_posted - 記帳する場合には、説明を指定します。

  • accu_splits - スプリットを累計するかどうかを指定します。yまたは空欄にします。