コンテンツにスキップ

iDempiere 得意先返品入荷伝票の使い方|販売管理 操作マニュアル・技術仕様

📖 販売管理の全体像: 販売管理の全体図 も合わせてご覧ください。

得意先返品入荷伝票は、顧客から返品された商品を自社倉庫へ受け入れるための伝票です。出荷伝票と同じ M_InOut テーブルを使用しますが、伝票タイプが「入荷(MMR)」かつ販売取引(IsSOTrx=Y)である点が特徴で、完了すると返品数量が在庫に戻し入れられます。

📌 ポイント: 返品は原則として先に 得意先返品依頼(RMA) を起票し、そこから返品入荷伝票を生成します。1枚の伝票に受注伝票(C_Order_ID)と RMA(M_RMA_ID)の両方を設定することはできず、prepareIt() で伝票検証エラーになります。

得意先返品入荷伝票でできること

Section titled “得意先返品入荷伝票でできること”
  • 顧客からの返品商品を倉庫・保管場所へ受け入れる
  • 得意先返品依頼(RMA)や既存伝票から明細を一括生成する(「Create lines from」ボタン)
  • ロット・シリアル番号(属性セットインスタンス)単位で返品数量を受け入れる
  • 入出荷確認伝票を作成し、正常品数量と欠陥品数量を分けて確認する
  • 返品入荷から貸方請求書(クレジットメモ)を作成する(「入荷伝票をもとに仕入請求伝票作成」ボタン)
  • 受注明細・請求明細との照合(発注照合 / 請求照合)状況を参照する
  • 直送(ドロップシップ)の返品先や運送会社・送料負担ルールを指定する

ヘッダー1タブ+明細1タブ+明細配下の4タブという6タブ構成です。

タブ名テーブル階層項目数役割
顧客返品入荷伝票M_InOut0約47項目伝票ヘッダー(取引先・倉庫・日付・伝票処理)
顧客返品入荷伝票明細M_InOutLine1約26項目返品品目・数量・保管場所
AttributesM_InOutLineMA26項目属性セットインスタンス別の数量割当
入出荷確認伝票明細M_InOutLineConfirm210項目受入確認(正常品/欠陥品/差異数量)
発注照合M_MatchPO210項目受注明細との照合結果(参照)
請求照合M_MatchInv29項目請求明細との照合結果(参照)
graph TD
    T1["📥 顧客返品入荷伝票<br/>M_InOut<br/>約47項目"]
    T2["📋 顧客返品入荷伝票明細<br/>M_InOutLine<br/>約26項目"]
    T3["🏷 Attributes<br/>M_InOutLineMA<br/>6項目"]
    T4["✅ 入出荷確認伝票明細<br/>M_InOutLineConfirm<br/>10項目"]
    T5["🔗 発注照合<br/>M_MatchPO<br/>10項目"]
    T6["🧾 請求照合<br/>M_MatchInv<br/>9項目"]
    T1 --> T2
    T2 --> T3
    T2 --> T4
    T2 --> T5
    T2 --> T6

顧客返品入荷伝票 M_InOut 約47項目 顧客返品入荷伝票明細 M_InOutLine 約26項目 Attributes M_InOutLineMA 6項目 入出荷確認伝票明細 M_InOutLineConfirm 10項目 発注照合 M_MatchPO 10項目 請求照合 M_MatchInv 9項目

💡 ヒント: 「Attributes」タブは、品目に属性セットが設定されロット/シリアル管理を行っている場合にのみ使用します。属性管理していない品目では明細タブの数量入力だけで完結します。

graph TD
    A["🚀 メニューから開く<br/>返品管理 > 得意先返品入荷伝票"] --> B["➕ 新規<br/>伝票タイプ・取引先・倉庫を選択"]
    B --> C{"明細の作り方"}
    C -->|"RMA から"| D["🔗 RMA を選択して<br/>Create lines from で明細生成"]
    C -->|"手入力"| E["✏️ 明細タブで品目・<br/>移動数量・保管場所を入力"]
    D --> F{"ロット/シリアル管理品?"}
    E --> F
    F -->|Yes| G["🏷 Attributes タブで<br/>属性別に数量を割当"]
    F -->|No| H{"受入確認を使う?"}
    G --> H
    H -->|Yes| I["✅ 入出荷確認伝票作成ボタン<br/>→ 正常品/欠陥品を確認"]
    H -->|No| J["▶️ 出荷プロセス = 完了"]
    I --> J
    J --> K["📦 在庫に戻し入れ<br/>M_Transaction 生成"]
    K --> L["🧾 必要に応じて<br/>貸方請求書を作成"]

