U bent hier:
Het Framework voor procedureplannen gebruiken
Om ervoor te zorgen dat uw procedures in de juiste volgorde worden uitgevoerd en dat de prijsstelling consistent wordt toegepast op een offerte, maakt u een nieuw procedureplan.
Vereiste editions
| Beschikbaar in: Lightning Experience |
| Beschikbaar in: Enterprise, Performance, Unlimited en Developer Edition van Revenue Cloud waarin Salesforce-prijsstelling is ingeschakeld |
| Benodigde gebruikersmachtigingen | |
|---|---|
| Procedureplandefinities maken en bijwerken: | Toegang tot procedureplan AND Salesforce Pricing Design Time-gebruiker |
| Prijsstellingsprocedures maken, bijwerken en verwijderen: | Toegang tot procedureplan OR Salesforce Pricing Design Time-gebruiker |
| Prijsstellingsprocedures gebruiken: | Salesforce Prijzen Run Time-gebruiker |
| Als u versie-instellingen voor Apex-klassen wilt definiëren, bewerken, verwijderen, instellen of de beveiliging ervoor wilt instellen: | Apex-auteur |
Stel je voor dat je bij een luchtvaartmaatschappij werkt en zakenreizigers assisteert. Laten we nu een vlucht boeken! We willen dat onze prijzen de realtime marktomstandigheden weerspiegelen en prijzen tonen in de lokale valuta van de klant.
Voordat we de prijs berekenen, halen we automatisch een dynamisch basistarief op uit een extern systeem om concurrerende prijzen te garanderen. We passen ook de kortingen van het boekingsplatform toe en voegen een gemakstoeslag toe.
Zodra we ons procedureplan hebben samengesteld, maken we een offerte. Vervolgens converteren we de totale prijs van USD naar INR op basis van de locatie van de gebruiker (bijvoorbeeld India).
Voordat u begint, zorgt u ervoor dat u:
- Salesforce-prijsstelling hebben ingeschakeld.
- Machtigingen hebben om procedures, procedureplannen, producten en offertes te maken.
- Begrijp hoe u prijsstellingsprocedures maakt. Zie Uw prijsstellingsprocedures samenstellen met Salesforce-prijsstelling voor meer informatie over prijsstellingsprocedures.
- Begrijp en weet hoe u contextdefinities gebruikt. Zie Contextdefinities voor meer informatie over contextdefinities.
- Gebruik dezelfde contextdefinitie voor al uw prijsstellingsprocedures en procedureplannen.
Definities van procedureplannen kunnen complex zijn, vooral wanneer ze betrekking hebben op Apex klassen en verschillende prijsstellingsprocedures. Volg deze stappen om een offerte te maken en leer hoe u uw prijsstelling dynamisch en nauwkeurig maakt zonder de procedure zelf te bemoeilijken.
Afstemming van procedureplannen inschakelen voor prijzen
- Geef vanuit Set-up Omzetinstellingen op in het vak Snel zoeken en selecteer vervolgens Omzetinstellingen.
- Zoek Procedureplancombinatie voor prijsstelling en schakel deze in.
- Zoek en schakel Standaardprocedures en prijsstellingsprocedures voor verkooptransacties uitsluiten in.
Een commercieel product maken
- Zoek en selecteer Producten vanuit de Appstarter.
-
Maak een commercieel product met de naam Delhi - New York.
Zie Eenvoudige producten maken en ervoor zorgen dat Productrecordtype is ingesteld op Commercieel voor meer informatie over het maken van een product.
- Voeg uw product toe aan de catalogus en maak er een prijslijstitem voor.
- Zoek vanuit Set-up in het vak Snel zoeken naar en selecteer Set-up van Salesforce-prijzen.
- Klik in de sectie Prijsgegevens synchroniseren op Synchroniseren.
Uw prijsstellingsprocedure samenstellen
-
Maak een prijsstellingsprocedure en noem deze Prijsstellingsprocedure voor vliegtickets.
Volg voor het maken van een prijsstellingsprocedure de eerste 5 stappen in Uw prijsstellingsprocedure configureren.
-
Maak constanten. Deze constanten dienen als plaatshouders voor vaste waarden in uw prijsstellingsprocedure.
Constante naam Gegevenstype Standaardwaarde AdjType TEXT Percentage AdjValue GETAL 5 Overschrijven TEXT Overschrijven ConvFeeAdjType TEXT Bedrag ConvFeeAdjValue GETAL -250 -
Voeg de volgende elementen toe.
- Prijsstelling
- Prijslijstprijs. Gebruik de beslissingstabel Prijslijstgegevens V2.
- Handmatige kortingen. U moet drie handmatige kortingselementen toevoegen.
-
Het eerste element Handmatige korting wordt toegevoegd om het dynamische basistarief van de vlucht te berekenen. Wijs deze variabelen toe.
- Invoervariabelen
- Type aanpassing: Overschrijven
- Aanpassingswaarde: PartnerUnitPrice
- Hoeveelheid: LineItemQuantity
- Invoereenheidsprijs: ListPrice
- Uitvoervariabele
- Netto eenheidsprijs: NetUnitPrice
- Invoervariabelen
-
Het tweede element Handmatige korting wordt toegevoegd om de platformkorting voor de vluchtboeking te berekenen. Wijs deze variabelen toe.
- Invoervariabelen
- Type aanpassing: AdjType
- Aanpassingswaarde: AdjValue
- Hoeveelheid: LineItemQuantity
- Invoereenheidsprijs: PartnerUnitPrice
- Uitvoervariabele
- Netto eenheidsprijs: NetUnitPrice
- Invoervariabelen
-
En het laatste element Handmatige korting wordt toegevoegd om de gemakskosten te berekenen die aan uw klant in rekening worden gebracht voor de boeking van de vlucht.
- Invoervariabelen
- Type aanpassing: ConvFeeAdjType
- Aanpassingswaarde: ConvFeeAdjValue
- Hoeveelheid: LineItemQuantity
- Invoereenheidsprijs: NetUnitPrice
- Uitvoervariabele
- Netto eenheidsprijs: NetUnitPrice
- Invoervariabelen
- Stel uw voorkeuren in om prijsgegevens, profieltoegang en plaatsingsgegevens weer te geven.
- Sla uw procedure op.
- Activeer uw procedure.
Uw procedure moet er als volgt uitzien. Omwille van de duidelijkheid hebben we de naam van elk element Handmatige korting gewijzigd om de prijsberekening te tonen die het gaat uitvoeren. Klik voor het wijzigen van de naam van een element op
en geef de gewenste naam op.

