iDempiere 発注照合伝票の使い方|購買管理 操作マニュアル・技術仕様
This content is not available in your language yet.
📖 購買管理の全体像: 購買管理の全体図 も合わせてご覧ください。
発注照合伝票(Matched Purchase Orders)は、発注伝票明細と入荷伝票明細、または発注伝票明細と仕入請求伝票明細を照合した結果を記録・照会する画面です。発注した品目が正しく入荷・請求されたかを確認し、架空請求や過大請求を防ぐための台帳として機能します。
📌 ポイント: 発注照合伝票には 価格差異許容範囲(
PriceMatchDifference) という専用項目があり、「発注単価」と「請求単価」の差額が明細単位で保持されます。仕入価格の食い違いを調べる起点はこの列です。
発注照合伝票でできること
Section titled “発注照合伝票でできること”- 発注伝票明細(
C_OrderLine)と入荷明細(M_InOutLine)の照合結果の照会 - 発注伝票明細と仕入請求伝票明細(
C_InvoiceLine)の照合結果の照会 - 照合数量(
Qty)と品目・属性セットインスタンスの確認 - 発注単価と請求単価の価格差異(
PriceMatchDifference)の確認 - 承認済み(
IsApproved)フラグによる価格差異の承認管理 - 誤った照合レコードの削除(「削除」ボタン=
Processing) - 転記状態(
Posted)と転記日付(DateAcct)の確認
発注照合伝票は 1 タブ構成の照会ウィンドウです。
| タブ名 | テーブル | 項目数 | 役割 |
|---|---|---|---|
| 発注照合伝票 | M_MatchPO | 18項目 | 発注・入荷・請求の三者照合結果の照会・削除 |
💡 ヒント: 1 レコードは「発注明細 1 行 × 入荷明細 1 行(および必要に応じて請求明細 1 行)× 数量」の 1 組を表します。分割入荷・分割請求を行うと、その回数だけレコードが増えます。
基本操作手順
Section titled “基本操作手順”graph TD
A["📝 発注伝票を完了"] --> B["📥 入荷伝票を完了<br/>(発注参照)"]
B --> C["🔗 発注×入荷の照合<br/>M_MatchPO 自動生成"]
A --> D["🧾 仕入請求伝票を完了<br/>(発注参照)"]
D --> E["🔗 発注×請求の照合<br/>M_MatchPO 自動生成"]
C --> F["🔍 発注照合伝票ウィンドウで<br/>照合結果を照会"]
E --> F
F --> G{"価格差異<br/>PriceMatchDifference"}
G -->|差異なし| H["✅ 転記状態を確認"]
G -->|差異あり| I["🧐 発注単価と請求単価を照合<br/>承認済みフラグで承認"]
I --> J["🗑 必要なら削除ボタンで<br/>照合を取消し再処理"]
⚠️ 注意: 照合レコードの削除は、発注に対する入荷済/請求済の紐付けを解除します。会計・購買実績に影響するため、原因を特定してから実施してください。
アクセス方法(メニューパス)
Section titled “アクセス方法(メニューパス)”メニューから「購買管理 > 発注照合伝票」を開きます。
- メニューから「発注照合伝票」を開く
- 検索で対象を絞り込む
- 発注伝票明細: 特定の発注行の消化状況を調べる場合
- 入荷明細 / 仕入請求伝票明細: 入荷側・請求側から遡る場合
- 品目: 品目単位で照合状況を俯瞰する場合
- 数量と価格差異許容範囲を確認する
価格差異の確認
Section titled “価格差異の確認”- 一覧で「価格差異許容範囲(
PriceMatchDifference)」列を表示する - 値がゼロでない行は、発注単価と請求単価に差が生じています
- 差異が妥当な場合(値引・送料調整など)は「承認済み」にチェックして承認記録を残します
- 差異が誤りの場合は、仕入請求伝票側の単価を修正のうえ再照合します
誤った照合の削除
Section titled “誤った照合の削除”- 対象の照合レコードを選択
- 「削除」ボタン(カラム名
Processing、説明は “Delete PO Matching Record”)を実行 - 元の発注・入荷・請求伝票を修正し、再度照合を成立させます
項目リファレンス
Section titled “項目リファレンス”発注照合伝票タブ(主要項目)
Section titled “発注照合伝票タブ(主要項目)”| 項目名 | 必須 | 型 | 説明 |
|---|---|---|---|
| クライアント | 必須 | 選択 | テナント |
| 組織 | 必須 | 選択 | 組織 |
| 伝票番号 | - | 文字列 | 照合レコードの伝票番号 |
| 取引日付 | 必須 | 日付 | 照合が行われた取引日 |
| 転記日付 | 必須 | 日付 | 会計計上日 |
| 発注伝票明細 | 必須 | 検索 | 照合対象の発注明細 |
| 入荷明細 | 必須 | 検索 | 照合対象の入荷明細 |
| 仕入請求伝票明細 | - | 検索 | 照合対象の請求明細 |
| 品目 | 必須 | 検索 | 照合対象の品目 |
| 属性セットインスタンス | - | 品目属性 | ロット・シリアル等の属性 |
| 数量 | 必須 | 数量 | 照合された数量 |
| 価格差異許容範囲 | - | 金額 | 発注単価と請求単価の差額 |
| 承認済み | - | チェック | 承認が必要な場合のフラグ(既定 N) |
| Referenced Match PO | - | 検索 | 参照元の照合レコード(取消時に使用) |
| 説明 | - | 文字列 | 任意の説明 |
| 処理済み | 必須 | チェック | 処理済みフラグ |
| 転記 | 必須 | ボタン | 転記状態の確認 |
| 削除 | 必須 | ボタン | 照合レコードの削除処理 |
よくある質問(FAQ)
Section titled “よくある質問(FAQ)”Q. 価格差異許容範囲(PriceMatchDifference)とは何ですか?
Section titled “Q. 価格差異許容範囲(PriceMatchDifference)とは何ですか?”照合された明細単位での「発注価格と請求価格の差額」です(項目説明: “Difference between Purchase and Invoice Price per matched line”)。MMatchPO は getInvoicePriceActual() で請求側の実単価を取得でき、発注単価との差が本項目に反映されます。差異が出る典型例は、発注後の値引き交渉や単価改定を請求書だけに反映したケースです。
Q. 入荷だけ登録したのに請求明細が自動でセットされました
Section titled “Q. 入荷だけ登録したのに請求明細が自動でセットされました”MMatchPO.beforeSave() は、新規レコードで請求明細が未設定かつ取消レコードでない場合、同じ入荷明細に紐づく請求照合(M_MatchInv)を走査します。属性セットインスタンスが一致し、かつ数量が完全に一致する照合が見つかると、その請求明細 ID を自動セットします。数量が異なる場合は、その数量に対応する M_MatchPO レコードが別途新規作成されます。
Q. 発注伝票明細を指定していないのに埋まっているのはなぜですか?
Section titled “Q. 発注伝票明細を指定していないのに埋まっているのはなぜですか?”beforeSave() は発注明細が未設定の場合、まず請求明細(C_InvoiceLine.C_OrderLine_ID)から、続いて入荷明細(M_InOutLine.C_OrderLine_ID)から発注明細を逆引きしてセットします。発注を参照して作成した入荷・請求であれば、発注明細は自動的に決まります。
Q. 転記日付はどのように決まりますか?
Section titled “Q. 転記日付はどのように決まりますか?”beforeSave() で、DateTrx が未設定なら当日日時、DateAcct が未設定なら getNewerDateAcct()(関連伝票側の新しい方の転記日付)、それも取得できない場合は DateTrx がセットされます。
Q. 照合を取り消すには?
Section titled “Q. 照合を取り消すには?”画面の「削除」ボタンのほか、モデル側では reverse(Timestamp reversalDate) および reverse(Timestamp, boolean reverseMatchingOnly) が用意されています。取消後は isReversal() が真となり、Ref_MatchPO_ID / Reversal_ID で元レコードとの対応を追跡できます。
Q. 請求照合伝票との使い分けは?
Section titled “Q. 請求照合伝票との使い分けは?”入荷と請求の突合だけを見る場合は請求照合伝票、発注を起点に「発注どおり入荷・請求されたか」を見る場合は発注照合伝票を使用します。MMatchPO.getMatchInvCreated() のように、発注照合の処理過程で請求照合が生成されるケースもあるため、両者はセットで確認するのが確実です。
- 請求照合伝票(Matched Invoices)の使い方
- 発注伝票(Purchase Order)の使い方
- 入荷伝票(Material Receipt)の使い方
- 仕入請求伝票(Purchase Invoice)の使い方
- 画面リファレンス: 発注照合伝票
🛠 技術仕様(開発者向け)
発注照合伝票は M_MatchPO テーブルに格納されます。テーブル説明は “Match Purchase Order to Shipment/Receipt and Invoice”、アクセスレベルは 3(クライアント+組織)、削除可能(IsDeleteable=Y)です。モデルクラスは MMatchPO(1,480行)で、X_M_MatchPO を継承します。Document 型ではありませんが Posted / DateAcct を持つ転記対象レコードです。三者照合ロジックを担うため、購買系モデルの中でも大きなクラスです。
アーキテクチャ概要
Section titled “アーキテクチャ概要”classDiagram
class MMatchPO {
+create(MInvoiceLine, MInOutLine, ...) MMatchPO
+getOrCreate(C_OrderLine_ID, qty, MInOutLine, trxName) MMatchPO
+getOrderLine(ctx, C_OrderLine_ID, trxName) MMatchPO[]
+getInOut(ctx, ...) MMatchPO[]
+getInvoice(ctx, ...) MMatchPO[]
+getInvoicePriceActual() BigDecimal
+getMatchInvCreated() MMatchInv
+getNewerDateAcct() Timestamp
+reverse(Timestamp) boolean
+reverse(Timestamp, boolean) boolean
+isReversal() boolean
#beforeSave(boolean) boolean
#afterSave(boolean, boolean) boolean
}
class X_M_MatchPO {
<<generated>>
}
class PO {
<<abstract>>
}
MMatchPO --|> X_M_MatchPO
X_M_MatchPO --|> PO
MMatchPO --> MOrderLine : matches
MMatchPO --> MInOutLine : matches
MMatchPO --> MInvoiceLine : matches
MMatchPO --> MMatchInv : creates
パッケージ: org.compiere.model
ソースファイル: org.adempiere.base/src/org/compiere/model/MMatchPO.java
関連DBテーブル
Section titled “関連DBテーブル”M_MatchPO(発注照合伝票)
Section titled “M_MatchPO(発注照合伝票)”| カラム名 | 型 | 必須 | 説明 | 備考 |
|---|---|---|---|---|
| M_MatchPO_ID | ID | PK | 照合ID | 主キー |
| AD_Client_ID | Table Direct | Y | クライアント | default @#AD_Client_ID@ |
| AD_Org_ID | Table Direct | Y | 組織 | default @#AD_Org_ID@ |
| DocumentNo | String | N | 伝票番号 | |
| DateTrx | Date | Y | 取引日付 | 未設定時は beforeSave で当日 |
| DateAcct | Date | Y | 転記日付 | 未設定時は getNewerDateAcct() |
| C_OrderLine_ID | Search | Y | 発注伝票明細 | 未設定時は請求/入荷から逆引き |
| M_InOutLine_ID | Search | Y | 入荷明細 | |
| C_InvoiceLine_ID | Search | N | 仕入請求伝票明細 | MatchInv から自動補完あり |
| M_Product_ID | Search | Y | 品目 | |
| M_AttributeSetInstance_ID | Product Attribute | N | 属性セットインスタンス | 入荷明細から自動コピー |
| Qty | Quantity | Y | 数量 | 照合数量 |
| PriceMatchDifference | Amount | N | 価格差異 | 発注価格と請求価格の差 |
| IsApproved | Yes-No | N | 承認済み | default N |
| Ref_MatchPO_ID | Search | N | 参照元照合レコード | 取消用 |
| Reversal_ID | Search | N | 取消ID | |
| Processed | Yes-No | Y | 処理済み | |
| ProcessedOn | Number | N | 処理日時 | |
| Processing | Button | Y | 削除処理ボタン | Delete PO Matching Record |
| Posted | Button | Y | 転記状態 | |
| Description | String | N | 説明 |
erDiagram
C_OrderLine ||--o{ M_MatchPO : "matched by"
M_InOutLine ||--o{ M_MatchPO : "matched by"
C_InvoiceLine ||--o{ M_MatchPO : "matched by"
M_MatchPO ||--o| M_MatchPO : "Ref_MatchPO_ID reversal"
M_MatchPO ||--o| M_MatchInv : "may create"
C_Order ||--o{ C_OrderLine : "lines"
M_InOut ||--o{ M_InOutLine : "lines"
C_Invoice ||--o{ C_InvoiceLine : "lines"
ビジネスロジック
Section titled “ビジネスロジック”beforeSave() の処理フロー
Section titled “beforeSave() の処理フロー”flowchart TD
A[beforeSave] --> B{DateTrx null?}
B -->|Yes| C[当日日時をセット]
B -->|No| D{DateAcct null?}
C --> D
D -->|Yes| E["getNewerDateAcct() → null なら DateTrx"]
D -->|No| F{"ASI=0 かつ 入荷明細あり?"}
E --> F
F -->|Yes| G[入荷明細の ASI をコピー]
F -->|No| H{"新規 かつ 請求明細未設定 かつ 非取消?"}
G --> H
H -->|Yes| I["同一入荷明細の M_MatchInv を走査"]
I --> J{"数量が一致?"}
J -->|Yes| K[請求明細IDをセット]
J -->|No| L["その数量の MMatchPO を別途生成"]
H -->|No| M{"C_OrderLine_ID = 0?"}
K --> M
L --> M
M -->|Yes| N["請求明細 → 入荷明細の順で<br/>発注明細を逆引き"]
M -->|No| O[保存続行]
N --> O
請求照合レコードを走査する際、既に同一組み合わせ(同一入荷明細+同一請求明細)の M_MatchPO が存在する場合はスキップされ、二重照合が防止されます。
変更検知フラグ
Section titled “変更検知フラグ”MMatchPO は m_isInvoiceLineChange / m_isInOutLineChange という protected フラグを持ち、setC_InvoiceLine_ID() / setM_InOutLine_ID() の呼び出しで請求明細・入荷明細が差し替わったかを記録します。afterSave() はこのフラグに応じて関連レコードの再計算・整合処理を分岐させます。
生成ユーティリティ
Section titled “生成ユーティリティ”| メソッド | 用途 |
|---|---|
create(MInvoiceLine, MInOutLine, ...) | 請求明細と入荷明細から照合を生成 |
getOrCreate(C_OrderLine_ID, qty, MInOutLine, trxName) | 既存照合を取得、無ければ生成 |
getOrderLine(ctx, C_OrderLine_ID, trxName) | 発注明細に紐づく照合を取得 |
getInOut(ctx, ...) / getInvoice(ctx, ...) | 入荷伝票/請求伝票単位で取得 |
getMatchInvCreated() | 処理過程で生成された請求照合を取得 |
取消(リバース)
Section titled “取消(リバース)”reverse(Timestamp reversalDate) は照合全体の取消、reverse(Timestamp, boolean reverseMatchingOnly) は照合関係のみの取消に対応します。取消レコードは isReversal() で判定できます。
拡張ポイント(カスタマイズ箇所)
Section titled “拡張ポイント(カスタマイズ箇所)”OSGi Model Validator(推奨)
Section titled “OSGi Model Validator(推奨)”価格差異のしきい値管理は Model Validator で実装するのが定石です。
public class CustomMatchPOValidator implements ModelValidator { @Override public int modelChange(PO po, int type) throws Exception { if (po instanceof MMatchPO && (type == TYPE_BEFORE_NEW || type == TYPE_BEFORE_CHANGE)) { MMatchPO mp = (MMatchPO) po; BigDecimal diff = mp.getPriceMatchDifference(); // 例: 価格差異が一定額を超える場合は承認済みを必須にする if (diff != null && diff.abs().compareTo(new BigDecimal("10000")) > 0 && !mp.isApproved()) { throw new AdempiereException("価格差異が大きいため、承認済みチェックが必要です"); } } return null; }}Callout
Section titled “Callout”M_MatchPO の各カラムには標準の Callout(AD_Column.Callout)が設定されていません。画面上の入力補助が必要な場合は独自 Callout を登録します。
照合生成タイミングの制御
Section titled “照合生成タイミングの制御”照合は入荷・請求の処理経路から生成されるため、生成条件を変えたい場合は M_InOut / C_Invoice の docValidate()(TIMING_AFTER_COMPLETE)でフックします。
関連ドキュメント
Section titled “関連ドキュメント”iDempiereカスタマイズのご相談
Section titled “iDempiereカスタマイズのご相談”発注・入荷・請求の三者照合は、検収基準や価格差異の許容ルールが企業ごとに異なる領域です。 差異のしきい値管理や承認ワークフローとの連携は、Model Validator と OSGi プラグインでコア改変なしに実装できます。
As-Link株式会社では、OSGiプラグインによる安全なカスタマイズを提供しています。