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
| タブ名 | テーブル | 役割 | 主な入力項目 |
|---|---|---|---|
| 仕入先返品依頼伝票 | M_RMA | ヘッダー(対象入荷伝票・返品タイプ・取引先) | 伝票タイプ、RMA Type、Receipt(入荷伝票)、名称 |
| 仕入先返品依頼伝票明細 | M_RMALine | 返品する品目・数量・金額の明細 | 入荷明細、品目/料金、数量、税率 |
| 税額計算 | M_RMATax | 明細から集計された税額(自動計算) | 税率、課税標準額、税額 |
💡 ヒント: 税額計算タブは完了準備処理(
prepareIt)のたびに再計算・再作成されます。手入力するタブではありません。
基本操作手順
Section titled “基本操作手順”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/>(返品用の発注伝票を生成)"]
アクセス方法(メニューパス)
Section titled “アクセス方法(メニューパス)”メニューから「返品管理 > 仕入先返品依頼伝票」を開きます。
- ツールバーの「新規」ボタンをクリック
- ヘッダー情報を入力:
- 伝票タイプ: 仕入先返品依頼用の伝票タイプ(必須)
- RMA Type: 返品タイプ(必須)
- Receipt: 返品対象の入荷伝票(必須)
- 名称: 返品の件名(必須)
- 社内担当者: 対応担当者(必須。入荷伝票の担当者が自動セット)
- 説明 / コメント: 返品理由・補足
- 「保存」をクリック
- 取引先(
C_BPartner_ID)が未入力なら入荷伝票からセットされます - 通貨(
C_Currency_ID)は入荷伝票が参照する発注伝票または請求伝票からセットされます
- 取引先(
- 「Create lines from」ボタンで入荷明細を取り込む、または明細タブで手動入力
- 明細で 数量 を返品数に調整します(部分返品の場合)
⚠️ 注意: 新規保存時、ヘッダーの「発注伝票」は
beforeSave()で自動的にクリアされます(setC_Order_ID(0))。発注伝票は完了後に「Create Order From RMA」で生成された伝票が紐づく項目です。
明細登録のルール
Section titled “明細登録のルール”1 明細行につき、入荷明細(M_InOutLine_ID)/品目(M_Product_ID)/料金(C_Charge_ID)のいずれか 1 つ以上を指定する必要があります。
- 品目と料金を同時に指定するとエラーになります
- 入荷明細を指定した場合、品目・料金・金額は入荷明細から自動セットされます
- 同一の入荷明細を同じ RMA 内で 2 行以上登録することはできません
- 数量が未入力(0)の場合は
1が、金額が未入力の場合は入荷明細の単価がセットされます
伝票処理(DocAction)
Section titled “伝票処理(DocAction)”「Process RMA」ボタン(DocAction)から伝票を処理します。伝票状態(DocStatus)の初期値は「起案(DR)」、伝票アクションの初期値は「完了(CO)」です。
| アクション | 処理内容 |
|---|---|
| 完了(Complete) | 明細検証・税額計算の後に「完了(CO)」へ。承認は暗黙で行われる |
| 無効(Void) | 伝票を無効化する |
| クローズ(Close) | 完了済み伝票を締める |
| 訂正取消(Reverse-Correct) | 完了済み伝票を打ち消す |
| 再有効化(Re-activate) | 完了済み伝票を起案状態へ戻す |
完了処理では次の検証が行われます。
- 明細行が 0 件なら
@NoLines@ - 入荷明細を参照する各行について返品数量チェック。超過していれば
@AmtReturned>Shipped@ - 税額の再計算。失敗すると
Error calculating tax - 完了時に伝票番号を確定(伝票タイプが「完了時に採番を上書き」設定の場合)
- 未承認であれば暗黙的に承認、完了後は伝票アクションが「クローズ」に切り替わる
項目リファレンス
Section titled “項目リファレンス”主要項目のみ掲載しています。全項目一覧はリファレンス参照
仕入先返品依頼伝票タブ(ヘッダー)
Section titled “仕入先返品依頼伝票タブ(ヘッダー)”| 項目名 | 必須 | 型 | 説明 |
|---|---|---|---|
| 伝票番号 | 必須 | 文字列 | 伝票番号(自動採番) |
| 名称 | 必須 | 文字列 | 返品の件名 |
| 伝票タイプ | 必須 | 選択 | 仕入先返品依頼用の伝票タイプ |
| RMA Type | 必須 | 選択 | 返品タイプ(返品理由・処理区分) |
| Receipt | 必須 | 検索 | 返品対象の入荷伝票 |
| 取引先 | - | 検索 | 仕入先(未入力なら入荷伝票からセット) |
| 社内担当者 | 必須 | 検索 | 担当者(未入力なら入荷伝票からセット) |
| 説明 | - | 文字列 | 返品理由の概要 |
| コメント | - | テキスト | 補足情報 |
| 金額 | 自動 | 金額 | 返品金額(明細から集計) |
| 発注伝票 | - | 検索 | 生成された返品発注(新規保存時はクリアされる) |
| 伝票状態 | 自動 | リスト | 起案(DR)/進行中(IP)/完了(CO)/クローズ(CL) 等 |
| Process RMA | 必須 | ボタン | DocAction(完了・無効・クローズ等) |
仕入先返品依頼伝票明細タブ
Section titled “仕入先返品依頼伝票明細タブ”| 項目名 | 必須 | 型 | 説明 |
|---|---|---|---|
| 明細番号 | - | 整数 | 行番号(自動で10刻み採番) |
| 入荷明細 | - | 選択 | 返品対象の入荷明細 |
| 品目 | - | 検索 | 返品する品目(料金と排他) |
| 料金 | - | 選択 | 品目の代わりに計上する料金(品目と排他) |
| 数量 | 必須 | 数量 | 返品数量(未入力時は1) |
| 金額 | - | 金額 | 単価(未入力時は入荷明細の単価) |
| 税率 | 必須 | 選択 | 適用する税(未入力時は自動判定) |
| 行合計 | 自動 | 金額 | 数量 × 金額 |
| 説明 | - | 文字列 | 明細の補足 |
よくある質問(FAQ)
Section titled “よくある質問(FAQ)”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」で生成した発注伝票をもとに仕入請求(貸方)伝票を作成・完了する必要があります。
- 仕入先返品出荷伝票(Return to Vendor)の使い方
- 入荷伝票(Material Receipt)の使い方
- 発注伝票(Purchase Order)の使い方
- 仕入請求書(Vendor Invoice)の使い方
- 得意先返品 RMA(Customer RMA)の使い方
- 画面リファレンス: 仕入先返品依頼伝票
🛠 技術仕様(開発者向け)
仕入先返品依頼伝票は Document 型の伝票で、得意先返品と共通の M_RMA テーブルに格納されます。両者は IsSOTrx カラムで区別され(仕入先返品は N)、モデルクラスは同一の MRMA(1,008行)です。MRMA は DocAction を実装し、明細は MRMALine(728行)、税額は MRMATax(379行)が担当します。
M_RMA のアクセスレベルは「組織(Organization)」、削除可(IsDeleteable=Y)です。
アーキテクチャ概要
Section titled “アーキテクチャ概要”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
パッケージ: org.compiere.model
ソースファイル: org.adempiere.base/src/org/compiere/model/MRMA.java(1,008行)、MRMALine.java(728行)、MRMATax.java(379行)
関連DBテーブル
Section titled “関連DBテーブル”M_RMA(返品依頼ヘッダー)
Section titled “M_RMA(返品依頼ヘッダー)”📌 ポイント:
IsSOTrxの既定値はコンテキスト変数@IsSOTrx@です。ウィンドウ側のコンテキストで仕入先返品(N)が決まるため、REST API やプロセスから直接レコードを作る場合はIsSOTrxを明示的に設定してください。
| カラム名 | 型 | 必須 | 説明 | 備考 |
|---|---|---|---|---|
| M_RMA_ID | ID | PK | RMA ID | 主キー |
| AD_Client_ID | TableDirect | Y | クライアント | 既定 @#AD_Client_ID@ |
| AD_Org_ID | TableDirect | Y | 組織 | 既定 @#AD_Org_ID@ |
| DocumentNo | String | Y | 伝票番号 | 完了時に確定採番の場合あり |
| Name | String | Y | 名称 | 返品の件名 |
| C_DocType_ID | Table | Y | 伝票タイプ | |
| M_RMAType_ID | TableDirect | Y | RMA Type | 返品タイプ |
| InOut_ID | Search | Y | 入出荷伝票 | 仕入先返品では入荷伝票 |
| IsSOTrx | YesNo | Y | 販売取引フラグ | 既定 @IsSOTrx@。仕入先返品は N |
| C_BPartner_ID / SalesRep_ID | Search | N / Y | 取引先・社内担当者 | 未入力なら入荷伝票からセット |
| C_Currency_ID | TableDirect | N | 通貨 | 入荷伝票の発注/請求伝票から継承 |
| C_Order_ID | Search | N | 発注伝票 | 新規保存時に 0 クリア |
| Ref_RMA_ID | Search | N | 参照 RMA | カウンター文書用 |
| Amt | Amount | N | 金額 | 明細から集計 |
| DocStatus / DocAction | List / Button | Y | 伝票状態・伝票アクション | 既定 DR / CO |
| IsApproved / Processed | YesNo | Y | 承認済み・処理済み | 完了時に暗黙で承認 |
M_RMALine(返品依頼明細)
Section titled “M_RMALine(返品依頼明細)”| カラム名 | 型 | 必須 | 説明 | 備考 |
|---|---|---|---|---|
| M_RMALine_ID | ID | PK | 明細ID | 主キー |
| M_RMA_ID | Search | Y | ヘッダーFK | |
| Line | Integer | N | 明細番号 | 既定 SQL で最大値+10 |
| M_InOutLine_ID | TableDirect | N | 入荷明細FK | 品目・料金・金額の取得元 |
| M_Product_ID | Search | N | 品目 | 料金と排他 |
| C_Charge_ID | TableDirect | N | 料金 | 品目と排他 |
| Qty / Amt | Quantity / Amount | Y / N | 返品数量・単価 | 未入力時は数量 1・入荷明細の単価 |
| C_Tax_ID | TableDirect | Y | 税率 | 未入力時は自動判定 |
| LineNetAmt | Amount | N | 行合計 | getTotalAmt() の結果を保存 |
| QtyDelivered / QtyInvoiced | Quantity | N | 返品済数量・請求済数量 | |
| Ref_RMALine_ID | Search | N | 参照 RMA 明細 | カウンター文書用 |
M_RMATax(返品税額)
Section titled “M_RMATax(返品税額)”| カラム名 | 型 | 必須 | 説明 |
|---|---|---|---|
| M_RMA_ID | Search | Y | ヘッダーFK |
| C_Tax_ID | TableDirect | Y | 税率 |
| C_TaxProvider_ID | TableDirect | N | タックスプロバイダー |
| TaxBaseAmt | Amount | Y | 課税標準額 |
| TaxAmt | Amount | Y | 税額 |
| IsTaxIncluded | YesNo | Y | 税込フラグ |
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"
ビジネスロジック
Section titled “ビジネスロジック”伝票ライフサイクル
Section titled “伝票ライフサイクル”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()
beforeSave()(MRMA.java 256行〜)
Section titled “beforeSave()(MRMA.java 256行〜)”- 新規レコードなら
setC_Order_ID(0)で発注伝票参照をクリアし、getShipment()で参照先の入出荷伝票をロード - 取引先が未設定なら入出荷伝票の取引先を、社内担当者が未設定なら入出荷伝票の担当者をセット
- 通貨が未設定なら、入出荷伝票が参照する発注伝票(
C_Order_ID)または請求伝票(C_Invoice_ID)の通貨をセット IsSOTrxの整合性チェック: 入出荷伝票のisSOTrx()と RMA のisSOTrx()が異なる場合、RMA.IsSOTrx <> InOut.IsSOTrxエラーで保存を中止
prepareIt()(MRMA.java 347行〜)
Section titled “prepareIt()(MRMA.java 347行〜)”ModelValidator.TIMING_BEFORE_PREPAREの発火- 明細行が 0 件なら
@NoLines@を返してSTATUS_Invalid M_InOutLine_IDを持つ各明細についてcheckQty()を実行。false なら@AmtReturned>Shipped@calculateTaxTotal()で税額を再計算。失敗ならError calculating taxModelValidator.TIMING_AFTER_PREPAREの発火 →STATUS_InProgress
calculateTaxTotal()(392行〜)
Section titled “calculateTaxTotal()(392行〜)”DELETE FROM M_RMATax WHERE M_RMA_ID=? で既存の税額行を全削除したうえで、getTaxProviders() が返す各タックスプロバイダーの ITaxProvider.calculateRMATaxTotal() を Core.getTaxProvider() 経由で呼び出します。プロバイダーが解決できない場合は TaxNoProvider 例外となります。
completeIt()(441行〜)
Section titled “completeIt()(441行〜)”- 未準備なら
prepareIt()を再実行し、STATUS_InProgress以外なら中断 setDefiniteDocumentNo()(伝票タイプがIsOverwriteSeqOnCompleteの場合に採番し直し)TIMING_BEFORE_COMPLETEの発火- 未承認なら
approveIt()を暗黙実行 createCounterDoc()でカウンター文書(相手組織側の RMA)を生成。生成時は@CounterDoc@メッセージを付与TIMING_AFTER_COMPLETEの発火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 を計算して保存]
返品数量チェック(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')- 当該行の
Qtyが入荷明細のMovementQtyを超えていれば false - 上記 SQL で得た完了・クローズ済み RMA の返品済数量に当該行の数量を加算し、入荷明細の
MovementQtyを超えていれば false
拡張ポイント(カスタマイズ箇所)
Section titled “拡張ポイント(カスタマイズ箇所)”OSGi Model Validator(推奨)
Section titled “OSGi Model Validator(推奨)”返品承認ルールを追加する場合は 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; }}明細の一括生成
Section titled “明細の一括生成”MRMA.createLineFrom(int M_InOutLine_ID, BigDecimal MovementQty, String Description) を使うと、入荷明細から RMA 明細をプログラムで生成できます。「Create lines from」相当の処理を独自プロセスから呼び出す場合に利用します。
税計算の差し替え
Section titled “税計算の差し替え”税額計算は ITaxProvider の実装に委譲されます(Core.getTaxProvider(MTaxProvider))。外部税計算サービスと連携する場合は ITaxProvider.calculateRMATaxTotal() を実装した OSGi サービスを登録します。
Callout
Section titled “Callout”このウィンドウの入力項目には AD 上の callout 定義がありません(M_RMA / M_RMALine / M_RMATax の全カラムで Callout 未設定)。値の自動補完は MRMA.beforeSave() / MRMALine.beforeSave() のモデル層で実装されています。UI 上での即時反映が必要な場合のみ、独自 callout を追加してください。
関連プロセス
Section titled “関連プロセス”| プロセス名 | 画面上のボタン | 説明 |
|---|---|---|
| Create lines from | CreateLinesFrom | 入荷伝票の明細から返品明細を一括取込 |
| Create Order From RMA | GenerateTo | 完了済み RMA をもとに発注伝票を生成 |
| Process RMA | DocAction | 完了・無効・クローズ・訂正取消・再有効化 |
関連ドキュメント
Section titled “関連ドキュメント”iDempiereカスタマイズのご相談
Section titled “iDempiereカスタマイズのご相談”仕入先返品は返品理由の分類、承認段階、仕入先評価への反映など、企業ごとに運用差が大きい領域です。
MRMA はコアクラスですが、Model Validator と ITaxProvider を組み合わせればコア改変なしで自社ルールを実装できます。
As-Link株式会社では、OSGiプラグインによる安全なカスタマイズを提供しています。