コンテンツにスキップ

iDempiere 仕入先返品依頼伝票の使い方|購買管理 操作マニュアル・技術仕様

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

仕入先返品依頼伝票(Vendor RMA: Return Material Authorization)は、仕入先へ返品する内容を事前に取りまとめ、承認・記録するための伝票です。入荷伝票(Material Receipt)を参照して返品品目・数量・金額を確定させ、後続の返品出荷伝票や返品発注の生成元になります。

📌 ポイント: RMA は「返品の承認記録」であり、完了しても在庫は動きません。在庫を減らすには 仕入先返品出荷伝票 を別途作成・完了する必要があります。

仕入先返品依頼伝票でできること

Section titled “仕入先返品依頼伝票でできること”
  • 入荷伝票を参照した返品依頼の登録(取引先・通貨・担当者は自動セット)
  • 「Create lines from」による入荷明細からの返品明細の一括取込
  • 返品数量が入荷数量を超えないかの自動チェック
  • 返品タイプ(RMA Type)による返品理由・処理区分の管理
  • 品目返品だけでなく料金(Charge)行の登録
  • 税額の自動計算(税額計算タブ)
  • 完了済み RMA からの発注伝票生成(Create Order From RMA)
graph TD
    subgraph "仕入先返品依頼伝票ウィンドウ(Window ID: 53099)"
        T1["↩️ 仕入先返品依頼伝票<br/>M_RMA<br/>17項目"]
        T2["📋 仕入先返品依頼伝票明細<br/>M_RMALine<br/>15項目"]
        T3["💰 税額計算<br/>M_RMATax<br/>8項目(自動計算)"]
    end
    T1 --> T2
    T1 --> T3

仕入先返品依頼伝票ウィンドウ(Window ID: 53099) ↩ 仕入先返品依頼伝票 M_RMA 17項目 仕入先返品依頼伝票明細 M_RMALine 15項目 税額計算 M_RMATax 8項目(自動計算)

タブ名テーブル役割主な入力項目
仕入先返品依頼伝票M_RMAヘッダー(対象入荷伝票・返品タイプ・取引先)伝票タイプ、RMA Type、Receipt(入荷伝票)、名称
仕入先返品依頼伝票明細M_RMALine返品する品目・数量・金額の明細入荷明細、品目/料金、数量、税率
税額計算M_RMATax明細から集計された税額(自動計算)税率、課税標準額、税額

💡 ヒント: 税額計算タブは完了準備処理(prepareIt)のたびに再計算・再作成されます。手入力するタブではありません。

graph TD
    A["🚀 メニューから開く<br/>返品管理 > 仕入先返品依頼伝票"] --> B["➕ 新規でヘッダーを入力<br/>(伝票タイプ・RMA Type・名称)"]
    B --> C["📦 Receipt に対象の<br/>入荷伝票を選択"]
    C --> D["💾 保存<br/>(取引先・通貨・担当者が自動セット)"]
    D --> E{明細の作り方}
    E -->|入荷から取込| F["📥 Create lines from ボタン"]
    E -->|手動入力| G["✏️ 明細タブで入荷明細または<br/>品目・料金を選択"]
    F --> H["🔢 返品数量を調整<br/>(部分返品はここで減らす)"]
    G --> H
    H --> I["▶️ Process RMA → 完了<br/>税額が自動計算される"]
    I --> J["🚚 仕入先返品出荷伝票を作成<br/>(在庫の払出)"]
    I --> K["🧾 Create Order From RMA<br/>(返品用の発注伝票を生成)"]

メニューから開く 返品管理 > 仕入先返品依頼伝票 新規でヘッダーを入力 (伝票タイプ・RMA Type・名称) Receipt に対象の 入荷伝票を選択 保存 (取引先・通貨・担当者が自動セット) Create lines from ボタン 明細タブで入荷明細または 品目・料金を選択 返品数量を調整 (部分返品はここで減らす) ▶ Process RMA → 完了 税額が自動計算される 仕入先返品出荷伝票を作成 (在庫の払出) Create Order From RMA (返品用の発注伝票を生成) 明細の作り方 入荷から取込 手動入力

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

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

メニューから「返品管理 > 仕入先返品依頼伝票」を開きます。

  1. ツールバーの「新規」ボタンをクリック
  2. ヘッダー情報を入力:
    • 伝票タイプ: 仕入先返品依頼用の伝票タイプ(必須)
    • RMA Type: 返品タイプ(必須)
    • Receipt: 返品対象の入荷伝票(必須)
    • 名称: 返品の件名(必須)
    • 社内担当者: 対応担当者(必須。入荷伝票の担当者が自動セット)
    • 説明 / コメント: 返品理由・補足
  3. 保存」をクリック
    • 取引先(C_BPartner_ID)が未入力なら入荷伝票からセットされます
    • 通貨(C_Currency_ID)は入荷伝票が参照する発注伝票または請求伝票からセットされます
  4. Create lines from」ボタンで入荷明細を取り込む、または明細タブで手動入力
  5. 明細で 数量 を返品数に調整します(部分返品の場合)

