コンテンツにスキップ

iDempiere 営業ステージの使い方|販売管理 操作マニュアル・技術仕様

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

営業ステージは、商談(営業案件)の進捗段階を定義するマスタです。各ステージに「可能性(%)」を持たせておくことで、営業案件でステージを選択したときに成約可能性が自動セットされ、パイプラインの加重見込金額を一貫した基準で算出できます。

📌 ポイント: ステージに設定した「可能性(%)」は、営業案件側で Callout(CalloutOpportunity.salesStage)により自動転記されます。ステージ設計の段階で可能性の数値を決めておくことが、パイプライン精度の要になります。

  • 商談の進捗段階(初回接触・提案・見積提示・クロージング等)の定義
  • ステージごとの成約可能性(%)の設定
  • クローズステータス(IsClosed)による「終了ステージ」の識別
  • 成約フラグ(IsWon)による「受注」と「失注」の区別
  • 当該ステージに滞留している営業案件の一覧確認(営業案件タブ)
  • ステージ名称の多言語化(翻訳タブ)

営業ステージはシンプルな3タブ構成です。

タブ名テーブル項目数役割
営業ステージC_SalesStage約9項目ステージの基本定義(可能性・クローズ・成約)
営業案件(オポチュニティ)C_Opportunity約17項目当該ステージにある営業案件の一覧・編集
翻訳C_SalesStage_Trl約8項目多言語対応の翻訳

💡 ヒント: 営業案件タブは参照・編集用の子タブです。案件そのものの登録・運用は 営業案件(オポチュニティ) から行うほうが、見積/受注タブや営業活動タブも併せて扱えるため実務的です。

graph TD
    A["🚀 メニューから開く<br/>販売管理 > 見込顧客管理 > 営業ステージ"] --> B["➕ 新規でステージを登録<br/>(検索キー・名称)"]
    B --> C["📊 可能性(%)を入力<br/>(例: 提案=30、見積提示=60)"]
    C --> D{終了ステージか?}
    D -->|進行中| E["クローズステータス = OFF"]
    D -->|受注で終了| F["クローズステータス = ON<br/>Won = ON<br/>可能性 = 100"]
    D -->|失注で終了| G["クローズステータス = ON<br/>Won = OFF<br/>可能性 = 0"]
    E --> H["💾 保存"]
    F --> H
    G --> H
    H --> I["🔗 営業案件でステージを選択<br/>→ 可能性(%)が自動セット"]

メニューから開く 販売管理 > 見込顧客管理 > 営業ステージ 新規でステージを登録 (検索キー・名称) 可能性(%)を入力 (例: 提案=30、見積提示=60) クローズステータス = OFF クローズステータス = ON Won = ON 可能性 = 100 クローズステータス = ON Won = OFF 可能性 = 0 保存 営業案件でステージを選択 → 可能性(%)が自動セット 終了ステージか? 進行中 受注で終了 失注で終了

