Loading
Lär
Innehållsförteckningar
Välj filter

          Inga resultat
          Inga resultat
          Här är några söktips

          Kontrollera stavningen av dina nyckelord.
          Använd mer allmänna söktermer.
          Välj färre filter för att utöka din sökning.

          Sök hela Salesforce-hjälpen
          Använd ramverket för förfarandeplan

          Använd ramverket för förfarandeplan

          För att säkerställa att dina procedurer körs i rätt ordning och prissättning tillämpas enhetligt på en offert, skapa en ny procedurplan.

          Versioner som krävs

          Tillgängliga i: Lightning Experience
          Tillgängliga i: Versionerna Enterprise, Performance, Unlimited och Developer av Revenue Cloud där Salesforce-prissättning har aktiverats
          Användarbehörigheter som krävs för att
          Skapa och uppdatera definitioner av förfarandeplaner:

          Åtkomst till procedurplan

          OCH

          Användare av designtid för Salesforce-prissättning

          Skapa, uppdatera och ta bort prissättningsprocesser:

          Åtkomst till procedurplan

          ELLER

          Användare av designtid för Salesforce-prissättning

          Använda prissättningsprocesser: Användare av Salesforce Pricing Runtime
          Definiera, redigera, ta bort, ange säkerhet och konfigurera versionsinställningar för Apex-utlösare: Apex-författare

          Tänk dig att du arbetar på ett flygbolag och hjälper affärsresenärer. Nu bokar vi en flygresa! Vi vill att vår prissättning ska återspegla marknadsförhållanden i realtid och visa priser i kundens lokala valuta.

          Innan vi beräknar priset hämtar vi automatiskt ett dynamiskt baspris från ett externt system för att säkerställa konkurrenskraftig prissättning. Vi tillämpar även bokningsplattformens rabatter och lägger till en bekvämlighetsavgift.

          När vi har byggt vår procedurplan skapar vi en offert. Baserat på användarens plats (till exempel Indien) konverterar vi sedan det totala priset från USD till INR.

          Innan du börjar, se till att:

          • Ha aktiverat Salesforce-prissättning.
          • Ha behörighet att skapa procedurer, procedurplaner, produkter och offerter.
          • Förstå hur du skapar prissättningsprocesser. Mer information om prissättningsprocesser finns i Bygg dina prissättningsprocesser med Salesforce Pricing.
          • Förstå och veta hur man använder sammanhangsdefinitioner. Mer information om sammanhangsdefinitioner finns i Sammanhangsdefinitioner.
          • Använd samma sammanhangsdefinition i dina prissättningsprocesser och förfarandeplaner.

          Processplandefinitioner kan vara komplexa, särskilt när de involverar Apex klasser och olika prissättningsprocesser. Följ dessa steg för att skapa en offert och få reda på hur du gör din prissättning dynamisk och korrekt utan att krångla till själva proceduren.

          Slå på Orkestrering av procedurplan för prissättning

          1. I Inställningar, i rutan Snabbsökning, skriv Intäktsinställningar och välj sedan Intäktsinställningar.
          2. Hitta och aktivera Procedurplanorkestrering för prissättning.
          3. Hitta och aktivera Uteslut standardprissättning och prissättning för försäljningstransaktioner.

          Skapa en kommersiell produkt

          1. Sök upp och öppna Produkter från Appstartaren.
          2. Skapa en kommersiell produkt som heter Delhi - New York.
            Mer information om hur du skapar en produkt finns i Skapa enkla produkter och se till att Produktposttyp är inställd som Kommersiell.
          3. Lägg till din produkt i katalogen och skapa en prisbokpost för den.
          4. I Inställningar, i rutan Snabbsökning, sök efter och välj Salesforces prissättningsinställningar.
          5. I sektionen Synkronisera prissättningsdata, klicka på Synkronisera.

          Bygg din prissättningsprocess

          1. Skapa ett prissättningsförfarande och döp det till Prissättningsförfarande för flygbokning.
            För att skapa en prissättningsprocess, följ de första 5 stegen i Konfigurera din prissättningsprocess.
          2. Skapa konstanter. Dessa konstanter kommer att fungera som platshållare för fasta värden i din prissättningsprocess.
            Konstantnamn Datatyp Standardinställning
            AdjType TEXT Procent
            AdjValue NUMMER 5
            Åsidosätt TEXT Åsidosätt
            ConvFeeAdjType TEXT Belopp
            ConvFeeAdjValue NUMMER -250
          3. Lägg till följande element.
            1. Prissättning
            2. Listpris. Använd beslutstabellen Prisbokposter V2.
            3. Manuella rabatter. Du måste lägga till tre manuella rabattelement.
          4. Det första elementet Manuell rabatt läggs till för att beräkna flygningens dynamiska baspris. Mappa dessa variabler.
            • Indatavariabler
              • Justeringstyp: Åsidosätt
              • Justeringsvärde: PartnerUnitPrice
              • Mängd: LineItemQuantity
              • Enhetspris för indata: ListPrice
            • Utdatavariabel
              • Nettoenhetspris: NetUnitPrice
          5. Det andra elementet Manuell rabatt läggs till för att beräkna plattformsrabatten för flygbokningen. Mappa dessa variabler.
            • Indatavariabler
              • Justeringstyp: AdjType
              • Justeringsvärde: AdjValue
              • Mängd: LineItemQuantity
              • Enhetspris för indata: PartnerUnitPrice
            • Utdatavariabel
              • Nettoenhetspris: NetUnitPrice
          6. Och det sista elementet för manuell rabatt läggs till för att beräkna bekvämlighetsavgiften för att debitera din kund för flygbokningen.
            • Indatavariabler
              • Justeringstyp: ConvFeeAdjType
              • Justeringsvärde: ConvFeeAdjValue
              • Mängd: LineItemQuantity
              • Enhetspris för indata: NetUnitPrice
            • Utdatavariabel
              • Nettoenhetspris: NetUnitPrice
          7. Ange dina inställningar för att visa prisinformation, profilåtkomst och rangordningsinformation.
          8. Spara din procedur.
          9. Aktivera din procedur.

          Din behandling ska se ut så här. För tydlighetens skull har vi bytt namn på varje element i Manuell rabatt för att visa den prissättningsberäkning det kommer att utföra. För att byta namn på ett element, klicka på Ikonen Redigeraoch ange ditt önskade namn.

          Förfarandeplanens prissättningsförfarande

          Definiera klasser för Apex Hooks

          1. I Inställningar, i rutan Snabbsökning, skriv Apex och välj sedan Apex-klasser.
          2. Klicka på Ny.
          3. Den första Apex klassen är en förinställning som hämtar alla försäljningstransaktionsobjekt från prissättningssammanhanget och åsidosätter deras PartnerUnitPrice-tagg med ett dynamiskt slumpmässigt baspris mellan 990 och 1200 innan prissättning utförs från en extern databas.
            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. Skapa en annan Apex klass.
            Denna Apex klass är en posthook som hämtar taggen NetUnitPrice efter prissättning och konverterar den till den lokala valutan INR (indiska rupier) med hjälp av en simulerad dynamisk valutakurs mellan 85-86. Den uppdaterar sedan beskrivningen av försäljningstransaktionsobjekt med det nya INR-priset, vilket ger lokaliserad prissättningssynlighet för indiska 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;
                }
            }
            

          Konfigurera en egen procedurplandefinition

          1. I Inställningar, i rutan Snabbsökning, sök efter och välj Procedurplandefinitioner.
          2. Klicka på Ny
          3. Ange dessa detaljer.
            1. Titel: Procedurplan för flygbokning.
              Tryck på Tab för att automatiskt fylla i utvecklarnamnet.
            2. Processtyp: Revenue Cloud.
            3. Primärt objekt: Citat.
            4. Sammanhangsdefinition: <Namn på sammanhangsdefinition>.
              Du måste välja en sammanhangsdefinition som är utformad för ditt användningsfall. Se dock till att detta är samma sammanhangsdefinition som du använde när du byggde din prissättningsprocess.
            5. Spara dina ändringar.
          4. Öppna den nyligen skapade definitionsposten för förfarandeplan.
          5. För att lägga till de procedurer du vill ha i Avsnitt i procedurplan, välj Lägg till.
          6. Lägg till den första sektionen för att få det dynamiska baspriset för vårt flyg. Ange dessa detaljer.
            1. Typ: Standard.
            2. Namn: DynamicBasePriceApex.
            3. Sektionstyp: Apex.
            4. När sektionen har lagts till, klicka på Pil-ikon och specificera dessa detaljer.
              1. Faser: Prissättning
              2. Lösningstyp: Standard
              3. Apex: DynamicFlightBasePriceApex
              Det borde se ut ungefär så här:
              Sektionen Procedurplan
          7. På samma sätt kan du lägga till en annan sektion för att utföra prissättningsberäkningen och åsidosätta baspriset med det pris vi skapade med Apex förinställning. Specificera dessa värden.
            1. Typ: Standard.
            2. Namn: FlightPriceCalculation.
            3. Sektionstyp: Prissättningsförfarande .
            4. Klicka på Pil-ikon och specificera dessa detaljer.
              1. Faser: Prissättning
              2. Lösningstyp: Standard
              3. Förfarande: Procedur för flygbokningsprissättning
          8. Slutligen, lägg till en sektion för att konvertera priset från USD till INR (US-dollar till Indisk rupie) genom att lägga till denna Apex posthook för användare vars Faktureringsland är inställt till Indien
            1. Typ: Standard.
            2. Namn: ConvertFareToINR.
            3. Sektionstyp: Apex.
            4. Klicka på Pil-ikon och specificera dessa detaljer.
              1. Faser: Prissättning
              2. Lösningstyp: Regelbaserad
              3. Villkorskrav: Alla villkor uppfylls (OCH)
              4. Resurs: Fakturera till land
              5. Operator: Lika med
              6. Utdatavärde: Indien
              7. Apex: ConvertFareToINRApex
          9. Spara och aktivera sedan din definition av procedurplan.

          Verifiera utförandet av din procedurplan

          För att verifiera om procedurplanen utförs i den ordning vi anger och prissättningen är korrekt måste vi skapa en offert.

          1. Skapa en offert.
            I fältet Fakturera till land, ange Indien.
          2. Spara dina ändringar.
          3. Klicka på Bläddra i kataloger och lägg till produkten Delhi - New York i offerten.
          4. Håll markören över värdet för nettoenhetspris för att se detaljerna om vattenfall.
            Du ser tillämpningen av din procedurplan och de rabatter och tillägg som du konfigurerat i din prissättningsprocess.
            Vattenfall för offertpris
          5. För att se det konverterade priset för din offertradartikel, klicka Ikonen Visapå i offertradartikelraden och välj Visa.
          6. Beskrivning av radartikel visar det lokaliserade priset för din flygning.
            Beskrivning av offertradartikel
           
          Laddar
          Salesforce Help | Article