JPiereの期末在庫評価の計算方法に、総平均原価を追加しました。
総平均原価の追加理由
JPiereの期末在庫評価の計算は、在庫評価プロファイルを使用して、在庫評価計算伝票で行うようになっています。平均単価で評価しようとして場合、"平均発注単価"と"平均請求単価"がこれまでも選べましたが、この計算は、単純平均(期間平均)であり、期首在庫の評価金額と在庫数量は平均単価の計算に加味されていませんでした。
これまでの機能でも、在庫評価期間をシステムの運用開始日とすることで、総平均原価的な評価は可能でしたが、この方法だと運用期間が長くなればなるほど、処理に時間がかかるようになりますし、期首在庫の評価金額と在庫数量が加味されていないので、会社の設立当初から運用を開始していない限りは、正確な総平均原価にはなりません。
そこで、JPiereでは、これまでの"平均発注単価"と"平均請求単価"の計算方法を"単純平均(期間平均)"とし、期首在庫の評価金額と在庫数量を平均単価の計算に加味する在庫評価計算処理を"総平均"として追加しました。
総平均原価の計算処理
在庫評価プロファイルの設定
在庫評価方法で”平均発注単価”か"平均請求単価"を選択した場合、平均単価計算方法フィールドが表示され、"総平均"か"単純平均(期間平均)"を選択します。ここで、"単純平均(期間平均)"を選択すると、これまで実装されていたロジックで在庫評価計算伝票で在庫評価が行われます。"総平均"を選択すると、今回追加した新しい在庫評価ロジックで在庫評価が行われます。
在庫評価計算伝票明細作成
在庫評価計算伝票の在庫評価計算伝票明細作成プロセスを実行すると、総平均で計算する在庫評価計算プロファイルを使用している場合は、"期首となる在庫評価計算伝票"が入力されていない場合は、"期首在庫となる在庫評価計算伝票"を自動設定します。
JPiereのデフォルトの在庫評価計算明細作成クラスでは、次の条件に合致している在庫評価計算伝票を"期首在庫となる在庫評価計算伝票"に自動設定します。
- 同じ在庫評価プロファイルを使用している在庫評価計算伝票
- 在庫計算伝票の"前回評価日付"と同じ日付の"評価日付"が設定されている在庫評価計算伝票
- 伝票スタータスが"完成"か"クローズ"になっている在庫評価計算伝票
- 上記条件に合致する在庫評価計算伝票が複数ある場合には、在庫評価計算伝票のID(JP_InvValCal_ID)が一番大きい在庫評価計算伝票
上記条件に合致する在庫評価計算伝票が無い場合は、自動設定されません。また自動設定される場合でも、これはあくまでも在庫評価計算伝票明細プロセスのロジックにより自動設定されているだけですので、手入力で修正できます。
- 異なる在庫評価プロファイルの在庫評価計算伝票は設定する事ができません。
- 期首となる在庫評価計算伝票は、その評価日付が、在庫計算伝票の前回評価日付と同じ日付でなくてはいけません。
在庫評価計算
在庫評価計算伝票で、総平均で在庫評価を行う場合には、期首在庫の評価金額と在庫数量を持っている在庫評価計算伝票(≒前回の在庫評価計算伝票)を指定します。
◆平均発注単価 - 総平均
まず評価日付から前回評価日付の期間の入荷伝票(ベース伝票タイプが”MMR”で、IsSOTrxフラグが”N”であり伝票ステータスが”完成”か”クローズ”の入荷伝票明細)を取得します。 (※2016年11月11日修正)
まず評価日付から前回評価日付の期間の"入荷伝票"と"仕入先返品依頼伝票"の伝票ステータスが”完成”か”クローズ”の明細データを取得します。
そしてその中から、入荷伝票の入荷数量が0以下のマイナス数量の明細データと仕入先返品依頼伝票の明細データは平均発注単価の計算から除外します。
【補足説明】平均発注単価の計算から返品データを除外している理由。
返品処理のデータを平均発注単価の計算に加味すると複雑性が増し実装工数が増えます。
そして、一方で返品処理のデータを加味しても加味しなくても、最終的に平均発注単価の計算としては、大きな差異はなく無視できる程度の差異なのではないかと思います("重要性の原則"の観点から考えて、問題になるほど大きな差異にはならないと思います)。
そのためデフォルトでJPiereが用意している平均発注単価の在庫評価計算においては今のところ返品処理のデータは平均発注単価の計算においては無視する仕様としています。
JPiereの在庫評価計算は、計算処理をするプロセスをプラグインとして差し替える事ができますので、上記仕様で問題がある場合には自由にカスタマイズして下さい。
計算対象が入荷伝票のプラスの数量の明細に絞られたところで、その中から照合されている発注伝票明細の"発注金額の合計(≒当期商品仕入高)"と"発注数量の合計(≒当期商品仕入数量)"を算出します。
次に在庫評価計算伝票のヘッダー情報に入力されている、"期首となる在庫評価計算伝票"フィールドに設定されている在庫評価計算伝票から、在庫評価金額と帳簿数量を取得し、当期商品仕入高と当期商品仕入数量にそれぞれ加算し、合計金額から合計数量を除算して総平均原価(在庫評価単価)を求め、総平均原価に期末在庫数量を乗算して期末在庫評価金額を算出します。
まとめると次のような計算式になります。
- 総平均原価(在庫評価単価)=(期首在庫評価額+当期仕入額)÷ (期首在庫数量 +当期仕入数量)
- 在庫評価金額 = 総平均原価(在庫評価単価) × 期末在庫数量
期首となる在庫評価計算伝票が設定されていない場合は、"単純平均(期間平均)"で計算します。(2019年4月23日改修)
平均単価の算出に際して小数点以下の金額の取扱いについては、通貨の原価計算精度に依存します。通貨の原価計算精度以下の桁数は四捨五入されます。そして品目毎の在庫評価金額については、通貨の標準精度に依存し、標準精度以下の桁数は四捨五入されます。
◆2019年4月23日改修
平均発注単価の"総平均"の在庫評価方法の際に、期首在庫の評価額と在庫数量を期首在庫となる在庫評価計算伝票からのみ取得していたのを、次のいずれかの方法で取得するように改修しました。
①期首在庫となる在庫評価計算伝票が指定されている場合
->期首在庫となる在庫評価計算伝票の対応する明細に入力されている在庫評価単価と帳簿数量を使用します。
②期首在庫となる在庫評価計算伝票が指定されていない場合
->期首在庫の数量は前回評価日付の組織在庫のタイムスタンプから取得します。 ->在庫評価単価は、在庫評価プロファイルに設定されているプライスリストの前回評価日付のバージョンから取得します。該当するデータが無い場合は、標準原価の”現在の原価”を使用します。 ③上記のいずれにも該当しない場合
->期首の時点では在庫は存在していなかった事になります。その場合、単純平均(期間平均)で計算します。
◆平均請求単価 - 総平均
まず評価日付から前回評価日付の期間の入荷伝票(ベース伝票タイプが”MMR”で、IsSOTrxフラグが”N”であり伝票ステータスが”完成”か”クローズ”の入荷伝票明細)を取得します。 (2016年11月11日修正)
まず評価日付から前回評価日付の期間の"入荷伝票"と"仕入先返品依頼伝票"の伝票ステータスが”完成”か”クローズ”の明細データを取得します。
そして、その明細データが照合されている請求伝票明細の"請求金額の合計(≒当期商品仕入高)"と"請求数量の合計(≒当期商品仕入数量)"を算出します。
次に在庫評価計算伝票のヘッダー情報に入力されている、"期首となる在庫評価計算伝票"フィールドに設定されている在庫評価計算伝票から、在庫評価金額と帳簿数量を取得し、当期商品仕入高と当期商品仕入数量にそれぞれ加算し、合計金額から合計数量を除算して総平均原価(在庫評価単価)を求め、総平均原価に期末在庫数量を乗算して期末在庫評価金額を算出します。
まとめると次のような計算式になります。
- 総平均原価(在庫評価単価)=(期首在庫評価額+当期仕入額)÷ (期首在庫数量 +当期仕入数量)
- 在庫評価金額 = 総平均原価(在庫評価単価) × 期末在庫数量
期首となる在庫評価計算伝票が設定されていない場合は、"単純平均(期間平均)"で計算します。(2019年4月23日改修)
平均単価の算出に際して小数点以下の金額の取扱いについては、通貨の原価計算精度に依存します。通貨の原価計算精度以下の桁数は四捨五入されます。そして品目毎の在庫評価金額については、通貨の標準精度に依存し、標準精度以下の桁数は四捨五入されます。
◆2019年4月23日改修
平均請求単価の"総平均"の在庫評価方法の際に、期首在庫の評価額と在庫数量を期首在庫となる在庫評価計算伝票からのみ取得していたのを、次のいずれかの方法で取得するように改修しました。
①期首在庫となる在庫評価計算伝票が指定されている場合
->期首在庫となる在庫評価計算伝票の対応する明細に入力されている在庫評価単価と帳簿数量を使用します。
②期首在庫となる在庫評価計算伝票が指定されていない場合
->期首在庫の数量は前回評価日付の組織在庫のタイムスタンプから取得します。
->在庫評価単価は、在庫評価プロファイルに設定されているプライスリストの前回評価日付のバージョンから取得します。該当するデータが無い場合は、標準原価の”現在の原価”を使用します。 ③上記のいずれにも該当しない場合
->期首の時点では在庫は存在していなかった事になります。その場合、単純平均(期間平均)で計算します。
カスタマイズ履歴
2019年4月23日
平均発注単価と平均請求単価の"総平均"の在庫評価方法の際に、期首在庫の評価額と在庫数量を期首在庫となる在庫評価計算伝票からのみ取得していたのを、次のいずれかの方法で取得するように改修しました。
①期首在庫となる在庫評価計算伝票が指定されている場合
->期首在庫となる在庫評価計算伝票の対応する明細に入力されている在庫評価単価と帳簿数量を使用します。
②期首在庫となる在庫評価計算伝票が指定されていない場合
->期首在庫の数量は前回評価日付の組織在庫のタイムスタンプから取得します。
->在庫評価単価は、在庫評価プロファイルに設定されているプライスリストの前回評価日付のバージョンから取得します。該当するデータが無い場合は、標準原価の”現在の原価”を使用します。 ③上記のいずれにも該当しない場合
->期首の時点では在庫は存在していなかった事になりますので、単純平均(期間平均)で計算します。
◆修正クラス
- jpiere.base.plugin.org.adempiere.process.DefaultInventoryValuationCalculate
2016年11月12日:平均請求原価の計算に返品を含めて計算する
これまで、平均請求単価を計算する際に、返品は考慮していませんでしたが、このカスタマイズで返品を平均請求単価を計算する際に考慮するように致しました。
カスタマイズ情報
追加リストバリデーション
◆JP Type of Average Cost(平均単価の計算方法)
下記の選択リスト:
- GA:総平均(Gross Average)
- PA:単純平均(期間平均)(Periodic Average)
追加テーブルバリデーション
◆JP JP_InvValCal(在庫評価計算伝票)
◆JP JP_InvValCalLine(在庫評価計算伝票明細)
追加カラム
◆JP_InvValProfile(在庫評価プロファイル)テーブル
- JP_TypeOfAverageCost(平均単価の計算方法)
◆JP_InvValCal(在庫評価計算伝票ヘッダー)テーブル
- JP_BeginInvValCal_ID(期首在庫となる在庫評価計算伝票)
◆JP_InvValCalLine(在庫評価計算伝票明細)テーブル
- JP_BeginInvValCalLine_ID(期首在庫となる在庫評価計算伝票明細)
◆JP_InvValCalLog(在庫評価計算伝票ログ)テーブル
- JP_BeginInvValCalLine_ID(期首在庫となる在庫評価計算伝票明細)
修正クラス
◆在庫評価計算伝票名足作成プロセス(DefaultCreateInvValCalLine)
総平均の計算の場合で、期首となる在庫評価計算伝票が入力されていない場合は、期首となる在庫評価計算伝票を自動設定するように変更しました。
◆在庫評価計算プロセス(DefaultInventoryValuatiionCalculate)
総平均原価の計算ロジックを追加しました。
◆在庫評価計算プロファイル(MInvValProfile)
beforeSave()メソッドで、在庫評価方法が”請求平均単価"と"発注平均単価"ではない場合、”平均単価の計算方法”をブランクにするようにしました。
◆在庫評価計算伝票ヘッダ(MInvValCal)
beforeSave()メソッドで、期首となる在庫評価計算伝票の入力がある場合で、かつ在庫評価プロファイルが総平均を採用している場合、同じ在庫評価プロファイルを使用しているかどうかのチェックと、期首となる在庫評価計算伝票の伝票ステータスが"完成"もしくは"クローズ"になっているかのチェックと、期首となる在庫評価計算伝票の評価日付と前回評価日付が同じかどうかのチェックと追加しました。
◆モデルクラス(XクラスとIクラス)の再作成
次のテーブルはカラムを追加したため、XクラスとIクラスを再作成しています。
- JP_InvValProfile(在庫評価プロファイル)
- JP_InvValCal(在庫評価計算伝票ヘッダー)
- JP_InvValCalLine(在庫評価計算伝票明細)
- JP_InvValCalLog(在庫評価計算ログ)
追加メッセージ
◆JP_BeginningInventory
Beginning Inventory(期首在庫)
◆JP_DifferentInvValProfile
Different Inventory Valuation Profile(在庫評価プロファイルが異なります。)
◆JP_DiffDateValue
Last Date Value is different from Valuation Date of Beginning Inventory Valuation(期首となる在庫評価計算伝票の評価日付と前回評価日付が異なります。)
◆JP_CreateStockOrgTimestamp
Please Create Stock Org Timestamp(組織在庫のタイムスタンプを作成して下さい。)