Skip to content

iDempiere 在庫移動確認伝票の使い方|在庫管理 操作マニュアル・技術仕様

This content is not available in your language yet.

📖 在庫管理の全体像: 在庫管理の業務フロー全体図 も合わせてご覧ください。

在庫移動確認伝票は、在庫移動伝票(Inventory Move)で送り出した品目が移動先に実際に到着したことを確認する伝票です。移動伝票の伝票タイプが「積送中(In Transit)」の場合に自動生成され、確認担当者が実際に受け取った数量を入力して完了させます。

📌 ポイント: 在庫移動確認伝票は手動で新規作成する伝票ではありません。移動伝票の伝票タイプに「積送中」が設定されているときに自動生成されるため、まず伝票タイプ側の設定を確認してください。

確認時に差異数量または欠陥品数量を入力すると、iDempiere が対応する倉庫の棚卸伝票(Physical Inventory)を自動生成して在庫を実態に合わせます。この自動生成こそが本ウィンドウの中核機能です。

在庫移動確認伝票でできること

Section titled “在庫移動確認伝票でできること”
  • 積送中の在庫移動について、移動先での実受領数量を確認・登録
  • 目標数量に対する差異数量の記録(発送元倉庫の棚卸伝票を自動生成)
  • 品質不良による欠陥品数量の記録(移動先倉庫の棚卸伝票を自動生成)
  • 承認金額に基づく承認・却下の管理
  • 伝票状態(DocStatus)による進捗管理と、無効化・締切・逆仕訳などの伝票アクション
  • 自動生成された棚卸伝票へのリンク参照(棚卸伝票フィールド)

在庫移動確認伝票はヘッダー+明細のシンプルな2タブ構成です。

タブ名テーブル項目数役割
在庫移動確認伝票M_MovementConfirm10項目対象の在庫移動伝票・伝票状態・承認情報
在庫移動確認伝票明細M_MovementLineConfirm11項目明細ごとの目標数量・確認済数量・差異・欠陥品数量

💡 ヒント: 明細タブの数量はすべて**在庫保管単位(Storage UOM)**で表示されます。品目の販売単位と在庫単位が異なる場合は換算に注意してください。

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/>伝票番号がヘッダーに記録"]

在庫移動伝票を完了 (伝票タイプ = 積送中) 在庫移動確認伝票が 自動生成される メニューから 在庫移動確認伝票を開く 明細タブで 確認済(正常品)数量を入力 数量に差異あり? 不足・過剰 差異数量を入力 → 発送元倉庫の棚卸伝票を生成 品質不良 欠陥品数量を入力 → 移動先倉庫の棚卸伝票を生成 差異なし そのまま完了 保存 ▶ 確認プロセス(DocAction) で「完了」を実行 棚卸伝票が自動生成され 伝票番号がヘッダーに記録

アクセス方法(メニューパス)

Section titled “アクセス方法(メニューパス)”

メニューから「在庫管理 > 在庫移動確認伝票」を開きます。

新規登録(確認伝票の入力手順)

Section titled “新規登録(確認伝票の入力手順)”

在庫移動確認伝票は自動生成されるため、通常は既存レコードを検索して編集します。

  1. 対象の在庫移動確認伝票を検索して開く(在庫移動伝票フィールドで対象移動伝票を特定できます)
  2. 在庫移動確認伝票明細」タブに移動
  3. 明細ごとに実受領状況を入力:
    • 確認済(正常品)数量: 正常な状態で受け取った数量
    • 差異数量: 目標数量に対する不足・過剰(発送元倉庫側の棚卸対象)
    • 欠陥品数量: 品質不良で受け入れられなかった数量(移動先倉庫側の棚卸対象)
    • 説明: 差異理由のメモ(任意)
  4. 保存」をクリック
  5. ヘッダータブに戻り、**確認プロセス(DocAction)**で「完了」を実行

⚠️ 注意: 明細が1件も存在しない状態で完了しようとすると @NoLines@ エラーとなり伝票状態が「無効」になります。自動生成された明細を誤って削除しないでください。

本ウィンドウは伝票(Document)型で、DocAction ボタンから以下の処理を実行します。

伝票アクション処理内容
完了(Complete)明細を確定し、差異・欠陥品があれば棚卸伝票を自動生成
承認(Approve)承認済みフラグを ON にする
却下(Reject)承認済みフラグを OFF に戻す
無効化(Void)伝票を無効化する
締切(Close)伝票を締め切る
逆仕訳-訂正 / 逆仕訳-発生完了済み伝票を取り消す
再有効化(Re-activate)完了済み伝票を編集可能な状態に戻す

📌 ポイント: 完了処理では未承認でも暗黙的に承認されます(completeIt() 内で approveIt() が呼ばれます)。承認金額を使った承認フローを厳密に運用したい場合は、ワークフローまたは Model Validator での制御が必要です。

項目名必須説明
クライアント必須選択テナント
組織必須選択組織
伝票番号必須文字列伝票採番(30桁)
在庫移動伝票必須検索確認対象の在庫移動伝票
説明-文字列任意のメモ(255桁)
承認済み必須チェック承認状態(初期値 N)
承認金額-金額承認に必要な金額基準
伝票状態必須リストドラフト・完了・無効等
確認プロセス必須ボタン伝票アクション(DocAction)
棚卸伝票-検索自動生成された棚卸伝票への参照
項目名必須説明
在庫移動確認伝票必須検索親伝票(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

在庫移動確認伝票 完了 差異数量 ≠ 0? 発送元保管場所の倉庫を特定 棚卸伝票を生成 (伝票サブタイプ = 実地棚卸) 棚卸明細に差異数量を登録 欠陥品数量 ≠ 0? 移動先保管場所の倉庫を特定 棚卸伝票を生成 (移動先倉庫) 棚卸明細に欠陥品数量を登録 確認伝票の棚卸伝票欄に 伝票番号を記録

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)、削除可能です。

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

