コンテンツにスキップ

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

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

見積回答伝票(RfQ Response)は、見積依頼(RfQ)に対する仕入先 1 社ごとの回答を保持する伝票です。見積依頼伝票の「見積回答要求及び見積回答伝票作成」処理で依頼先の数だけ自動生成され、そこに各社の価格・納期を入力して比較します。

📌 ポイント: 回答は入力しただけでは評価対象になりません。「見積回答伝票を完成にする」ボタン(CheckComplete)で完成(IsComplete)にした回答だけが、ランク付けと採用の対象になります。

  • 仕入先ごとの見積回答(価格・納期)の登録
  • 見積依頼の明細・数量段階に対応した回答価格・割引率の入力
  • 完成チェック(CheckComplete)による回答内容の妥当性検証
  • 招待日(DateInvited)・回答日付(DateResponse)の記録
  • 見積回答の依頼メール送信(Processing
  • ランキング(Ranking)による回答の順位付け
  • 採用見積(IsSelectedWinner)の選定(伝票単位・明細単位)
  • 採用結果から生成された発注伝票(C_Order_ID)の追跡

見積回答伝票は 3 階層のタブ構成で、見積依頼伝票と 1 対 1 で対応します。

タブ名テーブル項目数役割
見積回答伝票C_RfQResponse25項目回答ヘッダー(仕入先・総額・納期・完成/採用フラグ)
見積回答伝票明細C_RfQResponseLine12項目見積依頼明細に対応した回答(納期・採用フラグ)
見積回答伝票明細価格C_RfQResponseLineQty8項目数量段階ごとの価格・割引率・ランキング
graph TD
    subgraph "見積依頼側"
        A1["C_RfQ<br/>見積依頼伝票"]
        A2["C_RfQLine<br/>明細"]
        A3["C_RfQLineQty<br/>数量"]
    end
    subgraph "見積回答側"
        B1["C_RfQResponse<br/>見積回答伝票"]
        B2["C_RfQResponseLine<br/>明細"]
        B3["C_RfQResponseLineQty<br/>明細価格"]
    end
    A1 --> A2
    A2 --> A3
    B1 --> B2
    B2 --> B3
    A1 -.仕入先ごとに生成.-> B1
    A2 -.対応.-> B2
    A3 -.対応.-> B3

見積依頼側 C_RfQ 見積依頼伝票 C_RfQLine 明細 C_RfQLineQty 数量 見積回答側 C_RfQResponse 見積回答伝票 C_RfQResponseLine 明細 C_RfQResponseLineQty 明細価格

💡 ヒント: 回答の各階層は、見積依頼側の各階層を必ず参照します(C_RfQ_ID / C_RfQLine_ID / C_RfQLineQty_ID)。したがって、回答を手作業で一から作るのではなく、見積依頼伝票側から生成するのが正しい運用です。

graph TD
    A["📄 見積依頼伝票で<br/>見積回答要求及び<br/>見積回答伝票作成を実行"] --> B["📧 仕入先へ招待メール<br/>招待日が記録される"]
    B --> C["🚀 メニューから開く<br/>購買管理 > 見積回答伝票"]
    C --> D["💴 明細価格タブで<br/>価格・割引率を入力"]
    D --> E["📅 納期(作業日程)を入力"]
    E --> F["✅ 見積回答伝票を完成にする<br/>CheckComplete"]
    F --> G{"検証OK?"}
    G -->|NG| H["⚠️ エラー内容に従い<br/>価格・有効フラグを修正"]
    H --> F
    G -->|OK| I["🏁 完成 IsComplete = Y"]
    I --> J["🏅 見積依頼伝票側で<br/>ランク付けを実行"]
    J --> K["🥇 採用見積にチェック"]
    K --> L["🧾 発注伝票作成"]

見積依頼伝票で 見積回答要求及び 見積回答伝票作成を実行 仕入先へ招待メール 招待日が記録される メニューから開く 購買管理 > 見積回答伝票 明細価格タブで 価格・割引率を入力 納期(作業日程)を入力 見積回答伝票を完成にする CheckComplete 検証OK? エラー内容に従い 価格・有効フラグを修正 完成 IsComplete = Y 見積依頼伝票側で ランク付けを実行 採用見積にチェック 発注伝票作成

⚠️ 注意: 完成チェックは「完成にする」だけでなく「いったん完成フラグを外してから再検証する」動作です。検証に失敗した場合、回答は未完成のまま残ります。

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

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

メニューから「購買管理 > 見積回答伝票」を開きます。

  1. 対象の見積回答伝票を開く(見積依頼伝票から生成済み)
  2. ヘッダーを確認・入力:
    • 見積依頼伝票C_RfQ_ID) / 名称Name): 生成時に自動セット
    • 取引先C_BPartner_ID) / 取引先住所C_BPartner_Location_ID) / ユーザー
    • 通貨C_Currency_ID
    • 価格Price): 総額回答の場合に入力(必須項目)
    • 回答日付DateResponse
    • 作業開始(予定)日 / 納品(予定)日数 / 作業完了(予定)日
  3. 見積回答伝票明細」タブで明細ごとの納期・条件を確認
  4. 見積回答伝票明細価格」タブで数量段階ごとに入力:
    • 価格Price): 必須
    • 割引 %Discount): 任意(絶対値 100 以内)
  5. 保存」をクリック
  1. ヘッダーの「見積回答伝票を完成にする」ボタン(CheckComplete)を実行
  2. 見積依頼側の設定に応じて次の検証が行われます
    • 見積タイプが「総額のみ」の場合、依頼側の数量が 1 明細 1 件になっているか
    • 「見積総額」または「総額のみ」の場合、価格(Price)が 0 より大きいか
    • 「すべての明細に回答」の場合、各明細に有効かつ正の金額の数量回答が 1 つ以上あるか
    • 「見積総量」の場合、すべての数量回答が有効かつ正の金額であるか
  3. すべて満たすと 完成IsComplete = Y)になります
