breadcrumbDescription
Brug rammestrukturen for procedureplanen
Hvis du vil sikre, at dine procedurer kører i den korrekte rækkefølge, og prissætning anvendes ensartet på et tilbud, skal du oprette en ny procedureplan.
EditionsHeading
| Tilgængelig i: Lightning Experience |
| Tilgængelig i: Enterprise, Performance, Unlimited og Developer Edition af Revenue Cloud, hvor Salesforce Pricing er aktiveret |
| Brugertilladelser påkrævet | |
|---|---|
| Hvis du vil oprette og opdatere definitioner på procedureplan: | Adgang til procedureplan OG Salesforce Pricing Design Time-bruger |
| Hvis du vil oprette, opdatere og slette prissætningsprocedurer: | Adgang til procedureplan ELLER Salesforce Pricing Design Time-bruger |
| Hvis du vil bruge prissætningsprocedurer: | Salesforce Pricing Run Time-bruger |
| Hvis du vil definere, redigere, slette sikkerhed og indstille versionsindstillinger for Apex- klasser: | Dokumentopretter Apex |
Forestil dig, at du arbejder for et flyselskab og hjælper forretningsrejsende. Lad os nu reservere en flyrejse! Vi ønsker, at vores priser afspejler markedsbetingelser i realtid og viser priser i kundens lokale valuta.
Før vi beregner prisen, henter vi automatisk en dynamisk basispris fra et eksternt system for at sikre konkurrencedygtig prissætning. Vi vil også anvende reservationsplatformens rabatter og tilføje et bekvemmelighedsgebyr.
Når vi har opbygget vores procedureplan, opretter vi et tilbud. Derefter vil vi baseret på brugerens placering (f.eks. Indien) konvertere den samlede pris fra USD til INR.
Før du går i gang, skal du sørge for at:
- Har aktiveret Salesforce-prissætning.
- Har tilladelser til at oprette procedurer, procedureplaner, produkter og tilbud.
- Forstå, hvordan du opretter prissætningsprocedurer. Hvis du vil vide mere om prissætningsprocedurer, kan du se Opbyg dine prissætningsprocedurer ved brug af Salesforce Pricing.
- Forstå og vide, hvordan du bruger kontekstdefinitioner. Hvis du vil vide mere om kontekstdefinitioner, kan du se Kontekstdefinitioner.
- Brug den samme kontekstdefinition på tværs af dine prissætningsprocedurer og procedureplaner.
Definitioner på procedureplaner kan være komplekse, især når de involverer Apex og forskellige prissætningsprocedurer. Følg disse trin for at oprette et tilbud, og find ud af, hvordan du gør din prissætning dynamisk og nøjagtig uden at komplicere selve proceduren.
Aktiver orkestrering af procedureplan for prissætning
- Skriv Indtjeningsindstillinger i feltet Find hurtigt i Opsætning, og vælg derefter Indtjeningsindstillinger.
- Find og aktiver Procedureplanorkestrering for prissætning.
- Find og aktiver Udelad standardprissætningsprocedurer for salgstransaktionstype.
Opret et kommercielt produkt
- Find og vælg Produkter fra Appstarter.
-
Opret et kommercielt produkt ved navn Delhi - New York.
Hvis du vil vide, hvordan du opretter et produkt, kan du se Opret enkle produkter og sørge for, at produktregistreringstypen er indstillet til kommerciel.
- Føj dit produkt til kataloget, og opret en prislisteoplysning for det.
- Søg efter og vælg Opsætning af Salesforce-prissætning i feltet Find hurtigt i Opsætning.
- Klik på Synkroniser i afsnittet Data om synkroniseringsprissætning.
Opbyg din prissætningsprocedure
-
Opret en prissætningsprocedure, og navngiv den Prissætningsprocedure for flyreservation.
Hvis du vil oprette en prissætningsprocedure, skal du følge de første 5 trin i Konfigurer din prissætningsprocedure.
-
Opret konstanter. Disse konstanter tjener som pladsholdere for faste værdier i din prissætningsprocedure.
Konstant navn Datatype Standardværdi AdjType TEXT Procent AdjValue TAL 5 Tilsidesæt TEXT Tilsidesæt ConvFeeAdjType TEXT Amount ConvFeeAdjValue TAL -250 -
Tilføj følgende elementer.
- Prisindstilling
- Listepris. Brug beslutningstabellen Prislisteposter V2.
- Manuelle Rabatter. Du skal tilføje tre manuelle rabatelementer.
-
Det første Manuelt rabat-element tilføjes for at beregne den dynamiske basispris for flyvningen. Tilknyt disse variabler.
- Inputvariabler
- Justeringstype: Tilsidesæt
- Justeringsværdi: PartnerUnitPrice
- Mængde: LineItemQuantity
- Inputenhedspris: ListPrice
- Outputvariabel
- Nettoenhedspris: NetUnitPrice
- Inputvariabler
-
Det andet Manuelt rabat-element tilføjes for at beregne platformsrabatten for flyreservationen. Tilknyt disse variabler.
- Inputvariabler
- Justeringstype: AdjType
- Justeringsværdi: AdjValue
- Mængde: LineItemQuantity
- Inputenhedspris: PartnerUnitPrice
- Outputvariabel
- Nettoenhedspris: NetUnitPrice
- Inputvariabler
-
Og det sidste manuelle rabatelement tilføjes for at beregne bekvemmelighedsgebyret for at opkræve din kunde for flyreservationen.
- Inputvariabler
- Justeringstype: ConvFeeAdjType
- Justeringsværdi: ConvFeeAdjValue
- Mængde: LineItemQuantity
- Inputenhedspris: NetUnitPrice
- Outputvariabel
- Nettoenhedspris: NetUnitPrice
- Inputvariabler
- Angiv dine præferencer for at få vist prisoplysninger, profiladgang og rangeringsoplysninger.
- Gem din procedure.
- Aktiver din procedure.
Din procedure skal se sådan ud. Af klarhedshensyn har vi omdøbt hvert manuelt rabatelement for at vise den prisberegning, det foretager. Hvis du vil omdøbe et element, skal du klikke på
og angive det ønskede navn.

