Usted está aquí:
Utilizar precios de partidas de detalles de transacciones avanzados para asignar campos personalizados
Los usuarios pueden actualizar campos personalizados en artículos de transacciones de ventas o detalles de artículos de transacciones de ventas a través de procedimientos de precios utilizando la función Precios de partidas de detalles avanzados. Con esta función, los usuarios ya no necesitan utilizar flujos o desencadenadores personalizados para actualizar esos campos. Esta función es útil para casos de uso de corrección, renovación y cancelación.
Ediciones necesarias
| Disponible en: Lightning Experience |
| Disponible en: Ediciones Enterprise, Unlimited y Developer de Revenue Cloud donde Gestión de transacciones está activada |
| Permisos de usuario necesarios | |
|---|---|
| Para configurar y utilizar precios de partidas de detalles avanzados: | Administrador de Salesforce Y Conjunto de permisos Usuario de tiempo de diseño de precios |
Antes de empezar, complete estas tareas.
- Para activar la función Precios de partidas de detalles avanzados, en Configuración, busque y seleccione Configuración de ingresos y luego active la configuración Precios de partidas de detalles avanzados.
- Configure su procedimiento de precios.
- Agregar asignaciones de etiquetas de contexto al elemento Partida de mapa de procedimiento de precios utilizando JSON
Para configurar un procedimiento de precios para utilizar precios de partidas de detalles avanzados, copie y pegue el JSON de la partida de mapa en un procedimiento de precios en Precios de ingresos. - Agregar asignaciones de etiquetas de contexto al elemento Partida de mapa de procedimiento de descubrimiento utilizando JSON
Para configurar un procedimiento de descubrimiento para utilizar precios de partidas de detalles avanzados con productos de precios derivados, copie y pegue la partida de mapa para JSON de precios derivados en un procedimiento de descubrimiento en Precios de ingresos.
Actualizar procedimiento de precios de ingresos
Para configurar precios de partidas de detalles avanzados, modifique su procedimiento de precios de ingresos.
- Desde el Iniciador de aplicación, busque y seleccione Procedimientos de precios y luego seleccione un procedimiento de precios para actualizar.
- Modifique el procedimiento de precios agregando un nuevo elemento de partida de mapa como el segundo elemento junto a la configuración de precios en el procedimiento de precios.
-
Agregue asignaciones de etiquetas de contexto a la partida de mapa.
Variable de entrada
Variable de salida
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
Tras agregar las asignaciones de etiquetas de contexto, verá las asignaciones predeterminadas entre SalesTransaction y SalesTransactionItemDetail con definiciones de contexto actualizadas.
Actualizar procedimiento de descubrimiento de precios derivado
Si está utilizando precios derivados, realice cambios adicionales en su procedimiento de descubrimiento tras completar los cambios en su procedimiento de precios de ingresos. Estos cambios son necesarios para determinar productos derivados y colaboradores válidos.
- Desde el Iniciador de aplicación, busque y seleccione Procedimientos de descubrimiento y luego seleccione un procedimiento de descubrimiento para actualizar.
-
Agregue dos nuevos elementos al procedimiento de descubrimiento a productos derivados de precios: Configuración de descubrimiento y Partida de mapa.
Agregue estas variables a la configuración de descubrimiento.
- Variable de entrada: Partida
- Variable de salida: LineItem
Agregue estas variables a la partida de mapa.- Variable de entrada: SalesTransactionItem
- Variable de salida: SalesTransactionItemDetail
Agregue estas variables adicionales a la partida de mapa.
Variable de entrada
Variable de salida
LineItem
SalesTrxnItemDetailSource
EffectiveFrom
ItemDetailEffectiveFrom__std
EffectiveTo
ItemDetailEffectiveTo__std
DerivedPricingAttribute
ItemDetailDerivedPricingAttribute__std
-
Apoye campos personalizados utilizando procedimientos de precios para corregir, renovar y cancelar casos de uso (ARC).
La configuración de campos personalizados es aplicable si utiliza las API de ARC y desea utilizar campos personalizados.
- Agregue campos personalizados a los objetos QuoteLineItem, QuoteLineItem Detail, OrderProduct y OrderProductDetails.
- En la definición de contexto, cree una entrada para estos campos personalizados en los nodos SalesTransactionItem y SalesTransactionItemDetail.
- Cree las asignaciones requeridas en QuoteEntitiesMapping y OrderEntitiesMapping.
-
Modifique el procedimiento de precios de ingresos para campos personalizados.
- En el procedimiento de precios, modifique el elemento MapLineItem para agregar una asignación entre SalesTransactionItem.CustomField y SalesTransactionItemDetail.CustomField.
-
Cree cualquier elemento de personalización necesario en el procedimiento de precios para asignar un valor a SalesTransactionItem.CustomField.
El procedimiento de precios detecta automáticamente si una partida específica tiene entradas de detalles y escribe en SalesTransactionItemDetail.CustomField si existen. De lo contrario, escribe en SalesTransactionItem.CustomField.
Durante las nuevas transacciones de venta, CustomField en SalesTransactionItem se rellena. Para escenarios de ARC con líneas de detalle, la línea de detalle se escribe en CustomField en SalesTransactionItemDetail. Si no se crean líneas de detalles para ARC, la línea de detalle se escribe en CustomField en SalesTransactionItem.
-
Para redactar campos personalizados en QuoteLineItem o OrderProducts con líneas de detalle, complete esta configuración adicional que implica planes de procedimientos y clases Apex.
- Active un plan de procedimiento. En Configuración, busque y seleccione Configuración de ingresos y active la configuración Orquestación de plan de procedimientos para precios.
- Cree un plan para el presupuesto y el pedido.
- En el plan de procedimiento, verifique que todos los pasos incluyen el elemento MapLineItem. Modifique las asignaciones basándose en los campos utilizados en el procedimiento de precios.
- Utilice este ejemplo de clase Apex Apex ApexCustomFieldHandler, que puede mejorar para actualizar múltiples campos personalizados si es necesario. Esta clase consulta nodos SalesTransactionItem y SalesTransactionItemDetail, extrae valores de campo personalizados de elementos de detalles y luego actualiza los campos personalizados correspondientes en 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;
}
}