項目・ボタンカラム役割
見積回答の依頼をメール送信するProcessing仕入先へ回答依頼メールを送信
見積回答伝票を完成にするCheckComplete回答内容を検証し完成にする
完成IsComplete完成状態のフラグ
ランキングRanking順位(ランク付け処理で更新)
採用見積IsSelectedWinner採用した回答(伝票・明細の両方にあり)
発注伝票C_Order_ID採用結果から生成された発注伝票

📌 ポイント: 採用見積(IsSelectedWinner)はヘッダーと明細の両方にあります。明細単位で仕入先を分ける(品目 A は X 社、品目 B は Y 社)といった分割発注が可能です。

見積回答伝票タブ(主要項目)

Section titled “見積回答伝票タブ(主要項目)”
項目名必須説明
見積依頼伝票必須検索対応する見積依頼
名称必須文字列回答の名称
取引先必須検索回答した仕入先
取引先住所必須選択仕入先住所
ユーザー-選択仕入先担当者
通貨必須選択回答通貨
価格必須単価総額回答の金額
招待日-日付最後に招待を送信した日
回答日付-日付回答を受領した日
作業開始(予定)日-日付作業開始予定
納品(予定)日数-整数納品までの日数
作業完了(予定)日-日付作業完了予定
ランキング-整数相対順位
採用見積必須チェック採用した回答か
完成必須チェック完成状態
発注伝票-検索生成された発注伝票
処理済み必須チェック処理済みフラグ
項目名必須説明
見積依頼伝票明細必須選択対応する依頼明細
見積回答伝票明細必須検索親の回答伝票
作業開始(予定)日-日付明細単位の作業開始予定
納品(予定)日数-整数明細単位の納品日数
作業完了(予定)日-日付明細単位の作業完了予定
採用見積必須チェックこの明細を採用するか
説明 / コメント-文字列補足
項目名必須説明
見積回答伝票明細必須選択親の回答明細
見積依頼伝票明細数量必須検索対応する依頼側の数量段階
価格必須単価回答単価
割引 %-数値割引率(絶対値 100 以内)
ランキング-整数数量段階ごとの順位

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

Q. 「No Total Amount」というエラーで完成にできません

Section titled “Q. 「No Total Amount」というエラーで完成にできません”

見積依頼側で「見積総額(IsQuoteTotalAmt)」または「総額のみ」が指定されている場合、MRfQResponse.checkComplete() は回答ヘッダーの 価格(Price)が 0 より大きいことを要求します。総額を入力してください。

Q. 「Line n: No Amount」というエラーが出ます

Section titled “Q. 「Line n: No Amount」というエラーが出ます”

