Du er her:
Bruke prosedyreplanrammeverket
Opprett en ny prosedyreplan for å sikre at prosedyrene kjører i riktig rekkefølge og at prisene brukes konsistent på et tilbud.
Nødvendige utgaver
| Tilgjengelig i Lightning Experience |
| Tilgjengelig i Enterprise, Performance, Unlimited og Developer Edition i Revenue Cloud der Salesforce Pricing er aktivert |
| Nødvendige brukertillatelser | |
|---|---|
| For å opprette og oppdatere definisjoner av prosedyreplaner: | Prosedyreplantilgang OG Tidsbruker av Salesforce Prissetting |
| For å opprette, oppdatere og slette prisprosedyrer: | Prosedyreplantilgang ELLER Tidsbruker av Salesforce Prissetting |
| For å bruke prisprosedyrer: | Salesforce Pricing Run Time-bruker |
| For å definere, redigere, slette, angi sikkerhet og angi versjonsinnstillinger for Apex-klasser: | Forfatter for Apex |
Tenk deg at du arbeider på et flyselskap og hjelper forretningsreisende. La oss nå bestille en flyreise! Vi ønsker at prisene våre gjenspeiler sanntids markedsforhold og viser priser i kundens lokale valuta.
Før vi beregner prisen henter vi automatisk en dynamisk basisprisen fra et eksternt system for å sikre konkurransedyktige priser. Vi vil også bruke bestillingsplattformens rabatter og legge til en praktisk avgift.
Når vi har bygd prosedyreplanen, oppretter vi et tilbud. Deretter konverterer vi totalprisen fra USD til INR basert på brukerens plassering (for eksempel India).
Før du begynner må du forsikre deg om at du gjør følgende:
- Har aktivert Salesforce-priser.
- Har tillatelser til å opprette prosedyrer, prosedyreplaner, produkter og tilbud.
- Forstå hvordan du oppretter prisprosedyrer. Hvis du vil vite mer om prisprosedyrer, kan du se Bygge prisprosedyrer med Salesforce-prising.
- Forstå og forstå hvordan du bruker kontekstdefinisjoner. Hvis du vil vite mer om kontekstdefinisjoner, kan du se Kontekstdefinisjoner.
- Bruk samme kontekstdefinisjon på tvers av prisprosedyrer og prosedyreplaner.
Prosedyreplandefinisjoner kan være komplekse, spesielt når de involverer Apex og forskjellige prisprosedyrer. Følg denne fremgangsmåten for å opprette et tilbud og lære hvordan du gjør prisene dine dynamiske og nøyaktige uten å komplisere selve prosedyren.
Slå på Prosedyreplanorkestrering for prising
- Skriv inn omsetningsinnstillinger i Hurtigsøk-feltet i Oppsett, og velg deretter omsetningsinnstillinger.
- Finn og aktiver Prosedyreplanorkestrering for prising.
- Finn og aktiver Ekskluder standardpriser og prosedyrer for salgstransaksjonstype.
Opprette et kommersielt produkt
- Finn og velg Produkter fra Appstarter.
-
Lag et kommersielt produkt kalt Delhi - New York.
Hvis du vil vite hvordan du oppretter et produkt, kan du se Opprette enkle produkter og påse at Produktposttype er satt til Kommerciel.
- Legg til produktet i katalogen, og opprett en prislisteoppføring for det.
- Søk etter og velg Salesforce Pricing Setup i Hurtigsøk-feltet i Oppsett.
- Klikk på Synkroniser under Synkroniser prisdata.
Bygge prisprosedyren
-
Opprett en prisprosedyre og gi den navnet Prisprosedyre for flybestilling.
For å opprette en prisprosedyre følger du de fem første trinnene i Konfigurere prisprosedyre.
-
Opprett konstanter. Disse konstantene vil tjene som plassholdere for faste verdier i prisprosedyren.
Konstantnavn Datatype Standardverdi AdjType TEXT Prosent AdjValue NUMBER 5 Overstyring TEXT Overstyring ConvFeeAdjType TEXT Amount ConvFeeAdjValue NUMBER -250 -
Legg til følgende elementer.
- Prisinnstilling
- Listepris. Bruk beslutningstabellen Prislisteoppføringer V2.
- Manuelle rabatter. Du må legge til tre manuelle rabattelementer.
-
Det første Elementet Manuell rabatt legges til for å beregne den dynamiske basisprisen for flyreisen. Tilordne disse variablene.
- Inndatavariabler
- Justeringstype: Overstyr
- Justeringsverdi: PartnerUnitPrice
- Mengde: LineItemQuantity
- Enhetspris: ListPrice
- Utdatavariabel
- Netto enhetspris: NetUnitPrice
- Inndatavariabler
-
Det andre Elementet Manuell rabatt legges til for å beregne plattformrabatten for flybestillingen. Tilordne disse variablene.
- Inndatavariabler
- Justeringstype: AdjType
- Justeringsverdi: AdjValue
- Mengde: LineItemQuantity
- Enhetspris: PartnerUnitPrice
- Utdatavariabel
- Netto enhetspris: NetUnitPrice
- Inndatavariabler
-
Og det siste Manuell rabatt-elementet legges til for å beregne komfortavgiften som skal belastes kunden for flybestillingen.
- Inndatavariabler
- Justeringstype: ConvFeeAdjType
- Justeringsverdi: ConvFeeAdjValue
- Mengde: LineItemQuantity
- Enhetspris: NetUnitPrice
- Utdatavariabel
- Netto enhetspris: NetUnitPrice
- Inndatavariabler
- Angi preferansene for å vise prisinformasjon, profiltilgang og rangeringsinformasjon.
- Lagre prosedyren.
- Aktiver prosedyren.
Prosedyren skal se slik ut. For å gjøre det tydeligere har vi endret navn på hvert Manuell rabatt-element for å vise prisberegningen det skal utføre. Hvis du vil gi nytt navn til et element, klikker du
og skriver inn navnet du ønsker.

