iDempiere 購買依頼伝票の使い方|購買管理 操作マニュアル・技術仕様
This content is not available in your language yet.
📖 購買管理の全体像: 購買管理の全体図 も合わせてご覧ください。
購買依頼伝票(Requisition)は、現場から「これが必要」という要求を起票し、承認を経て発注伝票に変換するための伝票です。発注伝票を直接作成せず、いったん依頼として集約することで、承認統制と発注のまとめ買い(集約発注)が可能になります。
📌 ポイント: 購買依頼は在庫補充(Replenishment)処理から自動生成することもできます。手起票の依頼と補充由来の依頼を同じ画面で承認・発注化できるのが、この伝票の実務上の価値です。
購買依頼伝票でできること
Section titled “購買依頼伝票でできること”- 必要な品目・数量・必要日付の起票
- 優先度(
PriorityRule)による依頼の重み付け - 依頼者(
AD_User_ID)・倉庫・価格表の指定 - 品目行と料金行(
C_Charge_ID)の混在入力 - 価格表からの単価自動セットと明細行合計の自動計算
- 承認(
IsApproved)を含む伝票処理(DocAction) - 「発注伝票作成」プロセスによる発注伝票への変換(複数依頼の集約発注)
- 依頼明細から生成された発注伝票明細(
C_OrderLine)の追跡
購買依頼伝票は 3 タブ構成です。
| タブ名 | テーブル | 項目数 | 役割 |
|---|---|---|---|
| 購買依頼伝票 | M_Requisition | 18項目 | ヘッダー(依頼者・必要日付・優先度・倉庫・価格表・伝票処理) |
| 購買依頼伝票明細 | M_RequisitionLine | 13項目 | 依頼明細(品目/料金・数量・単価・行合計) |
| 発注伝票明細 | C_OrderLine | 24項目 | 依頼から生成された発注伝票明細の照会 |
💡 ヒント: 3 番目の「発注伝票明細」タブは、依頼が実際にどの発注になったかを追跡するための照会タブです。依頼明細の
C_OrderLine_IDを通じて紐付いています。
基本操作手順
Section titled “基本操作手順”graph TD
A["🚀 メニューから開く<br/>購買管理 > 購買依頼伝票(標準)"] --> B["➕ ヘッダーを入力<br/>依頼者・必要日付・倉庫・価格表"]
B --> C["📋 明細タブで<br/>品目・数量を入力"]
C --> D["💴 単価は価格表から自動セット<br/>行合計を自動計算"]
D --> E["▶ 見積依頼プロセス(DocAction)<br/>で完了"]
E --> F{"承認済み?"}
F -->|未承認| G["✅ 完了時に暗黙承認"]
F -->|承認済| H["📦 発注伝票作成プロセスを実行"]
G --> H
H --> I["🧾 発注伝票が生成<br/>(複数依頼を集約可能)"]
I --> J["🔍 発注伝票明細タブで<br/>紐付けを確認"]
K["🔄 在庫補充処理"] --> C
⚠️ 注意: 完了処理の前提として、依頼者・価格表・倉庫がすべて設定されている必要があります。いずれかが未設定の場合、伝票状態は「無効(Invalid)」になります。また明細が 1 行もない場合はエラー(
@NoLines@)となります。
アクセス方法(メニューパス)
Section titled “アクセス方法(メニューパス)”メニューから「購買管理 > 購買依頼伝票(標準)」を開きます。
新規登録(必須項目ベース)
Section titled “新規登録(必須項目ベース)”- 「新規」ボタンをクリック
- ヘッダー必須項目を入力:
- 伝票タイプ(
C_DocType_ID): 購買依頼の伝票タイプ - 伝票番号(
DocumentNo) - ユーザー(
AD_User_ID): 依頼者 - 優先度(
PriorityRule): 既定値は「5」(中) - 必要日付(
DateRequired): いつまでに必要か - 伝票日付(
DateDoc): 既定はログイン日付 - 倉庫(
M_Warehouse_ID): 納入先倉庫 - 価格表(
M_PriceList_ID): 単価取得元
- 伝票タイプ(
- 必要に応じて 説明・コメント を入力
- 「保存」をクリック
- 「購買依頼伝票明細」タブに移動
- 明細を追加:
- 品目(
M_Product_ID)または 料金(C_Charge_ID)のいずれか - 数量(
Qty): 既定 1 - 単価(
PriceActual): 未入力なら価格表から自動セット - 説明
- 品目(
- 行合計(
LineNetAmt)が自動計算されることを確認 - ヘッダーの 明細行合計(
TotalLines)は完了処理時に再集計されます
💡 ヒント: 品目を選択すると料金はクリアされ、料金を選択すると属性セットインスタンスがクリアされます。品目行と料金行は排他であり、どちらも指定しない金額だけの行は登録できません。
M_Requisition は DocStatus / DocAction を持つ Document 型伝票です(既定値は DocStatus=DR、DocAction=CO)。
graph LR
A["起票 Drafted"] --> B["準備 In Progress"]
B --> C["完了 Completed"]
C --> D["クローズ Closed"]
B --> E["無効 Voided"]
C --> F["再有効化 Re-Activate"]
F --> A
| アクション | 挙動 |
|---|---|
| 準備(Prepare) | 必須項目・明細有無・会計期間の検証と金額再集計 |
| 承認(Approve) | IsApproved を Y にセット |
| 却下(Reject) | IsApproved を N にセット |
| 完了(Complete) | 未承認なら暗黙的に承認し、処理済みにして次アクションをクローズに設定 |
| 無効(Void) / クローズ(Close) | 依頼を締め切る |
| 再有効化(Re-Activate) | 完了済み伝票を編集可能な状態に戻す |
発注伝票への変換
Section titled “発注伝票への変換”- 完了済みの購買依頼を対象に「発注伝票作成(Create PO from Requisition)」プロセスを実行
- 条件に合致する依頼明細から発注伝票が生成される
- 生成された発注は「発注伝票明細」タブから確認できる
📌 ポイント: 複数の購買依頼をまとめて 1 本の発注に集約できます(ウィンドウ説明の “optionally consolidated Purchase Orders”)。仕入先ごとにまとめることで発注回数を削減できます。
項目リファレンス
Section titled “項目リファレンス”購買依頼伝票タブ
Section titled “購買依頼伝票タブ”| 項目名 | 必須 | 型 | 説明 |
|---|---|---|---|
| 伝票タイプ | 必須 | 選択 | 購買依頼の伝票タイプ |
| 伝票番号 | 必須 | 文字列 | 伝票の採番 |
| ユーザー | 必須 | 選択 | 依頼者 |
| 優先度 | 必須 | リスト | 依頼の優先度(既定 5) |
| 必要日付 | 必須 | 日付 | 必要とする日付 |
| 伝票日付 | 必須 | 日付 | 起票日(既定: ログイン日付) |
| 倉庫 | 必須 | 選択 | 納入先倉庫 |
| 価格表 | 必須 | 選択 | 単価取得元の価格表 |
| 承認済み | 必須 | チェック | 承認フラグ |
| 明細行合計 | 必須 | 金額 | 明細の合計(完了時に再計算) |
| 伝票状態 | 必須 | リスト | 伝票のステータス(既定 DR) |
| 見積依頼プロセス | 必須 | ボタン | 伝票アクション(既定 CO) |
| 説明 / コメント | - | 文字列 | 任意の補足 |
| 処理済み | 必須 | チェック | 処理済みフラグ |
| 転記 | 必須 | ボタン | 転記状態 |
購買依頼伝票明細タブ
Section titled “購買依頼伝票明細タブ”| 項目名 | 必須 | 型 | 説明 |
|---|---|---|---|
| 明細番号 | 必須 | 整数 | 行番号(既定: 最大値+10) |
| 品目 | - | 検索 | 依頼する品目 |
| 料金 | - | 選択 | 品目を使わない場合の料金 |
| 数量単位 | - | 検索 | 単位(品目から自動セット) |
| 数量 | 必須 | 数量 | 依頼数量(既定 1) |
| 単価 | 必須 | 単価 | 価格表から自動セット |
| 行合計 | 必須 | 金額 | 数量×単価(自動計算) |
| 取引先 | - | 検索 | 希望仕入先 |
| 発注伝票明細 | - | 検索 | 生成された発注明細へのリンク |
| 説明 | - | 文字列 | 任意の説明 |
よくある質問(FAQ)
Section titled “よくある質問(FAQ)”Q. 完了しようとすると「無効(Invalid)」になります
Section titled “Q. 完了しようとすると「無効(Invalid)」になります”MRequisition.prepareIt() は、依頼者(AD_User_ID)・価格表(M_PriceList_ID)・倉庫(M_Warehouse_ID)のいずれかが未設定の場合に STATUS_Invalid を返します。3 項目がすべて設定されているか確認してください。
Q. 「@NoLines@」というエラーが出ます
Section titled “Q. 「@NoLines@」というエラーが出ます”明細が 1 行もない状態で完了しようとしています。prepareIt() は明細ゼロ件で AdempiereException("@NoLines@") を送出します。
Q. 会計期間が閉じているとどうなりますか?
Section titled “Q. 会計期間が閉じているとどうなりますか?”prepareIt() の中で MPeriod.testPeriodOpen() が伝票日付・伝票基本タイプ「購買依頼(PurchaseRequisition)」・組織を引数に実行されます。該当期間が閉じている場合は準備処理でエラーになります。
Q. 明細行合計が入力値と違います
Section titled “Q. 明細行合計が入力値と違います”prepareIt() は明細ごとに 数量 × 単価 を再計算し、価格表の標準精度(MPriceList.getStandardPrecision())で四捨五入(HALF_UP)します。計算結果が保存値と異なる場合は明細を更新し、その合計をヘッダーの TotalLines に反映します。手入力した行合計は、完了処理で再計算値に置き換わります。
Q. 完了済みの依頼に明細を追加できません
Section titled “Q. 完了済みの依頼に明細を追加できません”MRequisitionLine.beforeSave() が、新規明細の追加時に親伝票の処理済み状態を確認し、処理済みなら “ParentComplete” エラーで保存を中止します。追加が必要な場合は再有効化(Re-Activate)してから編集してください。
Q. 承認を通さずに完了できてしまいます
Section titled “Q. 承認を通さずに完了できてしまいます”completeIt() は、IsApproved が未設定の場合に暗黙的に approveIt() を呼び出します。承認を必須の統制にしたい場合は、ワークフローまたは Model Validator(TIMING_BEFORE_COMPLETE)で承認済みチェックを追加してください。
Q. 在庫補充から自動で依頼を作れますか?
Section titled “Q. 在庫補充から自動で依頼を作れますか?”作れます。ウィンドウ説明にあるとおり、購買依頼は補充処理(Replenishment)経由で自動生成できます。補充ルールは品目マスタの補充タブ(M_Replenish)で定義します。
- 発注伝票(Purchase Order)の使い方
- 入荷伝票(Material Receipt)の使い方
- 見積依頼伝票(RfQ)の使い方
- 品目マスタ(Product)の使い方
- 倉庫・ロケーターの使い方
- 価格表(Price List)の使い方
- 画面リファレンス: 購買依頼伝票(標準)
🛠 技術仕様(開発者向け)
購買依頼伝票は M_Requisition(“Material Requisition”)と M_RequisitionLine(“Material Requisition Line”)に格納されます。いずれもアクセスレベル 1(組織)です。モデルクラスは MRequisition(624行、DocAction 実装)と MRequisitionLine(363行)です。3 番目のタブは既存の C_OrderLine を参照する照会タブで、専用テーブルはありません。
アーキテクチャ概要
Section titled “アーキテクチャ概要”classDiagram
class MRequisition {
+prepareIt() String
+completeIt() String
+approveIt() boolean
+rejectIt() boolean
+voidIt() boolean
+closeIt() boolean
+reverseCorrectIt() boolean
+reverseAccrualIt() boolean
+reActivateIt() boolean
+getLines() MRequisitionLine[]
+setM_PriceList_ID() void
+getApprovalAmt() BigDecimal
+createPDF() File
}
class DocAction {
<<interface>>
}
class MRequisitionLine {
+setPrice() void
+setPrice(int M_PriceList_ID) void
+setLineNetAmt() void
+getQtyOrdered() BigDecimal
+forC_Order_ID(ctx, C_Order_ID, trxName) MRequisitionLine[]
+unlinkC_OrderLine_ID(ctx, C_OrderLine_ID, trxName) void
}
class X_M_Requisition {
<<generated>>
}
class PO {
<<abstract>>
}
MRequisition --|> X_M_Requisition
MRequisition ..|> DocAction
X_M_Requisition --|> PO
MRequisition --> MRequisitionLine : has many
MRequisitionLine --> MOrderLine : generates
パッケージ: org.compiere.model
ソースファイル: org.adempiere.base/src/org/compiere/model/MRequisition.java / MRequisitionLine.java
関連DBテーブル
Section titled “関連DBテーブル”M_Requisition(購買依頼伝票)
Section titled “M_Requisition(購買依頼伝票)”| カラム名 | 型 | 必須 | 説明 | 備考(default・callout) |
|---|---|---|---|---|
| M_Requisition_ID | ID | PK | 依頼ID | 主キー |
| AD_Client_ID | Table Direct | Y | クライアント | default @#AD_Client_ID@ |
| AD_Org_ID | Table Direct | Y | 組織 | default @#AD_Org_ID@ / callout CalloutOrder.organization |
| C_DocType_ID | Table Direct | Y | 伝票タイプ | |
| DocumentNo | String | Y | 伝票番号 | 更新不可 |
| AD_User_ID | Table Direct | Y | 依頼者 | prepareIt の必須条件 |
| PriorityRule | List | Y | 優先度 | default 5 |
| DateRequired | Date | Y | 必要日付 | |
| DateDoc | Date | Y | 伝票日付 | default @#Date@ / callout CalloutEngine.checkPeriodOpen |
| M_Warehouse_ID | Table Direct | Y | 倉庫 | prepareIt の必須条件 |
| M_PriceList_ID | Table Direct | Y | 価格表 | prepareIt の必須条件 |
| IsApproved | Yes-No | Y | 承認済み | |
| TotalLines | Amount | Y | 明細行合計 | prepareIt で再集計 |
| DocStatus | List | Y | 伝票状態 | default DR |
| DocAction | Button | Y | 伝票アクション | default CO |
| Processed | Yes-No | Y | 処理済み | |
| ProcessedOn | Number | N | 処理日時 | |
| Posted | Button | Y | 転記状態 | |
| Description / Help | String | N | 説明・コメント |
M_RequisitionLine(購買依頼伝票明細)
Section titled “M_RequisitionLine(購買依頼伝票明細)”| カラム名 | 型 | 必須 | 説明 | 備考(default・callout) |
|---|---|---|---|---|
| M_RequisitionLine_ID | ID | PK | 明細ID | 主キー |
| M_Requisition_ID | Search | Y | 依頼FK | |
| Line | Integer | Y | 明細番号 | default @SQL=SELECT COALESCE(MAX(Line),0)+10 ... |
| M_Product_ID | Search | N | 品目 | callout CalloutRequisition.product |
| C_Charge_ID | Table Direct | N | 料金 | 品目指定時は 0 にクリア |
| M_AttributeSetInstance_ID | Product Attribute | N | 属性セットインスタンス | 料金行では 0 にクリア |
| C_UOM_ID | Search | N | 数量単位 | 未設定時は品目の単位 |
| Qty | Quantity | Y | 数量 | default 1 / callout CalloutRequisition.amt |
| PriceActual | Costs+Prices | Y | 単価 | callout CalloutRequisition.amt |
| LineNetAmt | Amount | Y | 行合計 | setLineNetAmt() で計算 |
| C_BPartner_ID | Search | N | 取引先 | 希望仕入先 |
| C_OrderLine_ID | Search | N | 発注伝票明細 | 生成された発注へのリンク |
| Description | String | N | 説明 |
erDiagram
M_Requisition ||--o{ M_RequisitionLine : "lines"
M_RequisitionLine }o--o| M_Product : "product"
M_RequisitionLine }o--o| C_Charge : "charge"
M_RequisitionLine }o--o| C_OrderLine : "converted to"
M_Requisition }o--|| M_Warehouse : "deliver to"
M_Requisition }o--|| M_PriceList : "pricing"
M_Requisition }o--|| C_DocType : "doc type"
C_Order ||--o{ C_OrderLine : "lines"
ビジネスロジック
Section titled “ビジネスロジック”prepareIt() の処理フロー
Section titled “prepareIt() の処理フロー”flowchart TD
A[prepareIt] --> B["fireDocValidate<br/>TIMING_BEFORE_PREPARE"]
B --> C{"AD_User_ID / M_PriceList_ID<br/>/ M_Warehouse_ID が 0?"}
C -->|Yes| D["STATUS_Invalid を返す"]
C -->|No| E{"明細 0 件?"}
E -->|Yes| F["AdempiereException @NoLines@"]
E -->|No| G["MPeriod.testPeriodOpen<br/>DOCBASETYPE_PurchaseRequisition"]
G --> H["各明細 LineNetAmt = Qty × PriceActual<br/>価格表精度で HALF_UP"]
H --> I["合計を TotalLines に反映"]
I --> J["fireDocValidate<br/>TIMING_AFTER_PREPARE"]
J --> K["STATUS_InProgress"]
completeIt() の処理
Section titled “completeIt() の処理”- 準備が未実行なら
prepareIt()を再実行し、InProgressでなければその状態を返す setDefiniteDocumentNo()を実行(伝票タイプがIsOverwriteDateOnCompleteの場合は伝票日付を当日に更新して期間を再検証、IsOverwriteSeqOnCompleteの場合は採番を再取得)TIMING_BEFORE_COMPLETEのバリデーションIsApprovedが false ならapproveIt()を暗黙実行TIMING_AFTER_COMPLETEのバリデーションProcessed = true、DocAction = CloseをセットしSTATUS_Completedを返す
MRequisitionLine.beforeSave() の主要チェック
Section titled “MRequisitionLine.beforeSave() の主要チェック”- 親伝票の処理済み判定: 新規行かつ親が処理済みなら “ParentComplete” で保存中止
- 明細番号の自動採番:
SELECT COALESCE(MAX(Line),0)+10で採番 - 品目行と料金行の排他: 品目指定時は
C_Charge_ID = 0、料金指定時はM_AttributeSetInstance_ID = 0 - 単位の既定化: 品目指定かつ単位未設定なら品目の
C_UOM_IDをセット - 単価の自動セット:
PriceActualがゼロならsetPrice()で価格表から取得 - 行合計の計算:
setLineNetAmt()を実行 - 品目・料金なしの金額行を禁止(IDEMPIERE-178 対応)
発注伝票とのリンク管理
Section titled “発注伝票とのリンク管理”MRequisitionLine は発注との紐付けを操作する静的メソッドを備えています。
| メソッド | 用途 |
|---|---|
forC_Order_ID(ctx, C_Order_ID, trxName) | 発注伝票に紐づく依頼明細を取得 |
forC_OrderLine_ID(ctx, C_OrderLine_ID, trxName) | 発注明細に紐づく依頼明細を取得 |
unlinkC_Order_ID(ctx, C_Order_ID, trxName) | 発注伝票との紐付けを解除 |
unlinkC_OrderLine_ID(ctx, C_OrderLine_ID, trxName) | 発注明細との紐付けを解除 |
getQtyOrdered() | 発注済み数量を取得 |
発注伝票を取り消した際に依頼側の紐付けを外すのは、これらの unlink 系メソッドの役割です。
拡張ポイント(カスタマイズ箇所)
Section titled “拡張ポイント(カスタマイズ箇所)”OSGi Model Validator(推奨)
Section titled “OSGi Model Validator(推奨)”Document 型のため docValidate() が利用できます。承認統制の強化に最適です。
public class CustomRequisitionValidator implements ModelValidator { @Override public String docValidate(PO po, int timing) { if (po instanceof MRequisition && timing == TIMING_BEFORE_COMPLETE) { MRequisition req = (MRequisition) po; // 例: 一定金額以上の依頼は明示的な承認を必須にする if (req.getTotalLines().compareTo(new BigDecimal("500000")) > 0 && !req.isApproved()) { return "50万円以上の購買依頼は事前承認が必要です"; } } return null; }}Callout(このテーブル固有)
Section titled “Callout(このテーブル固有)”| テーブル | カラム | Callout |
|---|---|---|
| M_Requisition | AD_Org_ID | org.compiere.model.CalloutOrder.organization |
| M_Requisition | DateDoc | org.compiere.model.CalloutEngine.checkPeriodOpen |
| M_RequisitionLine | M_Product_ID | org.compiere.model.CalloutRequisition.product |
| M_RequisitionLine | Qty | org.compiere.model.CalloutRequisition.amt |
| M_RequisitionLine | PriceActual | org.compiere.model.CalloutRequisition.amt |
単価取得ロジックを変更する場合は CalloutRequisition.amt の差し替えに加え、サーバ側の MRequisitionLine.setPrice() にも同等の制御を入れる必要があります(画面外からの登録に備えるため)。
承認ワークフロー
Section titled “承認ワークフロー”MRequisition は getApprovalAmt() / getDoc_User_ID() を実装しており、承認金額と承認者に基づく標準の伝票ワークフローに組み込めます。
関連プロセス
Section titled “関連プロセス”| プロセス名 | 説明 |
|---|---|
| Process Requisition | 購買依頼の伝票処理を実行 |
| Create PO from Requisition | 購買依頼から発注伝票を作成(集約可) |
| Open Requisitions | 未消化の購買依頼を一覧するレポート |
関連ドキュメント
Section titled “関連ドキュメント”iDempiereカスタマイズのご相談
Section titled “iDempiereカスタマイズのご相談”購買依頼は、承認ルート・予算チェック・発注集約ルールなど、企業ごとの統制要件が最も色濃く出る領域です。 金額しきい値による多段承認や部門予算との突合は、Model Validator とワークフローの組み合わせでコア改変なしに実装できます。
As-Link株式会社では、OSGiプラグインによる安全なカスタマイズを提供しています。