メニューから「販売管理 > 見込顧客管理 > 営業ステージ」を開きます。

  1. ツールバーの「新規」ボタンをクリック
  2. 基本情報を入力:
    • 検索キー: ステージの一意コード(例: 20-PROPOSAL。並び順を意識した番号プレフィクスが便利です)
    • 名称: ステージ名(例: 提案中
    • 説明: ステージの定義や判定基準(任意、255文字まで)
    • 可能性: 成約可能性(%)(必須。例: 30
  3. 終了ステージの場合は追加設定:
    • クローズステータス: 商談が終了する段階の場合にチェック
    • Won: 受注(成約)で終了するステージの場合にチェック
  4. 保存」をクリック

⚠️ 注意: 「可能性」は必須項目です。ここに入力した値が営業案件の可能性(%)の初期値として使われ、案件額×可能性(WeightedAmt)の計算根拠になります。空欄のまま運用すると加重見込が正しく積み上がりません。

検索キー名称可能性クローズWon
10-LEAD初回接触10--
20-PROPOSAL提案中30--
30-QUOTE見積提示60--
40-NEGOTIATION最終交渉80--
90-WON受注100
99-LOST失注0-
項目名必須説明
クライアント必須選択テナント(既定値は現在のクライアント)
組織必須選択組織(既定値は現在の組織)
検索キー必須文字列(60)ステージの一意コード
名称必須文字列(60)ステージ名
説明-文字列(255)ステージの補足説明
可能性必須金額成約可能性(%)。営業案件へ自動転記される
クローズステータス必須チェック商談が終了する段階か(既定値 N)
Won-チェック受注(成約)で終了するステージか
有効必須チェックレコードが有効か(既定値 Y)

全項目は 画面リファレンス: 営業ステージ を参照してください。

Q. ステージを変更したら営業案件の「可能性」が書き換わりました

Section titled “Q. ステージを変更したら営業案件の「可能性」が書き換わりました”

営業案件の営業ステージ欄には Callout(CalloutOpportunity.salesStage)が設定されており、選択したステージの Probability を SQL で取得して案件の可能性欄へ転記します。自動セット後に案件ごとに手動で上書きすることは可能です。

Q. 既存ステージの「可能性」を変更すると、過去の案件にも反映されますか?

Section titled “Q. 既存ステージの「可能性」を変更すると、過去の案件にも反映されますか?”

反映されません。Callout はユーザーがステージを選択した時点で値を転記する仕組みのため、既に保存済みの案件の可能性は変わりません。過去案件も揃えたい場合は、案件側で再度ステージを選び直すか、一括更新の仕組みを別途用意する必要があります。

Q. 「クローズステータス」と「Won」はどう使い分けますか?

Section titled “Q. 「クローズステータス」と「Won」はどう使い分けますか?”

「クローズステータス」は商談が終了したかどうか(進行中か否か)、「Won」は終了の結果が受注(成約)だったかを表します。したがって失注ステージは「クローズステータス=ON / Won=OFF」、受注ステージは「両方 ON」となります。なお IsWon のみ必須ではないため、進行中ステージでは空のままで構いません。

Q. 使わなくなったステージを削除できますか?

Section titled “Q. 使わなくなったステージを削除できますか?”

C_SalesStage は削除可能なテーブルですが、営業案件から参照されているステージは参照整合性により削除できません。運用中のステージを整理する場合は「有効」チェックを外して無効化してください。無効化すると新規案件で選択できなくなり、既存案件のデータはそのまま保持されます。

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

営業ステージは C_SalesStage(テーブル名: Sales Stage、説明: Stages of the sales process、アクセスレベル 3 = Client+Org、削除可、高ボリュームではない)に格納されるマスタです。専用のビジネスロジッククラス(MSalesStage)は存在せず、自動生成クラス X_C_SalesStage(281行)のみが提供されます。したがって beforeSave / afterSave などのカスタムロジックはコア側に実装されていません。

営業ステージ側にロジックが無い一方、値を利用する側(営業案件)に Callout が置かれている点がこのマスタの特徴です。

classDiagram
    class X_C_SalesStage {
        <<generated>>
        +setProbability(BigDecimal)
        +getProbability() BigDecimal
        +setIsClosed(boolean)
        +isClosed() boolean
        +setIsWon(boolean)
        +isWon() boolean
        +getKeyNamePair() KeyNamePair
    }
    class PO {
        <<abstract>>
    }
    class MOpportunity {
        +beforeSave() boolean
    }
    class CalloutOpportunity {
        +salesStage(...) String
    }
    X_C_SalesStage --|> PO
    MOpportunity --> X_C_SalesStage : references
    CalloutOpportunity --> X_C_SalesStage : reads Probability

<> +setProbability(BigDecimal) +getProbability() BigDecimal +setIsClosed(boolean) +isClosed() boolean +setIsWon(boolean) +isWon() boolean +getKeyNamePair() KeyNamePair <> +beforeSave() boolean +salesStage(...) String

パッケージ: org.compiere.model ソースファイル: org.adempiere.base/src/org/compiere/model/X_C_SalesStage.java(生成クラス) Callout: org.adempiere.base.callout/src/org/compiere/model/CalloutOpportunity.java

カラム名必須説明備考
C_SalesStage_IDIDPK営業ステージID主キー
C_SalesStage_UUUUID(36)NUUID
AD_Client_IDTableDirectYクライアント既定値 @#AD_Client_ID@
AD_Org_IDTableDirectY組織既定値 @#AD_Org_ID@
ValueString(60)Y検索キー識別子
NameString(60)Y名称識別子
DescriptionString(255)N説明
ProbabilityAmount(10)Y可能性(%)営業案件へ Callout で転記
IsClosedYesNoYクローズステータス既定値 N
IsWonYesNoN成約(Won)
IsActiveYesNoY有効既定値 Y
テーブル役割備考
C_Opportunity営業案件C_SalesStage_ID で参照。Callout 設定列
C_SalesStage_Trl翻訳Name / Description の多言語化
erDiagram
    C_SalesStage ||--o{ C_Opportunity : "stage of"
    C_SalesStage ||--o{ C_SalesStage_Trl : "translations"
    C_Opportunity ||--o{ C_ContactActivity : "activities"
    C_Opportunity }o--|| C_BPartner : "customer"
    C_Opportunity }o--o| C_Order : "converted to"

stage of converted to

  • モデルクラスのカスタムロジックなし: C_SalesStage には M クラスが存在せず、X_C_SalesStagePO を直接継承します。保存時の追加検証は行われません(可能性の 0〜100 範囲チェックなども標準では未実装です)。
  • CalloutOpportunity.salesStage: 営業案件の C_SalesStage_ID 列に登録された Callout です。処理は SELECT Probability FROM C_SalesStage WHERE C_SalesStage_ID = ? を実行し、取得値を mTab.setValue("Probability", probability) で案件の可能性欄へセットします。isCalloutActive() または値が null の場合は何もしません。
  • MOpportunity.beforeSave(): ステージそのものではなく案件側の処理ですが、C_Order_ID が設定されている場合に受注伝票の GrandTotalOpportunityAmt へ上書きします。ステージ設計と併せて把握しておくべき挙動です。

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

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

ステージ遷移の制約や可能性の値域チェックは Model Validator で追加できます。

public class CustomSalesStageValidator implements ModelValidator {
@Override
public int modelChange(PO po, int type) throws Exception {
if (po instanceof X_C_SalesStage) {
X_C_SalesStage stage = (X_C_SalesStage) po;
if (type == TYPE_BEFORE_NEW || type == TYPE_BEFORE_CHANGE) {
// 例: 可能性は 0〜100 に限定
BigDecimal p = stage.getProbability();
if (p != null && (p.signum() < 0 || p.compareTo(Env.ONEHUNDRED) > 0)) {
throw new AdempiereException("可能性は0〜100の範囲で入力してください");
}
// 例: Won を立てるならクローズも必須
if (stage.isWon() && !stage.isClosed()) {
throw new AdempiereException("Won のステージはクローズステータスも ON にしてください");
}
}
}
return null;
}
}

C_Opportunity.C_SalesStage_ID 列の Callout 欄には標準で org.compiere.model.CalloutOpportunity.salesStage が設定されています。独自 Callout を追加する場合は、AD_Column の Callout 欄にセミコロン区切りで追記します(既存の記述を消さないでください)。ステージ選択時に予定クローズ日付を自動計算する、といった拡張に向いています。

営業ステージウィンドウには標準の関連プロセス(ボタン起動のプロセス)は定義されていません。


営業ステージの遷移ルールやパイプライン集計の基準は、Model Validator と独自 Callout でコア改変なしに業務へ合わせられます。

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

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