Skip to content

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

This content is not available in your language yet.

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

購買依頼伝票(Requisition)は、現場から「これが必要」という要求を起票し、承認を経て発注伝票に変換するための伝票です。発注伝票を直接作成せず、いったん依頼として集約することで、承認統制と発注のまとめ買い(集約発注)が可能になります。

📌 ポイント: 購買依頼は在庫補充(Replenishment)処理から自動生成することもできます。手起票の依頼と補充由来の依頼を同じ画面で承認・発注化できるのが、この伝票の実務上の価値です。

  • 必要な品目・数量・必要日付の起票
  • 優先度(PriorityRule)による依頼の重み付け
  • 依頼者(AD_User_ID)・倉庫・価格表の指定
  • 品目行と料金行(C_Charge_ID)の混在入力
  • 価格表からの単価自動セットと明細行合計の自動計算
  • 承認(IsApproved)を含む伝票処理(DocAction
  • 「発注伝票作成」プロセスによる発注伝票への変換(複数依頼の集約発注)
  • 依頼明細から生成された発注伝票明細(C_OrderLine)の追跡

購買依頼伝票は 3 タブ構成です。

タブ名テーブル項目数役割
購買依頼伝票M_Requisition18項目ヘッダー(依頼者・必要日付・優先度・倉庫・価格表・伝票処理)
購買依頼伝票明細M_RequisitionLine13項目依頼明細(品目/料金・数量・単価・行合計)
発注伝票明細C_OrderLine24項目依頼から生成された発注伝票明細の照会

💡 ヒント: 3 番目の「発注伝票明細」タブは、依頼が実際にどの発注になったかを追跡するための照会タブです。依頼明細の C_OrderLine_ID を通じて紐付いています。

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

メニューから開く 購買管理 > 購買依頼伝票(標準) ヘッダーを入力 依頼者・必要日付・倉庫・価格表 明細タブで 品目・数量を入力 単価は価格表から自動セット 行合計を自動計算 ▶ 見積依頼プロセス(DocAction) で完了 承認済み? 完了時に暗黙承認 発注伝票作成プロセスを実行 発注伝票が生成 (複数依頼を集約可能) 発注伝票明細タブで 紐付けを確認 在庫補充処理 未承認 承認済

⚠️ 注意: 完了処理の前提として、依頼者・価格表・倉庫がすべて設定されている必要があります。いずれかが未設定の場合、伝票状態は「無効(Invalid)」になります。また明細が 1 行もない場合はエラー(@NoLines@)となります。

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

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

メニューから「購買管理 > 購買依頼伝票(標準)」を開きます。

  1. 新規」ボタンをクリック
  2. ヘッダー必須項目を入力:
    • 伝票タイプC_DocType_ID): 購買依頼の伝票タイプ
    • 伝票番号DocumentNo
    • ユーザーAD_User_ID): 依頼者
    • 優先度PriorityRule): 既定値は「5」(中)
    • 必要日付DateRequired): いつまでに必要か
    • 伝票日付DateDoc): 既定はログイン日付
    • 倉庫M_Warehouse_ID): 納入先倉庫
    • 価格表M_PriceList_ID): 単価取得元
  3. 必要に応じて 説明コメント を入力
  4. 保存」をクリック
  1. 購買依頼伝票明細」タブに移動
  2. 明細を追加:
    • 品目M_Product_IDまたは 料金C_Charge_ID)のいずれか
    • 数量Qty): 既定 1
    • 単価PriceActual): 未入力なら価格表から自動セット
    • 説明
  3. 行合計LineNetAmt)が自動計算されることを確認
  4. ヘッダーの 明細行合計TotalLines)は完了処理時に再集計されます

💡 ヒント: 品目を選択すると料金はクリアされ、料金を選択すると属性セットインスタンスがクリアされます。品目行と料金行は排他であり、どちらも指定しない金額だけの行は登録できません。

M_RequisitionDocStatus / DocAction を持つ Document 型伝票です(既定値は DocStatus=DRDocAction=CO)。

graph LR
    A["起票 Drafted"] --> B["準備 In Progress"]
    B --> C["完了 Completed"]
    C --> D["クローズ Closed"]
    B --> E["無効 Voided"]
    C --> F["再有効化 Re-Activate"]
    F --> A

