절차 계획 프레임워크 사용
절차가 올바른 순서로 실행되고 가격 책정이 견적서에 일관되게 적용되도록 새 절차 계획을 만듭니다.
필수 Edition
| 제공 제품: Lightning Experience |
| 지원 제품: Salesforce 가격 책정이 활성화된 Revenue Cloud의 Enterprise, Performance, Unlimited 및 Developer Edition |
| 필요한 사용자 권한 | |
|---|---|
| 절차 계획 정의 만들기 및 업데이트: | 절차 계획 액세스 AND Salesforce 가격 책정 설계 시간 사용자 |
| 가격 책정 절차 만들기, 업데이트, 삭제: | 절차 계획 액세스 OR Salesforce 가격 책정 설계 시간 사용자 |
| 가격 책정 절차 사용: | Salesforce 가격 책정 실행 시간 사용자 |
| Apex 클래스의 버전 설정 정의, 편집, 삭제, 보안 설정 및 설정 | 작성자 Apex |
항공사에서 근무하고 비즈니스 여행자를 지원한다고 가정해 보겠습니다. 이제 비행기를 예약합니다. 가격 책정은 실시간 시장 상황을 반영하고 고객의 현지 통화로 가격을 표시하려고 합니다.
가격을 계산하기 전에 경쟁 가격 책정을 위해 외부 시스템에서 동적 기본 요금을 자동 가져옵니다. 또한 예약 플랫폼의 할인을 적용하고 편의 수수료를 추가합니다.
절차 계획을 구축하면 견적서가 생성됩니다. 그런 다음 사용자의 위치(예: 인도)를 기반으로 총액을 USD에서 INR로 변환합니다.
시작하기 전에 다음을 확인하십시오.
- Salesforce 가격 책정을 활성화했습니다.
- 절차, 절차 계획, 제품, 견적서를 만들 수 있는 권한이 있습니다.
- 가격 책정 절차를 만드는 방법을 이해합니다. 가격 책정 절차에 대한 자세한 내용은 Salesforce 가격 책정을 사용하여 가격 책정 절차 구축을 참조하십시오.
- 컨텍스트 정의를 이해하고 사용하는 방법을 알고 있습니다. 컨텍스트 정의에 대해 자세히 알아보려면 컨텍스트 정의를 참조하십시오.
- 가격 책정 절차 및 절차 계획 전체에서 동일한 컨텍스트 정의를 사용합니다.
절차 계획 정의는 특히 Apex 클래스와 다른 가격 책정 절차를 포함할 때 복잡할 수 있습니다. 다음 단계에 따라 견적서를 만들고 절차 자체를 복잡하게 만들지 않고 가격 책정을 동적이고 정확하게 만드는 방법을 알아봅니다.
가격 책정을 위한 절차 계획 오케스트레이션 활성화
- 설정에서 빠른 찾기 상자에 매출 설정을 입력한 다음, 매출 설정을 선택합니다.
- 가격 책정을 위한 절차 계획 오케스트레이션을 찾아서 활성화합니다.
- 기본 및 세일즈 트랜잭션 유형 가격 책정 절차 제외를 찾아서 활성화합니다.
상업 제품 만들기
- 앱 시작 관리자에서 제품을 찾아서 선택합니다.
-
델리 - 뉴욕이라는 상업 제품을 만듭니다.
제품을 만드는 방법을 알아보려면 간단한 제품 만들기를 참조하고 제품 레코드 유형이 상업으로 설정되어 있는지 확인하십시오.
- 카탈로그에 제품을 추가하고 해당 제품에 대한 가격 목록 항목을 만듭니다.
- 설정에서 빠른 찾기 상자에서 Salesforce 가격 책정 설정을 검색하여 선택합니다.
- 가격 책정 데이터 동기화 섹션에서 동기화를 클릭합니다.
가격 책정 절차 구축
-
가격 책정 절차를 만들고 이름을 예약 가격 책정 절차로 지정합니다.
가격 책정 절차를 만들려면 가격 책정 절차 구성의 첫 5단계를 따르십시오.
-
상수를 만듭니다. 해당 상수는 가격 책정 절차에서 고정 값의 자리 표시자로 사용됩니다.
상수 이름 데이터 유형 Default Value(기본값) AdjType TEXT 퍼센트 AdjValue 숫자 5 재정의 TEXT 재정의 ConvFeeAdjType TEXT 금액 ConvFeeAdjValue 숫자 -250 - 다음 요소를 추가합니다.
-
첫 번째 수동 할인 요소가 추가되어 비행의 동적 기본 요금을 계산합니다. 다음 변수를 매핑합니다.
- 입력 변수
- 조정 유형: 오버라이드
- 조정 값: PartnerUnitPrice
- 수량: LineItemQuantity
- 입력 단가: 목록가격
- 출력 변수
- 순 단가: NetUnitPrice
- 입력 변수
-
두 번째 수동 할인 요소가 추가되어 비행 예약에 대한 플랫폼 할인을 계산합니다. 다음 변수를 매핑합니다.
- 입력 변수
- 조정 유형: AdjType
- 조정 값: AdjValue
- 수량: LineItemQuantity
- 입력 단가: PartnerUnitPrice
- 출력 변수
- 순 단가: NetUnitPrice
- 입력 변수
-
마지막 수동 할인 요소는 비용을 청구하는 편의 요금을 계산하기 위해 추가되며,
- 입력 변수
- 조정 유형: ConvFeeAdjType
- 조정 값: ConvFeeAdjValue
- 수량: LineItemQuantity
- 입력 단가: NetUnitPrice
- 출력 변수
- 순 단가: NetUnitPrice
- 입력 변수
- 기본 설정을 설정하여 가격 책정 정보, 프로필 액세스 및 순위 정보를 봅니다.
- 절차를 저장합니다.
- 절차를 활성화합니다.
절차는 다음과 같이 표시됩니다. 명확성을 위해 수행할 가격 책정 계산을 표시하도록 각 수동 할인 요소의 이름이 변경되었습니다. 요소의 이름을 변경하려면
을 클릭하고 원하는 이름을 입력합니다.

