Você está aqui:
Usar a estrutura do plano de procedimento
Para garantir que seus procedimentos sejam executados na ordem correta e a precificação seja aplicada de modo consistente a uma cotação, crie um novo plano de procedimento.
Edições obrigatórias
| Disponível em: Lightning Experience |
| Disponível em: Edições Enterprise, Performance, Unlimited e Developer do Revenue Cloud em que a Precificação do Salesforce está habilitada |
| Permissões de usuário necessárias | |
|---|---|
| Para criar e atualizar definições de plano de procedimento: | Acesso ao plano de procedimento E Usuário do tempo de design de precificação do Salesforce |
| Para criar, atualizar e excluir procedimentos de precificação: | Acesso ao plano de procedimento OU Usuário do tempo de design de precificação do Salesforce |
| Para usar procedimentos de precificação: | Usuário do tempo de execução de precificação do Salesforce |
| Para definir, editar, excluir e definir a segurança e definir as configurações de versão para classes do Apex: | Criar Apex |
Imagine que você trabalhe em uma companhia aérea e ajude viajantes de negócios. Agora, vamos reservar um voo! Queremos que nossa precificação reflita as condições de mercado em tempo real e mostre os preços na moeda local do cliente.
Antes de calcular o preço, buscaremos automaticamente uma tarifa de base dinâmica de um sistema externo para garantir uma precificação competitiva. Também aplicaremos os descontos da plataforma de agendamento e adicionaremos uma taxa de conveniência.
Depois de criar nosso plano de procedimento, criaremos uma cotação. Em seguida, com base no local do usuário (por exemplo, Índia), converteremos o preço total de USD para INR.
Antes de começar, certifique-se de que:
- Habilitaram a Precificação do Salesforce.
- Tenha permissões para criar procedimentos, planos de procedimento, produtos e cotações.
- Entenda como criar procedimentos de precificação. Para saber mais sobre procedimentos de precificação, consulte Criar seus procedimentos de precificação usando a Precificação do Salesforce.
- Entenda e saiba como usar Definições de contexto. Para aprender mais sobre definições de contexto, consulte Definições de contexto.
- Use a mesma definição de contexto em seus planos de procedimento e procedimentos de precificação.
As definições de plano de procedimento podem ser complexas, especialmente quando envolvem classes do Apex e diferentes procedimentos de precificação. Siga estas etapas para criar uma cotação e aprender a tornar sua precificação dinâmica e precisa sem complicar o próprio procedimento.
Ativar orquestração do plano de procedimento para precificação
- Em Configuração, na caixa Busca rápida, insira Configurações de receita e selecione Configurações de receita.
- Localize e habilite a Orquestração de plano de procedimento para precificação.
- Localize e habilite Excluir procedimentos de precificação padrão e tipo de transação de vendas.
Criar um produto comercial
- No Iniciador de aplicativos, localize e selecione Produtos.
-
Crie um produto comercial chamado Deli - Nova York.
Para aprender a criar um produto, consulte Criar produtos simples e certifique-se de que o Tipo de registro do produto esteja definido como Comercial.
- Adicione seu produto ao catálogo e crie uma entrada do catálogo de preços para ele.
- Em Configuração, na caixa Busca rápida, pesquise e selecione Configuração de precificação do Salesforce.
- Na seção Sincronizar dados de precificação, clique em Sincronizar.
Criar seu procedimento de precificação
-
Crie um procedimento de precificação e dê a ele o nome Procedimento de precificação de reserva de voo.
Para criar um procedimento de precificação, siga as 5 primeiras etapas em Configurar seu procedimento de precificação.
-
Criar constantes. Essas constantes servirão como espaços reservados para valores fixos em seu procedimento de precificação.
Nome constante Tipo de dados Valor padrão AdjType TEXT Porcentagem AdjValue NÚMERO 5 Substituição TEXT Substituição ConvFeeAdjType TEXT Valor ConvFeeAdjValue NÚMERO -250 -
Adicione os seguintes elementos.
- Configuração de preço
- Preço de lista. Use a tabela de decisão de entradas do catálogo de preços V2.
- Descontos manuais. Você precisará adicionar três elementos de desconto manual.
-
O primeiro elemento Desconto manual é adicionado para calcular a tarifa de base dinâmica do voo. Mapeie essas variáveis.
- Variáveis de entrada
- Tipo de ajuste: Substituição
- Valor de ajuste: PartnerUnitPrice
- Quantidade: LineItemQuantity
- Preço unitário de entrada: ListPrice
- Variável de saída
- Preço unitário líquido: NetUnitPrice
- Variáveis de entrada
-
O segundo elemento Desconto manual é adicionado para calcular o desconto de plataforma para o agendamento de voo. Mapeie essas variáveis.
- Variáveis de entrada
- Tipo de ajuste: AdjType
- Valor de ajuste: AdjValue
- Quantidade: LineItemQuantity
- Preço unitário de entrada: PartnerUnitPrice
- Variável de saída
- Preço unitário líquido: NetUnitPrice
- Variáveis de entrada
-
O último elemento Desconto manual é adicionado para calcular a taxa de conveniência para cobrar seu cliente pelo agendamento de voo.
- Variáveis de entrada
- Tipo de ajuste: ConvFeeAdjType
- Valor de ajuste: ConvFeeAdjValue
- Quantidade: LineItemQuantity
- Preço unitário de entrada: NetUnitPrice
- Variável de saída
- Preço unitário líquido: NetUnitPrice
- Variáveis de entrada
- Defina suas preferências para visualizar informações de precificação, acesso ao perfil e informações de classificação.
- Salve seu procedimento.
- Ative seu procedimento.
Seu procedimento deve ter a seguinte aparência. Por motivos de clareza, alteramos o nome de cada elemento Desconto manual para mostrar o cálculo de precificação que ele realizará. Para renomear um elemento, clique
e insira o nome desejado.

