Ti trovi qui:
Utilizzo di Advanced Transaction Detail Line Pricing per mappare i campi personalizzati
Gli utenti possono aggiornare i campi personalizzati sulle voci transazione di vendita o sui dettagli delle voci transazione di vendita tramite le procedure di calcolo dei prezzi utilizzando la funzione Advanced Detail Line Pricing (Prezzi linea di dettagli avanzati). Con questa funzione, gli utenti non devono più utilizzare trigger o flussi personalizzati per aggiornare tali campi. Questa funzione è utile per i casi d'uso di modifica, rinnovo e annullamento.
Versioni (Edition) richieste
| Disponibile nelle versioni: Lightning Experience |
| Disponibile in: Enterprise Edition, Unlimited Edition e Developer Edition di Revenue Cloud in cui è abilitata la gestione delle transazioni |
| Autorizzazioni utente necessarie | |
|---|---|
| Per impostare e utilizzare i prezzi avanzati delle linee di dettaglio: | Amministratore Salesforce E Insieme di autorizzazioni Utente Pricing Design Time |
Prima di iniziare, eseguire le seguenti operazioni.
- Per attivare la funzione Advanced Detail Line Pricing, in Imposta, trovare e selezionare Impostazioni reddito e quindi attivare l'impostazione Advanced Detail Line Pricing.
- Configurare la procedura di calcolo dei prezzi.
- Aggiunta di mappature di tag contesto all'elemento Voce mappa procedura prezzi utilizzando JSON
Per configurare una procedura di calcolo dei prezzi per l'utilizzo dei prezzi avanzati per le linee di dettaglio, copiare e incollare il JSON della voce mappa in una procedura di calcolo dei prezzi in Prezzi reddito. - Aggiunta di mappature di tag contesto all'elemento Voce mappa procedura di individuazione tramite JSON
Per configurare una procedura di individuazione in modo che utilizzi i prezzi avanzati delle linee di dettaglio con i prodotti basati sui prezzi derivati, copiare e incollare l'elemento della linea di mappa per il JSON prezzi derivati in una procedura di individuazione in Prezzi reddito.
Procedura di aggiornamento dei prezzi del reddito
Per configurare i prezzi avanzati delle linee di dettaglio, modificare la procedura di calcolo dei prezzi del reddito.
- Dal Programma di avvio app, trovare e selezionare Procedure prezzi e quindi selezionare una procedura prezzi da aggiornare.
- Modificare la procedura di calcolo dei prezzi aggiungendo un nuovo elemento voce mappa come secondo elemento accanto all'impostazione dei prezzi nella procedura di calcolo dei prezzi.
-
Aggiungere mappature di tag contesto all'elemento riga mappa.
Variabile di input
Variabile di output
LineItem
SalesTrxnItemDetailSource
LineItemQuantity
ItemDetailQuantity
NetUnitPrice
ItemDetailNetUnitPrice
price_water_fall
DetailPriceWaterfallIdentifier
InputUnitPrice
ItemDetailUnitPrice
ItemBillingReference
ItemDetailBillingReference
ItemNetTotalPrice
ItemDetailTotalPrice
TotalLineAmount
ItemDetailTotalLineAmount
EffectiveFrom
ItemDetailEffectiveFrom__std
EffectiveTo
ItemDetailEffectiveTo__std
PricingTermCount
ItemDetailPricingTermCount__std
itemTransientEndDate
ItemDetailTransientEndDate__std
ItemPricingSource
ItemDetailPricingSource__std
Attributo prezzi derivati
ItemDetailDerivedPricingAttribute__std
ItemGroupSummarySubtotal
ItemDetailGroupSummaryTotal__std
ListPrice
ItemDetailListPrice__std
IsContracted
ItemDetailIsContracted__std
ItemContractPrice
ItemDetailContractPrice__std
STI_TenantName__c
STID_TenantName__c
Dopo aver aggiunto le mappature dei tag contesto, vengono visualizzate le mappature predefinite tra SalesTransaction e SalesTransactionItemDetail con definizioni contesto aggiornate.
Procedura di aggiornamento dell'individuazione dei prezzi derivati
Se si utilizzano prezzi derivati, apportare ulteriori modifiche alla procedura di individuazione dopo aver completato le modifiche alla procedura di determinazione dei prezzi del reddito. Queste modifiche sono necessarie per determinare i prodotti che apportano contributi e derivati validi.
- Dal Programma di avvio app, trovare e selezionare Procedure di individuazione e quindi selezionare una procedura di individuazione da aggiornare.
-
Aggiungere due nuovi elementi alla procedura di individuazione del prezzo dei prodotti derivati: Impostazioni Discovery e Voce mappa.
Aggiungere queste variabili alle impostazioni di Discovery.
- Variabile di input: Voce
- Variabile di output: LineItem
Aggiungere queste variabili alla voce della mappa.- Variabile di input: SalesTransactionItem
- Variabile di output: SalesTransactionItemDetail
Aggiungere queste variabili aggiuntive alla voce della mappa.
Variabile di input
Variabile di output
LineItem
SalesTrxnItemDetailSource
EffectiveFrom
ItemDetailEffectiveFrom__std
EffectiveTo
ItemDetailEffectiveTo__std
Attributo prezzi derivati
ItemDetailDerivedPricingAttribute__std
-
Supportare i campi personalizzati utilizzando le procedure di calcolo dei prezzi per modificare, rinnovare e annullare i casi d'uso.
L'impostazione dei campi personalizzati è applicabile se si utilizzano le API CRF e si desidera utilizzare i campi personalizzati.
- Aggiungere campi personalizzati agli oggetti QuoteLineItem, QuoteLineItem Detail, OrderProduct e OrderProductDetails.
- Nella definizione contesto, creare una voce per questi campi personalizzati nei nodi SalesTransactionItem e SalesTransactionItemDetail.
- Creare le mappature richieste in QuoteEntitiesMapping e OrderEntitiesMapping.
-
Modificare la procedura di calcolo dei prezzi del reddito per i campi personalizzati.
- Nella procedura di calcolo dei prezzi, modificare l'elemento per aggiungere una mappatura tra SalesTransactionItem.CustomField e SalesTransactionItemDetail.CustomField.
-
Creare gli eventuali elementi di personalizzazione necessari nella procedura di calcolo dei prezzi per assegnare un valore a SalesTransactionItem.CustomField.
La procedura di calcolo dei prezzi rileva automaticamente se una riga specifica contiene voci di dettaglio e scrive in SalesTransactionItemDetail.CustomField, se esistenti. In caso contrario, scrive in SalesTransactionItem.CustomField.
Durante le nuove transazioni di vendita, CustomField in SalesTransactionItem viene compilato. Per gli scenari CRF con linee di dettaglio, la linea di dettaglio viene scritta in CustomField in SalesTransactionItemDetail. Se non vengono create righe di dettaglio per CRF, la riga di dettaglio viene scritta in CustomField in SalesTransactionItem.
-
Per scrivere campi personalizzati su QuoteLineItem o OrderProducts con righe di dettagli, completare questa impostazione aggiuntiva che include piani procedura e classi Apex.
- Abilitare un piano procedurale. In Imposta, trovare e selezionare Impostazioni reddito e attivare l'impostazione Orchestrazione piano procedurale per prezzi.
- Creare un piano procedurale per il preventivo e l'ordine.
- Nel piano della procedura, verificare che tutti i passaggi includano l'elemento MapLineItem. Modificare le mappature in base ai campi utilizzati nella procedura di calcolo dei prezzi.
- Utilizzare questo esempio di classe ApexCustomFieldHandler, che è possibile migliorare per aggiornare più campi personalizzati se necessario. Questa classe esegue una query sui nodi SalesTransactionItem e SalesTransactionItemDetail, estrae i valori dei campi personalizzati dagli elementi dettaglio e quindi aggiorna i campi personalizzati corrispondenti in SalesTransactionItem.
global class ApexCustomFieldHandler implements RevSignaling.SignalingApexProcessor {
public virtual class BaseException extends Exception {}
public class OtherException extends BaseException {}
public RevSignaling.TransactionResponse execute(RevSignaling.TransactionRequest request) {
String contextId = request.ctxInstanceId;
Context.IndustriesContext industriesContext = new Context.IndustriesContext();
// STEP 2 - Query SalesTransactionItem nodes
Map<String, Object> inputQueryItem = new Map<String, Object>{
'contextId' => contextId,
'tags' => new List<String>{ 'SalesTransactionItem', 'SalesTransactionItemDetail' }
};
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');
List<Object> itemDetailData = (List<Object>) itemQueryResult.get('SalesTransactionItemDetail');
Map<String, String> salesTransactionItemIdToCustomAggregatedValue = new Map<String, String>();
// STEP 3 - Custom Field Value from SalesTransactionItemDetail
for(Object itemDetailObj : itemDetailData) {
Map<String, Object> itemDetailNode = (Map<String, Object>) itemDetailObj;
Map<String, Object> detailTagMap = (Map<String, Object>) itemDetailNode.get('tagValue');
String lineItemId = (String)((Map<String, Object>) detailTagMap.get('SalesTrxnItemDetailParent')).get('tagValue');
String cfValue = (String)((Map<String, Object>) detailTagMap.get('STID_TenantName__c')).get('tagValue');
System.debug('Custom Field Value for Detail Item' + cfValue);
if(cfValue != null) {
salesTransactionItemIdToCustomAggregatedValue.put(lineItemId, cfValue);
}
}
// STEP 4 - 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;
Map<String, Object> tagMap = (Map<String, Object>) itemNode.get('tagValue');
String lineItemId = (String)((Map<String, Object>) tagMap.get('LineItem')).get('tagValue');
List<Object> dataPath = (List<Object>) itemNode.get('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' => 'STI_TenantName__c',
'attributeValue' => salesTransactionItemIdToCustomAggregatedValue.get(lineItemId)
}
}
});
}
// STEP 5 - Create collection context update
if (!itemNodeUpdates.isEmpty()) {
Map<String, Object> updateInput = new Map<String, Object>{
'contextId' => contextId,
'nodePathAndAttributes' => itemNodeUpdates
};
//Step 6 - Update context
System.debug('--- PREHOOK: SUBMITTING CONTEXT UPDATE ---');
System.debug(JSON.serializePretty(updateInput));
industriesContext.updateContextAttributes(updateInput);
}
RevSignaling.TransactionResponse response = new RevSignaling.TransactionResponse();
response.status = RevSignaling.TransactionStatus.SUCCESS;
return response;
}
}

