Vous êtes ici :
Utilisation de la tarification avancée des lignes de détail de transaction pour mapper des champs personnalisés
Les utilisateurs peuvent mettre à jour des champs personnalisés dans des éléments de transaction commerciale ou des détails d'élément de transaction commerciale via des procédures de tarification en utilisant la fonctionnalité Tarification de ligne de détail avancée. Avec cette fonctionnalité, les utilisateurs n'ont plus besoin d'utiliser des déclencheurs ou des flux personnalisés pour mettre à jour ces champs. Cette fonctionnalité est utile pour les cas d'utilisation d'amendement, de renouvellement et d'annulation.
Éditions requises
| Disponible avec : Lightning Experience |
| Disponible avec : Éditions Enterprise, Unlimited et Developer de Revenue Cloud dans lesquelles la Gestion des transactions est activée |
| Autorisations utilisateur requises | |
|---|---|
| Pour configurer et utiliser la tarification avancée des lignes de détail : | Administrateur Salesforce ET Ensemble d'autorisations Utilisateur du temps de conception de la tarification |
Avant de commencer, effectuez les tâches ci-dessous.
- Pour activer la fonctionnalité Tarification de la ligne de détail avancée, dans Configuration, recherchez et sélectionnez Paramètres de revenu, puis activez le paramètre Tarification de la ligne de détail avancée.
- Configurez votre procédure de tarification.
- Ajout de mappages de balises de contexte à l’élément Élément d’élément de ligne de mappage de la procédure de tarification en utilisant JSON
Pour configurer une procédure de tarification afin d'utiliser la tarification par ligne de détail avancée, copiez-collez le JSON de l'élément de ligne de carte dans une procédure de tarification dans Tarification du revenu. - Ajout de mappages de balises de contexte à l'élément Élément d'élément de ligne de carte de procédure de découverte en utilisant JSON
Pour configurer une procédure de découverte afin d'utiliser la tarification par ligne de détail avancée avec des produits à tarification dérivée, copiez-collez l'élément de ligne de carte pour le JSON de tarification dérivée dans une procédure de découverte dans Tarification du revenu.
Mise à jour de la procédure de tarification du revenu
Pour configurer la tarification des lignes de détail avancées, modifiez votre procédure de tarification du revenu.
- Dans le Lanceur d'application, recherchez et sélectionnez Procédures de tarification, puis sélectionnez une procédure de tarification à mettre à jour.
- Modifiez la procédure de tarification en ajoutant un nouvel élément d'élément de ligne de carte en tant que deuxième élément en regard du paramètre de tarification dans la procédure de tarification.
-
Ajoutez des mappages de balises de contexte à l'élément de ligne de carte.
Variable d'entrée
Variable de sortie
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
DerivedPricingAttribute
ItemDetailDerivedPricingAttribute__std
ItemGroupSummarySubtotal
ItemDetailGroupSummaryTotal__std
ListPrice
ItemDetailListPrice__std
IsContracted
ItemDetailIsContracted__std
ItemContractPrice
ItemDetailContractPrice__std
STI_TenantName__c
STID_TenantName__c
Après avoir ajouté les mappages de balises de contexte, les mappages par défaut entre SalesTransaction et SalesTransactionItemDetail sont affichés avec des définitions de contexte mises à jour.
Mise à jour de la procédure de découverte de la tarification dérivée
Si vous utilisez la tarification dérivée, apportez des modifications supplémentaires à votre procédure de découverte après avoir apporté des modifications à votre procédure de tarification du revenu. Ces modifications sont nécessaires pour déterminer les produits contributeurs et dérivés valides.
- Dans le Lanceur d'application, recherchez et sélectionnez Procédures de découverte, puis sélectionnez une procédure de découverte à mettre à jour.
-
Ajouter deux nouveaux éléments à la procédure de découverte pour les produits dérivés du prix : Paramètres de découverte et Élément de ligne de carte.
Ajoutez ces variables aux paramètres de découverte.
- Variable d'entrée : Élément de ligne
- Variable de sortie : LineItem
Ajoutez ces variables à l'élément de ligne de carte.- Variable d'entrée : SalesTransactionItem
- Variable de sortie : SalesTransactionItemDetail
Ajoutez ces variables supplémentaires à l'élément de ligne de carte.
Variable d'entrée
Variable de sortie
LineItem
SalesTrxnItemDetailSource
EffectiveFrom
ItemDetailEffectiveFrom__std
EffectiveTo
ItemDetailEffectiveTo__std
DerivedPricingAttribute
ItemDetailDerivedPricingAttribute__std
-
Prenez en charge les champs personnalisés en utilisant des procédures de tarification pour amender, renouveler et annuler des cas d'utilisation (ARC).
La configuration de champs personnalisés est applicable si vous utilisez des API ARC et souhaitez utiliser des champs personnalisés.
- Ajoutez des champs personnalisés aux objets QuoteLineItem, QuoteLineItem Detail, OrderProduct et OrderProductDetails.
- Dans la définition du contexte, créez une entrée pour ces champs personnalisés dans les nœuds SalesTransactionItem et SalesTransactionItemDetail.
- Créez les mappages requis dans QuoteEntitiesMapping et OrderEntitiesMapping.
-
Modifiez la procédure de tarification du revenu pour les champs personnalisés.
- Dans la procédure de tarification, modifiez l'élément MapLineItem pour ajouter un mappage entre SalesTransactionItem.CustomField et SalesTransactionItemDetail.CustomField.
-
Créez tous les éléments de personnalisation nécessaires dans la procédure de tarification pour attribuer une valeur à SalesTransactionItem.CustomField.
La procédure de tarification détecte automatiquement si une ligne spécifique contient des entrées de détail et écrit dans SalesTransactionItemDetail.CustomField si elles existent. Sinon, il écrit dans SalesTransactionItem.CustomField.
Lors de nouvelles transactions commerciales, CustomField dans SalesTransactionItem est rempli. Pour des scénarios ARC avec des lignes de détail, la ligne de détail est écrite dans CustomField sur SalesTransactionItemDetail. Si aucune ligne de détail n'est créée pour ARC, elle est écrite dans CustomField sur SalesTransactionItem.
-
Pour écrire des champs personnalisés sur QuoteLineItem ou OrderProducts avec des lignes de détail, complétez cette configuration supplémentaire impliquant des plans de procédure et des classes Apex.
- Activez un plan de procédure. Dans Configuration, recherchez et sélectionnez Paramètres de revenu, puis activez le paramètre Orchestration du plan de procédure pour la tarification.
- Créez un plan de procédure pour le devis et la commande.
- Dans le plan de procédure, vérifiez que toutes les étapes incluent l'élément MapLineItem. Modifiez les mappages en fonction des champs utilisés dans la procédure de tarification.
- Utilisez cet exemple de classe ApexCustomFieldHandler, que vous pouvez améliorer pour mettre à jour plusieurs champs personnalisés si nécessaire. Cette classe interroge les nœuds SalesTransactionItem et SalesTransactionItemDetail, extrait les valeurs de champ personnalisées des éléments de détail, puis met à jour les champs personnalisés correspondants dans 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;
}
}