Definir classes para ganchos do Apex
- Em Configuração, na caixa Busca rápida, insira Apex e selecione Classes do Apex.
- Clique em Novo.
-
A primeira classe do Apex é um prehack que busca todos os itens da transação de vendas do contexto Precificação e substitui sua tag PartnerUnitPrice por uma tarifa de base aleatória dinâmica entre 990 e 1200 antes da execução da precificação de um banco de dados externo.
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; } } -
Crie outra Classe do Apex.
Essa classe do Apex é um posthook que busca a tag NetUnitPrice após a precificação e a converte na moeda local, INR (Rúpia indiana) usando uma taxa de conversão dinâmica simulada entre 85 e 86. Em seguida, ela atualiza a descrição do Item da transação de vendas com a nova tarifa INR, fornecendo visibilidade de precificação localizada para clientes indianos.
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; } }
Configurar uma definição de plano de procedimento personalizado
- Em Configuração, na caixa Busca rápida, pesquise e selecione Definições do plano de procedimento.
- Clique em Novo
-
Especifique estes detalhes.
-
Título: Procedimento de reserva de voo.
Pressione Tab para preencher automaticamente o Nome do desenvolvedor.
- Tipo de processo: Revenue Cloud.
- Objeto principal: Cotação.
-
Definição de contexto: <Nome da definição de contexto>.
Você precisará escolher uma definição de contexto projetada para seu caso de uso. No entanto, essa deve ser a mesma definição de contexto que você usou ao criar seu procedimento de precificação.
- Salve suas alterações.
-
Título: Procedimento de reserva de voo.
- Abra o registro de definição de plano de procedimento recém-criado.
- Para adicionar os procedimentos desejados nas Seções do plano de procedimento, selecione Adicionar.
-
Adicione a primeira seção para obter o preço base dinâmico do nosso voo. Especifique estes detalhes.
- Tipo: Padrão.
- Nome: DynamicBasePriceApex.
- Tipo de seção: Apex.
-
Depois que a seção for adicionada, clique em
e especifique estes detalhes.
- Fases: Preços
- Tipo de resolução: Padrão
- Apex: DynamicFlightBasePriceApex
Deve ter uma aparência semelhante a esta:
-
Da mesma forma, adicione outra seção para realizar o cálculo de precificação e substituir o preço base pelo preço gerado usando o prehak do Apex. Especifique estes valores.
- Tipo: Padrão.
- Nome: FlightPriceCalculation.
- Tipo de seção: Procedimento de precificação .
-
Clique em
e especifique estes detalhes.
- Fases: Preços
- Tipo de resolução: Padrão
- Procedimento: Flight_Booking_Pricing_Procedure
-
Por fim, adicione uma seção para converter o preço de USD para INR (Dólar dos EUA para Rúpia indiana) adicionando este posthook do Apex para usuários cujo País de cobrança esteja definido como Índia
- Tipo: Padrão.
- Nome: ConvertFareToINR.
- Tipo de seção: Apex.
-
Clique em
e especifique estes detalhes.
- Fases: Preços
- Tipo de resolução: Baseado em regra
- Requisitos da condição: Todas as condições são atendidas (AND)
- Recurso: Faturar para o país
- Operador: Igual a
- Valor de saída: Índia
- Apex: ConvertFareToINRApex
- Salve e ative sua definição de plano de procedimento.
Verificar a execução do seu plano de procedimento
Para verificar se o plano de procedimento é executado no pedido que definimos e se a precificação é precisa, precisaremos criar uma cotação.
-
Criar uma cotação.
No campo Faturar para país, insira Índia.
- Salve suas alterações.
- Clique em Pesquisar catálogos e adicione o produto Deli - Nova Iorque à cotação.
-
Passe o mouse sobre o valor de Preço unitário líquido para ver os detalhes da cascata de preços.
Você verá a aplicação do seu plano de procedimento e os descontos e adições que você configurou no procedimento de precificação.
-
Para visualizar a taxa de conversão do item de linha de cotação, clique
na linha de item de linha de cotação e selecione Visualizar.
-
A Descrição do item de linha mostra o preço localizado para seu voo.