+create(MMovement, boolean) MMovementConfirm +prepareIt() String +completeIt() String +approveIt() boolean +voidIt() boolean +reverseCorrectIt() boolean +getLines(boolean) MMovementLineConfirm[] #createDifferenceDoc(MMovement, MMovementLineConfirm) boolean #setInventoryDocType(MInventory) void <> <> <> > X_M_MovementConfirm X_M_MovementConfirm --

パッケージ: org.compiere.model ソースファイル: org.adempiere.base/src/org/compiere/model/MMovementConfirm.java(817行) / MMovementLineConfirm.java

M_MovementConfirm(在庫移動確認伝票)

Section titled “M_MovementConfirm(在庫移動確認伝票)”
カラム名必須説明備考
M_MovementConfirm_IDIDPK確認伝票ID主キー
AD_Client_IDTable DirectYテナント既定 @#AD_Client_ID@
AD_Org_IDTable DirectY組織既定 @#AD_Org_ID@
DocumentNoString(30)Y伝票番号伝票採番
M_Movement_IDSearchY在庫移動伝票確認対象
DescriptionString(255)N説明
IsApprovedYes-NoY承認済み既定 N
ApprovalAmtAmountN承認金額
DocStatusList(2)Y伝票状態
DocActionButton(2)Y伝票アクション
M_Inventory_IDSearchN棚卸伝票差異発生時に自動設定
ProcessingYes-NoN処理中フラグ
ProcessedYes-NoY処理済み

M_MovementLineConfirm(在庫移動確認伝票明細)

Section titled “M_MovementLineConfirm(在庫移動確認伝票明細)”
カラム名必須説明備考
M_MovementLineConfirm_IDIDPK明細ID主キー
M_MovementConfirm_IDSearchY親伝票FK更新不可
M_MovementLine_IDSearchY在庫移動明細FK
TargetQtyQuantityY目標数量
ConfirmedQtyQuantityY確認済(正常品)数量
DifferenceQtyQuantityY差異数量発送元倉庫の棚卸対象
ScrappedQtyQuantityY欠陥品数量移動先倉庫の棚卸対象
M_InventoryLine_IDSearchN棚卸伝票明細FK自動設定
DescriptionString(255)N説明
ProcessedYes-NoY処理済み
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"

confirmed by difference doc difference line

MMovementConfirm.prepareIt() は以下の順で検証します。

  1. ModelValidationEngine.fireDocValidate(TIMING_BEFORE_PREPARE) を発火
  2. 会計期間チェック: MPeriod.isOpen(..., MDocType.DOCBASETYPE_MaterialMovement, AD_Org_ID)。締まっていれば @PeriodClosed@STATUS_Invalid
  3. バックデート取引チェック: MAcctSchema.isBackDateTrxAllowed()。不可なら @BackDateTrxNotAllowed@
  4. 明細存在チェック: getLines(true) が0件なら @NoLines@
  5. fireDocValidate(TIMING_AFTER_PREPARE) を発火
  6. DocActionComplete にセットし STATUS_InProgress を返却
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 生成"]

completeIt() m_justPrepared? prepareIt() を再実行 fireDocValidate BEFORE_COMPLETE isApproved? approveIt() 暗黙承認 各明細 confirm.processLine() 完全確認 かつ 欠陥品0? createDifferenceDoc() 差異伝票なし 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(実地棚卸)の伝票タイプを検索して設定します。該当する伝票タイプが未定義だと棚卸伝票の伝票タイプが設定されない点に注意してください。

MMovementConfirmDocAction の全メソッド(unlockIt / invalidateIt / prepareIt / approveIt / rejectIt / completeIt / voidIt / closeIt / reverseCorrectIt / reverseAccrualIt / reActivateIt)を実装しています。getC_Currency_ID() / getDoc_User_ID() / getSummary() / getProcessMsg()DocAction 契約の一部として提供されます。

拡張ポイント(カスタマイズ箇所)

Section titled “拡張ポイント(カスタマイズ箇所)”

伝票型のため、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_COMPLETEprepareIt() / completeIt() 内で実際に発火されるため、独自チェックの差し込み先として利用できます。

M_MovementConfirm / M_MovementLineConfirm の各カラムには標準の Callout は設定されていません(AD メタデータ上 Callout 列は空)。入力時の自動計算を追加したい場合は、独自 Callout を OSGi プラグインとして登録します。

createDifferenceDoc()protected メソッドのため、コアを改変せずに挙動を変えたい場合は Model Validator の TIMING_AFTER_COMPLETE で生成済みの M_Inventory を後処理する方式が安全です。

プロセス名説明
確認プロセス(DocAction)伝票の準備・完了・無効化・逆仕訳を実行

在庫移動確認伝票は、差異伝票の自動生成ロジックや承認フローを業務ルールに合わせて拡張できる領域です。 Model Validator を使えば、欠陥品理由の必須化や倉庫別の承認者振り分けをコア改変なしに実現できます。

As-Link株式会社では、OSGiプラグインによる安全なカスタマイズを提供しています。

OSS ERP導入・カスタマイズサービスの詳細はこちら