iDempiere 在庫移動確認伝票の使い方|在庫管理 操作マニュアル・技術仕様
📖 在庫管理の全体像: 在庫管理の業務フロー全体図 も合わせてご覧ください。
在庫移動確認伝票は、在庫移動伝票(Inventory Move)で送り出した品目が移動先に実際に到着したことを確認する伝票です。移動伝票の伝票タイプが「積送中(In Transit)」の場合に自動生成され、確認担当者が実際に受け取った数量を入力して完了させます。
📌 ポイント: 在庫移動確認伝票は手動で新規作成する伝票ではありません。移動伝票の伝票タイプに「積送中」が設定されているときに自動生成されるため、まず伝票タイプ側の設定を確認してください。
確認時に差異数量または欠陥品数量を入力すると、iDempiere が対応する倉庫の棚卸伝票(Physical Inventory)を自動生成して在庫を実態に合わせます。この自動生成こそが本ウィンドウの中核機能です。
在庫移動確認伝票でできること
Section titled “在庫移動確認伝票でできること”- 積送中の在庫移動について、移動先での実受領数量を確認・登録
- 目標数量に対する差異数量の記録(発送元倉庫の棚卸伝票を自動生成)
- 品質不良による欠陥品数量の記録(移動先倉庫の棚卸伝票を自動生成)
- 承認金額に基づく承認・却下の管理
- 伝票状態(DocStatus)による進捗管理と、無効化・締切・逆仕訳などの伝票アクション
- 自動生成された棚卸伝票へのリンク参照(棚卸伝票フィールド)
在庫移動確認伝票はヘッダー+明細のシンプルな2タブ構成です。
| タブ名 | テーブル | 項目数 | 役割 |
|---|---|---|---|
| 在庫移動確認伝票 | M_MovementConfirm | 10項目 | 対象の在庫移動伝票・伝票状態・承認情報 |
| 在庫移動確認伝票明細 | M_MovementLineConfirm | 11項目 | 明細ごとの目標数量・確認済数量・差異・欠陥品数量 |
💡 ヒント: 明細タブの数量はすべて**在庫保管単位(Storage UOM)**で表示されます。品目の販売単位と在庫単位が異なる場合は換算に注意してください。
基本操作手順
Section titled “基本操作手順”graph TD
A["🚚 在庫移動伝票を完了<br/>(伝票タイプ = 積送中)"] --> B["⚙️ 在庫移動確認伝票が<br/>自動生成される"]
B --> C["📂 メニューから<br/>在庫移動確認伝票を開く"]
C --> D["🔢 明細タブで<br/>確認済(正常品)数量を入力"]
D --> E{"数量に差異あり?"}
E -->|"不足・過剰"| F["📉 差異数量を入力<br/>→ 発送元倉庫の棚卸伝票を生成"]
E -->|"品質不良"| G["🗑 欠陥品数量を入力<br/>→ 移動先倉庫の棚卸伝票を生成"]
E -->|"差異なし"| H["✅ そのまま完了"]
F --> I["💾 保存"]
G --> I
H --> I
I --> J["▶ 確認プロセス(DocAction)<br/>で「完了」を実行"]
J --> K["📄 棚卸伝票が自動生成され<br/>伝票番号がヘッダーに記録"]
アクセス方法(メニューパス)
Section titled “アクセス方法(メニューパス)”メニューから「在庫管理 > 在庫移動確認伝票」を開きます。
新規登録(確認伝票の入力手順)
Section titled “新規登録(確認伝票の入力手順)”在庫移動確認伝票は自動生成されるため、通常は既存レコードを検索して編集します。
- 対象の在庫移動確認伝票を検索して開く(在庫移動伝票フィールドで対象移動伝票を特定できます)
- 「在庫移動確認伝票明細」タブに移動
- 明細ごとに実受領状況を入力:
- 確認済(正常品)数量: 正常な状態で受け取った数量
- 差異数量: 目標数量に対する不足・過剰(発送元倉庫側の棚卸対象)
- 欠陥品数量: 品質不良で受け入れられなかった数量(移動先倉庫側の棚卸対象)
- 説明: 差異理由のメモ(任意)
- 「保存」をクリック
- ヘッダータブに戻り、**確認プロセス(DocAction)**で「完了」を実行
⚠️ 注意: 明細が1件も存在しない状態で完了しようとすると
@NoLines@エラーとなり伝票状態が「無効」になります。自動生成された明細を誤って削除しないでください。
伝票処理(DocAction / DocStatus)
Section titled “伝票処理(DocAction / DocStatus)”本ウィンドウは伝票(Document)型で、DocAction ボタンから以下の処理を実行します。
| 伝票アクション | 処理内容 |
|---|---|
| 完了(Complete) | 明細を確定し、差異・欠陥品があれば棚卸伝票を自動生成 |
| 承認(Approve) | 承認済みフラグを ON にする |
| 却下(Reject) | 承認済みフラグを OFF に戻す |
| 無効化(Void) | 伝票を無効化する |
| 締切(Close) | 伝票を締め切る |
| 逆仕訳-訂正 / 逆仕訳-発生 | 完了済み伝票を取り消す |
| 再有効化(Re-activate) | 完了済み伝票を編集可能な状態に戻す |
📌 ポイント: 完了処理では未承認でも暗黙的に承認されます(
completeIt()内でapproveIt()が呼ばれます)。承認金額を使った承認フローを厳密に運用したい場合は、ワークフローまたは Model Validator での制御が必要です。
項目リファレンス
Section titled “項目リファレンス”在庫移動確認伝票タブ
Section titled “在庫移動確認伝票タブ”| 項目名 | 必須 | 型 | 説明 |
|---|---|---|---|
| クライアント | 必須 | 選択 | テナント |
| 組織 | 必須 | 選択 | 組織 |
| 伝票番号 | 必須 | 文字列 | 伝票採番(30桁) |
| 在庫移動伝票 | 必須 | 検索 | 確認対象の在庫移動伝票 |
| 説明 | - | 文字列 | 任意のメモ(255桁) |
| 承認済み | 必須 | チェック | 承認状態(初期値 N) |
| 承認金額 | - | 金額 | 承認に必要な金額基準 |
| 伝票状態 | 必須 | リスト | ドラフト・完了・無効等 |
| 確認プロセス | 必須 | ボタン | 伝票アクション(DocAction) |
| 棚卸伝票 | - | 検索 | 自動生成された棚卸伝票への参照 |
在庫移動確認伝票明細タブ
Section titled “在庫移動確認伝票明細タブ”| 項目名 | 必須 | 型 | 説明 |
|---|---|---|---|
| 在庫移動確認伝票 | 必須 | 検索 | 親伝票(M_MovementConfirm) |
| 在庫移動伝票明細 | 必須 | 検索 | 対象の在庫移動明細 |
| 目標数量 | 必須 | 数量 | 移動伝票上の予定数量 |
| 確認済(正常品)数量 | 必須 | 数量 | 実際に受領した正常品の数量 |
| 差異数量 | 必須 | 数量 | 目標との差異(発送元倉庫の棚卸対象) |
| 欠陥品数量 | 必須 | 数量 | 品質不良数量(移動先倉庫の棚卸対象) |
| 説明 | - | 文字列 | 差異理由等のメモ |
| 棚卸伝票明細 | - | 検索 | 自動生成された棚卸明細への参照 |
| 処理済み | 必須 | チェック | 処理完了フラグ |
差異・欠陥品の在庫反映フロー
Section titled “差異・欠陥品の在庫反映フロー”graph TD
A["在庫移動確認伝票 完了"] --> B{"差異数量 ≠ 0?"}
B -->|"Yes"| C["発送元保管場所の倉庫を特定"]
C --> D["棚卸伝票を生成<br/>(伝票サブタイプ = 実地棚卸)"]
D --> E["棚卸明細に差異数量を登録"]
A --> F{"欠陥品数量 ≠ 0?"}
F -->|"Yes"| G["移動先保管場所の倉庫を特定"]
G --> H["棚卸伝票を生成<br/>(移動先倉庫)"]
H --> I["棚卸明細に欠陥品数量を登録"]
E --> J["確認伝票の棚卸伝票欄に<br/>伝票番号を記録"]
I --> J
よくある質問(FAQ)
Section titled “よくある質問(FAQ)”Q. 在庫移動確認伝票が作成されません。なぜですか?
Section titled “Q. 在庫移動確認伝票が作成されません。なぜですか?”在庫移動伝票の伝票タイプに「積送中(In Transit)」が設定されていないためです。確認伝票は移動伝票の伝票タイプが積送中を示す場合にのみ自動生成されます。伝票タイプ設定を見直してください。
Q. 完了しようとすると「期間が締められています」と表示されます。
Section titled “Q. 完了しようとすると「期間が締められています」と表示されます。”完了処理の準備段階(prepareIt)で、伝票基本タイプ「資材移動(Material Movement)」の会計期間がオープンかどうかを検証しています。対象期間が締められている場合は伝票状態が「無効」になります。会計期間管理で期間を開くか、日付を見直してください。
Q. 「バックデート取引は許可されていません」と出るのはなぜですか?
Section titled “Q. 「バックデート取引は許可されていません」と出るのはなぜですか?”会計スキーマのバックデート取引許可設定により、過去日付の取引が制限されています。準備処理で isBackDateTrxAllowed の検証に失敗すると @BackDateTrxNotAllowed@ となり伝票状態が「無効」になります。
Q. 差異数量と欠陥品数量はどう使い分けますか?
Section titled “Q. 差異数量と欠陥品数量はどう使い分けますか?”差異数量は「発送元で計上した数量と実際に届いた数量のズレ」を表し、発送元倉庫の棚卸伝票が生成されます。欠陥品数量は「届いたが品質不良で使えない数量」を表し、移動先倉庫の棚卸伝票が生成されます。責任範囲が異なるため、在庫差異の分析上も区別して入力してください。
Q. 自動生成された棚卸伝票はどこで確認できますか?
Section titled “Q. 自動生成された棚卸伝票はどこで確認できますか?”ヘッダーの「棚卸伝票」フィールドに最初に生成された棚卸伝票へのリンクが記録されます。複数倉庫にまたがる場合は複数の棚卸伝票が生成され、伝票番号がカンマ区切りで処理メッセージに表示されます。生成された棚卸伝票は 実地棚卸 ウィンドウで確認・完了処理を行います。
🛠 技術仕様(開発者向け)
在庫移動確認伝票は伝票(Document)型のウィンドウ(AD_Window_ID: 333)で、ヘッダーは M_MovementConfirm、明細は M_MovementLineConfirm テーブルに格納されます。MMovementConfirm クラス(817行)が DocAction インターフェースを実装し、伝票ライフサイクル(prepare / complete / void / close / reverse / reactivate)と差異伝票の自動生成を担います。両テーブルとも AccessLevel = 1(Organization)、削除可能です。
アーキテクチャ概要
Section titled “アーキテクチャ概要”classDiagram
class MMovementConfirm {
+create(MMovement, boolean) MMovementConfirm
+prepareIt() String
+completeIt() String
+approveIt() boolean
+voidIt() boolean
+reverseCorrectIt() boolean
+getLines(boolean) MMovementLineConfirm[]
#createDifferenceDoc(MMovement, MMovementLineConfirm) boolean
#setInventoryDocType(MInventory) void
}
class X_M_MovementConfirm {
<<generated>>
}
class PO {
<<abstract>>
}
class DocAction {
<<interface>>
}
MMovementConfirm --|> X_M_MovementConfirm
X_M_MovementConfirm --|> PO
MMovementConfirm ..|> DocAction
MMovementConfirm --> MMovementLineConfirm : has many
MMovementConfirm --> MMovement : confirms
MMovementConfirm --> MInventory : generates
パッケージ: org.compiere.model
ソースファイル: org.adempiere.base/src/org/compiere/model/MMovementConfirm.java(817行) / MMovementLineConfirm.java
関連DBテーブル
Section titled “関連DBテーブル”M_MovementConfirm(在庫移動確認伝票)
Section titled “M_MovementConfirm(在庫移動確認伝票)”| カラム名 | 型 | 必須 | 説明 | 備考 |
|---|---|---|---|---|
| M_MovementConfirm_ID | ID | PK | 確認伝票ID | 主キー |
| AD_Client_ID | Table Direct | Y | テナント | 既定 @#AD_Client_ID@ |
| AD_Org_ID | Table Direct | Y | 組織 | 既定 @#AD_Org_ID@ |
| DocumentNo | String(30) | Y | 伝票番号 | 伝票採番 |
| M_Movement_ID | Search | Y | 在庫移動伝票 | 確認対象 |
| Description | String(255) | N | 説明 | |
| IsApproved | Yes-No | Y | 承認済み | 既定 N |
| ApprovalAmt | Amount | N | 承認金額 | |
| DocStatus | List(2) | Y | 伝票状態 | |
| DocAction | Button(2) | Y | 伝票アクション | |
| M_Inventory_ID | Search | N | 棚卸伝票 | 差異発生時に自動設定 |
| Processing | Yes-No | N | 処理中フラグ | |
| Processed | Yes-No | Y | 処理済み |
M_MovementLineConfirm(在庫移動確認伝票明細)
Section titled “M_MovementLineConfirm(在庫移動確認伝票明細)”| カラム名 | 型 | 必須 | 説明 | 備考 |
|---|---|---|---|---|
| M_MovementLineConfirm_ID | ID | PK | 明細ID | 主キー |
| M_MovementConfirm_ID | Search | Y | 親伝票FK | 更新不可 |
| M_MovementLine_ID | Search | Y | 在庫移動明細FK | |
| TargetQty | Quantity | Y | 目標数量 | |
| ConfirmedQty | Quantity | Y | 確認済(正常品)数量 | |
| DifferenceQty | Quantity | Y | 差異数量 | 発送元倉庫の棚卸対象 |
| ScrappedQty | Quantity | Y | 欠陥品数量 | 移動先倉庫の棚卸対象 |
| M_InventoryLine_ID | Search | N | 棚卸伝票明細FK | 自動設定 |
| Description | String(255) | N | 説明 | |
| Processed | Yes-No | Y | 処理済み |
erDiagram
M_Movement ||--o{ M_MovementConfirm : "confirmed by"
M_MovementConfirm ||--o{ M_MovementLineConfirm : "lines"
M_MovementLine ||--o| M_MovementLineConfirm : "confirms"
M_MovementConfirm ||--o| M_Inventory : "difference doc"
M_MovementLineConfirm ||--o| M_InventoryLine : "difference line"
M_Inventory ||--o{ M_InventoryLine : "lines"
ビジネスロジック
Section titled “ビジネスロジック”prepareIt() の検証順序
Section titled “prepareIt() の検証順序”MMovementConfirm.prepareIt() は以下の順で検証します。
ModelValidationEngine.fireDocValidate(TIMING_BEFORE_PREPARE)を発火- 会計期間チェック:
MPeriod.isOpen(..., MDocType.DOCBASETYPE_MaterialMovement, AD_Org_ID)。締まっていれば@PeriodClosed@でSTATUS_Invalid - バックデート取引チェック:
MAcctSchema.isBackDateTrxAllowed()。不可なら@BackDateTrxNotAllowed@ - 明細存在チェック:
getLines(true)が0件なら@NoLines@ fireDocValidate(TIMING_AFTER_PREPARE)を発火DocActionをCompleteにセットしSTATUS_InProgressを返却
completeIt() と差異伝票の生成
Section titled “completeIt() と差異伝票の生成”flowchart TD
A["completeIt()"] --> B{"m_justPrepared?"}
B -->|"No"| C["prepareIt() を再実行"]
B -->|"Yes"| D["fireDocValidate<br/>BEFORE_COMPLETE"]
C --> D
D --> E{"isApproved?"}
E -->|"No"| F["approveIt() 暗黙承認"]
E -->|"Yes"| G["各明細 confirm.processLine()"]
F --> G
G --> H{"完全確認 かつ 欠陥品0?"}
H -->|"No"| I["createDifferenceDoc()"]
H -->|"Yes"| J["差異伝票なし"]
I --> K["MInventory / MInventoryLine 生成"]
createDifferenceDoc(MMovement, MMovementLineConfirm) の要点:
DifferenceQty != 0の場合、明細のM_Locator_ID(発送元保管場所)から倉庫を特定し、その倉庫のMInventoryを生成。説明にM_MovementConfirm_ID + 伝票番号を設定ScrappedQty != 0の場合、M_LocatorTo_ID(移動先保管場所)から倉庫を特定し、移動先倉庫のMInventoryを生成- 倉庫が変わるたびに新しい棚卸伝票を生成(
m_inventoryFrom/m_inventoryToを倉庫ごとにリセット) - 最初に生成された棚卸伝票の ID を確認伝票の
M_Inventory_IDにセットし、2件目以降は伝票番号をカンマ連結して処理メッセージに追記 - 生成した
MInventoryLineには差異数量(説明はDifferenceQtyの翻訳ラベル)を設定し、M_InventoryLine_IDを確認明細に書き戻し
setInventoryDocType(MInventory): MDocType.getOfDocBaseType(ctx, DOCBASETYPE_MaterialPhysicalInventory) から DocSubTypeInv = PhysicalInventory(実地棚卸)の伝票タイプを検索して設定します。該当する伝票タイプが未定義だと棚卸伝票の伝票タイプが設定されない点に注意してください。
伝票アクションの実装状況
Section titled “伝票アクションの実装状況”MMovementConfirm は DocAction の全メソッド(unlockIt / invalidateIt / prepareIt / approveIt / rejectIt / completeIt / voidIt / closeIt / reverseCorrectIt / reverseAccrualIt / reActivateIt)を実装しています。getC_Currency_ID() / getDoc_User_ID() / getSummary() / getProcessMsg() も DocAction 契約の一部として提供されます。
拡張ポイント(カスタマイズ箇所)
Section titled “拡張ポイント(カスタマイズ箇所)”OSGi Model Validator(推奨)
Section titled “OSGi Model Validator(推奨)”伝票型のため、docValidate() による伝票タイミングでの制御が有効です。
public class CustomMoveConfirmValidator implements ModelValidator { @Override public String docValidate(PO po, int timing) { if (po instanceof MMovementConfirm && timing == TIMING_BEFORE_COMPLETE) { MMovementConfirm mc = (MMovementConfirm) po; for (MMovementLineConfirm line : mc.getLines(true)) { // 例: 欠陥品数量を入力した場合は説明を必須にする if (line.getScrappedQty().signum() != 0 && (line.getDescription() == null || line.getDescription().isEmpty())) { return "欠陥品数量を入力した明細には理由を記入してください"; } } } return null; }
@Override public int modelChange(PO po, int type) throws Exception { return 0; }}TIMING_BEFORE_PREPARE / TIMING_AFTER_PREPARE / TIMING_BEFORE_COMPLETE は prepareIt() / completeIt() 内で実際に発火されるため、独自チェックの差し込み先として利用できます。
Callout
Section titled “Callout”M_MovementConfirm / M_MovementLineConfirm の各カラムには標準の Callout は設定されていません(AD メタデータ上 Callout 列は空)。入力時の自動計算を追加したい場合は、独自 Callout を OSGi プラグインとして登録します。
差異伝票生成のカスタマイズ
Section titled “差異伝票生成のカスタマイズ”createDifferenceDoc() は protected メソッドのため、コアを改変せずに挙動を変えたい場合は Model Validator の TIMING_AFTER_COMPLETE で生成済みの M_Inventory を後処理する方式が安全です。
関連プロセス
Section titled “関連プロセス”| プロセス名 | 説明 |
|---|---|
| 確認プロセス(DocAction) | 伝票の準備・完了・無効化・逆仕訳を実行 |
関連ドキュメント
Section titled “関連ドキュメント”iDempiereカスタマイズのご相談
Section titled “iDempiereカスタマイズのご相談”在庫移動確認伝票は、差異伝票の自動生成ロジックや承認フローを業務ルールに合わせて拡張できる領域です。 Model Validator を使えば、欠陥品理由の必須化や倉庫別の承認者振り分けをコア改変なしに実現できます。
As-Link株式会社では、OSGiプラグインによる安全なカスタマイズを提供しています。