起票 Drafted 準備 In Progress 完了 Completed クローズ Closed 無効 Voided 再有効化 Re-Activate

アクション挙動
準備(Prepare)必須項目・明細有無・会計期間の検証と金額再集計
承認(Approve)IsApproved を Y にセット
却下(Reject)IsApproved を N にセット
完了(Complete)未承認なら暗黙的に承認し、処理済みにして次アクションをクローズに設定
無効(Void) / クローズ(Close)依頼を締め切る
再有効化(Re-Activate)完了済み伝票を編集可能な状態に戻す
  1. 完了済みの購買依頼を対象に「発注伝票作成(Create PO from Requisition)」プロセスを実行
  2. 条件に合致する依頼明細から発注伝票が生成される
  3. 生成された発注は「発注伝票明細」タブから確認できる

📌 ポイント: 複数の購買依頼をまとめて 1 本の発注に集約できます(ウィンドウ説明の “optionally consolidated Purchase Orders”)。仕入先ごとにまとめることで発注回数を削減できます。

項目名必須説明
伝票タイプ必須選択購買依頼の伝票タイプ
伝票番号必須文字列伝票の採番
ユーザー必須選択依頼者
優先度必須リスト依頼の優先度(既定 5)
必要日付必須日付必要とする日付
伝票日付必須日付起票日(既定: ログイン日付)
倉庫必須選択納入先倉庫
価格表必須選択単価取得元の価格表
承認済み必須チェック承認フラグ
明細行合計必須金額明細の合計(完了時に再計算)
伝票状態必須リスト伝票のステータス(既定 DR)
見積依頼プロセス必須ボタン伝票アクション(既定 CO)
説明 / コメント-文字列任意の補足
処理済み必須チェック処理済みフラグ
転記必須ボタン転記状態
項目名必須説明
明細番号必須整数行番号(既定: 最大値+10)
品目-検索依頼する品目
料金-選択品目を使わない場合の料金
数量単位-検索単位(品目から自動セット)
数量必須数量依頼数量(既定 1)
単価必須単価価格表から自動セット
行合計必須金額数量×単価(自動計算)
取引先-検索希望仕入先
発注伝票明細-検索生成された発注明細へのリンク
説明-文字列任意の説明

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

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)で定義します。

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

購買依頼伝票は M_Requisition(“Material Requisition”)と M_RequisitionLine(“Material Requisition Line”)に格納されます。いずれもアクセスレベル 1(組織)です。モデルクラスは MRequisition(624行、DocAction 実装)と MRequisitionLine(363行)です。3 番目のタブは既存の C_OrderLine を参照する照会タブで、専用テーブルはありません。

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

+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 <> +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 <> <> > X_M_Requisition MRequisition ..

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

カラム名必須説明備考(default・callout)
M_Requisition_IDIDPK依頼ID主キー
AD_Client_IDTable DirectYクライアントdefault @#AD_Client_ID@
AD_Org_IDTable DirectY組織default @#AD_Org_ID@ / callout CalloutOrder.organization
C_DocType_IDTable DirectY伝票タイプ
DocumentNoStringY伝票番号更新不可
AD_User_IDTable DirectY依頼者prepareIt の必須条件
PriorityRuleListY優先度default 5
DateRequiredDateY必要日付
DateDocDateY伝票日付default @#Date@ / callout CalloutEngine.checkPeriodOpen
M_Warehouse_IDTable DirectY倉庫prepareIt の必須条件
M_PriceList_IDTable DirectY価格表prepareIt の必須条件
IsApprovedYes-NoY承認済み
TotalLinesAmountY明細行合計prepareIt で再集計
DocStatusListY伝票状態default DR
DocActionButtonY伝票アクションdefault CO
ProcessedYes-NoY処理済み
ProcessedOnNumberN処理日時
PostedButtonY転記状態
Description / HelpStringN説明・コメント

M_RequisitionLine(購買依頼伝票明細)

