Loading
Lær
Indhold
Vælg filtre

          Ingen resultater
          Ingen resultater
          Her er nogle søgetips

          Kontroller stavemåden for dine søgeord.
          Brug mere generelle søgeudtryk.
          Vælg færre filtre for at gøre søgningen bredere.

          Søg efter alle i Hjælp til Salesforce
          Brug rammestrukturen for procedureplanen

          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

          1. Skriv Indtjeningsindstillinger i feltet Find hurtigt i Opsætning, og vælg derefter Indtjeningsindstillinger.
          2. Find og aktiver Procedureplanorkestrering for prissætning.
          3. Find og aktiver Udelad standardprissætningsprocedurer for salgstransaktionstype.

          Opret et kommercielt produkt

          1. Find og vælg Produkter fra Appstarter.
          2. 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.
          3. Føj dit produkt til kataloget, og opret en prislisteoplysning for det.
          4. Søg efter og vælg Opsætning af Salesforce-prissætning i feltet Find hurtigt i Opsætning.
          5. Klik på Synkroniser i afsnittet Data om synkroniseringsprissætning.

          Opbyg din prissætningsprocedure

          1. 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.
          2. 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
          3. Tilføj følgende elementer.
            1. Prisindstilling
            2. Listepris. Brug beslutningstabellen Prislisteposter V2.
            3. Manuelle Rabatter. Du skal tilføje tre manuelle rabatelementer.
          4. 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
          5. 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
          6. 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
          7. Angiv dine præferencer for at få vist prisoplysninger, profiladgang og rangeringsoplysninger.
          8. Gem din procedure.
          9. 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å Redigeringsikonog angive det ønskede navn.

          Procedureplanens prissætningsprocedure

          Definer klasser for Apex

          1. Skriv Apex i feltet Find hurtigt i Opsætning, og vælg derefter Apex-klasser.
          2. Klik på Ny.
          3. 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;
                }
            }
            
          4. 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

          1. Søg efter og vælg Definitioner på procedureplan i feltet Find hurtigt i Opsætning.
          2. Klik på Ny.
          3. Angiv disse detaljer.
            1. Titel: Flyreservationsplan.
              Tryk på Fane for automatisk at udfylde udviklernavnet.
            2. Procestype: Revenue Cloud.
            3. Primært objekt: Tilbud.
            4. 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.
            5. Gem dine ændringer.
          4. Åbn den netop oprettede definitionsregistrering for procedureplanen.
          5. Hvis du vil tilføje de ønskede procedurer i afsnittene i procedureplanen, skal du vælge Tilføj.
          6. Tilføj det første afsnit for at få den dynamiske basispris for vores fly. Angiv disse detaljer.
            1. Type: Standard.
            2. Navn: DynamicBasePriceApex.
            3. Afsnitstype: Apex.
            4. Når afsnittet er tilføjet, skal du klikke på Ikonet Pil og angive disse detaljer.
              1. Faser: Prissætning
              2. Løsningstype: Default (Standard)
              3. Apex: DynamicFlightBasePriceApex
              Det skal se sådan ud:
              Afsnittet Procedureplan
          7. 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.
            1. Type: Standard.
            2. Navn: FlightPriceCalculation.
            3. Afsnitstype: Prisprocedure .
            4. Klik på Ikonet Pil, og angiv disse detaljer.
              1. Faser: Prissætning
              2. Løsningstype: Default (Standard)
              3. Procedure: Flight_Booking_Pricing_Procedure
          8. 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
            1. Type: Standard.
            2. Navn: ConvertFareToINR.
            3. Afsnitstype: Apex.
            4. Klik på Ikonet Pil, og angiv disse detaljer.
              1. Faser: Prissætning
              2. Løsningstype: Regelbaseret
              3. Betingelseskrav: Alle betingelser er opfyldt (OG)
              4. Ressource: Faktura til land
              5. Operator: Er lig med
              6. Outputværdi: Indien
              7. Apex: ConvertFareToINRApex
          9. 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.

          1. Opret et tilbud.
            I feltet Fakturering til land skal du skrive India.
          2. Gem dine ændringer.
          3. Klik på Gennemse kataloger og føj Delhi - New York til tilbuddet.
          4. 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.
            Tilbudspris - vandfald
          5. Hvis du vil se den konverterede sats for din tilbudslinjevarer, skal du klikke Ikonet Vispå i tilbudslinjevarerækken og vælge Vis.
          6. Beskrivelse af linjevare viser den lokaliserede pris for din flyrejse.
            Beskrivelse af tilbudslinjevare
           
          Indlæser
          Salesforce Help | Article