Definer klasser for Apex
- Skriv Apex i feltet Find hurtigt i Opsætning, og vælg derefter Apex-klasser.
- Klik på Ny.
-
Den første Apex er et præ-hook, der henter alle salgstransaktionselementer fra konteksten Prissætning og tilsidesætter deres PartnerUnitPrice-tag med en dynamisk vilkårlig basispris mellem 990 og 1200 før kørsel af prissætning fra en ekstern database.
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; } } -
Opret endnu en Apex.
Denne Apex er et posthook, der henter NetUnitPrice-tagget efter prissætning og konverterer det til den lokale valuta, INR (indiske rupier) ved brug af en simuleret dynamisk konverteringskurs mellem 85-86. Den opdaterer derefter beskrivelsen af salgstransaktionselementet med den nye INR-pris, hvilket giver lokaliseret prissynlighed for indiske 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; } }
Konfigurer en tilpasset definition på procedureplan
- Søg efter og vælg Definitioner på procedureplan i feltet Find hurtigt i Opsætning.
- Klik på Ny.
-
Angiv disse detaljer.
-
Titel: Flyreservationsplan.
Tryk på Fane for automatisk at udfylde udviklernavnet.
- Procestype: Revenue Cloud.
- Primært objekt: Tilbud.
-
Kontekstdefinition: <Navn på kontekstdefinition>.
Du skal vælge en kontekstdefinition, der er designet til din anvendelsessituation. Men sørg for, at dette er den samme kontekstdefinition, du brugte, da du opbyggede din prissætningsprocedure.
- Gem dine ændringer.
-
Titel: Flyreservationsplan.
- Åbn den netop oprettede definitionsregistrering for procedureplanen.
- Hvis du vil tilføje de ønskede procedurer i afsnittene i procedureplanen, skal du vælge Tilføj.
-
Tilføj det første afsnit for at få den dynamiske basispris for vores fly. Angiv disse detaljer.
- Type: Standard.
- Navn: DynamicBasePriceApex.
- Afsnitstype: Apex.
-
Når afsnittet er tilføjet, skal du klikke på
og angive disse detaljer.
- Faser: Prissætning
- Løsningstype: Default (Standard)
- Apex: DynamicFlightBasePriceApex
Det skal se sådan ud:
-
Tilføj på samme måde et andet afsnit for at udføre prisberegningen og tilsidesætte basisprisen med den pris, vi genererede ved brug af Apex. Angiv disse værdier.
- Type: Standard.
- Navn: FlightPriceCalculation.
- Afsnitstype: Prisprocedure .
-
Klik på
, og angiv disse detaljer.
- Faser: Prissætning
- Løsningstype: Default (Standard)
- Procedure: Flight_Booking_Pricing_Procedure
-
Til sidst skal du tilføje et afsnit for at konvertere prisen fra USD til INR (US Dollar til Indisk Rupee) ved at tilføje denne Apex posthook for brugere, hvis Faktureringsland er indstillet til Indien
- Type: Standard.
- Navn: ConvertFareToINR.
- Afsnitstype: Apex.
-
Klik på
, og angiv disse detaljer.
- Faser: Prissætning
- Løsningstype: Regelbaseret
- Betingelseskrav: Alle betingelser er opfyldt (OG)
- Ressource: Faktura til land
- Operator: Er lig med
- Outputværdi: Indien
- Apex: ConvertFareToINRApex
- Gem, og aktiver derefter din definition på procedureplan.
Bekræft kørsel af din procedureplan
Hvis du vil bekræfte, om procedureplanen afvikles i den rækkefølge, vi angiver, og priserne er nøjagtige, skal vi oprette et tilbud.
-
Opret et tilbud.
I feltet Fakturering til land skal du skrive India.
- Gem dine ændringer.
- Klik på Gennemse kataloger og føj Delhi - New York til tilbuddet.
-
Peg på værdien Net Unit Price (Netto enhedspris) for at se prisens vandfaldsdetaljer.
Du vil se applikationen af din procedureplan og de rabatter og tilføjelser, som du konfigurerede i din prissætningsprocedure.
-
Hvis du vil se den konverterede sats for din tilbudslinjevarer, skal du klikke
på i tilbudslinjevarerækken og vælge Vis.
-
Beskrivelse af linjevare viser den lokaliserede pris for din flyrejse.