Section titled “M_RequisitionLine(購買依頼伝票明細)”
カラム名必須説明備考(default・callout)
M_RequisitionLine_IDIDPK明細ID主キー
M_Requisition_IDSearchY依頼FK
LineIntegerY明細番号default @SQL=SELECT COALESCE(MAX(Line),0)+10 ...
M_Product_IDSearchN品目callout CalloutRequisition.product
C_Charge_IDTable DirectN料金品目指定時は 0 にクリア
M_AttributeSetInstance_IDProduct AttributeN属性セットインスタンス料金行では 0 にクリア
C_UOM_IDSearchN数量単位未設定時は品目の単位
QtyQuantityY数量default 1 / callout CalloutRequisition.amt
PriceActualCosts+PricesY単価callout CalloutRequisition.amt
LineNetAmtAmountY行合計setLineNetAmt() で計算
C_BPartner_IDSearchN取引先希望仕入先
C_OrderLine_IDSearchN発注伝票明細生成された発注へのリンク
DescriptionStringN説明
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"

converted to deliver to doc type

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"]

fireDocValidate TIMING_BEFORE_PREPARE AD_User_ID / M_PriceList_ID / M_Warehouse_ID が 0? STATUS_Invalid を返す 明細 0 件? AdempiereException @NoLines@ MPeriod.testPeriodOpen DOCBASETYPE_PurchaseRequisition 各明細 LineNetAmt = Qty × PriceActual 価格表精度で HALF_UP 合計を TotalLines に反映 fireDocValidate TIMING_AFTER_PREPARE

  1. 準備が未実行なら prepareIt() を再実行し、InProgress でなければその状態を返す
  2. setDefiniteDocumentNo() を実行(伝票タイプが IsOverwriteDateOnComplete の場合は伝票日付を当日に更新して期間を再検証、IsOverwriteSeqOnComplete の場合は採番を再取得)
  3. TIMING_BEFORE_COMPLETE のバリデーション
  4. IsApproved が false なら approveIt() を暗黙実行
  5. TIMING_AFTER_COMPLETE のバリデーション
  6. Processed = trueDocAction = Close をセットし STATUS_Completed を返す

MRequisitionLine.beforeSave() の主要チェック

Section titled “MRequisitionLine.beforeSave() の主要チェック”
  1. 親伝票の処理済み判定: 新規行かつ親が処理済みなら “ParentComplete” で保存中止
  2. 明細番号の自動採番: SELECT COALESCE(MAX(Line),0)+10 で採番
  3. 品目行と料金行の排他: 品目指定時は C_Charge_ID = 0、料金指定時は M_AttributeSetInstance_ID = 0
  4. 単位の既定化: 品目指定かつ単位未設定なら品目の C_UOM_ID をセット
  5. 単価の自動セット: PriceActual がゼロなら setPrice() で価格表から取得
  6. 行合計の計算: setLineNetAmt() を実行
  7. 品目・料金なしの金額行を禁止(IDEMPIERE-178 対応)

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 “拡張ポイント(カスタマイズ箇所)”

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
M_RequisitionAD_Org_IDorg.compiere.model.CalloutOrder.organization
M_RequisitionDateDocorg.compiere.model.CalloutEngine.checkPeriodOpen
M_RequisitionLineM_Product_IDorg.compiere.model.CalloutRequisition.product
M_RequisitionLineQtyorg.compiere.model.CalloutRequisition.amt
M_RequisitionLinePriceActualorg.compiere.model.CalloutRequisition.amt

単価取得ロジックを変更する場合は CalloutRequisition.amt の差し替えに加え、サーバ側の MRequisitionLine.setPrice() にも同等の制御を入れる必要があります(画面外からの登録に備えるため)。

MRequisitiongetApprovalAmt() / getDoc_User_ID() を実装しており、承認金額と承認者に基づく標準の伝票ワークフローに組み込めます。

プロセス名説明
Process Requisition購買依頼の伝票処理を実行
Create PO from Requisition購買依頼から発注伝票を作成(集約可)
Open Requisitions未消化の購買依頼を一覧するレポート

購買依頼は、承認ルート・予算チェック・発注集約ルールなど、企業ごとの統制要件が最も色濃く出る領域です。 金額しきい値による多段承認や部門予算との突合は、Model Validator とワークフローの組み合わせでコア改変なしに実装できます。

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

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