Klassen definiëren voor Apex Hooks
- Geef vanuit Set-up Apex op in het vak Snel zoeken en selecteer vervolgens Apex-klassen.
- Klik op Nieuw.
-
De eerste Apex klasse is een prehook die alle Verkooptransactie-items ophaalt uit de context Prijzen en hun PartnerUnitPrice-tag overschrijft met een dynamisch willekeurig basistarief tussen 990 en 1200 voordat de prijs wordt uitgevoerd vanuit een externe 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; } } -
Maak een andere Apex klasse.
Deze Apex klasse is een posthook die de NetUnitPrice tag ophaalt na prijsstelling en deze converteert naar de lokale valuta, INR (Indiase roepies) met behulp van een gesimuleerde dynamische wisselkoers tussen 85–86. Vervolgens werkt deze de beschrijving van Verkooptransactie-item bij met het nieuwe INR-tarief, wat gelokaliseerde zichtbaarheid van prijzen biedt voor Indiase klanten.
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; } }
Een definitie van een aangepast procedureplan configureren
- Zoek vanuit Set-up in het vak Snel zoeken naar en selecteer Definities van procedureplannen.
- Klik op Nieuw.
-
Geef deze details op.
-
Titel: Plan voor vluchtboekingsprocedure.
Druk op Tab om de naam van de ontwikkelaar automatisch in te vullen.
- Procestype: Revenue Cloud.
- Primair object: Citaat.
-
Contextdefinitie: <Context Definition Name>.
U moet een contextdefinitie kiezen die is ontworpen voor uw gebruikscase. Zorg er echter voor dat dit dezelfde contextdefinitie is die u hebt gebruikt bij het samenstellen van uw prijsstellingsprocedure.
- Sla uw wijzigingen op.
-
Titel: Plan voor vluchtboekingsprocedure.
- Open de zojuist gemaakte record voor de definitie van het procedureplan.
- Selecteer voor het toevoegen van de gewenste procedures in de secties Procedureplan Toevoegen.
-
Voeg de eerste sectie toe om de dynamische basisprijs van onze vlucht te krijgen. Geef deze details op.
- Type: Standaard.
- Naam: DynamicBasePriceApex.
- Sectietype: Apex.
-
Zodra de sectie is toegevoegd, klikt u op
en geeft u deze details op.
- Fasen: Prijzen
- Type oplossing: Standaard
- Apex: DynamicFlightBasePriceApex
Het zou er ongeveer zo uit moeten zien:
-
Voeg op soortgelijke wijze een andere sectie toe om de prijsberekening uit te voeren en de basisprijs te overschrijven met de prijs die we hebben gegenereerd met behulp van de Apex prehook. Geef deze waarden op.
- Type: Standaard.
- Naam: FlightPriceCalculation.
- Sectietype: Prijsstellingsprocedure.
-
Klik op
en geef deze details op.
- Fasen: Prijzen
- Type oplossing: Standaard
- Procedure: Flight_Booking_Pricing_Procedure
-
Voeg tenslotte een sectie toe om de prijs te converteren van USD naar INR (Amerikaanse dollar naar Indiase roepie) door deze Apex posthook toe te voegen voor gebruikers wier Factuurland is ingesteld op India
- Type: Standaard.
- Naam: ConvertFareToINR.
- Sectietype: Apex.
-
Klik op
en geef deze details op.
- Fasen: Prijzen
- Type oplossing: Op regels gebaseerd
- Vereisten voor voorwaarden: Aan alle voorwaarden wordt voldaan (AND)
- Resource: Factuur naar land
- Operator: Is gelijk aan
- Uitvoerwaarde: India
- Apex: ConvertFareToINRApex
- Sla op en activeer vervolgens de definitie van uw procedureplan.
Uitvoering van uw procedureplan verifiëren
Om te controleren of het procedureplan wordt uitgevoerd in de volgorde die we hebben ingesteld en of de prijsstelling nauwkeurig is, moeten we een offerte maken.
-
Maak een offerte.
Geef in het veld Factuur naar land India op.
- Sla uw wijzigingen op.
- Klik op Catalogi doorzoeken en voeg het product Delhi - New York toe aan de offerte.
-
Beweeg de muisaanwijzer over de waarde Netto eenheidsprijs om de prijswatervaldetails te zien.
U ziet de toepassing van uw procedureplan en de kortingen en toevoegingen die u hebt geconfigureerd in uw prijsstellingsprocedure.
-
Klik voor het weergeven van de geconverteerde wisselkoers voor uw offerteregelitem op
in de rij met offerteregelitems en selecteer Weergeven.
-
De regelitembeschrijving toont de gelokaliseerde prijs voor uw vlucht.