⚠️ 注意: 新規保存時、ヘッダーの「発注伝票」は beforeSave() で自動的にクリアされます(setC_Order_ID(0))。発注伝票は完了後に「Create Order From RMA」で生成された伝票が紐づく項目です。

1 明細行につき、入荷明細(M_InOutLine_ID)/品目(M_Product_ID)/料金(C_Charge_ID)のいずれか 1 つ以上を指定する必要があります。

  • 品目と料金を同時に指定するとエラーになります
  • 入荷明細を指定した場合、品目・料金・金額は入荷明細から自動セットされます
  • 同一の入荷明細を同じ RMA 内で 2 行以上登録することはできません
  • 数量が未入力(0)の場合は 1 が、金額が未入力の場合は入荷明細の単価がセットされます

Process RMA」ボタン(DocAction)から伝票を処理します。伝票状態(DocStatus)の初期値は「起案(DR)」、伝票アクションの初期値は「完了(CO)」です。

アクション処理内容
完了(Complete)明細検証・税額計算の後に「完了(CO)」へ。承認は暗黙で行われる
無効(Void)伝票を無効化する
クローズ(Close)完了済み伝票を締める
訂正取消(Reverse-Correct)完了済み伝票を打ち消す
再有効化(Re-activate)完了済み伝票を起案状態へ戻す

完了処理では次の検証が行われます。

  1. 明細行が 0 件なら @NoLines@
  2. 入荷明細を参照する各行について返品数量チェック。超過していれば @AmtReturned>Shipped@
  3. 税額の再計算。失敗すると Error calculating tax
  4. 完了時に伝票番号を確定(伝票タイプが「完了時に採番を上書き」設定の場合)
  5. 未承認であれば暗黙的に承認、完了後は伝票アクションが「クローズ」に切り替わる

主要項目のみ掲載しています。全項目一覧はリファレンス参照

仕入先返品依頼伝票タブ(ヘッダー)

Section titled “仕入先返品依頼伝票タブ(ヘッダー)”
項目名必須説明
伝票番号必須文字列伝票番号(自動採番)
名称必須文字列返品の件名
伝票タイプ必須選択仕入先返品依頼用の伝票タイプ
RMA Type必須選択返品タイプ(返品理由・処理区分)
Receipt必須検索返品対象の入荷伝票
取引先-検索仕入先(未入力なら入荷伝票からセット)
社内担当者必須検索担当者(未入力なら入荷伝票からセット)
説明-文字列返品理由の概要
コメント-テキスト補足情報
金額自動金額返品金額(明細から集計)
発注伝票-検索生成された返品発注(新規保存時はクリアされる)
伝票状態自動リスト起案(DR)/進行中(IP)/完了(CO)/クローズ(CL) 等
Process RMA必須ボタンDocAction(完了・無効・クローズ等)
項目名必須説明
明細番号-整数行番号(自動で10刻み採番)
入荷明細-選択返品対象の入荷明細
品目-検索返品する品目(料金と排他)
料金-選択品目の代わりに計上する料金(品目と排他)
数量必須数量返品数量(未入力時は1)
金額-金額単価(未入力時は入荷明細の単価)
税率必須選択適用する税(未入力時は自動判定)
行合計自動金額数量 × 金額
説明-文字列明細の補足

Q. 「返品数量が入荷数量を超えています」と表示されます。

Section titled “Q. 「返品数量が入荷数量を超えています」と表示されます。”

返品数量チェック(MRMALine.checkQty())は 2 段階で行われます。まず対象の入荷明細の移動数量を超えていないか、次に同じ入荷明細に対して完了済み(CO)またはクローズ済み(CL)の RMA で既に返品済みの数量との合計が入荷数量を超えていないかを確認します。過去の返品分を含めて数量を見直してください。

Q. 同じ入荷明細から 2 行作れないのはなぜですか?

Section titled “Q. 同じ入荷明細から 2 行作れないのはなぜですか?”

MRMALine.beforeSave() が同一 RMA 内での入荷明細の重複を禁止しており、重複すると InOutLineAlreadyEntered エラーになります。数量を分けたい場合は 1 行にまとめ、数量欄で調整してください。

