iDempiere 見積回答伝票の使い方|購買管理 操作マニュアル・技術仕様
This content is not available in your language yet.
📖 購買管理の全体像: 購買管理の全体図 も合わせてご覧ください。
見積回答伝票(RfQ Response)は、見積依頼(RfQ)に対する仕入先 1 社ごとの回答を保持する伝票です。見積依頼伝票の「見積回答要求及び見積回答伝票作成」処理で依頼先の数だけ自動生成され、そこに各社の価格・納期を入力して比較します。
📌 ポイント: 回答は入力しただけでは評価対象になりません。「見積回答伝票を完成にする」ボタン(
CheckComplete)で完成(IsComplete)にした回答だけが、ランク付けと採用の対象になります。
見積回答伝票でできること
Section titled “見積回答伝票でできること”- 仕入先ごとの見積回答(価格・納期)の登録
- 見積依頼の明細・数量段階に対応した回答価格・割引率の入力
- 完成チェック(
CheckComplete)による回答内容の妥当性検証 - 招待日(
DateInvited)・回答日付(DateResponse)の記録 - 見積回答の依頼メール送信(
Processing) - ランキング(
Ranking)による回答の順位付け - 採用見積(
IsSelectedWinner)の選定(伝票単位・明細単位) - 採用結果から生成された発注伝票(
C_Order_ID)の追跡
見積回答伝票は 3 階層のタブ構成で、見積依頼伝票と 1 対 1 で対応します。
| タブ名 | テーブル | 項目数 | 役割 |
|---|---|---|---|
| 見積回答伝票 | C_RfQResponse | 25項目 | 回答ヘッダー(仕入先・総額・納期・完成/採用フラグ) |
| 見積回答伝票明細 | C_RfQResponseLine | 12項目 | 見積依頼明細に対応した回答(納期・採用フラグ) |
| 見積回答伝票明細価格 | C_RfQResponseLineQty | 8項目 | 数量段階ごとの価格・割引率・ランキング |
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_ID/C_RfQLine_ID/C_RfQLineQty_ID)。したがって、回答を手作業で一から作るのではなく、見積依頼伝票側から生成するのが正しい運用です。
基本操作手順
Section titled “基本操作手順”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["🧾 発注伝票作成"]
⚠️ 注意: 完成チェックは「完成にする」だけでなく「いったん完成フラグを外してから再検証する」動作です。検証に失敗した場合、回答は未完成のまま残ります。
アクセス方法(メニューパス)
Section titled “アクセス方法(メニューパス)”メニューから「購買管理 > 見積回答伝票」を開きます。
- 対象の見積回答伝票を開く(見積依頼伝票から生成済み)
- ヘッダーを確認・入力:
- 見積依頼伝票(
C_RfQ_ID) / 名称(Name): 生成時に自動セット - 取引先(
C_BPartner_ID) / 取引先住所(C_BPartner_Location_ID) / ユーザー - 通貨(
C_Currency_ID) - 価格(
Price): 総額回答の場合に入力(必須項目) - 回答日付(
DateResponse) - 作業開始(予定)日 / 納品(予定)日数 / 作業完了(予定)日
- 見積依頼伝票(
- 「見積回答伝票明細」タブで明細ごとの納期・条件を確認
- 「見積回答伝票明細価格」タブで数量段階ごとに入力:
- 価格(
Price): 必須 - 割引 %(
Discount): 任意(絶対値 100 以内)
- 価格(
- 「保存」をクリック
完成チェック
Section titled “完成チェック”- ヘッダーの「見積回答伝票を完成にする」ボタン(
CheckComplete)を実行 - 見積依頼側の設定に応じて次の検証が行われます
- 見積タイプが「総額のみ」の場合、依頼側の数量が 1 明細 1 件になっているか
- 「見積総額」または「総額のみ」の場合、価格(
Price)が 0 より大きいか - 「すべての明細に回答」の場合、各明細に有効かつ正の金額の数量回答が 1 つ以上あるか
- 「見積総量」の場合、すべての数量回答が有効かつ正の金額であるか
- すべて満たすと 完成(
IsComplete = Y)になります
| 項目・ボタン | カラム | 役割 |
|---|---|---|
| 見積回答の依頼をメール送信する | Processing | 仕入先へ回答依頼メールを送信 |
| 見積回答伝票を完成にする | CheckComplete | 回答内容を検証し完成にする |
| 完成 | IsComplete | 完成状態のフラグ |
| ランキング | Ranking | 順位(ランク付け処理で更新) |
| 採用見積 | IsSelectedWinner | 採用した回答(伝票・明細の両方にあり) |
| 発注伝票 | C_Order_ID | 採用結果から生成された発注伝票 |
📌 ポイント: 採用見積(
IsSelectedWinner)はヘッダーと明細の両方にあります。明細単位で仕入先を分ける(品目 A は X 社、品目 B は Y 社)といった分割発注が可能です。
項目リファレンス
Section titled “項目リファレンス”見積回答伝票タブ(主要項目)
Section titled “見積回答伝票タブ(主要項目)”| 項目名 | 必須 | 型 | 説明 |
|---|---|---|---|
| 見積依頼伝票 | 必須 | 検索 | 対応する見積依頼 |
| 名称 | 必須 | 文字列 | 回答の名称 |
| 取引先 | 必須 | 検索 | 回答した仕入先 |
| 取引先住所 | 必須 | 選択 | 仕入先住所 |
| ユーザー | - | 選択 | 仕入先担当者 |
| 通貨 | 必須 | 選択 | 回答通貨 |
| 価格 | 必須 | 単価 | 総額回答の金額 |
| 招待日 | - | 日付 | 最後に招待を送信した日 |
| 回答日付 | - | 日付 | 回答を受領した日 |
| 作業開始(予定)日 | - | 日付 | 作業開始予定 |
| 納品(予定)日数 | - | 整数 | 納品までの日数 |
| 作業完了(予定)日 | - | 日付 | 作業完了予定 |
| ランキング | - | 整数 | 相対順位 |
| 採用見積 | 必須 | チェック | 採用した回答か |
| 完成 | 必須 | チェック | 完成状態 |
| 発注伝票 | - | 検索 | 生成された発注伝票 |
| 処理済み | 必須 | チェック | 処理済みフラグ |
見積回答伝票明細タブ
Section titled “見積回答伝票明細タブ”| 項目名 | 必須 | 型 | 説明 |
|---|---|---|---|
| 見積依頼伝票明細 | 必須 | 選択 | 対応する依頼明細 |
| 見積回答伝票明細 | 必須 | 検索 | 親の回答伝票 |
| 作業開始(予定)日 | - | 日付 | 明細単位の作業開始予定 |
| 納品(予定)日数 | - | 整数 | 明細単位の納品日数 |
| 作業完了(予定)日 | - | 日付 | 明細単位の作業完了予定 |
| 採用見積 | 必須 | チェック | この明細を採用するか |
| 説明 / コメント | - | 文字列 | 補足 |
見積回答伝票明細価格タブ
Section titled “見積回答伝票明細価格タブ”| 項目名 | 必須 | 型 | 説明 |
|---|---|---|---|
| 見積回答伝票明細 | 必須 | 選択 | 親の回答明細 |
| 見積依頼伝票明細数量 | 必須 | 検索 | 対応する依頼側の数量段階 |
| 価格 | 必須 | 単価 | 回答単価 |
| 割引 % | - | 数値 | 割引率(絶対値 100 以内) |
| ランキング | - | 整数 | 数量段階ごとの順位 |
よくある質問(FAQ)
Section titled “よくある質問(FAQ)”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 − 割引%) ÷ 100Q. 回答が「有効な金額」と判定される条件は?
Section titled “Q. 回答が「有効な金額」と判定される条件は?”MRfQResponseLineQty.isValidAmt() が真になる条件は次のとおりです。
| 条件 | 内容 |
|---|---|
| 価格 | null でなく、ゼロでない |
| 割引 % | 絶対値が 100 以下 |
| 正味額 | null でない |
| 正味額 | 0 より大きい |
ランク付け処理は、この判定を満たさない回答を無効として扱います。
Q. 納期の日付が自動で変わります
Section titled “Q. 納期の日付が自動で変わります”MRfQResponse.beforeSave() は見積依頼伝票と同じ日程補完ロジックを持ちます。開始日と日数から完了日、開始日と完了日から日数、完了日と日数から開始日、という順で自動計算されます。
Q. 仕入先に回答を催促したい
Section titled “Q. 仕入先に回答を催促したい”ヘッダーの「見積回答の依頼をメール送信する」ボタン(Processing)を実行するか、見積依頼伝票側から「Invite and Remind」プロセスを実行します。モデル側では MRfQResponse.sendRfQ() がメール送信を担当します。
- 見積依頼伝票(RfQ)の使い方
- 見積依頼案件(RfQ Topic)の使い方
- 発注伝票(Purchase Order)の使い方
- 取引先マスタ(Business Partner)の使い方
- 画面リファレンス: 見積回答伝票
🛠 技術仕様(開発者向け)
見積回答伝票は 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 の各フラグとボタンで状態を管理します。
アーキテクチャ概要
Section titled “アーキテクチャ概要”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
パッケージ: org.compiere.model
ソースファイル: org.adempiere.base/src/org/compiere/model/MRfQResponse.java / MRfQResponseLine.java / MRfQResponseLineQty.java
関連DBテーブル
Section titled “関連DBテーブル”C_RfQResponse(見積回答伝票・主要カラム)
Section titled “C_RfQResponse(見積回答伝票・主要カラム)”| カラム名 | 型 | 必須 | 説明 | 備考 |
|---|---|---|---|---|
| C_RfQResponse_ID | ID | PK | 回答ID | 主キー |
| AD_Client_ID / AD_Org_ID | Table Direct | Y | クライアント / 組織 | default @AD_Client_ID@ / @AD_Org_ID@ |
| C_RfQ_ID | Search | Y | 見積依頼FK | 更新不可 |
| Name | String | Y | 名称 | |
| C_BPartner_ID | Search | Y | 取引先 | |
| C_BPartner_Location_ID | Table Direct | Y | 取引先住所 | |
| AD_User_ID | Table Direct | N | 担当者 | |
| C_Currency_ID | Table Direct | Y | 通貨 | default @C_Currency_ID@ |
| Price | Costs+Prices | Y | 価格(総額回答) | 完成チェックで検証 |
| DateInvited | Date | N | 招待日 | |
| DateResponse | Date | N | 回答日付 | |
| DateWorkStart / DeliveryDays / DateWorkComplete | - | N | 作業日程 | beforeSave で相互補完 |
| Ranking | Integer | N | ランキング | |
| IsSelectedWinner | Yes-No | Y | 採用見積 | |
| IsComplete | Yes-No | Y | 完成 | CheckComplete で更新 |
| CheckComplete | Button | N | 完成チェック | |
| Processing | Button | N | 回答依頼メール送信 | |
| C_Order_ID | Search | N | 生成された発注伝票 | |
| Processed | Yes-No | Y | 処理済み |
C_RfQResponseLine(見積回答伝票明細)
Section titled “C_RfQResponseLine(見積回答伝票明細)”| カラム名 | 型 | 必須 | 説明 | 備考 |
|---|---|---|---|---|
| C_RfQResponseLine_ID | ID | PK | 明細ID | 主キー |
| C_RfQResponse_ID | Search | Y | 回答FK | 更新不可 |
| C_RfQLine_ID | Table Direct | Y | 依頼明細FK | 更新不可 |
| DateWorkStart / DeliveryDays / DateWorkComplete | - | N | 明細単位の作業日程 | |
| IsSelectedWinner | Yes-No | Y | 採用見積 | 明細単位の採用 |
| IsSelfService | Yes-No | Y | セルフサービス | |
| Description / Help | - | N | 説明・コメント |
C_RfQResponseLineQty(見積回答伝票明細価格)
Section titled “C_RfQResponseLineQty(見積回答伝票明細価格)”| カラム名 | 型 | 必須 | 説明 | 備考 |
|---|---|---|---|---|
| C_RfQResponseLineQty_ID | ID | PK | 明細価格ID | 主キー |
| C_RfQResponseLine_ID | Table Direct | Y | 回答明細FK | 更新不可 |
| C_RfQLineQty_ID | Search | Y | 依頼数量FK | 更新不可 |
| Price | Costs+Prices | Y | 回答単価 | |
| Discount | Number | N | 割引 % | 絶対値 100 以内 |
| Ranking | Integer | N | ランキング | 無効回答は 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"
ビジネスロジック
Section titled “ビジネスロジック”checkComplete() の検証フロー
Section titled “checkComplete() の検証フロー”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
戻り値が null なら完成、文字列ならその内容がエラーメッセージです。
getNetAmt() と isValidAmt()
Section titled “getNetAmt() と isValidAmt()”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 を返します。
Comparator による並べ替え
Section titled “Comparator による並べ替え”MRfQResponseLineQty は Comparator<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 “拡張ポイント(カスタマイズ箇所)”OSGi Model Validator(推奨)
Section titled “OSGi Model Validator(推奨)”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; }}Callout
Section titled “Callout”C_RfQResponse / C_RfQResponseLine / C_RfQResponseLineQty の各カラムには標準の Callout(AD_Column.Callout)が設定されていません。価格入力時に正味額を即時表示するなどの補助が必要な場合は、独自 Callout を AD_Column に登録します。
メール送信のカスタマイズ
Section titled “メール送信のカスタマイズ”MRfQResponse.sendRfQ() が招待・催促メールの送信を担当し、createPDF() が見積依頼書 PDF を生成します。帳票レイアウトは見積依頼案件の印刷書式(AD_PrintFormat_ID)で切り替えられるため、まずは印刷書式の調整で対応できないかを検討してください。
関連プロセス
Section titled “関連プロセス”| プロセス名 | 説明 |
|---|---|
| Check Complete | 見積依頼の設定に基づき回答が完成しているかを検証 |
| Create and Invite | 見積回答伝票を作成し、仕入先へ招待メールを送信 |
| Invite and Remind | 仕入先へ招待・催促メールを送信 |
| Rank Responses | 完成した回答をランク付けし、採用提示額を更新 |
| Create Purchase Order | 採用した回答から発注伝票を作成 |
| Close RfQ | 見積依頼と関連する回答をクローズ |
| RfQ Response Print | 見積回答の印刷 |
関連ドキュメント
Section titled “関連ドキュメント”iDempiereカスタマイズのご相談
Section titled “iDempiereカスタマイズのご相談”見積回答の受付は、仕入先ポータルやメール添付の取り込みを組み合わせることで、転記作業をゼロに近づけられます。 基準価格との乖離チェックや総合評価による自動ランク付けも、Model Validator とカスタムプロセスで実現可能です。
As-Link株式会社では、OSGiプラグインによる安全なカスタマイズを提供しています。