見積依頼側で「すべての明細に回答(isQuoteAllLines())」が指定されている場合、各明細に有効(IsActive=Y)かつ正味額が正の数量回答が 1 つ以上必要です。該当行の価格を入力するか、割引率を見直してください。

Q. 「Line n: Not Active」と表示されます

Section titled “Q. 「Line n: Not Active」と表示されます”

「すべての明細に回答」設定では明細が有効である必要があり、「見積総量(IsQuoteAllQty)」設定ではすべての数量回答が有効である必要があります。無効化した行があると完成チェックで弾かれます。

Q. 正味額(Net Amount)はどう計算されますか?

Section titled “Q. 正味額(Net Amount)はどう計算されますか?”

MRfQResponseLineQty.getNetAmt() が計算します。割引が未設定またはゼロなら価格そのもの、割引がある場合は次の式です(小数点以下 2 桁、HALF_UP)。

正味額 = 価格 × (100 − 割引%) ÷ 100

Q. 回答が「有効な金額」と判定される条件は?

Section titled “Q. 回答が「有効な金額」と判定される条件は?”

MRfQResponseLineQty.isValidAmt() が真になる条件は次のとおりです。

条件内容
価格null でなく、ゼロでない
割引 %絶対値が 100 以下
正味額null でない
正味額0 より大きい

ランク付け処理は、この判定を満たさない回答を無効として扱います。

Q. 納期の日付が自動で変わります

Section titled “Q. 納期の日付が自動で変わります”

MRfQResponse.beforeSave() は見積依頼伝票と同じ日程補完ロジックを持ちます。開始日と日数から完了日、開始日と完了日から日数、完了日と日数から開始日、という順で自動計算されます。

ヘッダーの「見積回答の依頼をメール送信する」ボタン(Processing)を実行するか、見積依頼伝票側から「Invite and Remind」プロセスを実行します。モデル側では MRfQResponse.sendRfQ() がメール送信を担当します。

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

見積回答伝票は C_RfQResponse(“Request for Quotation Response from a potential Vendor”)、C_RfQResponseLine(“RfQ Response Line”)、C_RfQResponseLineQty(“RfQ Response Line Qty”)の 3 テーブルで構成され、いずれもアクセスレベル 1(組織)です。モデルクラスは MRfQResponse(427行)、MRfQResponseLine(224行)、MRfQResponseLineQty(263行)です。DocStatus / DocAction は持たず、IsComplete / IsSelectedWinner / Processed の各フラグとボタンで状態を管理します。

classDiagram
    class MRfQResponse {
        +MRfQResponse(MRfQ, MRfQTopicSubscriber)
        +MRfQResponse(MRfQ, MBPartner)
        +getLines(boolean requery) MRfQResponseLine[]
        +getRfQ() MRfQ
        +sendRfQ() boolean
        +createPDF() File
        +checkComplete() String
        +isQuoteTotalAmtOnly() boolean
        #beforeSave(boolean) boolean
    }
    class MRfQResponseLine {
        +MRfQResponseLine(MRfQResponse, MRfQLine)
        +getQtys(boolean requery) MRfQResponseLineQty[]
        +getRfQLine() MRfQLine
        #beforeSave(boolean) boolean
        #afterSave(boolean, boolean) boolean
    }
    class MRfQResponseLineQty {
        +getRfQLineQty() MRfQLineQty
        +isValidAmt() boolean
        +getNetAmt() BigDecimal
        +compare(Object, Object) int
    }
    class Comparator {
        <<interface>>
    }
    class X_C_RfQResponse {
        <<generated>>
    }
    class PO {
        <<abstract>>
    }
    MRfQResponse --|> X_C_RfQResponse
    X_C_RfQResponse --|> PO
    MRfQResponse --> MRfQResponseLine : has many
    MRfQResponseLine --> MRfQResponseLineQty : has many
    MRfQResponseLineQty ..|> Comparator
    MRfQResponse --> MRfQ : responds to

