고급 트랜잭션 세부 사항 행 가격 책정을 사용하여 사용자 정의 필드 매핑
사용자는 고급 세부 사항 라인 가격 책정 기능을 사용하여 가격 책정 절차를 통해 세일즈 트랜잭션 항목 또는 세일즈 트랜잭션 항목 세부 사항에 대한 사용자 정의 필드를 업데이트할 수 있습니다. 이 기능을 사용하면 사용자가 더 이상 사용자 정의 트리거 또는 플로를 사용하여 해당 필드를 업데이트할 필요가 없습니다. 이 기능은 수정, 갱신, 취소 사용 사례에 유용합니다.
필수 Edition
| 지원 제품: Lightning Experience |
| 사용 가능 제품: 트랜잭션 관리가 활성화된 Revenue Cloud의 Enterprise, Unlimited 및 Developer Edition |
| 필요한 사용자 권한 | |
|---|---|
| 고급 세부 사항 행 가격 책정 설정 및 사용: | Salesforce 관리자 AND 가격 책정 설계 시간 사용자 권한 집합 |
시작하기 전에 다음 과업을 완료하십시오.
- 고급 세부 사항 라인 가격 책정 기능을 활성화하려면 설정에서 매출 설정을 찾아서 선택한 다음, 고급 세부 사항 라인 가격 책정 설정을 활성화합니다.
- 가격 책정 절차를 구성합니다.
- JSON을 사용하여 가격 책정 절차 매핑 행 항목 요소에 컨텍스트 태그 매핑 추가
고급 세부 사항 행 가격 책정을 사용하도록 가격 책정 절차를 구성하려면 매핑 행 항목 JSON을 복사하여 매출 가격 책정의 가격 책정 절차에 붙여 넣습니다. - JSON을 사용하여 검색 절차 매핑 행 항목 요소에 컨텍스트 태그 매핑 추가
파생 가격 책정 제품에 고급 세부 사항 행 가격 책정을 사용하도록 검색 절차를 구성하려면 파생 가격 책정 JSON에 대한 지도 행 항목을 복사하여 매출 가격 책정의 검색 절차에 붙여넣습니다.
매출 가격 책정 절차 업데이트
고급 세부 사항 라인 가격 책정을 구성하려면 매출 가격 책정 절차를 수정합니다.
- 앱 시작 관리자에서 가격 책정 절차를 찾아서 선택한 다음, 업데이트할 가격 책정 절차를 선택합니다.
- 가격 책정 절차의 가격 책정 설정 옆에 있는 두 번째 요소로 새 지도 행 항목 요소를 추가하여 가격 책정 절차를 수정합니다.
-
맵 행 항목에 컨텍스트 태그 매핑을 추가합니다.
입력 변수
출력 변수
LineItem
SalesTrxnItemDetailSource
LineItemQuantity
ItemDetailQuantity
NetUnitPrice
ItemDetailNetUnitPrice
price_water_fall
DetailPriceWaterfallIdentifier
InputUnitPrice
ItemDetailUnitPrice
ItemBillingReference
ItemDetailBillingReference
ItemNetTotalPrice
ItemDetailTotalPrice
TotalLineAmount
ItemDetailTotalLineAmount
유효 시작
ItemDetailEffectiveFrom__std
효과
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 간의 기본 매핑이 표시됩니다.
파생 가격 책정 검색 절차 업데이트
파생 가격 책정을 사용하는 경우 매출 가격 책정 절차에 대한 변경 사항을 완료한 후 검색 절차를 추가로 변경합니다. 이러한 변경 사항은 유효한 기여 제품 및 파생 제품을 결정하는 데 필요합니다.
- 앱 시작 관리자에서 검색 절차를 찾아서 선택한 다음, 업데이트할 검색 절차를 선택합니다.
-
가격 파생 제품에 검색 절차에 검색 설정 및 행 항목 매핑의 두 가지 새로운 요소를 추가합니다.
검색 설정에 다음 변수를 추가합니다.
- 입력 변수: 행 항목
- 출력 변수: LineItem
지도 행 항목에 다음 변수를 추가합니다.- 입력 변수: SalesTransactionItem
- 출력 변수: SalesTransactionItemDetail
지도 행 항목에 다음의 추가 변수를 추가합니다.
입력 변수
출력 변수
LineItem
SalesTrxnItemDetailSource
유효 시작
ItemDetailEffectiveFrom__std
효과
ItemDetailEffectiveTo__std
DerivedPricingAttribute
ItemDetailDerivedPricingAttribute__std
-
ARC(수정, 갱신, 취소) 사용 사례에 가격 책정 절차를 사용하여 사용자 정의 필드를 지원합니다.
ARC API를 사용하고 사용자 정의 필드를 사용하려는 경우 사용자 정의 필드 설정을 사용할 수 있습니다.
- QuoteLineItem, QuoteLineItem Detail, OrderProduct, OrderProductDetails 개체에 사용자 정의 필드를 추가합니다.
- 컨텍스트 정의에서 SalesTransactionItem 및 SalesTransactionItemDetail 노드 모두에서 이러한 사용자 정의 필드에 대한 항목을 만듭니다.
- QuoteEntitiesMapping 및 OrderEntitiesMapping에서 필수 매핑을 만듭니다.
-
사용자 정의 필드에 대한 매출 가격 책정 절차를 수정합니다.
- 가격 책정 절차에서 SalesTransactionItem.CustomField와 SalesTransactionItemDetail.CustomField 간의 매핑을 추가하도록 MapLineItem 요소를 수정합니다.
-
가격 책정 절차 내에서 필요한 사용자 정의 요소를 만들어 SalesTransactionItem.CustomField에 값을 할당합니다.
가격 책정 절차는 특정 행에 세부 사항 항목이 있는지 자동으로 감지하고 세부 사항 항목이 있는 경우 SalesTransactionItemDetail.CustomField에 작성합니다. 그렇지 않으면 SalesTransactionItem.CustomField에 작성됩니다.
새 세일즈 트랜잭션 동안 SalesTransactionItem의 CustomField가 채워집니다. 세부 사항 행이 있는 ARC 시나리오의 경우 세부 사항 행은 SalesTransactionItemDetail의 CustomField에 작성됩니다. ARC에 대한 세부 사항 행이 생성되지 않은 경우 세부 사항 행은 SalesTransactionItem의 CustomField에 작성됩니다.
-
QuoteLineItem 또는 OrderProducts에 자세한 줄로 사용자 정의 필드를 작성하려면 절차 계획 및 Apex 클래스를 포함하는 이 추가 설정을 완료합니다.
- 절차 계획을 활성화합니다. 설정에서 매출 설정을 찾아서 선택하고 가격 책정용 절차 계획 오케스트레이션 설정을 활성화합니다.
- 견적 및 주문에 대한 절차 계획을 생성합니다.
- 절차 계획에서 모든 단계에 MapLineItem 요소가 포함되어 있는지 확인합니다. 가격 책정 절차에 사용된 필드를 기반으로 매핑
- 필요한 경우 여러 사용자 정의 필드를 업데이트하도록 향상할 수 있는 ApexCustomFieldHandler 클래스 예를 사용합니다. 이 클래스는 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;
}
}

