高度な取引詳細品目価格設定を使用したカスタム項目の対応付け
ユーザーは、高度な詳細品目価格設定機能を使用して、価格設定手順を通じて販売取引品目または販売取引品目の詳細のカスタム項目を更新できます。この機能を使用すると、ユーザーはカスタムトリガーやフローを使用してこれらの項目を更新する必要がなくなります。この機能は、修正、更新、キャンセルの使用事例に役立ちます。
必要なエディション
| 使用可能なインターフェース: Lightning Experience |
| 使用可能なエディション: トランザクション管理が有効になっている Revenue Cloud の Enterprise Edition、Unlimited Edition、および Developer Edition |
| 必要なユーザー権限 | |
|---|---|
| 高度な詳細品目価格を設定して使用する | Salesforce システム管理者 および 「価格設定設計時ユーザー」権限セット |
開始する前に、次の作業を完了します。
- Advanced Detail Line Pricing 機能を有効にするには、[設定] で [収益設定] を見つけて選択し、[Advanced Detail Line Pricing] 設定を有効にします。
- 価格設定手順を設定します。
- JSON を使用した価格設定手順マップ品目要素へのコンテキストタグの対応付けの追加
高度な詳細品目価格設定を使用する価格設定手順を設定するには、対応付け品目 JSON をコピーして [収益価格設定] の価格設定手順に貼り付けます。 - JSON を使用したディスカバリー手順マップ品目要素へのコンテキストタグの対応付けの追加
派生価格設定商品で高度な詳細品目価格設定を使用するように検出手順を設定するには、派生価格設定 JSON の対応付け品目をコピーして [収益価格設定] の検出手順に貼り付けます。
収益価格設定手順の更新
高度な詳細品目価格を設定するには、収益価格設定手順を変更します。
- アプリケーションランチャーから、[Pricing Procedures]を見つけて選択し、更新する価格設定手順を選択します。
- 価格設定手順の価格設定の横に 2 番目の要素として新しい地図品目要素を追加して、価格設定手順を変更します。
-
コンテキストタグの対応付けを地図品目に追加します。
入力変数
出力変数
LineItem
SalesTrxnItemDetailSource
LineItemQuantity
ItemDetailQuantity
NetUnitPrice
ItemDetailNetUnitPrice
price_water_fall
DetailPriceWaterfallIdentifier
InputUnitPrice
ItemDetailUnitPrice
ItemBillingReference
ItemDetailBillingReference
ItemNetTotalPrice
ItemDetailTotalPrice
TotalLineAmount
ItemDetailTotalLineAmount
EffectiveFrom
ItemDetailEffectiveFrom__std
EffectiveTo
ItemDetailEffectiveTo__std
PricingTermCount
ItemDetailPricingTermCount__std
itemTransientEndDate
ItemDetailTransientEndDate__std
ItemPricingSource
ItemDetailPricingSource__std
DerivedPricingAttribute
ItemDetailDerivedPricingAttribute__std
ItemGroupSummarySubtotal
ItemDetailGroupSummaryTotal__std
ListPrice
ItemDetailListPrice__std
IsContracted
ItemDetailIsContracted__std
ItemContractPrice
ItemDetailContractPrice__std
STI_TenantName__c
STID_TenantName__c
コンテキストタグの対応付けを追加すると、SalesTransaction と SalesTransactionItemDetail 間のデフォルトの対応付けと更新されたコンテキスト定義が表示されます。
派生価格設定検出手順の更新
派生価格設定を使用している場合は、収益価格設定手順の変更を完了した後に検出手順をさらに変更します。これらの変更は、有効な貢献商品と派生商品を決定するために必要です。
- アプリケーションランチャーから、[Discovery Procedures (検出手順)] を見つけて選択し、更新する検出手順を選択します。
-
検出手順に 2 つの新しい要素 ([検出設定] と [Map Line Item (品目の対応付け)]) を追加して、派生商品の価格を設定します。
次の変数を検出設定に追加します。
- 入力変数: Line Item
- 出力変数: LineItem
次の変数を地図品目に追加します。- 入力変数: SalesTransactionItem
- 出力変数: SalesTransactionItemDetail
次の追加変数を対応付け品目に追加します。
入力変数
出力変数
LineItem
SalesTrxnItemDetailSource
EffectiveFrom
ItemDetailEffectiveFrom__std
EffectiveTo
ItemDetailEffectiveTo__std
DerivedPricingAttribute
ItemDetailDerivedPricingAttribute__std
-
修正、更新、キャンセル (ARC) の使用事例の価格設定手順を使用して、カスタム項目をサポートします。
カスタム項目の設定は、ARC API を使用し、カスタム項目を使用する場合に適用されます。
-
カスタム項目の収益価格設定手順を変更します。
- 価格設定手順で、SalesTransactionItem.CustomField と SalesTransactionItemDetail.CustomField 間の対応付けを追加するように MapLineItem 要素を変更します。
-
価格設定手順内で必要なカスタマイズ要素を作成し、値を SalesTransactionItem.CustomField に割り当てます。
価格設定手順では、特定の品目に詳細エントリがあるかどうかが自動的に検出され、存在する場合は SalesTransactionItemDetail.CustomField に書き込まれます。それ以外の場合は、SalesTransactionItem.CustomField に書き込まれます。
新規販売トランザクション中に、SalesTransactionItem の CustomField が入力されます。ARC シナリオに詳細行がある場合、詳細行は SalesTransactionItemDetail の CustomField に書き込まれます。ARC の詳細品目が作成されていない場合、詳細品目は SalesTransactionItem の CustomField に書き込まれます。
-
QuoteLineItem または OrderProducts に詳細行を含むカスタム項目を記述するには、プロシージャ プランと Apex クラスを含むこの追加の設定を実行します。
- 処置計画を有効にします。[設定] で、[収益設定] を見つけて選択し、[Procedure Plan Orchestration for Pricing (価格設定のプロシージャプランオーケストレーション)] 設定を有効にします。
- 見積と注文の手順プランを作成します。
- 処置計画で、すべてのステップに MapLineItem 要素が含まれていることを確認します。価格設定手順で使用されるフィールドに基づいてマッピングを変更します。
- 次の ApexCustomFieldHandler Apex クラスの例を使用します。必要に応じて、複数のカスタム項目を更新するように拡張できます。このクラスは SalesTransactionItem ノードと SalesTransactionItemDetail ノードを照会し、詳細項目からカスタム項目値を抽出して、SalesTransactionItem の対応するカスタム項目を更新します。
global class ApexCustomFieldHandler implements RevSignaling.SignalingApexProcessor {
public virtual class BaseException extends Exception {}
public class OtherException extends BaseException {}
public RevSignaling.TransactionResponse execute(RevSignaling.TransactionRequest request) {
String contextId = request.ctxInstanceId;
Context.IndustriesContext industriesContext = new Context.IndustriesContext();
// STEP 2 - Query SalesTransactionItem nodes
Map<String, Object> inputQueryItem = new Map<String, Object>{
'contextId' => contextId,
'tags' => new List<String>{ 'SalesTransactionItem', 'SalesTransactionItemDetail' }
};
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');
List<Object> itemDetailData = (List<Object>) itemQueryResult.get('SalesTransactionItemDetail');
Map<String, String> salesTransactionItemIdToCustomAggregatedValue = new Map<String, String>();
// STEP 3 - Custom Field Value from SalesTransactionItemDetail
for(Object itemDetailObj : itemDetailData) {
Map<String, Object> itemDetailNode = (Map<String, Object>) itemDetailObj;
Map<String, Object> detailTagMap = (Map<String, Object>) itemDetailNode.get('tagValue');
String lineItemId = (String)((Map<String, Object>) detailTagMap.get('SalesTrxnItemDetailParent')).get('tagValue');
String cfValue = (String)((Map<String, Object>) detailTagMap.get('STID_TenantName__c')).get('tagValue');
System.debug('Custom Field Value for Detail Item' + cfValue);
if(cfValue != null) {
salesTransactionItemIdToCustomAggregatedValue.put(lineItemId, cfValue);
}
}
// STEP 4 - 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;
Map<String, Object> tagMap = (Map<String, Object>) itemNode.get('tagValue');
String lineItemId = (String)((Map<String, Object>) tagMap.get('LineItem')).get('tagValue');
List<Object> dataPath = (List<Object>) itemNode.get('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' => 'STI_TenantName__c',
'attributeValue' => salesTransactionItemIdToCustomAggregatedValue.get(lineItemId)
}
}
});
}
// STEP 5 - Create collection context update
if (!itemNodeUpdates.isEmpty()) {
Map<String, Object> updateInput = new Map<String, Object>{
'contextId' => contextId,
'nodePathAndAttributes' => itemNodeUpdates
};
//Step 6 - Update context
System.debug('--- PREHOOK: SUBMITTING CONTEXT UPDATE ---');
System.debug(JSON.serializePretty(updateInput));
industriesContext.updateContextAttributes(updateInput);
}
RevSignaling.TransactionResponse response = new RevSignaling.TransactionResponse();
response.status = RevSignaling.TransactionStatus.SUCCESS;
return response;
}
}