+MRfQResponse(MRfQ, MRfQTopicSubscriber) +MRfQResponse(MRfQ, MBPartner) +getLines(boolean requery) MRfQResponseLine[] +getRfQ() MRfQ +sendRfQ() boolean +createPDF() File +checkComplete() String +isQuoteTotalAmtOnly() boolean #beforeSave(boolean) boolean +MRfQResponseLine(MRfQResponse, MRfQLine) +getQtys(boolean requery) MRfQResponseLineQty[] +getRfQLine() MRfQLine #beforeSave(boolean) boolean #afterSave(boolean, boolean) boolean +getRfQLineQty() MRfQLineQty +isValidAmt() boolean +getNetAmt() BigDecimal +compare(Object, Object) int <> <> <> > X_C_RfQResponse X_C_RfQResponse --

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

C_RfQResponse(見積回答伝票・主要カラム)

Section titled “C_RfQResponse(見積回答伝票・主要カラム)”
カラム名必須説明備考
C_RfQResponse_IDIDPK回答ID主キー
AD_Client_ID / AD_Org_IDTable DirectYクライアント / 組織default @AD_Client_ID@ / @AD_Org_ID@
C_RfQ_IDSearchY見積依頼FK更新不可
NameStringY名称
C_BPartner_IDSearchY取引先
C_BPartner_Location_IDTable DirectY取引先住所
AD_User_IDTable DirectN担当者
C_Currency_IDTable DirectY通貨default @C_Currency_ID@
PriceCosts+PricesY価格(総額回答)完成チェックで検証
DateInvitedDateN招待日
DateResponseDateN回答日付
DateWorkStart / DeliveryDays / DateWorkComplete-N作業日程beforeSave で相互補完
RankingIntegerNランキング
IsSelectedWinnerYes-NoY採用見積
IsCompleteYes-NoY完成CheckComplete で更新
CheckCompleteButtonN完成チェック
ProcessingButtonN回答依頼メール送信
C_Order_IDSearchN生成された発注伝票
ProcessedYes-NoY処理済み

C_RfQResponseLine(見積回答伝票明細)

Section titled “C_RfQResponseLine(見積回答伝票明細)”
カラム名必須説明備考
C_RfQResponseLine_IDIDPK明細ID主キー
C_RfQResponse_IDSearchY回答FK更新不可
C_RfQLine_IDTable DirectY依頼明細FK更新不可
DateWorkStart / DeliveryDays / DateWorkComplete-N明細単位の作業日程
IsSelectedWinnerYes-NoY採用見積明細単位の採用
IsSelfServiceYes-NoYセルフサービス
Description / Help-N説明・コメント

C_RfQResponseLineQty(見積回答伝票明細価格)

