Loading
Erstellen von benutzerdefinierten Feldern und Definieren von Apex-Auslösern

Erstellen von benutzerdefinierten Feldern und Definieren von Apex-Auslösern

Erstellen Sie die erforderlichen benutzerdefinierten Felder und definieren Sie Apex-Auslöser für die Objekte "Angebotsbelegposten" und "Auftragsprodukt (OrderItem)".

Erforderliche Editionen

Verfügbarkeit: Lightning Experience
Verfügbarkeit: Enterprise, Unlimited und Developer Edition der Umsatzverwaltung (ehemals Revenue Cloud) mit der Revenue Cloud Growth-Lizenz oder der Revenue Cloud Advanced-Lizenz

Erstellen des benutzerdefinierten Felds ConstraintEngineNodeStatus

Erstellen Sie ein benutzerdefiniertes Feld in den Objekten "Quelle für Angebotsbelegposten", "Auftragsprodukt" und "Vermögenswertaktion", um Daten zu speichern, die das Modul für Einschränkungsregeln für die interne Verarbeitung verwendet.

Wechseln Sie zu den Objektverwaltungseinstellungen dieser Objekte und erstellen Sie ein benutzerdefiniertes Feld mit den folgenden Werten:

  1. Wählen Sie Textbereich (Lang) als Datentyp aus.
  2. Geben Sie Status des Einschränkungsmodulknotens als Feldbezeichnung ein.
  3. Geben Sie 131072 als Länge ein.
  4. Geben Sie ConstraintEngineNodeStatus als Feldnamen ein.
  5. Wählen Sie Sichtbarer Zugriff und deaktivieren Sie Schreibgeschützten Zugriff für die Profile der Benutzer, die das Modul für Einschränkungsregeln verwenden, sowie für Kunden-Community- und Partner-Community-Benutzer.
  6. Deaktivieren Sie die Seitenlayouts.

Definieren von Apex-Auslösern für Angebots- und Auftragsbelegposten

Definieren Sie Auslöser für die Objekte "Angebotsbelegposten" und "Auftragsprodukt (OrderItem)" mithilfe von Apex Code.

Verwenden Sie diesen Apex Code für das Objekt "Angebotsbelegposten".

trigger QuoteItemTrigger on QuoteLineItem (before insert) {
   //collect QuoteActionIds 
   Set<Id> quoteActionIds = new Set<Id>();
   
   for (QuoteLineItem qi : Trigger.new) {
   if (qi.QuoteActionId != null && qi.ConstraintEngineNodeStatus__c == null) {
   quoteActionIds.add(qi.QuoteActionId);
   }
   }
   
   if (!quoteActionIds.isEmpty()) {
   // Step 1: Get QuoteAction → SourceAsset
   Map<Id, Id> quoteActionToAssetId = new Map<Id, Id>();
   for (QuoteAction qAction : [
   SELECT Id, SourceAssetId 
   FROM QuoteAction 
   WHERE SourceAssetId != null 
   AND Id IN :quoteActionIds
   ]) {
   quoteActionToAssetId.put(qAction.Id, qAction.SourceAssetId);
   }
   
   // Step 2: Get AssetActions
   List<AssetAction> assetActions = [
   SELECT Id, AssetId, ActionDate 
   FROM AssetAction 
   WHERE AssetId IN :quoteActionToAssetId.values()
   ];
   
   // Step 3: Get latest AssetAction per Asset
   Map<Id, AssetAction> assetIdToLatestAction = new Map<Id, AssetAction>();
   for (AssetAction aAction : assetActions) {
   AssetAction existing = assetIdToLatestAction.get(aAction.AssetId);
   if (existing == null || aAction.ActionDate > existing.ActionDate) {
   assetIdToLatestAction.put(aAction.AssetId, aAction);
   }
   }
   
   // Step 4: Get related AssetActionSource records
   Map<Id, Id> assetIdToActionId = new Map<Id, Id>();
   for (Id assetId : assetIdToLatestAction.keySet()) {
   assetIdToActionId.put(assetId, assetIdToLatestAction.get(assetId).Id);
   }
   
   List<AssetActionSource> assetActionSources = [
   SELECT ConstraintEngineNodeStatus__c, AssetAction.AssetId 
   FROM AssetActionSource 
   WHERE AssetActionId IN :assetIdToActionId.values() ORDER BY CreatedDate DESC
   ];
   // Step 5: Map AssetId → Status
   Map<Id, String> assetIdToStatus = new Map<Id, String>();
   for (AssetActionSource actionSource : assetActionSources) {
   if (!assetIdToStatus.containsKey(actionSource.AssetAction.AssetId) && 
   actionSource.ConstraintEngineNodeStatus__c != null) {
   assetIdToStatus.put(
   actionSource.AssetAction.AssetId, 
   actionSource.ConstraintEngineNodeStatus__c
   );
   }
   }
   List<QuoteLineItem> toUpdate = new List<QuoteLineItem>();
   // Step 6: Set ConstraintEngineNodeStatus__c directly on Trigger.new records
   for (QuoteLineItem qi : Trigger.new) {            
   if (qi.QuoteActionId != null && qi.ConstraintEngineNodeStatus__c == null) {
   Id assetId = quoteActionToAssetId != null ? quoteActionToAssetId.get(qi.QuoteActionId) : null;
   if (assetId != null && assetIdToStatus != null) {
   String status = assetIdToStatus.get(assetId);
   if (status != null) {
   qi.ConstraintEngineNodeStatus__c = status;
   }
   }
   }
   }
   }
   }

