処置プランフレームワークの使用
手順が正しい順序で実行され、価格設定が見積に一貫して適用されるようにするには、新しい手順プランを作成します。
必要なエディション
| 使用可能なインターフェース: Lightning Experience |
| 使用可能なエディション: Revenue Cloud の Enterprise Edition、Performance Edition、Unlimited Edition、および Developer Edition (Salesforce 価格設定が有効) |
| 必要なユーザー権限 | |
|---|---|
| 処置プラン定義を作成および更新する | 処置計画アクセス および Salesforce 価格設定設計時間ユーザー |
| 価格設定手順を作成、更新、および削除する | 処置計画アクセス または Salesforce 価格設定設計時間ユーザー |
| 価格設定手順を使用する | Salesforce 価格設定ランタイムユーザー |
| Apex クラスの定義、編集、削除、セキュリティの設定、およびバージョンの設定を行う | 「Apex 開発」 |
航空会社で働き、出張者をサポートするとします。それでは、フライトを予約しましょう!価格設定にリアルタイムの市況を反映し、顧客の現地通貨で価格を表示する。
価格を計算する前に、競争力のある価格設定になるように外部システムから動的基本運賃を自動的に取得します。また、予約プラットフォームの割引が適用され、利便性料金が追加されます。
手順プランを作成したら、見積を作成します。次に、ユーザーの場所 (インドなど) に基づいて、合計金額を米ドルからインドルピーに換算します。
開始する前に、次のことを確認します。
- Salesforce 価格設定を有効にしている。
- 処置、処置プラン、商品、見積を作成する権限がある。
- 価格設定手順の作成方法を理解します。価格設定手順についての詳細は、「Salesforce 価格設定を使用した価格設定手順の作成」を参照してください。
- コンテキスト定義の使用方法を理解します。コンテキスト定義についての詳細は、「コンテキスト定義」を参照してください。
- 価格設定手順と手順プランで同じコンテキスト定義を使用します。
手順プラン定義は、特にApexクラスや異なる価格設定手順が含まれる場合、複雑になる可能性があります。次の手順に従って見積を作成し、手順自体を複雑にすることなく価格設定を動的かつ正確にする方法について説明します。
価格設定の手順プランオーケストレーションの有効化
- [設定] から、[クイック検索] ボックスに「収益設定」と入力し、[収益設定] を選択します。
- [Procedure Plan Orchestration for Pricing (価格設定のプロシージャプランオーケストレーション)] を見つけて有効にします。
- [Exclude Default and Sales Transaction Type Pricing Procedures (デフォルトおよび販売トランザクション種別の価格設定手順を除外)] を見つけて有効にします。
商業商品の作成
- アプリケーションランチャーで、[商品] を見つけて選択します。
-
「Delhi - New York」 (デリー - ニューヨーク) という商業商品を作成します。
商品の作成方法については、「シンプル商品の作成」を参照し、商品レコードタイプが [商業] に設定されていることを確認します。
- 商品をカタログに追加し、その価格表エントリを作成します。
- [設定] から、[クイック検索] ボックスで [Salesforce 価格設定] を検索して選択します。
- [Sync Pricing Data (価格設定データを同期)] セクションで、[同期] をクリックします。
価格設定手順の作成
-
価格設定手順を作成し、「Flight Booking Pricing Procedure」 (フライト予約価格設定手順) という名前を付けます。
価格設定手順を作成するには、「価格設定手順の設定」の最初の 5 つの手順に従います。
-
定数を作成します。これらの定数は、価格設定手順の固定値のプレースホルダーとして機能します。
定数名 データ型 デフォルト値 AdjType TEXT パーセント AdjValue NUMBER 5 上書き TEXT 上書き ConvFeeAdjType TEXT Amount ConvFeeAdjValue NUMBER -250 - 次の要素を追加します。
-
最初の手動割引要素は、フライトの動的基本運賃を計算するために追加されます。次の変数を対応付けます。
- 入力変数
- 調整種別: 上書き
- 調整値: PartnerUnitPrice
- Quantity: LineItemQuantity
- 入力単価: ListPrice
- 出力変数
- 正味単価: NetUnitPrice
- 入力変数
-
2 番目の手動割引要素は、フライト予約のプラットフォーム割引を計算するために追加されます。次の変数を対応付けます。
- 入力変数
- 調整種別: AdjType
- 調整値: AdjValue
- Quantity: LineItemQuantity
- 入力単価: PartnerUnitPrice
- 出力変数
- 正味単価: NetUnitPrice
- 入力変数
-
また、最後の [手動割引] 要素を追加して、フライト予約で顧客に請求する利便性料金を計算します。
- 入力変数
- 調整種別: ConvFeeAdjType
- 調整値: ConvFeeAdjValue
- Quantity: LineItemQuantity
- 入力単価: NetUnitPrice
- 出力変数
- 正味単価: NetUnitPrice
- 入力変数
- 価格設定情報、プロファイルアクセス権、ランク情報を表示するように個人設定を定義します。
- 手順を保存します。
- 手順を有効化します。
手順は次のようになります。わかりやすくするために、実行する価格設定の計算を示すために各手動割引要素の名前が変更されました。要素の名前を変更するには、 をクリックし
て目的の名前を入力します。

