財務諸表をさっくり学べるゲーム作りの一環で、今回は仕入価格が変わっていく時の単価計算について。
※日本の簿記で使われている用語の英訳にはゆらぎがあります。関数名にした時にイメージしやすい名前で選んでいます。
参考
https://dma-office.jp/2019/08/28/zaikohyouka/
少なくとも6種類の原価計算法と、時価を意識した低価法とがあります。
最も素直な原価計算法は先入先出法です。これは、文字通り仕入れた順に売り上げていき、仕入れた時の価格をそのまま商品原価として計上する方法です。英語でもfirst-in first-out=FIFOです。
最も厳格なのは個別法です。これは、同一商品でも優劣があり、先に仕入れたからといって先に売れるとは限らない場合に適用します。これだけがランダムアクセスになります。
その他の原価法は、個別法を除くと、どちらかというと計算を簡単にして、単価を把握しやすくするための計算法です。個別法以外は先入先出法に少し機能を追加することで実装できそうです。
そのため、商品単価をシミュレートするには、まず先入先出法から考えます。
原価法 (Cost method)
先入先出法 (First-in first-out method)
商品を仕入れた順に売り、原価は常に仕入価格で計算する方法です。
商品が仕入れた順に正しく商品棚に並べられて、先入先出(FIFO)構造になっていると想定します。
単価が割り切れないケースまで想定するなら、商品は単価でなく仕入価格(合計)と個数にし、単価を関数にします。(残数も要りますね)
個別法 (Individual method)
同一商品に優劣があり、必ずしも先に仕入れたものが先に売れるとは限らない(先入先出法が適用できない)場合に使用します。先入先出法のように仕入タイミングだけで管理できない意味で厳密で、古物商など、少数取扱で使用されるようです。
データ構造としてはランダムアクセス性が求められるため、管理するにはインデックスまたはID(通し番号)と、価格を決定づける(同一商品との差異を示す、いくつかの特徴(視覚的、その他特徴)が必要になります。
最終仕入原価法 (Last purchase cost method)
最終仕入原価法は、常に一番最後に仕入れた価格を売上原価にする方法です。
先入先出法の商品データを利用して、最後に仕入れた価格を参照すれば実現できそうです。
総平均法 (Weighted average method)
期首仕入(繰越商品の振替)を含む当期仕入を全部加算します。仕入個数が多いタイミングの単価の寄与率が高いので、重み付け計算になります。締日にならないと原価が確定しません。
これは、期首からの先入先出法の商品データの合計と算出された単価と合計金額を保存しておいて、仕入の度に加算する領域を用意することで実現できそうです。
※図の変更:総原価の変数は合計+個数になる。
移動平均法 (Moving average method)
仕入の都度原価を計算します。売り上げた直後に利益が分かり、また一時的な値上がり、値下がりの影響を均す効果がありそうです。
これは、総平均法で用意した領域に対して、売り上げた商品の単価と個数を減算することで実現できそうです。
売価還元法 (Retail method)
複数の商品をひとまとめにして、一つの原価として扱います。
データ構造的には、商品グループ毎の希望売価と原価率が必要そうです。また原価率の計算には、売価と仕入原価が必要になるため、先入先出法のリストを使って計算することになります。
なお、原価率が実績ベースの計算のため、初年度からの適用はできないものと思われます。また、設定した原価率は翌年(事業年度)を通じて使用されるようです。
https://keiriplus.jp/tips/tanaoroshishisan-7baikakangenhou/