Section titled “C_RfQResponseLineQty(見積回答伝票明細価格)”
カラム名必須説明備考
C_RfQResponseLineQty_IDIDPK明細価格ID主キー
C_RfQResponseLine_IDTable DirectY回答明細FK更新不可
C_RfQLineQty_IDSearchY依頼数量FK更新不可
PriceCosts+PricesY回答単価
DiscountNumberN割引 %絶対値 100 以内
RankingIntegerNランキング無効回答は 999
erDiagram
    C_RfQ ||--o{ C_RfQResponse : "responses"
    C_RfQResponse ||--o{ C_RfQResponseLine : "lines"
    C_RfQResponseLine ||--o{ C_RfQResponseLineQty : "prices"
    C_RfQLine ||--o{ C_RfQResponseLine : "answered"
    C_RfQLineQty ||--o{ C_RfQResponseLineQty : "answered"
    C_RfQResponse }o--|| C_BPartner : "vendor"
    C_RfQResponse ||--o| C_Order : "creates PO"

creates PO

flowchart TD
    A[checkComplete] --> B["IsComplete を一旦 false に"]
    B --> C["rfq.checkQuoteTotalAmtOnly()"]
    C --> D{"エラーあり?"}
    D -->|Yes| E["エラーを返して終了"]
    D -->|No| F{"見積総額 or 総額のみ?"}
    F -->|Yes| G{"Price > 0?"}
    G -->|No| H["No Total Amount"]
    G -->|Yes| I{"すべての明細に回答?"}
    F -->|No| I
    I -->|Yes| J{"各明細に有効かつ<br/>正の正味額の数量あり?"}
    J -->|No| K["Line n: No Amount / Not Active"]
    J -->|Yes| L{"見積総量?"}
    I -->|No| L
    L -->|Yes| M{"全数量が有効かつ<br/>正の正味額?"}
    M -->|No| N["Line n Qty=x: No Amount"]
    M -->|Yes| O["IsComplete = true<br/>null を返す"]
    L -->|No| O

IsComplete を一旦 false に rfq.checkQuoteTotalAmtOnly() エラーあり? エラーを返して終了 見積総額 or 総額のみ? Price > 0? No Total Amount すべての明細に回答? 各明細に有効かつ 正の正味額の数量あり? Line n: No Amount / Not Active 見積総量? 全数量が有効かつ 正の正味額? Line n Qty=x: No Amount IsComplete = true null を返す

戻り値が null なら完成、文字列ならその内容がエラーメッセージです。

public BigDecimal getNetAmt()
{
BigDecimal price = getPrice();
if (price == null || Env.ZERO.compareTo(price) == 0)
return null;
BigDecimal discount = getDiscount();
if (discount == null || Env.ZERO.compareTo(discount) == 0)
return price;
BigDecimal factor = Env.ONEHUNDRED.subtract(discount);
return price.multiply(factor).divide(Env.ONEHUNDRED, 2, RoundingMode.HALF_UP);
}

isValidAmt() は、価格がゼロでないこと・割引の絶対値が 100 以下であること・正味額が null でなく正であることを順に検証し、いずれかを満たさない場合は警告ログを出力して false を返します。

MRfQResponseLineQtyComparator<Object> を実装しており、compare() で回答価格の比較が可能です。ランク付け処理(Rank Responses)はこの比較を用いて数量段階ごとの順位を決定し、依頼側の C_RfQLineQty.BestResponseAmt を更新します。無効な回答はランク 999 として扱われます。

MRfQResponse には見積依頼から回答を生成するためのコンストラクタが用意されています。

コンストラクタ用途
MRfQResponse(MRfQ rfq, MRfQTopicSubscriber subscriber)見積依頼案件の依頼先から生成
MRfQResponse(MRfQ rfq, MBPartner partner)取引先を直接指定して生成
MRfQResponseLine(MRfQResponse response, MRfQLine line)依頼明細に対応する回答明細を生成
MRfQResponseLineQty(MRfQResponseLine line, MRfQLineQty qty)依頼数量に対応する回答価格を生成

各階層が依頼側のオブジェクトを引数に取るため、依頼と回答の構造は常に対応関係を保ちます。

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

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

Document 型ではないため modelChange() を使用します。

public class CustomRfQResponseValidator implements ModelValidator {
@Override
public int modelChange(PO po, int type) throws Exception {
if (po instanceof MRfQResponseLineQty
&& (type == TYPE_BEFORE_NEW || type == TYPE_BEFORE_CHANGE)) {
MRfQResponseLineQty qty = (MRfQResponseLineQty) po;
// 例: 基準価格を大幅に上回る回答を警告する
BigDecimal benchmark = qty.getRfQLineQty().getBenchmarkPrice();
BigDecimal net = qty.getNetAmt();
if (benchmark != null && net != null && benchmark.signum() > 0
&& net.compareTo(benchmark.multiply(new BigDecimal("1.5"))) > 0) {
throw new AdempiereException("基準価格の150%を超える回答です。内容を確認してください");
}
}
return null;
}
}

C_RfQResponse / C_RfQResponseLine / C_RfQResponseLineQty の各カラムには標準の Callout(AD_Column.Callout)が設定されていません。価格入力時に正味額を即時表示するなどの補助が必要な場合は、独自 Callout を AD_Column に登録します。

MRfQResponse.sendRfQ() が招待・催促メールの送信を担当し、createPDF() が見積依頼書 PDF を生成します。帳票レイアウトは見積依頼案件の印刷書式(AD_PrintFormat_ID)で切り替えられるため、まずは印刷書式の調整で対応できないかを検討してください。

プロセス名説明
Check Complete見積依頼の設定に基づき回答が完成しているかを検証
Create and Invite見積回答伝票を作成し、仕入先へ招待メールを送信
Invite and Remind仕入先へ招待・催促メールを送信
Rank Responses完成した回答をランク付けし、採用提示額を更新
Create Purchase Order採用した回答から発注伝票を作成
Close RfQ見積依頼と関連する回答をクローズ
RfQ Response Print見積回答の印刷

見積回答の受付は、仕入先ポータルやメール添付の取り込みを組み合わせることで、転記作業をゼロに近づけられます。 基準価格との乖離チェックや総合評価による自動ランク付けも、Model Validator とカスタムプロセスで実現可能です。

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

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