Apex フックのクラスの定義
- [設定] から、[クイック検索] ボックスに「Apex」と入力し、[Apex クラス] を選択します。
- [新規] をクリックします。
-
最初の Apex クラスは、外部データベースから価格設定を実行する前に、価格設定コンテキストからすべてのセールス取引品目を取得し、その PartnerUnitPrice タグを 990 ~ 1200 の動的なランダム基本運賃で上書きする事前フックです。
public class DynamicFlightBasePriceApex implements RevSignaling.SignalingApexProcessor { public RevSignaling.TransactionResponse execute(RevSignaling.TransactionRequest request) { System.debug('Executing PREHOOK'); String contextId = request.ctxInstanceId; Context.IndustriesContext industriesContext = new Context.IndustriesContext(); //Query SalesTransactionItem nodes Map<String, Object> inputQueryItem = new Map<String, Object>{ 'contextId' => contextId, 'tags' => new List<String>{ 'SalesTransactionItem' } }; Map<String, Object> itemQueryOutput = industriesContext.queryTags(inputQueryItem); Map<String, Object> itemQueryResult = (Map<String, Object>)itemQueryOutput.get('queryResult'); List<Object> itemData = (List<Object>) itemQueryResult.get('SalesTransactionItem'); System.debug('QLI itemData=' + itemData); // Generate random price between 990 and 1200 Decimal minPrice = 990; Decimal maxPrice = 1200; Decimal range = maxPrice - minPrice; // Use Crypto.getRandomInteger() to generate a secure random number Integer randomInt = Math.abs(Crypto.getRandomInteger()); Decimal randomPrice = minPrice + Math.mod(randomInt, range.intValue() + 1); System.debug('Generated Random Price: ' + randomPrice); // STEP 3 - Build update list List<Map<String, Object>> itemNodeUpdates = new List<Map<String, Object>>(); for (Object itemObj : itemData) { Map<String, Object> itemNode = (Map<String, Object>) itemObj; List<Object> dataPath = (List<Object>) itemNode.get('dataPath'); System.debug('Full item dataPath: ' + JSON.serialize(dataPath)); dataPath.remove(0); // Remove contextId itemNodeUpdates.add(new Map<String, Object>{ 'nodePath' => new Map<String, Object>{ 'dataPath' => dataPath }, 'attributes' => new List<Object>{ new Map<String, Object>{ 'attributeName' => 'PartnerUnitPrice', 'attributeValue' => randomPrice } } }); } // STEP 4 - Submit context update if (!itemNodeUpdates.isEmpty()) { Map<String, Object> updateInput = new Map<String, Object>{ 'contextId' => contextId, 'nodePathAndAttributes' => itemNodeUpdates }; System.debug('--- PREHOOK: SUBMITTING CONTEXT UPDATE ---'); System.debug(JSON.serializePretty(updateInput)); industriesContext.updateContextAttributes(updateInput); } // Return the response RevSignaling.TransactionResponse response = new RevSignaling.TransactionResponse(); response.status = RevSignaling.TransactionStatus.SUCCESS; response.message = 'Apex executed successfully with Random Price: ' + randomPrice; return response; } } -
別の Apex クラスを作成します。
この Apex クラスは、価格設定後に NetUnitPrice タグを取得し、シミュレートされた動的換算レート (85 ~ 86) を使用してローカル通貨の INR (インドルピー) に変換するポストフックです。次に、販売取引品目の説明を新しい INR 運賃で更新し、インドの顧客にローカライズされた価格設定の表示を提供します。
public class ConvertFareToINRApex implements RevSignaling.SignalingApexProcessor { public RevSignaling.TransactionResponse execute(RevSignaling.TransactionRequest request) { System.debug('Executing POSTHOOK'); String contextId = request.ctxInstanceId; Context.IndustriesContext industriesContext = new Context.IndustriesContext(); //Query SalesTransactionItem nodes Map<String, Object> inputQueryItem = new Map<String, Object>{ 'contextId' => contextId, 'tags' => new List<String>{ 'SalesTransactionItem' } }; Map<String, Object> itemQueryOutput = industriesContext.queryTags(inputQueryItem); Map<String, Object> itemQueryResult = (Map<String, Object>)itemQueryOutput.get('queryResult'); List<Object> itemData = (List<Object>) itemQueryResult.get('SalesTransactionItem'); System.debug('QLI itemData=' + itemData); //Query NetUnitPrice nodes Map<String, Object> inputQueryItem2 = new Map<String, Object>{ 'contextId' => contextId, 'tags' => new List<String>{ 'NetUnitPrice' } }; Map<String, Object> itemQueryOutput2 = industriesContext.queryTags(inputQueryItem2); Map<String, Object> itemQueryResult2 = (Map<String, Object>)itemQueryOutput2.get('queryResult'); List<Object> itemData2 = (List<Object>) itemQueryResult2.get('NetUnitPrice'); System.debug('NetUnitPrice itemData=' + itemData2); Map<String, Object> netUnitTagData = (Map<String, Object>) itemData2.get(0); Decimal netUnitPrice = (Decimal) netUnitTagData.get('tagValue'); netUnitPrice = netUnitPrice.setScale(2); System.debug('NetUnitPrice Tag Value=' + netUnitPrice); // Generate random price between 85.00 and 86.00 with decimals Decimal minPrice = 85.00; Decimal maxPrice = 86.00; Decimal range = maxPrice - minPrice; Integer randomInt = Math.abs(Crypto.getRandomInteger()); Integer randomDecimalInt = Math.mod(randomInt, 100); Decimal randomFraction = Decimal.valueOf(randomDecimalInt) / 100; Decimal usdToInrRate = minPrice + randomFraction; if (usdToInrRate > maxPrice) { usdToInrRate = maxPrice; } // Calculate NetUnitPrice in INR Decimal fareInInr = (netUnitPrice * usdToInrRate).setScale(2); String fareMessage = 'The Flight fare in INR is: ' + fareInInr + ' (USD ' + netUnitPrice + ' at rate ' + usdToInrRate + ')'; System.debug(fareMessage); // STEP 3 - Build update list List<Map<String, Object>> itemNodeUpdates = new List<Map<String, Object>>(); for (Object itemObj : itemData) { Map<String, Object> itemNode = (Map<String, Object>) itemObj; List<Object> dataPath = (List<Object>) itemNode.get('dataPath'); System.debug('Full item dataPath: ' + JSON.serialize(dataPath)); dataPath.remove(0); // Remove contextId itemNodeUpdates.add(new Map<String, Object>{ 'nodePath' => new Map<String, Object>{ 'dataPath' => dataPath }, 'attributes' => new List<Object>{ new Map<String, Object>{ 'attributeName' => 'SalesTrxnItemDescription', 'attributeValue' => fareMessage } } }); } // STEP 4 - Submit context update if (!itemNodeUpdates.isEmpty()) { Map<String, Object> updateInput = new Map<String, Object>{ 'contextId' => contextId, 'nodePathAndAttributes' => itemNodeUpdates }; System.debug('--- PREHOOK: SUBMITTING CONTEXT UPDATE ---'); System.debug(JSON.serializePretty(updateInput)); industriesContext.updateContextAttributes(updateInput); } // Return the response RevSignaling.TransactionResponse response = new RevSignaling.TransactionResponse(); response.status = RevSignaling.TransactionStatus.SUCCESS; response.message = 'Apex executed successfully with Price in INR: ' + fareInInr; return response; } }
カスタム処置計画定義の設定
- [設定] の [クイック検索] ボックスで、[処置プラン定義] を検索して選択します。
- [新規] をクリックします。
-
詳細を指定します。
-
タイトル: Flight Booking Procedure Plan (フライト予約手順計画)。
Tab キーを押して開発者名を自動入力します。
- プロセス種別: Revenue Cloud。
- 主オブジェクト: 見積。
-
コンテキスト定義: <コンテキスト定義名>。
使用事例に合わせて設計されたコンテキスト定義を選択する必要があります。ただし、これは価格設定手順の作成時に使用したコンテキスト定義と同じであることを確認してください。
- 変更内容を保存します。
-
タイトル: Flight Booking Procedure Plan (フライト予約手順計画)。
- 新しく作成した処置計画定義レコードを開きます。
- [処置プラン] セクションに必要な処置を追加するには、[追加] を選択します。
-
最初のセクションを追加して、フライトの動的基本価格を取得します。詳細を指定します。
- 種別: 標準。
- 名前: DynamicBasePriceApex。
- セクション種別: Apex。
-
セクションを追加したら、[
] をクリックして次の詳細を指定します。
- フェーズ: 価格設定
- 解決種別: デフォルト
- Apex: DynamicFlightBasePriceApex
次のようになります。
-
同様に、価格設定の計算を実行する別のセクションを追加し、Apex 事前フックを使用して生成した価格で基本価格を上書きします。次の値を指定します。
- 種別: 標準。
- 名前: FlightPriceCalculation。
- セクション種別: 価格設定手順。
-
[
] をクリックし、次の詳細を指定します。
- フェーズ: 価格設定
- 解決種別: デフォルト
- 手順: Flight_Booking_Pricing_Procedure
-
最後に、[国(請求先)] が [インド] に設定されているユーザー向けに次の Apex ポストフックを追加して、価格を米ドルからインドルピー (米ドルからインドルピー) に変換するセクションを追加します。
- 種別: 標準。
- 名前: ConvertFareToINR。
- セクション種別: Apex。
-
[
] をクリックし、次の詳細を指定します。
- フェーズ: 価格設定
- 解決種別: ルールベース
- 条件の要件: すべての条件に一致 (AND)
- リソース: 国(請求先)
- 演算子: 次の文字列と一致する
- 出力値: India
- Apex: ConvertFareToINRApex
- 処置プラン定義を保存して有効化します。
処置計画の実行の確認
処置プランが設定された順序で実行され、価格設定が正確かどうかを確認するには、見積を作成する必要があります。
-
見積を作成します。
[国(請求先)] フィールドに「インド」と入力します。
- 変更内容を保存します。
- [Browse Catalogs (カタログを参照)] をクリックし、[Delhi - New York (デリー - ニューヨーク)] 商品を見積に追加します。
-
[正味単価] の値にマウスポインターを置くと、価格ウォーターフォールの詳細が表示されます。
処置プランの適用と、価格設定手順で設定した割引および追加が表示されます。
-
見積品目の換算レートを表示するには、見積品目行
の をクリックし、[表示] を選択します。
-
[品目の説明] には、フライトのローカライズされた価格が表示されます。
この記事で問題は解決されましたか?
ご意見をお待ちしております。

