Loading
Lær
Innhold
Velg filtre

          Ingen resultater
          Ingen resultater
          Her er noen søketips

          Kontroller stavemåten i søkeordene.
          Bruk mer generelle søkebegreper.
          Velg færre filtre for å utvide søket.

          Søk i all Salesforce Hjelp
          Bruke prosedyreplanrammeverket

          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

          1. Skriv inn omsetningsinnstillinger i Hurtigsøk-feltet i Oppsett, og velg deretter omsetningsinnstillinger.
          2. Finn og aktiver Prosedyreplanorkestrering for prising.
          3. Finn og aktiver Ekskluder standardpriser og prosedyrer for salgstransaksjonstype.

          Opprette et kommersielt produkt

          1. Finn og velg Produkter fra Appstarter.
          2. 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.
          3. Legg til produktet i katalogen, og opprett en prislisteoppføring for det.
          4. Søk etter og velg Salesforce Pricing Setup i Hurtigsøk-feltet i Oppsett.
          5. Klikk på Synkroniser under Synkroniser prisdata.

          Bygge prisprosedyren

          1. 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.
          2. 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
          3. Legg til følgende elementer.
            1. Prisinnstilling
            2. Listepris. Bruk beslutningstabellen Prislisteoppføringer V2.
            3. Manuelle rabatter. Du må legge til tre manuelle rabattelementer.
          4. 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
          5. 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
          6. 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
          7. Angi preferansene for å vise prisinformasjon, profiltilgang og rangeringsinformasjon.
          8. Lagre prosedyren.
          9. 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 Rediger-ikonog skriver inn navnet du ønsker.

          Prosedyreplanens prisprosedyre

          Definere klasser for Apex

          1. Skriv Apex i Hurtigsøk-feltet under Oppsett, og velg Apex-klasser.
          2. Klikk på Ny.
          3. 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;
                }
            }
            
          4. 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

          1. Søk etter og velg Prosedyreplandefinisjoner i Hurtigsøk-feltet i Oppsett.
          2. Klikk på Ny.
          3. Angiv disse detaljer.
            1. Tittel: Flybestillingsplan.
              Trykk på Tab for å fylle ut Utviklernavn automatisk.
            2. Prosesstype: Revenue Cloud.
            3. Primært objekt: Tilbud.
            4. 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.
            5. Lagre endringene.
          4. Åpne den nylig opprettede definisjonsposten for prosedyreplanen.
          5. Velg Legg til for å legge til prosedyrene du ønsker i Prosedyreplan-delene.
          6. Legg til den første delen for å få den dynamiske basisprisen for flyreisen. Angiv disse detaljer.
            1. Type: Standard.
            2. Navn: DynamicBasePriceApex.
            3. Avsnittstype: Apex.
            4. Når delen er lagt til, klikker du på Pil-ikon og angir disse detaljene.
              1. Faser: Priser
              2. Løsningstype: Default (Standard)
              3. Apex: DynamicFlightBasePriceApex
              Det skal se slik ut:
              Prosedyreplandel
          7. 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.
            1. Type: Standard.
            2. Navn: FlightPriceCalculation.
            3. Avsnittstype: Priseprocedure .
            4. Klikk på Pil-ikon og angi disse detaljene.
              1. Faser: Priser
              2. Løsningstype: Default (Standard)
              3. Prosedyre: Flight_Booking_Pricing_Procedure
          8. 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
            1. Type: Standard.
            2. Navn: ConvertFareToINR.
            3. Avsnittstype: Apex.
            4. Klikk på Pil-ikon og angi disse detaljene.
              1. Faser: Priser
              2. Løsningstype: Regelbasert
              3. Betingelseskrav: Alle betingelser er oppfylt (AND)
              4. Ressurs: Bill To Country
              5. Operator: Er lik
              6. Utdataverdi: India
              7. Apex: ConvertFareToINRApex
          9. 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.

          1. Opprett et tilbud.
            Skriv inn India i feltet Fakturering til land.
          2. Lagre endringene.
          3. Klikk på Bla gjennom kataloger og legg til produktet Delhi - New York i tilbudet.
          4. 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.
            Foss for tilbudspris
          5. Hvis du vil vise konverteringsprisen for tilbudslinjeelementet, klikker du Vis-ikoni tilbudslinjeelementraden og velger Vis.
          6. Beskrivelsen av linjeelementet viser den lokaliserte prisen for flyreisen.
            Beskrivelse av tilbudslinjeelement
           
          Laster
          Salesforce Help | Article