iDempiere 営業案件(オポチュニティ)の使い方|販売管理 操作マニュアル・技術仕様
This content is not available in your language yet.
📖 販売管理の全体像: 販売管理の全体図 も合わせてご覧ください。
営業案件(オポチュニティ)は、「見込みのある商談」を1件ずつ管理する画面です。取引先・営業ステージ・見込金額・予定クローズ日付を登録し、そこから作成した見積/受注伝票と営業活動(訪問・電話・メール)を同じ画面でひも付けて追跡できます。iDempiere の標準リファレンスでは「A potential sale」と定義されています。
📌 ポイント: 案件に受注伝票(
C_Order_ID)をひも付けて保存すると、案件金額(販売単価)は受注伝票の総合計で自動的に上書きされます(MOpportunity.beforeSave())。受注確定後の金額修正は受注伝票側で行ってください。
営業案件でできること
Section titled “営業案件でできること”- 商談単位の登録(取引先・担当者・キャンペーン・社内担当者)
- 営業ステージによる進捗管理と可能性(%)の自動セット
- 見込金額(販売単価)・原価・通貨の記録
- 案件額×可能性による加重見込金額の管理(パイプライン集計)
- 案件配下での見積/受注伝票の作成・明細登録・伝票処理
- 営業活動(タスク・電話・メール・打合せ)の記録と完了管理
- 予定クローズ日付・クローズ日付による着地見込の管理
営業案件は、案件を頂点に「見積/受注」と「営業活動」がぶら下がる4タブ構成です。
| タブ名 | テーブル | 階層 | 項目数 | 役割 |
|---|---|---|---|---|
| 営業案件(オポチュニティ) | C_Opportunity | 0 | 約18項目 | 案件のヘッダー(ステージ・金額・期日) |
| 見積/受注 | C_Order | 1 | 約45項目 | 案件から作成した見積・受注伝票 |
| 見積明細/受注明細 | C_OrderLine | 2 | 約35項目 | 伝票の明細行(品目・数量・単価) |
| 営業活動(アクティビティ) | C_ContactActivity | 1 | 約11項目 | 訪問・電話・メール等の活動履歴 |
graph TD
T1["🎯 営業案件<br/>C_Opportunity<br/>約18項目"]
T2["📄 見積/受注<br/>C_Order<br/>約45項目"]
T3[" └ 見積明細/受注明細<br/> C_OrderLine<br/> 約35項目"]
T4["📞 営業活動<br/>C_ContactActivity<br/>約11項目"]
T1 --> T2
T2 --> T3
T1 --> T4
💡 ヒント: 案件のヘッダーにある「受注伝票」欄は、成約した受注伝票を1件ひも付けるための参照項目です。見積/受注タブで複数の伝票を扱いながら、最終的に成約した1件をヘッダーに指定する運用が分かりやすくなります。
基本操作手順
Section titled “基本操作手順”graph TD
A["🚀 メニューから開く<br/>販売管理 > 見込顧客管理 > 営業案件"] --> B["➕ 新規で案件を登録<br/>(取引先・担当者・キャンペーン)"]
B --> C["🎯 営業ステージを選択<br/>→ 可能性(%)が自動セット"]
C --> D["💰 販売単価・通貨<br/>予定クローズ日付を入力"]
D --> E["💾 保存"]
E --> F["📞 営業活動タブで<br/>訪問・電話・メールを記録"]
F --> G["📄 見積/受注タブで<br/>見積伝票を作成"]
G --> H["📋 明細タブで<br/>品目・数量・単価を入力"]
H --> I["✅ 注文プロセスで<br/>伝票を完成"]
I --> J{結果}
J -->|受注| K["🏆 受注ステージへ変更<br/>受注伝票をひも付け<br/>クローズ日付を入力"]
J -->|失注| L["❌ 失注ステージへ変更<br/>クローズ日付を入力"]
アクセス方法
Section titled “アクセス方法”メニューから「販売管理 > 見込顧客管理 > 営業案件(オポチュニティ)」を開きます。
新規登録(案件ヘッダー)
Section titled “新規登録(案件ヘッダー)”- ツールバーの「新規」ボタンをクリック
- 必須項目を入力:
- 伝票番号: 案件番号(伝票順序から自動採番。手入力も可)
- 取引先: 商談先の取引先(未登録の見込客は先に取引先マスタへ登録)
- 営業ステージ: 進捗段階(選択すると可能性(%)が自動セット)
- 可能性: 成約可能性(%)(ステージから自動セット。手動上書き可)
- 予定クローズ日付: 成約見込日
- 販売単価: 案件の見込金額
- 通貨: 案件の通貨
- 必要に応じて追加入力:
- ユーザー: 取引先側の担当者(コンタクト)
- 社内担当者: 自社の営業担当
- 営業活動(キャンペーン): 案件の発生元キャンペーン
- 原価: 案件にかかる想定原価
- 説明 / コメント: 商談メモ
- 「保存」をクリック。「案件額×可能性」に加重金額が表示されます
⚠️ 注意: 「可能性」「予定クローズ日付」「販売単価」「通貨」はいずれも必須項目です。空欄では保存できません。特に予定クローズ日付は、パイプラインを期間で集計するときの軸になるため、暫定でも入れておくことを推奨します。
営業活動の記録
Section titled “営業活動の記録”- 「営業活動(アクティビティ)」タブに移動し「新規」をクリック
- 活動内容を入力:
- 営業活動タイプ: タスク / 電話 / メール / 打合せ(必須)
- 説明: 活動の要約(必須)
- 開始日付: 実施日時(既定値は現在日時)
- 終了日付: 終了日時(任意)
- ユーザー / 社内担当者: 相手先担当者・自社担当者
- コメント: 詳細メモ
- 実施済みの活動は「完成」にチェック
- 「保存」をクリック
見積/受注の作成と伝票処理
Section titled “見積/受注の作成と伝票処理”案件配下の「見積/受注」タブは受注伝票(C_Order)そのものです。伝票状態(DocStatus)と注文プロセス(DocAction)を持つため、通常の受注伝票と同じ流れで処理します。
- 「見積/受注」タブで「新規」をクリック
- 伝票タイプで見積(Proposal / Quotation)または標準受注伝票を選択
- 取引先・住所・倉庫・価格表・支払条件などを確認(取引先マスタの既定値が自動セットされます)
- 「見積明細/受注明細」タブで品目・入力数量・単価を登録
- ヘッダーに戻り「注文プロセス」ボタンで伝票を処理:
| DocAction | 名称 | 効果 |
|---|---|---|
| CO | 完成 | 伝票を完成。受注の場合は在庫引当・出荷/請求の対象になります |
| PR | 準備 | 伝票を準備中(In Progress)にします |
| VO | 無効化 | 完成前の伝票を無効化します |
| CL | クローズ | 未出荷・未請求分を打ち切って伝票を閉じます |
| RE | 再開 | 完成後の伝票を編集可能な状態に戻します |
- 見積が受注に変わった場合は、案件ヘッダーの「受注伝票」欄に完成した受注伝票をひも付けます
⚠️ 注意: 受注伝票をひも付けて保存すると、案件の「販売単価」が受注伝票の総合計で上書きされます。見込金額の履歴を残したい場合は、ひも付け前の金額を「コメント」欄などに控えておいてください。
項目リファレンス(営業案件タブ)
Section titled “項目リファレンス(営業案件タブ)”| 項目名 | 必須 | 型 | 説明 |
|---|---|---|---|
| 伝票番号 | 必須 | 文字列(60) | 案件の一意番号 |
| 取引先 | 必須 | 検索 | 商談先の取引先。既定値 @C_BPartner_ID@ |
| ユーザー | - | 選択 | 取引先側の担当者(コンタクト) |
| 営業活動 | - | 選択 | 発生元のマーケティングキャンペーン |
| 社内担当者 | - | 選択 | 自社の営業担当 |
| 営業ステージ | 必須 | 選択 | 進捗段階。Callout で可能性を自動セット |
| 可能性 | 必須 | 金額 | 成約可能性(%) |
| 予定クローズ日付 | 必須 | 日付 | 成約見込日 |
| 販売単価 | 必須 | 金額 | 案件の見込金額(受注ひも付け時に自動上書き) |
| 案件額×可能性 | - | 金額 | 見込金額を可能性で加重した金額 |
| 通貨 | 必須 | 選択 | 案件の通貨 |
| 受注伝票 | - | 検索 | 成約時にひも付ける受注伝票 |
| クローズ日付 | - | 日付 | 実際のクローズ日 |
| 原価 | - | 金額 | 案件にかかる想定原価 |
| 説明 | - | 文字列(255) | 案件の概要 |
| コメント | - | テキスト(5000) | 商談メモ |
全項目(見積/受注タブ・明細タブを含む)は 画面リファレンス: 営業案件(オポチュニティ) を参照してください。
パイプライン管理の考え方
Section titled “パイプライン管理の考え方”graph TD
A["営業ステージ<br/>可能性(%)を定義"] --> B["営業案件<br/>販売単価 × 可能性"]
B --> C["案件額×可能性<br/>(加重見込金額)"]
C --> D["営業担当者ダッシュボード<br/>Sales Pipeline チャート"]
B --> E["見積/受注伝票"]
E --> F["出荷伝票"]
E --> G["売上請求書"]
よくある質問(FAQ)
Section titled “よくある質問(FAQ)”Q. 販売単価(案件金額)を修正しても保存すると元に戻ります
Section titled “Q. 販売単価(案件金額)を修正しても保存すると元に戻ります”受注伝票がひも付いている案件は、MOpportunity.beforeSave() により保存のたびに受注伝票の総合計(GrandTotal)で案件金額が上書きされます。これは案件金額と受注金額を一致させるための仕様です。金額を変えたい場合は受注伝票側の明細を修正してください。
Q. 営業ステージを変えると可能性(%)が勝手に変わります
Section titled “Q. 営業ステージを変えると可能性(%)が勝手に変わります”営業ステージ欄に Callout(CalloutOpportunity.salesStage)が設定されており、選択したステージの可能性をそのまま案件へ転記します。案件固有の事情がある場合は、ステージ選択後に可能性を手動で上書きしてください(上書き後にステージを選び直すと再度上書きされます)。
Q. 「案件額×可能性」は自動計算されますか?
Section titled “Q. 「案件額×可能性」は自動計算されますか?”WeightedAmt(案件額×可能性)は更新不可の項目として定義されており、ユーザーが直接編集することはできません。パイプラインの加重集計に利用する項目です。
Q. 見積から受注への変換はどこで行いますか?
Section titled “Q. 見積から受注への変換はどこで行いますか?”案件配下の「見積/受注」タブは受注伝票そのものです。見積伝票を完成させたあと、受注伝票の標準機能(伝票タイプの変更や「明細行をコピーして作成」)で受注へ引き継ぎます。詳しくは 受注伝票の使い方 を参照してください。
Q. 営業活動の「営業活動タイプ」にはどんな選択肢がありますか?
Section titled “Q. 営業活動の「営業活動タイプ」にはどんな選択肢がありますか?”標準では次の4種類です。EM(メール)、ME(打合せ)、PC(電話)、TA(タスク)。この分類は C_ContactActivity.ContactActivityType のリスト参照で定義されています。
Q. 失注した案件はどう処理しますか?
Section titled “Q. 失注した案件はどう処理しますか?”失注用の営業ステージ(クローズステータス=ON、Won=OFF)へ変更し、クローズ日付を入力します。レコードを削除する必要はなく、失注理由をコメントに残しておくと後の分析に活用できます。
- 営業ステージの使い方
- 営業担当者ダッシュボードの使い方
- 得意先(顧客)の使い方
- マーケティングキャンペーンの使い方
- 受注伝票(Sales Order)の使い方
- 取引先マスタ(Business Partner)の使い方
- 画面リファレンス: 営業案件(オポチュニティ)
🛠 技術仕様(開発者向け)
営業案件は C_Opportunity(テーブル名: Sales Opportunity、アクセスレベル 3 = Client+Org、削除可)に格納されます。モデルクラスは MOpportunity(80行)で、beforeSave() のみをオーバーライドした軽量クラスです。Document 型ではありません(DocStatus / DocAction を持たない)。
一方、子タブの「見積/受注」は C_Order(MOrder)そのもので、こちらは完全な Document 型です。したがって1つのウィンドウ内に「非 Document のマスタ的レコード」と「Document 型伝票」が同居する構成になっています。
営業活動 C_ContactActivity(説明: Events, tasks, communications related to a contact)には M クラスが存在せず、生成クラス X_C_ContactActivity(364行)のみが提供されます。
アーキテクチャ概要
Section titled “アーキテクチャ概要”classDiagram
class MOpportunity {
+beforeSave(boolean) boolean
}
class X_C_Opportunity {
<<generated>>
}
class X_C_ContactActivity {
<<generated>>
}
class MOrder {
+completeIt() String
+prepareIt() String
}
class PO {
<<abstract>>
}
class CalloutOpportunity {
+salesStage(...) String
}
MOpportunity --|> X_C_Opportunity
X_C_Opportunity --|> PO
X_C_ContactActivity --|> PO
MOpportunity --> MOrder : links to
MOpportunity --> X_C_ContactActivity : has many
CalloutOpportunity --> MOpportunity : sets Probability
パッケージ: org.compiere.model
ソースファイル: org.adempiere.base/src/org/compiere/model/MOpportunity.java(80行)/ X_C_Opportunity.java(538行)/ X_C_ContactActivity.java(364行)
Callout: org.adempiere.base.callout/src/org/compiere/model/CalloutOpportunity.java
関連DBテーブル
Section titled “関連DBテーブル”C_Opportunity(営業案件)
Section titled “C_Opportunity(営業案件)”| カラム名 | 型 | 必須 | 説明 | 備考 |
|---|---|---|---|---|
| C_Opportunity_ID | ID | PK | 案件ID | 主キー |
| C_Opportunity_UU | UUID(36) | N | UUID | |
| AD_Client_ID | TableDirect | Y | クライアント | 既定値 @#AD_Client_ID@ |
| AD_Org_ID | TableDirect | Y | 組織 | 既定値 @#AD_Org_ID@ |
| DocumentNo | String(60) | Y | 伝票番号 | |
| C_BPartner_ID | Search | Y | 取引先 | 既定値 @C_BPartner_ID@ |
| AD_User_ID | TableDirect | N | ユーザー | 既定値 -1 |
| C_Campaign_ID | TableDirect | N | キャンペーン | |
| SalesRep_ID | Table | N | 社内担当者 | |
| C_SalesStage_ID | Table | Y | 営業ステージ | Callout: CalloutOpportunity.salesStage |
| Probability | Amount | Y | 可能性(%) | ステージから自動セット |
| ExpectedCloseDate | Date | Y | 予定クローズ日付 | |
| OpportunityAmt | Amount | Y | 案件金額(販売単価) | 受注ひも付け時に自動上書き |
| WeightedAmt | Amount | N | 案件額×可能性 | 更新不可(IsUpdateable=N) |
| C_Currency_ID | TableDirect | Y | 通貨 | |
| C_Order_ID | Search | N | 受注伝票 | 成約時のひも付け先 |
| CloseDate | Date | N | クローズ日付 | |
| Cost | Amount | N | 原価 | |
| Description | String(255) | N | 説明 | |
| Comments | Text(5000) | N | コメント |
C_ContactActivity(営業活動)
Section titled “C_ContactActivity(営業活動)”| カラム名 | 型 | 必須 | 説明 | 備考 |
|---|---|---|---|---|
| C_ContactActivity_ID | ID | PK | 活動ID | 主キー |
| C_Opportunity_ID | TableDirect | N | 営業案件 | 既定値 @C_Opportunity_ID@ |
| ContactActivityType | List(10) | Y | 活動タイプ | EM/ME/PC/TA。更新不可 |
| Description | String(255) | Y | 説明 | 必須 |
| StartDate | Date+Time | Y | 開始日付 | 既定値 @SQL=SELECT SYSDATE ... |
| EndDate | Date+Time | N | 終了日付 | |
| AD_User_ID | Search | N | ユーザー | 既定値 @AD_User_ID@ |
| SalesRep_ID | Table | N | 社内担当者 | 既定値 @#SalesRep_ID@ |
| IsComplete | YesNo | N | 完成 | |
| Comments | Text | N | コメント |
営業活動タイプ(ContactActivityType)
Section titled “営業活動タイプ(ContactActivityType)”| コード | 定数 | 意味 |
|---|---|---|
| EM | CONTACTACTIVITYTYPE_Email | メール |
| ME | CONTACTACTIVITYTYPE_Meeting | 打合せ |
| PC | CONTACTACTIVITYTYPE_PhoneCall | 電話 |
| TA | CONTACTACTIVITYTYPE_Task | タスク |
erDiagram
C_Opportunity }o--|| C_SalesStage : "stage"
C_Opportunity }o--|| C_BPartner : "customer"
C_Opportunity }o--o| C_Campaign : "campaign"
C_Opportunity }o--o| C_Order : "converted order"
C_Opportunity ||--o{ C_ContactActivity : "activities"
C_Order ||--o{ C_OrderLine : "lines"
C_OrderLine }o--o| M_Product : "product"
C_Opportunity }o--o| AD_User : "contact"
ビジネスロジック
Section titled “ビジネスロジック”MOpportunity.beforeSave()
Section titled “MOpportunity.beforeSave()”MOpportunity が持つ唯一のカスタムロジックです。処理は次のとおりです。
getC_Order_ID() > 0の場合のみ実行(受注伝票がひも付いている案件)MOrderをロードし、ID が一致することを確認setOpportunityAmt(order.getGrandTotal())で案件金額を受注総合計に同期- 常に
trueを返す(保存を止める検証は行わない)
protected boolean beforeSave(boolean newRecord) { // Set OpportunityAmt to GrandTotal of order. if ( getC_Order_ID() > 0 ) { MOrder order = new MOrder(getCtx(), getC_Order_ID(), get_TrxName()); if ( order.getC_Order_ID() == getC_Order_ID() ) setOpportunityAmt(order.getGrandTotal()); } return true;}CalloutOpportunity.salesStage
Section titled “CalloutOpportunity.salesStage”C_SalesStage_ID 列に設定された Callout です。isCalloutActive() または値が null なら何もせず、そうでなければ SELECT Probability FROM C_SalesStage WHERE C_SalesStage_ID = ? の結果を mTab.setValue("Probability", probability) で可能性欄へ転記します。
見積/受注タブ(C_Order)
Section titled “見積/受注タブ(C_Order)”このタブは通常の受注伝票と同じ MOrder を扱うため、prepareIt() / completeIt() などの Document Engine のロジックがそのまま適用されます。在庫引当、価格の再計算、支払スケジュール生成などの挙動は受注伝票の仕様に従います。
営業活動(C_ContactActivity)
Section titled “営業活動(C_ContactActivity)”M クラスが存在しないため、保存時の追加検証はありません。Description と ContactActivityType、StartDate が必須制約として効きます。ContactActivityType は IsUpdateable=N のため、登録後にタイプを変更できません(変更したい場合はレコードを作り直します)。
拡張ポイント(カスタマイズ箇所)
Section titled “拡張ポイント(カスタマイズ箇所)”OSGi Model Validator(推奨)
Section titled “OSGi Model Validator(推奨)”public class CustomOpportunityValidator implements ModelValidator { @Override public int modelChange(PO po, int type) throws Exception { if (po instanceof MOpportunity && type == TYPE_BEFORE_CHANGE) { MOpportunity opp = (MOpportunity) po; // 例: クローズ済みステージへの遷移時はクローズ日付を必須にする if (opp.is_ValueChanged(MOpportunity.COLUMNNAME_C_SalesStage_ID)) { X_C_SalesStage stage = new X_C_SalesStage( opp.getCtx(), opp.getC_SalesStage_ID(), opp.get_TrxName()); if (stage.isClosed() && opp.getCloseDate() == null) { throw new AdempiereException("クローズするステージではクローズ日付を入力してください"); } } } return null; }}Callout の追加
Section titled “Callout の追加”C_Opportunity で標準の Callout が設定されているのは C_SalesStage_ID 列のみです。独自 Callout(例: ステージ選択時に予定クローズ日付を自動計算)を追加する場合は、AD_Column の Callout 欄にセミコロン区切りで追記します。
加重金額のカスタム計算
Section titled “加重金額のカスタム計算”WeightedAmt は IsUpdateable=N のため画面からは編集できません。独自の加重ロジックを持たせる場合は、Model Validator の TYPE_BEFORE_NEW / TYPE_BEFORE_CHANGE で set_ValueNoCheck() を用いて値をセットするか、レポート側で計算する方式を検討します。
受注ひも付け時の金額上書きを抑止したい場合
Section titled “受注ひも付け時の金額上書きを抑止したい場合”MOpportunity.beforeSave() はコアの挙動のため、Model Validator の TYPE_AFTER_CHANGE で意図した金額を再設定するか、案件金額とは別のカスタム列に「当初見込金額」を保持する設計が安全です。コアクラスの改変は避けてください。
関連プロセス
Section titled “関連プロセス”営業案件ウィンドウのヘッダータブに標準の関連プロセスは定義されていません。子タブの見積/受注では、受注伝票標準の「注文プロセス(DocAction)」「明細行をコピーして作成(CopyFrom)」「転記(Posted)」が利用できます。
関連ドキュメント
Section titled “関連ドキュメント”iDempiereカスタマイズのご相談
Section titled “iDempiereカスタマイズのご相談”商談プロセスの管理項目や見積からの受注変換フローは、企業ごとに要件が大きく異なります。Model Validator と独自 Callout で、コア改変なしに自社の営業プロセスへ合わせられます。
As-Link株式会社では、OSGiプラグインによる安全なカスタマイズを提供しています。