Q. 保存時に「RMA.IsSOTrx <> InOut.IsSOTrx」エラーが出ます。

Section titled “Q. 保存時に「RMA.IsSOTrx <> InOut.IsSOTrx」エラーが出ます。”

指定した入出荷伝票の販売取引フラグ(IsSOTrx)と RMA の販売取引フラグが一致していません。仕入先返品依頼伝票(IsSOTrx=N)には入荷伝票を、得意先返品には出荷伝票を指定してください。得意先側の返品は 得意先返品 RMA を使用します。

Q. 完了済み RMA に明細を追加できますか?

Section titled “Q. 完了済み RMA に明細を追加できますか?”

できません。ヘッダーが処理済み(Processed=Y)の状態で新規明細を保存しようとすると ParentComplete エラーになります。修正が必要な場合は「再有効化」で起案状態に戻してください。

Q. RMA を完了すると在庫や買掛金はどうなりますか?

Section titled “Q. RMA を完了すると在庫や買掛金はどうなりますか?”

RMA 単体では在庫も買掛金も動きません。在庫を減らすには 仕入先返品出荷伝票 を、買掛金を減らすには「Create Order From RMA」で生成した発注伝票をもとに仕入請求(貸方)伝票を作成・完了する必要があります。

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

仕入先返品依頼伝票は Document 型の伝票で、得意先返品と共通の M_RMA テーブルに格納されます。両者は IsSOTrx カラムで区別され(仕入先返品は N)、モデルクラスは同一の MRMA(1,008行)です。MRMADocAction を実装し、明細は MRMALine(728行)、税額は MRMATax(379行)が担当します。

M_RMA のアクセスレベルは「組織(Organization)」、削除可(IsDeleteable=Y)です。

classDiagram
    class MRMA {
        +prepareIt() String
        +completeIt() String
        +calculateTaxTotal() boolean
        +voidIt() boolean
        +closeIt() boolean
        +reActivateIt() boolean
        +getLines(boolean) MRMALine[]
        +getTaxes(boolean) MRMATax[]
        +getShipment() MInOut
        +createLineFrom(int, BigDecimal, String) void
        +createCounterDoc() MRMA
    }
    class MRMALine {
        +beforeSave(boolean) boolean
        +checkQty() boolean
        +updateHeaderAmt() boolean
        +getUnitAmt() BigDecimal
        +getTotalAmt() BigDecimal
    }
    class MRMATax {
        +get(MRMALine, int, ...)$ MRMATax
        +calculateTaxFromLines() boolean
    }
    class X_M_RMA {
        <<generated>>
    }
    class PO {
        <<abstract>>
    }
    class DocAction {
        <<interface>>
    }
    MRMA --|> X_M_RMA
    X_M_RMA --|> PO
    MRMA ..|> DocAction
    MRMA --> MRMALine : has many
    MRMA --> MRMATax : has many
    MRMALine --> MInOutLine : references

+prepareIt() String +completeIt() String +calculateTaxTotal() boolean +voidIt() boolean +closeIt() boolean +reActivateIt() boolean +getLines(boolean) MRMALine[] +getTaxes(boolean) MRMATax[] +getShipment() MInOut +createLineFrom(int, BigDecimal, String) void +createCounterDoc() MRMA +beforeSave(boolean) boolean +checkQty() boolean +updateHeaderAmt() boolean +getUnitAmt() BigDecimal +getTotalAmt() BigDecimal +get(MRMALine, int, ...)$ MRMATax +calculateTaxFromLines() boolean <> <> <> > X_M_RMA X_M_RMA --

パッケージ: org.compiere.model ソースファイル: org.adempiere.base/src/org/compiere/model/MRMA.java(1,008行)、MRMALine.java(728行)、MRMATax.java(379行)

📌 ポイント: IsSOTrx の既定値はコンテキスト変数 @IsSOTrx@ です。ウィンドウ側のコンテキストで仕入先返品(N)が決まるため、REST API やプロセスから直接レコードを作る場合は IsSOTrx を明示的に設定してください。