Apex 후크의 클래스 정의
- 설정에서 빠른 찾기 상자에 Apex를 입력한 다음, Apex 클래스를 선택합니다.
- 새로 만들기를 클릭합니다.
-
첫 번째 Apex 클래스는 가격 책정 컨텍스트에서 모든 세일즈 트랜잭션 항목을 가져오고 외부 데이터베이스에서 가격 책정을 실행하기 전에 동적 무작위 기본 요금(990~1200)으로 PartnerUnitPrice 태그를 재정의하는 프리후크입니다.
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.
탭을 눌러 개발자 이름을 자동으로 채웁니다.
- 프로세스 유형: Revenue Cloud.
- 주 목적: 견적서.
-
컨텍스트 정의: <Context 정의 이름>.
사용 사례에 맞게 설계된 컨텍스트 정의를 선택해야 합니다. 그러나 가격 책정 절차를 구축할 때 사용한 컨텍스트 정의와 동일해야 합니다.
- 변경 사항을 저장합니다.
-
제목: Flight Booking Procedure Plan.
- 새로 생성된 절차 계획 정의 레코드를 엽니다.
- 절차 계획 섹션에 원하는 절차를 추가하려면 추가를 선택합니다.
-
첫 번째 섹션을 추가하여 비행의 동적 기본 가격을 확인합니다. 다음 세부 사항을 지정합니다.
- 유형: 표준.
- 이름: DynamicBasePriceApex.
- 섹션 유형: Apex.
-
섹션이 추가되면
를 클릭하고 다음 세부 사항을 지정합니다.
- 단계: 가격 책정
- 해상도 유형: 기본값
- Apex: DynamicFlightBasePriceApex
다음과 같이 표시됩니다.
-
마찬가지로 다른 섹션을 추가하여 가격 책정을 계산하고 Apex 프리후크를 사용하여 생성한 가격으로 기본 가격을 재정의합니다. 다음 값을 지정합니다.
- 유형: 표준.
- 이름: FlightPriceCalculation.
- 섹션 유형: 가격 책정 절차 .
-
를 클릭하고 다음 세부 사항을 지정합니다.
- 단계: 가격 책정
- 해상도 유형: 기본값
- 절차: Flight_Booking_Pricing_Procedure
-
마지막으로, 청구지 국가가 인도로 설정된 사용자를 위해 이 Apex 포스트후크를 추가하여 가격을 USD에서 INR로 변환하는 섹션을 추가합니다.
- 유형: 표준.
- 이름: ConvertFareToINR.
- 섹션 유형: Apex.
-
를 클릭하고 다음 세부 사항을 지정합니다.
- 단계: 가격 책정
- 해결 유형: 규칙 기반
- 조건 요구 사항: 모든 조건 충족 (AND)
- 자원: 청구지 국가
- 연산자: Equals
- 출력 값: 인도
- Apex: ConvertFareToINRApex
- 저장한 다음, 절차 계획 정의를 활성화합니다.
절차 계획 실행 확인
설정한 순서대로 절차 계획이 실행되고 가격이 정확한지 확인하려면 견적서를 만들어야 합니다.
-
견적서 작성
청구지 국가 필드에 인도를 입력합니다.
- 변경 사항을 저장합니다.
- 캐탈로그 찾아보기 를 클릭하고 Delhi - New York 제품을 견적서에 추가합니다.
-
순 단가 값 위로 마우스를 이동하면 가격 폭포 세부 사항이 표시됩니다.
절차 계획의 적용과 가격 책정 절차에서 구성한 할인 및 추가 항목을 확인할 수 있습니다.
-
견적서 행 항목의 변환된 요금을 보려면 견적서 행 항목 행
에서 을 클릭하고 보기를 선택합니다.
-
행 항목 설명에 비행의 현지화된 가격이 표시됩니다.
이 기사를 통해 문제를 해결했습니까?
개선을 위한 의견을 보내주세요.