Definere klasser for Apex
- Skriv Apex i Hurtigsøk-feltet under Oppsett, og velg Apex-klasser.
- Klikk på Ny.
-
Den første Apex er en prehook som henter alle salgstransaksjonselementer fra Pricing-konteksten og overstyrer PartnerUnitPrice-koden med en dynamisk vilkårlig basisprisen mellom 990 og 1200 før prisutføringen 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; } } -
Opprett en annen Apex.
Denne Apex er en posthook som henter NetUnitPrice-koden etter prising og konverterer den til den lokale valutaen, INR (indiske rupi) ved å bruke en simulert dynamisk omregningskurs mellom 85 og 86. Den oppdaterer deretter beskrivelsen av salgstransaksjonselementet med den nye INR-prisen, og gir lokalisert prissynlighet 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; } }
Konfigurere en definisjon av en tilpasset prosedyreplan
- Søk etter og velg Prosedyreplandefinisjoner i Hurtigsøk-feltet i Oppsett.
- Klikk på Ny.
-
Angiv disse detaljer.
-
Tittel: Flybestillingsplan.
Trykk på Tab for å fylle ut Utviklernavn automatisk.
- Prosesstype: Revenue Cloud.
- Primært objekt: Tilbud.
-
Kontekstdefinisjon: <Navn på kontekstdefinisjon>.
Du må velge en kontekstdefinisjon som er utformet for bruksområdet. Forsikre deg imidlertid om at dette er den samme kontekstdefinisjonen du brukte da du bygde prisprosedyren.
- Lagre endringene.
-
Tittel: Flybestillingsplan.
- Åpne den nylig opprettede definisjonsposten for prosedyreplanen.
- Velg Legg til for å legge til prosedyrene du ønsker i Prosedyreplan-delene.
-
Legg til den første delen for å få den dynamiske basisprisen for flyreisen. Angiv disse detaljer.
- Type: Standard.
- Navn: DynamicBasePriceApex.
- Avsnittstype: Apex.
-
Når delen er lagt til, klikker du på
og angir disse detaljene.
- Faser: Priser
- Løsningstype: Default (Standard)
- Apex: DynamicFlightBasePriceApex
Det skal se slik ut:
-
På samme måte kan du legge til en annen del for å utføre prisberegningen og overstyre basisprisen med prisen vi genererte med Apex prehook. Angi disse verdiene.
- Type: Standard.
- Navn: FlightPriceCalculation.
- Avsnittstype: Priseprocedure .
-
Klikk på
og angi disse detaljene.
- Faser: Priser
- Løsningstype: Default (Standard)
- Prosedyre: Flight_Booking_Pricing_Procedure
-
Til slutt legger du til en del for å konvertere prisen fra USD til INR (US Dollar til Indisk rupi) ved å legge til denne Apex posthook for brukere som faktureringsland er satt til India
- Type: Standard.
- Navn: ConvertFareToINR.
- Avsnittstype: Apex.
-
Klikk på
og angi disse detaljene.
- Faser: Priser
- Løsningstype: Regelbasert
- Betingelseskrav: Alle betingelser er oppfylt (AND)
- Ressurs: Bill To Country
- Operator: Er lik
- Utdataverdi: India
- Apex: ConvertFareToINRApex
- Lagre og aktiver deretter definisjonen av prosedyreplanen.
Bekrefte utførelsen av prosedyreplanen
For å kontrollere om prosedyreplanen utføres i den rekkefølgen vi angir og prisen er nøyaktig, må vi opprette et tilbud.
-
Opprett et tilbud.
Skriv inn India i feltet Fakturering til land.
- Lagre endringene.
- Klikk på Bla gjennom kataloger og legg til produktet Delhi - New York i tilbudet.
-
Før markøren over netto enhetsprisverdien for å se prisfossdetaljene.
Du vil se anvendelsen af din procedureplan og de rabatter og tilføjelser, som du har konfigureret i din prisprocedure.
-
Hvis du vil vise konverteringsprisen for tilbudslinjeelementet, klikker du
i tilbudslinjeelementraden og velger Vis.
-
Beskrivelsen av linjeelementet viser den lokaliserte prisen for flyreisen.