メニューから開く 返品管理 > 得意先返品入荷伝票 新規 伝票タイプ・取引先・倉庫を選択 明細の作り方 RMA から RMA を選択して Create lines from で明細生成 手入力 明細タブで品目・ 移動数量・保管場所を入力 ロット/シリアル管理品? Attributes タブで 属性別に数量を割当 受入確認を使う? 入出荷確認伝票作成ボタン → 正常品/欠陥品を確認 ▶ 出荷プロセス = 完了 在庫に戻し入れ M_Transaction 生成 必要に応じて 貸方請求書を作成

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

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

メニューから「返品管理 > 得意先返品入荷伝票」を開きます(AD_Window_ID: 53097)。

  1. ツールバーの「新規」ボタンをクリック
  2. ヘッダーの必須項目を入力:
    • 伝票タイプ: 返品入荷用の伝票タイプ(DocBaseType = MMR、販売取引 = Y)
    • 取引先取引先住所: 返品元の顧客
    • 倉庫: 受け入れ先の倉庫
    • 移動日付: 実際に入荷した日付
    • 転記日付: 会計計上日(期間がオープンである必要があります)
  3. 必要に応じて RMA または 受注伝票 を設定(両方は設定できません
  4. 保存」をクリック(伝票番号が自動採番されます)

⚠️ 注意: 「移動タイプ」は手入力しません。beforeSave() が伝票タイプの DocBaseType と販売取引フラグから自動判定し、返品入荷では C(Customer Returns)がセットされます。

  1. 顧客返品入荷伝票明細」タブに移動
  2. 明細を登録:
    • 品目: 返品された品目(料金の返品の場合は「料金」を選択)
    • 保管場所: 戻し入れ先のロケーター
    • 入力数量 / 数量単位: 入力単位ベースの数量
    • 移動数量: 在庫単位に換算された返品数量
    • RMA Line: RMA から生成した場合は自動セット
  3. ロット・シリアル管理品目の場合は「Attributes」タブで属性セットインスタンスごとに移動数量を割り当てます

💡 ヒント: ヘッダーの「Create lines from」ボタンを使うと、RMA や既存の出荷伝票から明細をまとめて取り込めます。手入力より漏れが少なく確実です。

伝票処理(DocAction)内容
完了(Complete)検証後に在庫へ戻し入れ、在庫取引(M_Transaction)を生成
無効(Void)未完了伝票を無効化
反対仕訳(Reverse-Correct)完了済み伝票を打ち消す反転伝票を生成
締め(Close)未処理数量を残したまま伝票をクローズ
承認 / 却下ワークフロー承認が必要な場合に使用
  1. ヘッダーの「出荷プロセス」ボタンをクリック
  2. 完了」を選択して実行
  3. 伝票状態が「完了(CO)」になり、在庫数量が増加します

⚠️ 注意: 入出荷確認伝票を作成済みで未完了のものが残っていると、完了時に「@Open@: @M_InOutConfirm_ID@」というエラーで停止します。確認伝票を先に完了させてください。

顧客返品入荷伝票タブ(主要項目)

Section titled “顧客返品入荷伝票タブ(主要項目)”
項目名必須説明
伝票番号必須文字列伝票の採番番号
伝票タイプ必須選択DocBaseType = MMR(入荷)かつ販売取引
取引先必須検索返品元の顧客
取引先住所必須選択返品元の住所
倉庫必須選択受け入れ先の倉庫
移動日付必須日付在庫を動かした日付
転記日付必須日付会計計上日
移動タイプ必須リスト伝票タイプから自動判定(返品入荷は C
RMA-検索得意先返品依頼。受注伝票との併用不可
受注伝票-検索元の受注伝票。RMA との併用不可
顧客注文番号-文字列取引先側の参照番号
出荷ルール必須リスト引き渡しのタイミング
配送方法必須リスト配送手段
送料負担ルール必須リスト送料の負担方法
優先度必須リスト伝票の優先度
移動確認必須チェック輸送中かどうか
検討中必須チェック係争中フラグ
伝票状態必須リストDR / IP / CO / VO 等
出荷プロセス必須ボタン伝票処理(完了・無効等)
転記必須ボタン会計転記状態

顧客返品入荷伝票明細タブ(主要項目)

Section titled “顧客返品入荷伝票明細タブ(主要項目)”
項目名必須説明
明細番号必須整数伝票内の一意な行番号
品目-検索返品対象の品目
料金-選択品目の代わりに料金を返品する場合
属性セットインスタンス必須属性ロット・シリアル番号
保管場所-ロケーター戻し入れ先のロケーター
入力数量必須数量選択単位ベースの数量
数量単位必須選択入力単位
移動数量必須数量在庫単位に換算した数量
確認済(正常品)数量-数量確認伝票で確定した正常品数量
欠陥品数量-数量QA 不合格として廃棄する数量
RMA Line-選択元 RMA 明細

全項目一覧はリファレンス参照

Q. 受注伝票と RMA を両方セットしたらエラーになりました

Section titled “Q. 受注伝票と RMA を両方セットしたらエラーになりました”

仕様どおりの動作です。MInOut.prepareIt() の冒頭で「Order OR RMA can be processed on a shipment/receipt」というチェックがあり、C_Order_ID != 0 かつ M_RMA_ID != 0 の場合は伝票状態を Invalid にして処理を中断します。どちらか一方だけを設定してください。

Q. 完了しようとすると期間のエラーが出ます

Section titled “Q. 完了しようとすると期間のエラーが出ます”

prepareIt()MPeriod.isOpen() で転記日付の会計期間がオープンかを確認しています。加えて、会計スキーマのバックデート取引許可(MAcctSchema.isBackDateTrxAllowed())のチェックも行われます。転記日付を見直すか、会計期間の状態を確認してください。

Q. 「移動タイプ」を手で変更できますか?

Section titled “Q. 「移動タイプ」を手で変更できますか?”

変更しても保存時に上書きされます。MInOut.beforeSave() は新規レコード時、または C_DocType_ID が変更された時に setMovementType() を呼び出し、伝票タイプの DocBaseType と IsSOTrx から値を再計算します。

DocBaseTypeIsSOTrxセットされる移動タイプ
MMS(出荷)YCustomer Shipment
MMS(出荷)NVendor Returns
MMR(入荷)YCustomer Returns(得意先返品入荷)
MMR(入荷)NVendor Receipts

Q. ロット管理品で「Over_Qty_On_Attribute_Tab」というエラーが出ます

Section titled “Q. ロット管理品で「Over_Qty_On_Attribute_Tab」というエラーが出ます”

Attributes タブ(M_InOutLineMA)に割り当てた数量の合計が、明細の移動数量と一致していません。completeIt() の在庫更新処理でこの不一致を検出しています。属性別の数量を明細数量に合わせて調整してください。

Q. 属性セットが必須の品目で完了できません

Section titled “Q. 属性セットが必須の品目で完了できません”

prepareIt() は、品目の属性セットが「出荷時に必須(MANDATORYTYPE_WhenShipping)」の場合、明細の属性セットインスタンスまたは M_InOutLineMA の数量が揃っているかを検証します。自動生成された割当(isAutoGenerated()=true)は集計対象外なので、手動でロット・シリアルを指定してください。

Q. 完了後に取り消したい場合は?

Section titled “Q. 完了後に取り消したい場合は?”

完了済み伝票は削除できません。「反対仕訳(Reverse-Correct)」で反転伝票を生成して打ち消します。isReversal() が真の伝票では、受注のクローズ検証などの一部チェックがスキップされます。

Q. 返品を受けた分の返金はどう処理しますか?

Section titled “Q. 返品を受けた分の返金はどう処理しますか?”

ヘッダーの「入荷伝票をもとに仕入請求伝票作成」ボタンから請求書を作成できます。返品入荷は完了済みかつ内容が正しい状態で実行してください。

🛠 技術仕様(開発者向け)

得意先返品入荷伝票は Document 型のウィンドウ(AD_Window_ID: 53097)で、出荷伝票・入荷伝票と共通の M_InOut テーブルに格納されます。モデルクラスは MInOut(3,644行)で、DocAction インターフェースを実装し prepareIt() / completeIt() / voidIt() / closeIt() / reverseCorrectIt() を提供します。明細は MInOutLine(1,039行)です。

得意先返品かどうかは MInOut.isCustomerReturn() で判定します。

public boolean isCustomerReturn() {
MDocType doctype = MDocType.get(getC_DocType_ID());
if(isSOTrx() && doctype.getDocBaseType().equals("MMR") && doctype.isSOTrx())
return true;
return false;
}

テーブル属性: M_InOut / M_InOutLine / M_InOutLineMA / M_InOutLineConfirm はアクセスレベル 1(組織)、M_MatchPO / M_MatchInv はアクセスレベル 3(クライアント+組織)。いずれも削除可(IsDeleteable=Y)です。

classDiagram
    class MInOut {
        +prepareIt() String
        +completeIt() String
        +voidIt() boolean
        +closeIt() boolean
        +reverseCorrectIt() boolean
        +isCustomerReturn() boolean
        +setMovementType() void
        +createConfirmation() void
        +getLines(boolean) MInOutLine[]
        +copyLinesFrom(MInOut, boolean, boolean) int
    }
    class X_M_InOut {
        <<generated>>
    }
    class PO {
        <<abstract>>
    }
    class DocAction {
        <<interface>>
    }
    MInOut --|> X_M_InOut
    X_M_InOut --|> PO
    MInOut ..|> DocAction
    MInOut --> MInOutLine : has many
    MInOutLine --> MInOutLineMA : attribute allocation
    MInOutLine --> MInOutLineConfirm : confirmation
    MInOutLine --> MMatchPO : matched
    MInOutLine --> MMatchInv : matched
    MInOut --> MInOutConfirm : confirmations

+prepareIt() String +completeIt() String +voidIt() boolean +closeIt() boolean +reverseCorrectIt() boolean +isCustomerReturn() boolean +setMovementType() void +createConfirmation() void +getLines(boolean) MInOutLine[] +copyLinesFrom(MInOut, boolean, boolean) int <> <> <> > X_M_InOut X_M_InOut --

パッケージ: org.compiere.model ソースファイル: org.adempiere.base/src/org/compiere/model/MInOut.java

主な関連クラスの規模:

クラス行数役割
MInOut3,644入出荷伝票ヘッダー・伝票処理
MMatchPO1,480受注/発注明細との照合
MInOutLine1,039入出荷明細
MInOutConfirm895入出荷確認伝票ヘッダー
MMatchInv479請求明細との照合
MInOutLineMA315属性セットインスタンス別の数量割当

M_InOut(入出荷伝票/返品入荷ヘッダー)主要カラム

Section titled “M_InOut(入出荷伝票/返品入荷ヘッダー)主要カラム”
カラム名必須説明備考
M_InOut_IDIDPK入出荷伝票ID主キー
AD_Client_ID / AD_Org_IDTable DirectYクライアント/組織
DocumentNoStringY伝票番号自動採番
C_DocType_IDTableY伝票タイプDocBaseType=MMR・SOTrx=Y
C_BPartner_IDSearchY取引先返品元の顧客
C_BPartner_Location_IDTable DirectY取引先住所
M_Warehouse_IDTable DirectY倉庫受入先
MovementDateDateY移動日付
DateAcctDateY転記日付期間オープン必須
MovementTypeListY移動タイプbeforeSave() で自動セット
M_RMA_IDSearchNRMAC_Order_ID との併用不可
C_Order_IDSearchN受注伝票M_RMA_ID との併用不可
DeliveryRule / DeliveryViaRuleListY出荷ルール/配送方法
FreightCostRule / FreightAmtList / AmountY / N送料負担ルール/運送料
PriorityRuleListY優先度
IsInTransitYes-NoY移動確認(輸送中)
IsInDisputeYes-NoY検討中(係争中)
DateReceivedDateN受入日付
DocStatusListY伝票状態
DocActionButtonY出荷プロセス
PostedButtonY転記状態
CreateConfirmButtonN入出荷確認伝票作成
CreateLinesFromButtonN明細一括生成
GenerateToButtonN請求伝票作成

M_InOutLine(返品入荷明細)主要カラム

Section titled “M_InOutLine(返品入荷明細)主要カラム”
カラム名必須説明
M_InOutLine_IDIDPK明細ID
M_InOut_IDSearchYヘッダーFK
LineIntegerY明細番号
M_Product_IDSearchN品目
C_Charge_IDTable DirectN料金
M_AttributeSetInstance_IDProduct AttributeY属性セットインスタンス
M_Locator_IDLocator (WH)N保管場所
QtyEntered / C_UOM_IDQuantity / Table DirectY入力数量・数量単位
MovementQtyQuantityY移動数量(在庫単位)
ConfirmedQty / ScrappedQtyQuantityN確認済数量・欠陥品数量
M_RMALine_IDTable DirectNRMA 明細FK
erDiagram
    M_InOut ||--o{ M_InOutLine : "lines"
    M_InOutLine ||--o{ M_InOutLineMA : "attribute allocation"
    M_InOutLine ||--o{ M_InOutLineConfirm : "confirmation lines"
    M_InOutLine ||--o{ M_MatchPO : "matched to order"
    M_InOutLine ||--o{ M_MatchInv : "matched to invoice"
    M_InOut ||--o{ M_InOutConfirm : "confirmations"
    M_RMA ||--o{ M_InOut : "returns"
    M_RMALine ||--o{ M_InOutLine : "return lines"
    C_BPartner ||--o{ M_InOut : "customer"
    M_Warehouse ||--o{ M_InOut : "receives into"
    M_Product ||--o{ M_InOutLine : "returned"

attribute allocation confirmation lines matched to order matched to invoice return lines receives into

新規レコード時、または C_DocType_ID が変更された時に setMovementType() を呼び出します。setMovementType()C_DocType_ID が未設定の場合に FillMandatory エラーを記録し、設定済みなら getMovementType(ctx, C_DocType_ID, isSOTrx, trxName) の戻り値をセットします。判定ロジックは DocBaseType(MMS = 出荷 / MMR = 入荷)と伝票タイプ側の IsSOTrx の組み合わせです。加えて、倉庫と伝票が同一組織に属するかの検証も行われます。

flowchart TD
    A["prepareIt()"] --> B{"TIMING_BEFORE_PREPARE<br/>バリデータ OK?"}
    B -->|No| Z["STATUS_Invalid"]
    B -->|Yes| C{"C_Order_ID と M_RMA_ID<br/>が両方セット?"}
    C -->|Yes| Z
    C -->|No| D{"会計期間オープン?<br/>MPeriod.isOpen"}
    D -->|No| Z
    D -->|Yes| E{"バックデート取引許可?<br/>isBackDateTrxAllowed"}
    E -->|No| Z
    E -->|Yes| F{"クローズ済み受注を<br/>参照していないか"}
    F -->|参照あり| Z
    F -->|OK| G{"与信チェック<br/>CreditManager"}
    G -->|エラー| Z
    G -->|OK| H{"明細が1行以上?"}
    H -->|No| Z
    H -->|Yes| I{"属性セット必須品目の<br/>ASI/MA 数量が一致?"}
    I -->|不一致| Z
    I -->|OK| J["TIMING_AFTER_PREPARE"]
    J --> K["STATUS_InProgress"]

prepareIt() TIMING_BEFORE_PREPARE バリデータ OK? C_Order_ID と M_RMA_ID が両方セット? 会計期間オープン? MPeriod.isOpen バックデート取引許可? isBackDateTrxAllowed クローズ済み受注を 参照していないか 与信チェック CreditManager 明細が1行以上? 属性セット必須品目の ASI/MA 数量が一致? 参照あり エラー 不一致

prepareIt() の終盤では、参照している受注(C_Order_ID)と RMA(M_RMA_ID)が明細の実態と合っているかを再確認し、明細から集めた ID が1件だけかつヘッダーと異なる場合は置き換え、複数件ある場合はヘッダーの参照を外します。

  1. 再検証(prepareIt() を未実行なら実行)
  2. 完了時の確定伝票番号をセット
  3. ModelValidator.TIMING_BEFORE_COMPLETE を発火
  4. 未完了の入出荷確認伝票が残っていれば @Open@: @M_InOutConfirm_ID@ で中断
  5. 暗黙承認の処理
  6. 在庫充足チェック(不足時は @InsufficientStockCoverage@
  7. 明細ごとのループ:
    • 数量と移動タイプの決定、受注明細の更新
    • M_RMALine_ID があれば MRMALine をロード
    • 属性割当(M_InOutLineMA)の合計が明細数量を超える場合は @Over_Qty_On_Attribute_Tab@
    • MStorageOnHand.add() で在庫を更新(失敗時は「Cannot correct Inventory OnHand (MA)」)
    • MTransaction を生成(失敗時は「Could not create Material Transaction (MA)」)

📌 ポイント: 返品入荷では移動タイプが Customer Returns となるため、MStorageOnHand への数量は 加算 されます。出荷(Customer Shipment)とは符号が逆になる点が実装上の要点です。

メソッド処理
unlockIt() / invalidateIt()1414 / 1426ロック解除・伝票の無効化(Drafted へ戻す)
approveIt() / rejectIt()1607 / 1619ワークフロー承認・却下
voidIt()2617未完了伝票の無効化
closeIt()2703伝票のクローズ
reverseCorrectIt()2726反転伝票の生成
pendingConfirmations() / pendingCustomerConfirmations()2233 / 2215未完了確認伝票の有無を判定

MInOut.createFrom(MOrder, ...) / copyFrom(MInOut, ...) / copyLinesFrom(MInOut, boolean counter, boolean setOrder) により、既存の受注伝票や入出荷伝票から明細を複製できます。「Create lines from」ボタンはこれらの仕組みを利用しています。

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

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

M_InOut は Document 型のため、Model Validator の docValidate() による伝票タイミングごとのフックが利用できます。得意先返品だけを対象にしたい場合は isCustomerReturn() で絞り込みます。

public class CustomerReturnValidator implements ModelValidator {
@Override
public String docValidate(PO po, int timing) {
if (po instanceof MInOut) {
MInOut inout = (MInOut) po;
if (!inout.isCustomerReturn())
return null;
if (timing == TIMING_BEFORE_COMPLETE) {
// 例: 返品には必ず RMA の紐付けを必須とする
if (inout.getM_RMA_ID() == 0)
return "得意先返品入荷伝票には RMA の指定が必要です";
}
if (timing == TIMING_AFTER_COMPLETE) {
// 例: 返品完了時に品質管理システムへ通知
}
}
return null;
}
@Override
public int modelChange(PO po, int type) throws Exception {
return null;
}
}

利用できる主なタイミング定数は TIMING_BEFORE_PREPARE / TIMING_AFTER_PREPARE / TIMING_BEFORE_COMPLETE / TIMING_AFTER_COMPLETE / TIMING_BEFORE_VOID / TIMING_AFTER_VOID / TIMING_BEFORE_REVERSECORRECT / TIMING_AFTER_REVERSECORRECT です。

Callout については、M_InOut / M_InOutLine の各カラムに設定された標準 Callout(品目選択時の単位・保管場所の連動など)が動作します。独自 Callout を追加する場合は IColumnCallout を OSGi サービスとして登録すると、AD の Callout 設定を書き換えずに追加できます。

プロセス名説明
Create lines from既存の RMA・伝票から返品明細を一括生成(ヘッダーのボタン)
入出荷確認伝票作成受入確認伝票(M_InOutConfirm)を生成(CreateConfirm ボタン)
入荷伝票をもとに仕入請求伝票作成完了済み返品入荷から請求伝票を生成(GenerateTo ボタン)

返品業務は、RMA の必須化・返品理由の集計・検品結果に応じた在庫区分など、企業ごとに要件が大きく異なります。 M_InOut は Document 型のため、Model Validator の伝票タイミングフックでコア改変なしに業務ルールを組み込めます。

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

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