Du är här:
Använd ramverket för förfarandeplan
För att säkerställa att dina procedurer körs i rätt ordning och prissättning tillämpas enhetligt på en offert, skapa en ny procedurplan.
Versioner som krävs
| Tillgängliga i: Lightning Experience |
| Tillgängliga i: Versionerna Enterprise, Performance, Unlimited och Developer av Revenue Cloud där Salesforce-prissättning har aktiverats |
| Användarbehörigheter som krävs för att | |
|---|---|
| Skapa och uppdatera definitioner av förfarandeplaner: | Åtkomst till procedurplan OCH Användare av designtid för Salesforce-prissättning |
| Skapa, uppdatera och ta bort prissättningsprocesser: | Åtkomst till procedurplan ELLER Användare av designtid för Salesforce-prissättning |
| Använda prissättningsprocesser: | Användare av Salesforce Pricing Runtime |
| Definiera, redigera, ta bort, ange säkerhet och konfigurera versionsinställningar för Apex-utlösare: | Apex-författare |
Tänk dig att du arbetar på ett flygbolag och hjälper affärsresenärer. Nu bokar vi en flygresa! Vi vill att vår prissättning ska återspegla marknadsförhållanden i realtid och visa priser i kundens lokala valuta.
Innan vi beräknar priset hämtar vi automatiskt ett dynamiskt baspris från ett externt system för att säkerställa konkurrenskraftig prissättning. Vi tillämpar även bokningsplattformens rabatter och lägger till en bekvämlighetsavgift.
När vi har byggt vår procedurplan skapar vi en offert. Baserat på användarens plats (till exempel Indien) konverterar vi sedan det totala priset från USD till INR.
Innan du börjar, se till att:
- Ha aktiverat Salesforce-prissättning.
- Ha behörighet att skapa procedurer, procedurplaner, produkter och offerter.
- Förstå hur du skapar prissättningsprocesser. Mer information om prissättningsprocesser finns i Bygg dina prissättningsprocesser med Salesforce Pricing.
- Förstå och veta hur man använder sammanhangsdefinitioner. Mer information om sammanhangsdefinitioner finns i Sammanhangsdefinitioner.
- Använd samma sammanhangsdefinition i dina prissättningsprocesser och förfarandeplaner.
Processplandefinitioner kan vara komplexa, särskilt när de involverar Apex klasser och olika prissättningsprocesser. Följ dessa steg för att skapa en offert och få reda på hur du gör din prissättning dynamisk och korrekt utan att krångla till själva proceduren.
Slå på Orkestrering av procedurplan för prissättning
- I Inställningar, i rutan Snabbsökning, skriv Intäktsinställningar och välj sedan Intäktsinställningar.
- Hitta och aktivera Procedurplanorkestrering för prissättning.
- Hitta och aktivera Uteslut standardprissättning och prissättning för försäljningstransaktioner.
Skapa en kommersiell produkt
- Sök upp och öppna Produkter från Appstartaren.
-
Skapa en kommersiell produkt som heter Delhi - New York.
Mer information om hur du skapar en produkt finns i Skapa enkla produkter och se till att Produktposttyp är inställd som Kommersiell.
- Lägg till din produkt i katalogen och skapa en prisbokpost för den.
- I Inställningar, i rutan Snabbsökning, sök efter och välj Salesforces prissättningsinställningar.
- I sektionen Synkronisera prissättningsdata, klicka på Synkronisera.
Bygg din prissättningsprocess
-
Skapa ett prissättningsförfarande och döp det till Prissättningsförfarande för flygbokning.
För att skapa en prissättningsprocess, följ de första 5 stegen i Konfigurera din prissättningsprocess.
-
Skapa konstanter. Dessa konstanter kommer att fungera som platshållare för fasta värden i din prissättningsprocess.
Konstantnamn Datatyp Standardinställning AdjType TEXT Procent AdjValue NUMMER 5 Åsidosätt TEXT Åsidosätt ConvFeeAdjType TEXT Belopp ConvFeeAdjValue NUMMER -250 -
Lägg till följande element.
- Prissättning
- Listpris. Använd beslutstabellen Prisbokposter V2.
- Manuella rabatter. Du måste lägga till tre manuella rabattelement.
-
Det första elementet Manuell rabatt läggs till för att beräkna flygningens dynamiska baspris. Mappa dessa variabler.
- Indatavariabler
- Justeringstyp: Åsidosätt
- Justeringsvärde: PartnerUnitPrice
- Mängd: LineItemQuantity
- Enhetspris för indata: ListPrice
- Utdatavariabel
- Nettoenhetspris: NetUnitPrice
- Indatavariabler
-
Det andra elementet Manuell rabatt läggs till för att beräkna plattformsrabatten för flygbokningen. Mappa dessa variabler.
- Indatavariabler
- Justeringstyp: AdjType
- Justeringsvärde: AdjValue
- Mängd: LineItemQuantity
- Enhetspris för indata: PartnerUnitPrice
- Utdatavariabel
- Nettoenhetspris: NetUnitPrice
- Indatavariabler
-
Och det sista elementet för manuell rabatt läggs till för att beräkna bekvämlighetsavgiften för att debitera din kund för flygbokningen.
- Indatavariabler
- Justeringstyp: ConvFeeAdjType
- Justeringsvärde: ConvFeeAdjValue
- Mängd: LineItemQuantity
- Enhetspris för indata: NetUnitPrice
- Utdatavariabel
- Nettoenhetspris: NetUnitPrice
- Indatavariabler
- Ange dina inställningar för att visa prisinformation, profilåtkomst och rangordningsinformation.
- Spara din procedur.
- Aktivera din procedur.
Din behandling ska se ut så här. För tydlighetens skull har vi bytt namn på varje element i Manuell rabatt för att visa den prissättningsberäkning det kommer att utföra. För att byta namn på ett element, klicka på
och ange ditt önskade namn.