カラム名必須説明備考
M_RMA_IDIDPKRMA ID主キー
AD_Client_IDTableDirectYクライアント既定 @#AD_Client_ID@
AD_Org_IDTableDirectY組織既定 @#AD_Org_ID@
DocumentNoStringY伝票番号完了時に確定採番の場合あり
NameStringY名称返品の件名
C_DocType_IDTableY伝票タイプ
M_RMAType_IDTableDirectYRMA Type返品タイプ
InOut_IDSearchY入出荷伝票仕入先返品では入荷伝票
IsSOTrxYesNoY販売取引フラグ既定 @IsSOTrx@。仕入先返品は N
C_BPartner_ID / SalesRep_IDSearchN / Y取引先・社内担当者未入力なら入荷伝票からセット
C_Currency_IDTableDirectN通貨入荷伝票の発注/請求伝票から継承
C_Order_IDSearchN発注伝票新規保存時に 0 クリア
Ref_RMA_IDSearchN参照 RMAカウンター文書用
AmtAmountN金額明細から集計
DocStatus / DocActionList / ButtonY伝票状態・伝票アクション既定 DR / CO
IsApproved / ProcessedYesNoY承認済み・処理済み完了時に暗黙で承認
カラム名必須説明備考
M_RMALine_IDIDPK明細ID主キー
M_RMA_IDSearchYヘッダーFK
LineIntegerN明細番号既定 SQL で最大値+10
M_InOutLine_IDTableDirectN入荷明細FK品目・料金・金額の取得元
M_Product_IDSearchN品目料金と排他
C_Charge_IDTableDirectN料金品目と排他
Qty / AmtQuantity / AmountY / N返品数量・単価未入力時は数量 1・入荷明細の単価
C_Tax_IDTableDirectY税率未入力時は自動判定
LineNetAmtAmountN行合計getTotalAmt() の結果を保存
QtyDelivered / QtyInvoicedQuantityN返品済数量・請求済数量
Ref_RMALine_IDSearchN参照 RMA 明細カウンター文書用
カラム名必須説明
M_RMA_IDSearchYヘッダーFK
C_Tax_IDTableDirectY税率
C_TaxProvider_IDTableDirectNタックスプロバイダー
TaxBaseAmtAmountY課税標準額
TaxAmtAmountY税額
IsTaxIncludedYesNoY税込フラグ
erDiagram
    M_RMA ||--o{ M_RMALine : "has lines"
    M_RMA ||--o{ M_RMATax : "tax summary"
    M_RMA }o--|| M_InOut : "source receipt"
    M_RMA }o--|| C_BPartner : "vendor"
    M_RMA }o--|| M_RMAType : "RMA type"
    M_RMA }o--o| C_Order : "generated order"
    M_RMALine }o--o| M_InOutLine : "source receipt line"
    M_RMALine }o--o| M_Product : "product"
    M_RMALine }o--|| C_Tax : "tax"
    M_RMA ||--o{ M_InOut : "return to vendor shipment"

has lines tax summary source receipt RMA type generated order source receipt line return to vendor shipment

stateDiagram-v2
    [*] --> Drafted : 新規作成(DocStatus=DR)
    Drafted --> InProgress : prepareIt()
    Drafted --> Invalid : 検証エラー
    InProgress --> Completed : completeIt()
    Completed --> Closed : closeIt()
    Completed --> Reversed : reverseCorrectIt()
    Completed --> Drafted : reActivateIt()
    Drafted --> Voided : voidIt()

*

  1. 新規レコードなら setC_Order_ID(0) で発注伝票参照をクリアし、getShipment() で参照先の入出荷伝票をロード
  2. 取引先が未設定なら入出荷伝票の取引先を、社内担当者が未設定なら入出荷伝票の担当者をセット
  3. 通貨が未設定なら、入出荷伝票が参照する発注伝票(C_Order_ID)または請求伝票(C_Invoice_ID)の通貨をセット
  4. IsSOTrx の整合性チェック: 入出荷伝票の isSOTrx() と RMA の isSOTrx() が異なる場合、RMA.IsSOTrx <> InOut.IsSOTrx エラーで保存を中止
  1. ModelValidator.TIMING_BEFORE_PREPARE の発火
  2. 明細行が 0 件なら @NoLines@ を返して STATUS_Invalid
  3. M_InOutLine_ID を持つ各明細について checkQty() を実行。false なら @AmtReturned&gt;Shipped@
  4. calculateTaxTotal() で税額を再計算。失敗なら Error calculating tax
  5. ModelValidator.TIMING_AFTER_PREPARE の発火 → STATUS_InProgress

DELETE FROM M_RMATax WHERE M_RMA_ID=? で既存の税額行を全削除したうえで、getTaxProviders() が返す各タックスプロバイダーの ITaxProvider.calculateRMATaxTotal()Core.getTaxProvider() 経由で呼び出します。プロバイダーが解決できない場合は TaxNoProvider 例外となります。

  1. 未準備なら prepareIt() を再実行し、STATUS_InProgress 以外なら中断
  2. setDefiniteDocumentNo()(伝票タイプが IsOverwriteSeqOnComplete の場合に採番し直し)
  3. TIMING_BEFORE_COMPLETE の発火
  4. 未承認なら approveIt() を暗黙実行
  5. createCounterDoc() でカウンター文書(相手組織側の RMA)を生成。生成時は @CounterDoc@ メッセージを付与
  6. TIMING_AFTER_COMPLETE の発火
  7. setProcessed(true)setDocAction(DOCACTION_Close)STATUS_Completed

明細検証(MRMALine.beforeSave() 305行〜)

Section titled “明細検証(MRMALine.beforeSave() 305行〜)”
flowchart TD
    A[beforeSave] --> B{親が処理済み&&新規?}
    B -->|Yes| C[ParentComplete エラー]
    B -->|No| D{入荷明細/品目/料金<br/>いずれか指定あり?}
    D -->|No| E[FillShipLineOrProductOrCharge]
    D -->|Yes| F{品目と料金の<br/>両方を指定?}
    F -->|Yes| G[JustProductOrCharge]
    F -->|No| H{入荷明細あり?}
    H -->|Yes| I[checkQty 検証]
    I -->|NG| J[AmtReturned>Shipped]
    I -->|OK| K{同一入荷明細の<br/>重複行あり?}
    K -->|Yes| L[InOutLineAlreadyEntered]
    K -->|No| M[品目・料金・金額を<br/>入荷明細から設定]
    H -->|No| M
    M --> N[数量/金額の既定値補完<br/>税・明細番号のセット]
    N --> O[LineNetAmt を計算して保存]

親が処理済み&&新規? 入荷明細/品目/料金 いずれか指定あり? 品目と料金の 両方を指定? 入荷明細あり? 同一入荷明細の 重複行あり? ParentComplete エラー checkQty 検証 AmtReturned>Shipped 品目・料金・金額を 入荷明細から設定 数量/金額の既定値補完 税・明細番号のセット LineNetAmt を計算して保存

返品数量チェック(MRMALine.checkQty() 402行〜)

Section titled “返品数量チェック(MRMALine.checkQty() 402行〜)”
SELECT SUM(Qty) FROM M_RMALine rl
JOIN M_RMA r ON (r.M_RMA_ID = rl.M_RMA_ID)
WHERE M_InOutLine_ID = ? AND M_RMALine_ID != ?
AND r.Processed = 'Y' AND r.DocStatus IN ('CO','CL')
  1. 当該行の Qty が入荷明細の MovementQty を超えていれば false
  2. 上記 SQL で得た完了・クローズ済み RMA の返品済数量に当該行の数量を加算し、入荷明細の MovementQty を超えていれば false

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

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

返品承認ルールを追加する場合は docValidate()TIMING_BEFORE_COMPLETE でフックします。仕入先返品と得意先返品は同一クラスのため、必ず isSOTrx() で方向を判定してください。

public class CustomVendorRMAValidator implements ModelValidator {
@Override
public String docValidate(PO po, int timing) {
if (po instanceof MRMA && timing == TIMING_BEFORE_COMPLETE) {
MRMA rma = (MRMA) po;
if (!rma.isSOTrx()) { // 仕入先返品のみ
if (Util.isEmpty(rma.getDescription())) {
return "仕入先返品には返品理由の入力が必要です";
}
}
}
return null;
}
}

MRMA.createLineFrom(int M_InOutLine_ID, BigDecimal MovementQty, String Description) を使うと、入荷明細から RMA 明細をプログラムで生成できます。「Create lines from」相当の処理を独自プロセスから呼び出す場合に利用します。

税額計算は ITaxProvider の実装に委譲されます(Core.getTaxProvider(MTaxProvider))。外部税計算サービスと連携する場合は ITaxProvider.calculateRMATaxTotal() を実装した OSGi サービスを登録します。

このウィンドウの入力項目には AD 上の callout 定義がありません(M_RMA / M_RMALine / M_RMATax の全カラムで Callout 未設定)。値の自動補完は MRMA.beforeSave() / MRMALine.beforeSave() のモデル層で実装されています。UI 上での即時反映が必要な場合のみ、独自 callout を追加してください。

プロセス名画面上のボタン説明
Create lines fromCreateLinesFrom入荷伝票の明細から返品明細を一括取込
Create Order From RMAGenerateTo完了済み RMA をもとに発注伝票を生成
Process RMADocAction完了・無効・クローズ・訂正取消・再有効化

仕入先返品は返品理由の分類、承認段階、仕入先評価への反映など、企業ごとに運用差が大きい領域です。 MRMA はコアクラスですが、Model Validator と ITaxProvider を組み合わせればコア改変なしで自社ルールを実装できます。

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

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