Verwenden Sie diesen Apex Code für das Objekt "Auftragsprodukt (OrderItem)".

trigger OrderItemTrigger on OrderItem  (before insert) {
  //collect orderActionIds
  Set<Id> orderActionIds = new Set<Id>();
 
  for (OrderItem oi : Trigger.new) {
  if (oi.OrderActionId != null && oi.ConstraintEngineNodeStatus__c == null) {
  orderActionIds.add(oi.OrderActionId);
  }
  }
 
  if (!orderActionIds.isEmpty()) {
  // Step 1: Get OrderAction → SourceAsset
  Map<Id, Id> orderActionToAssetId = new Map<Id, Id>();
  for (OrderAction oAction : [
  SELECT Id, SourceAssetId
  FROM OrderAction
  WHERE SourceAssetId != null
  AND Id IN :orderActionIds
  ]) {
  orderActionToAssetId.put(oAction.Id, oAction.SourceAssetId);
  }
 
  // Step 2: Get AssetActions
  List<AssetAction> assetActions = [
  SELECT Id, AssetId, ActionDate
  FROM AssetAction
  WHERE AssetId IN :orderActionToAssetId.values()
  ];
 
  // Step 3: Get latest AssetAction per Asset
  Map<Id, AssetAction> assetIdToLatestAction = new Map<Id, AssetAction>();
  for (AssetAction aAction : assetActions) {
  AssetAction existing = assetIdToLatestAction.get(aAction.AssetId);
  if (existing == null || aAction.ActionDate > existing.ActionDate) {
  assetIdToLatestAction.put(aAction.AssetId, aAction);
  }
  }
 
  // Step 4: Get related AssetActionSource records
  Map<Id, Id> assetIdToActionId = new Map<Id, Id>();
  for (Id assetId : assetIdToLatestAction.keySet()) {
  assetIdToActionId.put(assetId, assetIdToLatestAction.get(assetId).Id);
  }
 
  List<AssetActionSource> assetActionSources = [
  SELECT ConstraintEngineNodeStatus__c, AssetAction.AssetId
  FROM AssetActionSource
  WHERE AssetActionId IN :assetIdToActionId.values() ORDER BY CreatedDate DESC
  ];
  // Step 5: Map AssetId → Status
  Map<Id, String> assetIdToStatus = new Map<Id, String>();
  for (AssetActionSource actionSource : assetActionSources) {
  if (!assetIdToStatus.containsKey(actionSource.AssetAction.AssetId) &&
  actionSource.ConstraintEngineNodeStatus__c != null) {
  assetIdToStatus.put(
  actionSource.AssetAction.AssetId,
  actionSource.ConstraintEngineNodeStatus__c
  );
  }
  }
  List<OrderItem> toUpdate = new List<OrderItem>();
  // Step 6: Set ConstraintEngineNodeStatus__c directly on Trigger.new records
  for (OrderItem oi : Trigger.new) {           
  if (oi.OrderActionId != null && oi.ConstraintEngineNodeStatus__c == null) {
  Id assetId = orderActionToAssetId != null ? orderActionToAssetId.get(oi.OrderActionId) : null;
  if (assetId != null && assetIdToStatus != null) {
  String status = assetIdToStatus.get(assetId);
  if (status != null) {
  oi.ConstraintEngineNodeStatus__c = status;
  }
  }
  }
  }
  }
  }

Siehe Definieren von Apex Auslösern.

Nachdem Sie die Apex-Auslöser definiert haben, richten Sie das Modul für Einschränkungsregeln ein.

 
Laden
Salesforce Help | Article