sironekotoroの日記

Perl で楽をしたい

1 行増えただけじゃん

長い前置き

平穏な時代

経理のお仕事で、仕訳というのがあります。複式簿記に則ってお金や債権・債務の流れを記録していきます。

いろいろなやり方があると思うのですが、うちの場合、 Google Sheet でマスターデータを書いておいて、それを Google Apps で処理して会計ソフト(弥生会計)取り込み用の csv ファイルにする、という方法をとっています。

マスタデータはこんな感じです。

名前 発生 金額 手数料負担 支払手数料 摘要
白猫商事 2021.12 10,000 得意先 176 猫用ホットカーペット

ひとつの振込先につき支払いはひとつ、という前提があり、こんなフローで仕訳 csv を作成します。

振り込み手数料は 30,000 円未満は 176円、30,000 円以上は275円です。

  1. マスターデータから 1 行取り込む
  2. 銀行手数料が得意先負担の場合には、以下の2行を作って仕訳シートに追加する
    1. 支払額から支払い手数料を算出する
    2. 支払額から支払手数料を引いた金額を支払額にする
    3. 支払手数料の行を追加する
  3. 銀行手数料が当方負担の場合には、金額をそのままに1行作って仕訳シートに追加する

データ構造としてはこんな感じです

[
    { 名前 => 白猫商事, 金額 => 10000, 手数料負担 => 得意先, 支払手数料 => 176, ... },
]

で、仕訳を作るとこんな感じです。

勘定科目 金額 勘定科目 金額 摘要
未払金 10,000 普通預金 9,824 白猫商事/2021.12/猫用ホットカーペット
支払手数料 176 白猫商事/2021.12/振込手数料

相手への支払い義務のあるお金(未払金)を、普通預金から出金して支払うという仕訳です。

ただし、白猫商事は振込手数料を先方が負担するので、手数料分を引いた金額を振込みます。

崩れる前提

ひとつの振込先につき支払いはひとつ、という前提があり、仕訳csvを作る時は

はい。ある日突然、一つの振込先に対する支払いの行を複数にすることになります。

名前 発生 金額 手数料負担 支払手数料 摘要
黒猫農業 2021.12 10,000 得意先 176 マタタビ
黒猫農業 2021.12 30,000 得意先 176 高級マタタビ

そして、振り込まれる側(この場合は黒猫農業)としては、一括で振り込んで欲しい(一つの支払いごとに支払い手数料を負担したくない)のも当然ですね。

最終的にはこういう仕分けになります。振り込み額が30,000円を超えるので、銀行手数料が変更になります。

勘定科目 金額 勘定科目 金額 摘要
未払金 10,000 普通預金 39,725 黒猫農業/2021.12/マタタビ
未払金 30,000 黒猫農業/2021.12/高級マタタビ
支払手数料 275 黒猫農業/2021.12/振込手数料

ぎゃー!

こうなってしまうと、マスターデータから1行読み込んで処理するという方法は取れません。

マスターデータ側で合算して 1 行にしてしまうのが一番簡単ですが、会計ソフト上でマタタビ・高級マタタビでそれぞれの費用を分析する場合には不向きになります。

となると、このような感じで処理することになります。

  1. ハッシュのデータ構造にする。key を名前に、 value には配列を格納するハッシュ(辞書型)のデータ構造を作る
  2. 同じ key の場合には、value に push する
  3. 出来上がったデータ構造を key ごとに処理する
    1. value の要素が 1 つだけの場合(白猫商事、黒猫物産の場合)は従来通り
    2. value の要素が複数の場合
      1. 支払額を合算
      2. 支払手数料も合算した額で算出
      3. 合算した支払額を1行目に集約
      4. 2行目以降は未払金のみ記載、支払額欄は空欄
      5. 最後の行に支払手数料を入れる

となります。この処理を行うためには、こんなデータ構造にする必要があります。

{
    茶虎農業 => [ 
        { 金額 => 10000, 手数料負担 => 得意先, ... }, 
        { 金額 => 30000, 手数料負担 => 得意先, ...  },
     ],
}

ここまでデータ構造の当たりがつけば、要件を満たすことができそうです。

というわけで

この「ぎゃー!」ってなってから実装し直すまで結構時間がかかった(試行錯誤で 1 日半くらい)ので記念に書いてみました。

こうやって書き出して思い出してみると、たいしたことないところで悩んでたなー、とか思うんですが、まぁ、喉元過ぎれば熱さ忘れるってやつですね。