Definiera klasser för Apex Hooks
- I Inställningar, i rutan Snabbsökning, skriv Apex och välj sedan Apex-klasser.
- Klicka på Ny.
-
Den första Apex klassen är en förinställning som hämtar alla försäljningstransaktionsobjekt från prissättningssammanhanget och åsidosätter deras PartnerUnitPrice-tagg med ett dynamiskt slumpmässigt baspris mellan 990 och 1200 innan prissättning utförs från en extern databas.
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; } } -
Skapa en annan Apex klass.
Denna Apex klass är en posthook som hämtar taggen NetUnitPrice efter prissättning och konverterar den till den lokala valutan INR (indiska rupier) med hjälp av en simulerad dynamisk valutakurs mellan 85-86. Den uppdaterar sedan beskrivningen av försäljningstransaktionsobjekt med det nya INR-priset, vilket ger lokaliserad prissättningssynlighet för indiska kunder.
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; } }
Konfigurera en egen procedurplandefinition
- I Inställningar, i rutan Snabbsökning, sök efter och välj Procedurplandefinitioner.
- Klicka på Ny
-
Ange dessa detaljer.
-
Titel: Procedurplan för flygbokning.
Tryck på Tab för att automatiskt fylla i utvecklarnamnet.
- Processtyp: Revenue Cloud.
- Primärt objekt: Citat.
-
Sammanhangsdefinition: <Namn på sammanhangsdefinition>.
Du måste välja en sammanhangsdefinition som är utformad för ditt användningsfall. Se dock till att detta är samma sammanhangsdefinition som du använde när du byggde din prissättningsprocess.
- Spara dina ändringar.
-
Titel: Procedurplan för flygbokning.
- Öppna den nyligen skapade definitionsposten för förfarandeplan.
- För att lägga till de procedurer du vill ha i Avsnitt i procedurplan, välj Lägg till.
-
Lägg till den första sektionen för att få det dynamiska baspriset för vårt flyg. Ange dessa detaljer.
- Typ: Standard.
- Namn: DynamicBasePriceApex.
- Sektionstyp: Apex.
-
När sektionen har lagts till, klicka på
och specificera dessa detaljer.
- Faser: Prissättning
- Lösningstyp: Standard
- Apex: DynamicFlightBasePriceApex
Det borde se ut ungefär så här:
-
På samma sätt kan du lägga till en annan sektion för att utföra prissättningsberäkningen och åsidosätta baspriset med det pris vi skapade med Apex förinställning. Specificera dessa värden.
- Typ: Standard.
- Namn: FlightPriceCalculation.
- Sektionstyp: Prissättningsförfarande .
-
Klicka på
och specificera dessa detaljer.
- Faser: Prissättning
- Lösningstyp: Standard
- Förfarande: Procedur för flygbokningsprissättning
-
Slutligen, lägg till en sektion för att konvertera priset från USD till INR (US-dollar till Indisk rupie) genom att lägga till denna Apex posthook för användare vars Faktureringsland är inställt till Indien
- Typ: Standard.
- Namn: ConvertFareToINR.
- Sektionstyp: Apex.
-
Klicka på
och specificera dessa detaljer.
- Faser: Prissättning
- Lösningstyp: Regelbaserad
- Villkorskrav: Alla villkor uppfylls (OCH)
- Resurs: Fakturera till land
- Operator: Lika med
- Utdatavärde: Indien
- Apex: ConvertFareToINRApex
- Spara och aktivera sedan din definition av procedurplan.
Verifiera utförandet av din procedurplan
För att verifiera om procedurplanen utförs i den ordning vi anger och prissättningen är korrekt måste vi skapa en offert.
-
Skapa en offert.
I fältet Fakturera till land, ange Indien.
- Spara dina ändringar.
- Klicka på Bläddra i kataloger och lägg till produkten Delhi - New York i offerten.
-
Håll markören över värdet för nettoenhetspris för att se detaljerna om vattenfall.
Du ser tillämpningen av din procedurplan och de rabatter och tillägg som du konfigurerat i din prissättningsprocess.
-
För att se det konverterade priset för din offertradartikel, klicka
på i offertradartikelraden och välj Visa.
-
Beskrivning av radartikel visar det lokaliserade priset för din flygning.

