iDempiere 原価調整伝票の使い方|在庫管理 操作マニュアル・技術仕様
📖 在庫管理の全体像: 在庫管理の業務フロー全体図 も合わせてご覧ください。
原価調整伝票は、品目の在庫原価(Cost Price)を手動で修正するための伝票です。棚卸伝票と同じ M_Inventory テーブルを使いますが、**伝票タイプの在庫サブタイプが「原価調整(Cost Adjustment)」**である点が実地棚卸との違いです。数量は動かさず、原価だけを調整します。
📌 ポイント: 原価調整伝票では在庫数量は変動しません。動かすのは原価のみです。数量を修正したい場合は 実地棚卸 を使用してください。
期首移行時の原価取込み、仕入原価の遡及修正、標準原価の改定など、在庫評価額を正しい金額に是正したい場面で使用します。
原価調整伝票でできること
Section titled “原価調整伝票でできること”- 品目ごとの現在の原価から新しい原価への変更
- 属性セットインスタンス(ロット・バッチ)単位での原価調整
- 在庫評価方法(Costing Method)を指定した調整
- 通貨・通貨レートタイプを指定した外貨建て原価の調整
- プロジェクト・アクティビティ・営業活動・コストセンター・部門などの会計ディメンション付与
- 完了後の会計仕訳(転記)と、逆仕訳による取り消し
原価調整伝票はヘッダー+明細の2タブ構成です。
| タブ名 | テーブル | 項目数 | 役割 |
|---|---|---|---|
| Cost Adjustment | M_Inventory | 20項目 | 伝票番号・伝票タイプ・移動日付・在庫評価方法・会計ディメンション |
| Cost Adjustment Line | M_InventoryLine | 12項目 | 品目・属性セットインスタンス・現在の原価・新しい原価 |
💡 ヒント:
M_Inventoryは実地棚卸・内部使用棚卸・原価調整の3種類の伝票で共有されるテーブルです。どの動作になるかは伝票タイプの在庫サブタイプで決まります。原価調整用の伝票タイプが未整備の場合、先に伝票タイプを準備してください。
基本操作手順
Section titled “基本操作手順”graph TD
A["📂 メニューから<br/>原価調整伝票を開く"] --> B["➕ 新規<br/>伝票タイプ(原価調整)を選択"]
B --> C["📅 移動日付を入力<br/>通貨は会計スキーマ通貨が自動設定"]
C --> D["⚙️ 在庫評価方法を選択<br/>(標準原価・平均原価など)"]
D --> E["💾 ヘッダーを保存"]
E --> F["📋 明細タブで品目を選択"]
F --> G{"原価計算レベルが<br/>バッチ/ロット?"}
G -->|"Yes"| H["🏷 属性セットインスタンスを必ず指定"]
G -->|"No"| I["現在の原価が自動セットされる"]
H --> I
I --> J["💰 新しい原価を入力"]
J --> K["▶ 棚卸プロセス(DocAction)で<br/>「完了」を実行"]
K --> L["📒 原価が更新され<br/>転記対象になる"]
アクセス方法(メニューパス)
Section titled “アクセス方法(メニューパス)”メニューから「在庫管理 > 原価調整伝票」を開きます。
- ツールバーの「新規」ボタンをクリック
- ヘッダー情報を入力:
- 伝票タイプ: 在庫サブタイプが「原価調整」の伝票タイプを選択(必須)
- 移動日付: 調整を計上する日付(初期値は当日)
- 在庫評価方法: 調整対象の原価計算方法(標準原価・平均原価等)
- 通貨: 未入力の場合、保存時に主会計スキーマの通貨が自動設定されます
- 説明: 調整理由のメモ(任意)
- 必要に応じて会計ディメンション(プロジェクト、アクティビティ、営業活動、Cost Center、Department、ユーザー1/2)を入力
- 「保存」をクリック
- 「Cost Adjustment Line」タブに移動して明細を登録:
- 品目: 調整対象の品目(必須)
- 属性セットインスタンス: ロット/バッチ単位で原価管理する場合は必須
- 現在の原価: 保存時に既存の原価レコードから自動セットされます
- 新しい原価: 調整後の原価を入力
- ヘッダーに戻り、**棚卸プロセス(DocAction)**で「完了」を実行
⚠️ 注意: 明細を1件でも登録した後は倉庫を変更できません(
CannotChangeWarehouseエラー)。倉庫を変えたい場合は明細をすべて削除してから変更してください。
伝票処理(DocAction / DocStatus)
Section titled “伝票処理(DocAction / DocStatus)”| 伝票アクション | 処理内容 |
|---|---|
| 完了(Complete) | 原価調整を確定し、原価レコードを更新 |
| 承認 / 却下 | 承認金額に基づく承認処理 |
| 無効化(Void) | 未転記の伝票を無効化 |
| 締切(Close) | 伝票を締め切る |
| 逆仕訳-訂正 / 逆仕訳-発生 | 完了済み伝票を反対仕訳で取り消す |
| 再有効化(Re-activate) | 完了済み伝票を編集可能な状態に戻す |
完了後は「転記」ボタンで会計仕訳の転記状況を確認できます。
項目リファレンス
Section titled “項目リファレンス”Cost Adjustment タブ(ヘッダー)
Section titled “Cost Adjustment タブ(ヘッダー)”| 項目名 | 必須 | 型 | 説明 |
|---|---|---|---|
| 伝票番号 | 必須 | 文字列 | 伝票採番 |
| 伝票タイプ | 必須 | 選択 | 在庫サブタイプ = 原価調整のもの |
| 移動日付 | 必須 | 日付 | 調整の計上日(初期値 当日) |
| 在庫評価方法 | - | リスト | 標準原価・平均原価等 |
| 通貨 | - | 選択 | 未指定なら主会計スキーマ通貨を自動設定 |
| 通貨レートタイプ | - | 選択 | 為替換算のレートタイプ |
| 説明 | - | 文字列 | 調整理由 |
| プロジェクト | - | 選択 | 会計ディメンション |
| アクティビティ | - | 選択 | 会計ディメンション |
| 営業活動 | - | 選択 | 会計ディメンション |
| Cost Center | - | 選択 | コストセンター |
| Department | - | 選択 | 部門 |
| 伝票状態 | 必須 | リスト | 初期値 DR(ドラフト) |
| 棚卸プロセス | 必須 | ボタン | 伝票アクション(初期値 CO) |
| 転記 | 必須 | ボタン | 転記状態 |
Cost Adjustment Line タブ(明細)
Section titled “Cost Adjustment Line タブ(明細)”| 項目名 | 必須 | 型 | 説明 |
|---|---|---|---|
| 明細番号 | - | 整数 | 自動採番(既存最大+10) |
| 品目 | 必須 | 検索 | 調整対象の品目 |
| 属性セットインスタンス | 必須 | 品目属性 | 原価計算レベルがバッチ/ロットなら必須 |
| 現在の原価 | - | 原価・価格 | 保存時に自動セット(初期値 0) |
| 新しい原価 | - | 原価・価格 | 調整後の原価(初期値 0) |
| 料金 | - | 選択 | 追加費用の勘定科目 |
| 説明 | - | 文字列 | 明細のメモ |
3種類の在庫伝票の使い分け
Section titled “3種類の在庫伝票の使い分け”M_Inventory は在庫サブタイプによって役割が変わります。
| 在庫サブタイプ | ウィンドウ | 数量の変動 | 原価の変動 | 主な用途 |
|---|---|---|---|---|
| 実地棚卸(Physical Inventory) | 実地棚卸 | あり | 間接的 | 棚卸差異の反映 |
| 内部使用(Internal Use) | 在庫減少・増加 | あり | 間接的 | 社内消費の払出(料金勘定が必須) |
| 原価調整(Cost Adjustment) | 原価調整伝票 | なし | あり | 在庫評価額の是正 |
よくある質問(FAQ)
Section titled “よくある質問(FAQ)”Q. 「原価レコードがありません」と表示されて保存できません。
Section titled “Q. 「原価レコードがありません」と表示されて保存できません。”明細保存時に対象品目(および属性セットインスタンス)の現在原価レコードが見つからない場合のエラーです。在庫評価方法が標準原価(Standard Costing)以外のときは現在原価が必須のため保存できません。先に取引実績を作るか、標準原価方式で登録してください。
Q. 属性セットインスタンスが必須になるのはどんなときですか?
Section titled “Q. 属性セットインスタンスが必須になるのはどんなときですか?”品目の原価計算レベル(Costing Level)がバッチ/ロットの場合です。この場合、属性セットインスタンスが未指定だと FillMandatory エラーになります。原価計算レベルは品目カテゴリ・会計スキーマの設定で決まります。
Q. 明細に保管場所を入力しても保存すると消えてしまいます。
Section titled “Q. 明細に保管場所を入力しても保存すると消えてしまいます。”仕様です。原価調整伝票では保存時に保管場所(M_Locator_ID)が 0 にクリアされます。原価調整は保管場所単位ではなく品目(+属性セットインスタンス)単位で行われるためです。
Q. 通貨を入力しなかった場合はどうなりますか?
Section titled “Q. 通貨を入力しなかった場合はどうなりますか?”保存時に主会計スキーマの通貨が自動設定されます。ヘッダーの通貨と一致する会計スキーマが明細処理時に選択されるため、複数会計スキーマ環境では通貨の指定が実質的にスキーマの指定になります。
Q. 「伝票の在庫サブタイプが設定されていません」というエラーが出ます。
Section titled “Q. 「伝票の在庫サブタイプが設定されていません」というエラーが出ます。”伝票タイプの**在庫サブタイプ(DocSubTypeInv)**が「実地棚卸」「内部使用」「原価調整」のいずれにも設定されていない場合のエラーです。伝票タイプ設定で在庫サブタイプを「原価調整」に設定してください。
Q. 完了後に間違いに気づいた場合は?
Section titled “Q. 完了後に間違いに気づいた場合は?”逆仕訳-訂正(Reverse-Correct)または逆仕訳-発生(Reverse-Accrual)で取り消します。逆仕訳伝票が新たに生成され、元伝票には逆仕訳への参照(Reversal_ID)が記録されます。
🛠 技術仕様(開発者向け)
原価調整伝票は伝票(Document)型のウィンドウ(AD_Window_ID: 200043)で、実地棚卸・内部使用棚卸と同じ M_Inventory / M_InventoryLine テーブルを共有します。MInventory クラス(1,354行)が DocAction を実装し、MInventoryLine クラス(544行)が在庫サブタイプ別のバリデーションを担当します。どのモードで動くかは MDocType.getDocSubTypeInv() の値(DOCSUBTYPEINV_CostAdjustment 等)で分岐します。両テーブルとも AccessLevel = 1(Organization)です。
アーキテクチャ概要
Section titled “アーキテクチャ概要”classDiagram
class MInventory {
+beforeSave(boolean) boolean
+prepareIt() String
+completeIt() String
+voidIt() boolean
+reverseCorrectIt() boolean
+getLines(boolean) MInventoryLine[]
#reverse(boolean) MInventory
#checkMaterialPolicy(MInventoryLine, BigDecimal) void
}
class MInventoryLine {
+beforeSave(boolean) boolean
+getCurrentCostPriceForCostAdjustment() BigDecimal
+isInternalUseInventory() boolean
+getMovementQty() BigDecimal
}
class X_M_Inventory {
<<generated>>
}
class PO {
<<abstract>>
}
class DocAction {
<<interface>>
}
MInventory --|> X_M_Inventory
X_M_Inventory --|> PO
MInventory ..|> DocAction
MInventory --> MInventoryLine : has many
MInventoryLine --> MProduct : adjusts cost of
MInventoryLine --> MAttributeSetInstance : batch/lot
パッケージ: org.compiere.model
ソースファイル: org.adempiere.base/src/org/compiere/model/MInventory.java(1,354行) / MInventoryLine.java(544行)
関連DBテーブル
Section titled “関連DBテーブル”M_Inventory(原価調整伝票ヘッダー)
Section titled “M_Inventory(原価調整伝票ヘッダー)”| カラム名 | 型 | 必須 | 説明 | 備考 |
|---|---|---|---|---|
| M_Inventory_ID | ID | PK | 伝票ID | 主キー |
| AD_Client_ID | Table Direct | Y | テナント | 既定 @#AD_Client_ID@ |
| AD_Org_ID | Table Direct | Y | 組織 | 既定 @#AD_Org_ID@ |
| DocumentNo | String | Y | 伝票番号 | |
| C_DocType_ID | Table Direct | Y | 伝票タイプ | 在庫サブタイプで動作が決まる |
| MovementDate | Date | Y | 移動日付 | 既定 @#Date@ |
| CostingMethod | List | N | 在庫評価方法 | |
| C_Currency_ID | Table Direct | N | 通貨 | 未設定時は主会計スキーマ通貨 |
| C_ConversionType_ID | Table Direct | N | 通貨レートタイプ | |
| M_Warehouse_ID | Table Direct | N | 倉庫 | 明細作成後は変更不可 |
| DocStatus | List | Y | 伝票状態 | 既定 DR |
| DocAction | Button | Y | 伝票アクション | 既定 CO |
| Posted | Button | Y | 転記状態 | |
| IsApproved | Yes-No | Y | 承認済み | |
| ApprovalAmt | Amount | N | 承認金額 | |
| Reversal_ID | Search | N | 逆仕訳伝票 | 逆仕訳時に設定 |
| C_CostCenter_ID | Table Direct | N | コストセンター | |
| C_Department_ID | Table Direct | N | 部門 | |
| Processed | Yes-No | Y | 処理済み |
M_InventoryLine(原価調整伝票明細)
Section titled “M_InventoryLine(原価調整伝票明細)”| カラム名 | 型 | 必須 | 説明 | 備考 |
|---|---|---|---|---|
| M_InventoryLine_ID | ID | PK | 明細ID | 主キー |
| M_Inventory_ID | Search | Y | 親伝票FK | |
| Line | Integer | N | 明細番号 | 既定 MAX(Line)+10 の SQL 既定値 |
| M_Product_ID | Search | Y | 品目 | |
| M_AttributeSetInstance_ID | Product Attribute | Y | 属性セットインスタンス | 原価計算レベル=バッチ/ロットで必須 |
| CurrentCostPrice | Costs+Prices | N | 現在の原価 | 既定 0・保存時に自動設定 |
| NewCostPrice | Costs+Prices | N | 新しい原価 | 既定 0 |
| C_Charge_ID | Table Direct | N | 料金 | 内部使用棚卸で使用 |
| InventoryType | List | Y | 在庫タイプ | 既定 D |
| M_Locator_ID | Locator (WH) | N | 保管場所 | 原価調整では 0 にクリア |
| QtyBook / QtyCount | Quantity | Y | 帳簿数量/実棚数量 | 実地棚卸で使用 |
| QtyInternalUse | Quantity | N | 内部使用数量 | 内部使用棚卸で使用 |
| Processed | Yes-No | Y | 処理済み |
erDiagram
C_DocType ||--o{ M_Inventory : "doc sub type inv"
M_Inventory ||--o{ M_InventoryLine : "lines"
M_InventoryLine }o--|| M_Product : "product"
M_InventoryLine }o--o| M_AttributeSetInstance : "batch/lot"
M_InventoryLine }o--o| C_Charge : "charge"
M_Inventory }o--o| M_Warehouse : "warehouse"
M_Inventory ||--o| M_Inventory : "reversal"
ビジネスロジック
Section titled “ビジネスロジック”MInventory.beforeSave()
Section titled “MInventory.beforeSave()”C_DocType_IDが未設定ならFillMandatoryで保存拒否- 既存レコードで
M_Warehouse_IDが変更された場合、M_InventoryLineの件数を SQL で確認し、1件でもあればCannotChangeWarehouseで保存拒否 - 伝票タイプの
DocSubTypeInvがCostAdjustmentの場合、C_Currency_IDが 0 なら主会計スキーマの通貨(MClient.get(ctx).getAcctSchema().getC_Currency_ID())を自動設定
MInventoryLine.beforeSave() — 原価調整分岐
Section titled “MInventoryLine.beforeSave() — 原価調整分岐”flowchart TD
A["beforeSave()"] --> B{"親伝票が Processed<br/>かつ新規?"}
B -->|"Yes"| C["ParentComplete エラー"]
B -->|"No"| D["明細番号の自動採番<br/>MAX(Line)+10"]
D --> E["数量の UOM 精度を強制"]
E --> F{"DocSubTypeInv"}
F -->|"InternalUse"| G["料金必須・帳簿/実棚数量禁止"]
F -->|"PhysicalInventory"| H["内部使用数量禁止<br/>料金は在庫タイプに応じ制御"]
F -->|"CostAdjustment"| I["原価調整バリデーション"]
F -->|"その他"| J["サブタイプ未設定エラー"]
I --> K{"原価計算レベル<br/>= バッチ/ロット?"}
K -->|"Yes かつ ASI 未指定"| L["FillMandatory エラー"]
K -->|"No"| M["通貨から会計スキーマを特定"]
M --> N["getCurrentCostPriceForCostAdjustment()"]
N --> O{"現在原価 = null?"}
O -->|"Yes かつ 標準原価以外"| P["NoCostingRecord エラー"]
O -->|"No"| Q["CurrentCostPrice にセット"]
Q --> R["M_Locator_ID を 0 にクリア"]
原価調整分岐の要点は次のとおりです。
- 属性セットインスタンス必須判定:
product.getCostingLevel(as)がCOSTINGLEVEL_BatchLotの場合、M_AttributeSetInstance_IDが 0 ならFillMandatoryエラー - 会計スキーマの特定: 親伝票の
C_Currency_IDと主会計スキーマの通貨が異なる場合、MAcctSchema.getClientAcctSchema()から通貨が一致するスキーマを検索して使用 - 現在原価のセット:
getCurrentCostPriceForCostAdjustment()の戻り値がnullかつ在庫評価方法がCOSTINGMETHOD_StandardCosting以外ならNoCostingRecordエラー。取得できた場合は新規時・品目変更時・ASI変更時にCurrentCostPriceを再設定 - 保管場所のクリア:
setM_Locator_ID(0) - 最後に、料金(
C_Charge_ID)が未設定ならAD_Org_IDを親伝票の組織に揃える
completeIt() の原価調整分岐
Section titled “completeIt() の原価調整分岐”MInventory.completeIt() は明細ループ内で DocSubTypeInv により処理を分岐し、CostAdjustment の場合は line.getCurrentCostPriceForCostAdjustment() で取得した現在原価を基準に原価レコードを更新します。実地棚卸のみで実行される後処理(checkMaterialPolicy() による在庫引当・材料ポリシー処理)は原価調整では実行されません。
reverse(boolean accrual) が逆仕訳伝票を生成し、reverseCorrectIt()(訂正)と reverseAccrualIt()(発生日逆仕訳)から共通で呼ばれます。生成された伝票は元伝票の Reversal_ID、明細は ReversalLine_ID で相互参照されます。
拡張ポイント(カスタマイズ箇所)
Section titled “拡張ポイント(カスタマイズ箇所)”OSGi Model Validator(推奨)
Section titled “OSGi Model Validator(推奨)”public class CustomCostAdjustmentValidator implements ModelValidator { @Override public int modelChange(PO po, int type) throws Exception { if (po instanceof MInventoryLine && (type == TYPE_BEFORE_NEW || type == TYPE_BEFORE_CHANGE)) { MInventoryLine line = (MInventoryLine) po; MDocType dt = MDocType.get(line.getCtx(), line.getParent().getC_DocType_ID()); if (MDocType.DOCSUBTYPEINV_CostAdjustment.equals(dt.getDocSubTypeInv())) { // 例: 原価の変動率が 50% を超える調整を禁止する BigDecimal cur = line.getCurrentCostPrice(); BigDecimal neu = line.getNewCostPrice(); if (cur.signum() != 0 && neu.subtract(cur).abs().divide(cur, 4, RoundingMode.HALF_UP) .compareTo(new BigDecimal("0.5")) > 0) { throw new AdempiereException("原価の変動率が50%を超えています。承認を得てください"); } } } return null; }}Callout
Section titled “Callout”M_Inventory / M_InventoryLine の各カラムには標準の Callout は設定されていません(AD メタデータ上 Callout 列は空)。現在原価の自動セットは Callout ではなく beforeSave() で行われるため、画面上は保存後に値が反映されます。
伝票タイミングでの制御
Section titled “伝票タイミングでの制御”docValidate() の TIMING_BEFORE_COMPLETE / TIMING_AFTER_COMPLETE を使うと、原価調整の完了前後に独自処理(承認チェック、原価改定履歴の記録など)を差し込めます。原価計算エンジン自体を差し替える場合は ICostingMethod の実装を OSGi サービスとして登録します。
関連プロセス
Section titled “関連プロセス”| プロセス名 | 説明 |
|---|---|
| 棚卸プロセス(DocAction) | 原価調整の準備・完了・無効化・逆仕訳を実行 |
| 転記(Posted) | 会計仕訳の転記状況確認・再転記 |
関連ドキュメント
Section titled “関連ドキュメント”iDempiereカスタマイズのご相談
Section titled “iDempiereカスタマイズのご相談”原価調整は在庫評価額と損益に直結するため、承認フローや変動率チェックを組み込みたいというご要望が多い領域です。 Model Validator を使えば、コア改変なしに原価改定のガバナンスを効かせられます。
As-Link株式会社では、OSGiプラグインによる安全なカスタマイズを提供しています。