ConsolidationService : champ d’application, global

  • Rversion finale: Australia
  • Mis à jour 1 avr. 2026
  • 22 minutes de lecture
  • L’API ConsolidationService est un include de script avec des méthodes de fusion et de déduplication de données métier complexes et hiérarchiques (telles que des contrats, des devis, des éléments de ligne et des droits) à l’aide d’une logique personnalisée.

    Cette API appartient à l’espace de noms sn_l2c_core et nécessite le rôle administrateur et le module d’extension Lead to Cash Core (com.snc.l2c_core) pour y accéder.

    Utilisez l’API ConsolidationService lorsque vous avez besoin d’un contrôle précis sur la façon dont les enregistrements sont combinés. Cette API fournit des fonctionnalités complexes non disponibles dans l’interface utilisateur, telles que :
    • Définir ce qui rend deux enregistrements identiques à travers plusieurs attributs ou entités enfants imbriquées.
    • Fusion conditionnelle des enregistrements lorsque certains critères sont remplis.
    • Application de calculs personnalisés pendant la consolidation, tels que la somme de quantités ou le calcul de plages de dates.
    • Déduplication récursive (consolidation) de structures enfants profondément imbriquées.
    • Réutiliser la même logique de consolidation de manière cohérente entre les flux et les intégrations.

    Le ConsolidationService fait partie du moteur primitif Lead to Cash Core et est accessible via le Base du lead-to-cash produit.

    Avant de commencer

    Avant d’implémenter ConsolidationService, assurez-vous d’avoir :
    • Le module d’extension Lead to Cash Core (com.snc.l2c_core) installé et le rôle administrateur .
    • Include de script personnalisé qui étend sn_l2c_core. LeadToCashService et renvoie votre implémentation ConsolidationService à partir de getConsolidationService(). Cela connecte votre logique de consolidation dans le pipeline afin qu’elle soit résolue par PrimitiveUtil au moment de l’exécution.
    • Familiarité avec PrimitiveUtil, qui est le point d’entrée pour l’invocation des primitives L2C Core, y compris la consolidation.

    ConsolidationService fait partie du Base du lead-to-cash moteur (l2c) Core primitives. Avant d’implémenter cette API, vous devez comprendre comment elle s’intègre dans le pipeline d’invocation plus large.

    PrimitiveUtil est le point d’entrée d’exécution pour toutes les opérations primitives L2C Core, y compris la consolidation. Plutôt que d’invoquer directement ConsolidationService , PrimitiveUtil utilise un mécanisme de point d’extension pour résoudre l’implémentation de service correcte au moment de l’exécution, qu’elle soit déclenchée à partir d’un script côté serveur ou d’une primitive Lead-to-Cash Flow Designer.

    Pour connecter votre logique ConsolidationService à ce pipeline, vous devez créer un include de script personnalisé qui étend sn_l2c_core. LeadToCashService et renvoie votre implémentation ConsolidationService à partir de getConsolidationService(). PrimitiveUtil vérifie le registre du point d’extension pour un LeadToCashService personnalisé au moment de l’exécution et l’invoque si un LeadToCashService est trouvé. Si aucune implémentation personnalisée n’est enregistrée, PrimitiveUtil revient à la sn_l2c_core de base. LeadToCashService automatiquement. Vous n’avez jamais besoin d’instancier ou de référencer cette solution de secours directement dans votre code.

    Extension et workflow de l’API ConsolidationServiceSNC

    Le système de base de l’API ConsolidationServiceSNC est désactivé par défaut pour garantir que la consolidation indésirable n’est pas appliquée sans le savoir. Pour activer les actions de consolidation, vous devez créer une logique personnalisée et éventuellement remplacer les méthodes fournies avec l’include de script ConsolidationServiceSNC.

    Pour étendre et utiliser l’API ConsolidationServiceSNC :
    1. Requis. Créez un include de script personnalisé qui étend sn_l2c_core. ConsolidationService.
    2. Requis. Remplacez enableConsolidation() pour retourner la valeur vrai. Ce marqueur permet au système d’autoriser la consolidation de votre service. Exemple de script :
      var MyConsolidationService = Class.create();
      MyConsolidationService.prototype = Object.extendsObject(
          sn_l2c_core.ConsolidationService,
      {
          enableConsolidation: function () {
              return true; // REQUIRED
          },
      
          type: 'MyConsolidationService'
      });
    3. En fonction des entités que vous souhaitez contrôler, remplacez (ou activez) éventuellement un certain nombre de ces méthodes supplémentaires :
      Remarque :
      Si vous ne remplacez aucune méthode, consolidate() renvoie le JSON cible inchangé sans fusion ni consolidation effectuée.
      Méthode Action
      canConsolidateEntity(contextType) Choisissez les tableaux enfants à consolider dans une cible.
      canMergeEntity(contextType) Fusionner les enfants sources dans une cible.
      getHashConfig() Spécifiez la manière dont les entités sont regroupées (hachage).
      canConsolidateJSON (json1, json2) Décidez si deux JSON doivent fusionner.
      overrideAttributeValues() Appliquez une logique métier personnalisée après une fusion et avant que le JSON consolidé final ne se poursuive dans le workflow.
      getPrimary(json1, json2) Décide laquelle des deux entités est traitée comme enregistrement primaire lors de la consolidation, dont les valeurs d’attribut sont conservées par défaut dans le résultat fusionné.
      preProcess() Pré-crochet pour le calcul des données.
      postHierarchyConsolidation() Post-crochet pour le nettoyage final.
    4. Retournez votre ConsolidationService personnalisé à partir de sn_l2c_core. LeadToCashService. LeadToCashService est le point d’entrée qui connecte votre logique de consolidation dans le pipeline Lead-to-Cash afin qu’elle soit réellement utilisée chaque fois que la consolidation est invoquée. Exemple de script :
      var MyLeadToCashService = Class.create();
      MyLeadToCashService.prototype = Object.extendsObject(
          sn_l2c_core.LeadToCashService,
      {
          getConsolidationService: function () {
              return new MyConsolidationService();
          },
      
          type: 'MyLeadToCashService'
      });
    5. Appelez votre consolidation en appelant LeadToCashService.consolidate() soit directement à partir d’un script côté serveur, soit indirectement via les primitives Lead-to-Cash Flow Designer.

    ConsolidationService : canConsolidateEntity(String contextType)

    Méthode pouvant être remplacée pour spécifier les types d’entité enfant qui peuvent être consolidés dans un JSON. L’implémentation de base renvoie la valeur False pour tous les types d’entité si elle n’est pas remplacée.

    Tableau 1. Paramètres
    Nom Type Description
    contextType Chaîne Nom clé de la propriété de tableau sur l’entité JSON représentant le type d’entité enfant. Exemples : « lineItems »,« characteristics »,« coveredProducts ».
    Tableau 2. Renvoie
    Type Description
    Booléen Marqueur indiquant si la consolidation est possible sur le type d’entité sélectionné.
    Valeurs valides :
    • vrai : regroupe les entités de ce type par hachage et les consolide.
    • faux : ne consolide pas les entités de ce type.

    Valeur par défaut : false

    L’exemple suivant montre comment remplacer canConsolidateEntity() pour activer la consolidation des éléments de ligne et des produits couverts.

    var MyConsolidationService = Class.create();
    
    MyConsolidationService.prototype = Object.extendsObject(sn_l2c_core.ConsolidationService, {
        enableConsolidation: function() {
            return true;
        },
    
        canConsolidateEntity: function(contextType) {
            return contextType == "lineItems" || contextType == "coveredProducts";
        },
    
        type: 'MyConsolidationService'
    });
    
    var service = new MyConsolidationService();
    
    gs.info("Can consolidate lineItems = " + service.canConsolidateEntity("lineItems"));
    
    gs.info("Can consolidate characteristics = " + service.canConsolidateEntity("characteristics"));
    Sortie :
    Can consolidate lineItems = true
    Can consolidate characteristics = false

    ConsolidationService : canConsolidateJSONs(Objet json1, Objet json2)

    Méthode remplaçable qui ajoute des conditions permettant de déterminer si deux JSON d’entité avec le même hachage peuvent être consolidés. L’implémentation de base renvoie la valeur false si elle n’est pas remplacée.

    Tableau 3. Paramètres
    Nom Type Description
    json1 Objet Premier JSON d’entité à comparer. Contient sys_id, table, attributs et tableaux enfants.
    json2 Objet Deuxième entité JSON à comparer. Contient sys_id, table, attributs et tableaux enfants.
    Tableau 4. Renvoie
    Type Description
    Booléen Marqueur indiquant si les deux JSON peuvent être consolidés en un seul.
    Valeurs valides :
    • true : les deux JSON peuvent être fusionnés via consolidateJSONs().
    • false : les deux JSON restent séparés.

    Valeur par défaut : false

    Cet exemple montre comment remplacer canConsolidateJSONs() pour permettre la consolidation des éléments de ligne avec la même offre de produits.

    var MyConsolidationService = Class.create();
    
    MyConsolidationService.prototype = Object.extendsObject(sn_l2c_core.ConsolidationService, {
    
        enableConsolidation: function() {
    
            return true;
    
        },
    
        canConsolidateJSONs: function(json1, json2) {
    
            if (json1.table == "sn_quote_mgmt_core_quote_line_item") {
    
                // Fall back to empty string if product_offering has no value
                var po1 = json1.attributes.product_offering ? json1.attributes.product_offering.value : "";
    
                // Fall back to empty string if product_offering has no value
                var po2 = json2.attributes.product_offering ? json2.attributes.product_offering.value : "";
    
                // Consolidate only if both line items share the same product offering, and that value is not empty
                return po1 == po2 && po1 != "";
    
            }
    
            return false;
    
        },
    
        type: 'MyConsolidationService'
    
    });
    Sortie :
    false

    ConsolidationService : canMergeEntity(String contextType)

    Méthode remplaçable pour spécifier les types d’entité enfant qui peuvent être fusionnés à partir des JSON sources dans le JSON cible. L’implémentation de base renvoie la valeur False pour tous les types d’entité si elle n’est pas remplacée.

    Tableau 5. Paramètres
    Nom Type Description
    contextType Chaîne Nom clé de la propriété de tableau sur l’entité JSON représentant le type d’entité enfant. Exemples : « lineItems »,« characteristics »,« coveredProducts ».
    Tableau 6. Renvoie
    Type Description
    Booléen Marqueur indiquant si les entités de ce type peuvent être fusionnées de la source vers la cible.
    Valeurs valides :
    • vrai : le système concatène les tableaux sources de ce type dans le tableau correspondant de la cible.
    • false : le système ne fusionne pas les tableaux sources de ce type dans la cible.

    Valeur par défaut : false

    L’exemple suivant montre comment remplacer canMergeEntity() pour activer la fusion des éléments de ligne et des produits couverts.

    var MyConsolidationService = Class.create();
    
    MyConsolidationService.prototype = Object.extendsObject(sn_l2c_core.ConsolidationService, {
    
    
        enableConsolidation: function() {
    
            return true;
    
        },
    
    
        canMergeEntity: function(contextType) {
    
            return contextType == "lineItems" || contextType == "coveredProducts";
    
        },
    
    
        type: 'MyConsolidationService'
    
    });
    
    
    var service = new MyConsolidationService();
    
    gs.info("Can merge lineItems = " + service.canMergeEntity("lineItems"));
    
    gs.info("Can merge characteristics = " + service.canMergeEntity("characteristics"));
    Sortie :
    Can merge lineItems = true
    Can merge characteristics = false

    ConsolidationService : consolidate(Object sourceJSON, Object targetJSON, Object additionalParams)

    Fusionne le ou les JSON d’entité source dans un JSON d’entité cible et consolide les entités enfants au sein du résultat fusionné en fonction du regroupement basé sur le hachage et de la logique de consolidation par paires.

    La méthode consolidate() agit comme le point d’entrée principal pour consolider les JSON. Cette méthode gère à la fois un seul JSON et plusieurs JSON, via le items tableau, en tant qu’entrée source.

    Tableau 7. Paramètres
    Nom Type Description
    additionalParams Objet Facultatif. Paramètres de configuration supplémentaires transmis aux méthodes de consolidation. Stocké sur l’instance sous la forme this.additionalParams et accessible dans toutes les méthodes pouvant être remplacées. Peut contenir toutes les paires clé-valeur personnalisées nécessaires à l’implémentation de la classe.
    sourceJSON Objet Accepte la sortie JSON de la méthode LeadtoCashCore : délimité createInstance() ou effect(). Il peut s’agir d’un objet JSON à entité unique ou d’un objet JSON contenant un tableau d’éléments de JSON à plusieurs entités.

    Si sourceJSON ne contient pas de tableau d’éléments, la méthode le traite comme une seule entité et l’enveloppe automatiquement dans un tableau. Transmettez la valeur Null ou omettez ce paramètre si seule la consolidation cible est nécessaire.

    "sourceJSON": {
        "items": [Array]
    }
    sourceJSON.éléments Tableau d'objets Facultatif. Tableau de JSON d’entités à fusionner dans la cible. Chaque élément représente une entité avec ses attributs et ses tableaux enfants. Si cette propriété existe, items elle est utilisée directement comme liste des entités sources.
    "items": [
      {
      "attributes": {Object},
      "characteristics": [Array],
      "coveredProducts": [Array],
      "sys_id": "String",
      "table": "String"
      }
    ]
    sourceJSON.éléments.attributs Objet Paires clé-valeur représentant les attributs de l’entité. Chaque attribut est un objet avec une propriété value.
    "attributes": {
      "end_date": {"value": "String"},
      "product_offering": {"value": "String"},
      "quantity": {"value": "String"},
      "start_date": {"value": "String"}
    }

    Exemple : { « product_offering » : { « value » : « xr48... « }, « quantité » : { « value » : « 5 » } }

    sourceJSON.items.attributes.end_date Chaîne Date de fin de l’attribut.

    Format : valeur GlideDate (par exemple, 01-01-2026)

    sourceJSON.items.attributes.product_offering Chaîne Nom de l’offre de produits associée à l’attribut. Situé dans la table Offre de produits [sn_prd_pm_product_offering].
    sourceJSON.items.attributes.quantity Chaîne Nombre d’éléments de produit achetés par rapport à l’attribut.
    sourceJSON.items.attributes.start_date Chaîne Date de début de l’attribut.

    Format : valeur GlideDate (par exemple, 01-01-2026)

    sourceJSON.items.characteristics Tableau d'objets Facultatif. Tableau des JSON d’entités caractéristiques.
    "characteristics": [
      {
        "attributes": {Object},
        "sys_id": "String",
        "table": "String"
       }
    ]
    sourceJSON.éléments.caractéristiques.attributs Objet Attributs associés à la caractéristique de l’élément. Chaque propriété enfant est une paire clé-valeur représentant l’attribut. L’attribut est un objet avec une propriété value.
    "attributes": {
       "characteristic": {Object},
       "value": {Object}
    }
    sourceJSON.éléments.caractéristiques.attributs.caractéristique Objet Paire clé-valeur représentant la caractéristique associée à l’attribut. characteristic est un objet avec une propriété value.
    "characteristic": {
        "value": "String"
    }
    sourceJSON.éléments.caractéristiques.attributs.valeur Objet Paire clé-valeur représentant la valeur d’attribut associée à la caractéristique parente. value est un objet avec une propriété value.
    "value": {
       "value": "String"
    }
    sourceJSON.items.characteristics.sys_id Chaîne Sys_id de la caractéristique associée à l’élément.
    sourceJSON.items.characteristics.table Chaîne Emplacement dans la table de la caractéristique associée à l’élément.
    sourceJSON.items.coveredProducts Tableau d'objets Facultatif. Tableau des JSON d’entités de produits couverts.
    coveredProducts: [
     {
      "sys_id": {Object},
      "table": "String",
      "attributes": {Object}
     }
    ]
    sourceJSON.items.coveredProducts.sys_id Objet Sys_id de l’enregistrement du produit couvert.
    sys_id: { 
      value: "String"
    }
    sourceJSON.items.coveredProducts.table Chaîne Nom de la table contenant l’enregistrement du produit couvert. Par exemple, sn_install_base_m2m_contract_sold_product.
    sourceJSON.items.coveredProducts.attributes Objet Attributs du produit couvert. Les champs peuvent varier en fonction de l’enregistrement.
    attributes: {
                sold_product: { value: "String" },
                contract: { value: "String" },
                service_contract_line: { value: "String" },
                entitlement: { value: "String" },
                install_base: { value: "String" },
                covering_sold_product: { value: "String" },
                date_added: { value: "String" },
                date_removed: { value: "String" }
      }
    sourceJSON.items.coveredProducts.attributes.sold_product Objet Enregistrement de produit vendu associé à ce produit couvert.
    "sold_product": {
      "value": "String"
    }
    sourceJSON.items.coveredProducts.attributes.contract Objet Enregistrement de contrat parent dans lequel la couverture est définie.
    "contract": {
      "value": "String"
    }
    sourceJSON.items.coveredProducts.attributes.service_contract_line Objet Élément de ligne de contrat de service spécifique lié à ce produit couvert.
    "service_contract_line": {
      "value": "String"
    }
    sourceJSON.items.coveredProducts.attributes.entitlement Objet Enregistrement du droit régissant les conditions de la couverture.
    "entitlement": {
      "value": "String"
    }
    sourceJSON.items.coveredProducts.attributes.install_base Objet Enregistrement de base d’installation représentant l’actif déployé.
    "install_base": {
      "value": "String"
    }
    sourceJSON.items.coveredProducts.attributes.covering_sold_product Objet Produit vendu fournissant une couverture pour cette entrée.
    "covering_sold_product": {
      "value": "String"
    }
    sourceJSON.items.coveredProducts.attributes.date_added Objet Chaîne de date ISO 8601 indiquant quand le produit a été ajouté à la couverture.
    "date_added": {
      "value": "String"
    }
    sourceJSON.items.coveredProducts.attributes.date_removed Objet Chaîne de date ISO 8601 indiquant quand le produit a été retiré de la couverture. Nul ou vide si actuellement actif.
    "date_removed": {
      "value": "String"
    }
    sourceJSON.items.lineItems Tableau d'objets Facultatif. Tableau des JSON de l’entité de l’élément de ligne enfant. Chaque enfant suit la même structure (sys_id, table, attributs et enfants imbriqués).
    "lineItems": [
     {
       "attributes": {Object},
       "characteristics": [Array],
       "coveredProducts": [Array],
       "sys_id": "String",
       "table": "String"
      }
    ]
    sourceJSON.items.lineItems.attributes Objet Paires clé-valeur représentant les attributs de l’entité. Chaque attribut est un objet avec une propriété value. Suit la même structure que sourceJSON.items.attributes.
    "attributes": {
      "characteristic": {Object},
      "value": {Object}
    }
    sourceJSON.items.lineItems.characteristic Objet Paires clé-valeur représentant la caractéristique de l’élément de ligne. La caractéristique est un objet avec une propriété value. Suit la même structure que sourceJSON.items.characteristics.
    "characteristics": [{
       "attributes": {Object},
       "sys_id": "String",
       "table": "String"
    }]
    sourceJSON.items.lineItems.coveredProducts Tableau des JSON d’entités de produits couverts associés à l’élément de ligne. Suit la même structure que sourceJSON.items.coveredProducts.
    coveredProducts: [
     {
      "sys_id": {Object},
      "table": "String",
      "attributes": {Object}
     }
    ]
    sourceJSON.items.lineItems.sys_id Sys_id de l’élément de ligne JSON d’entité.
    sourceJSON.items.lineItems.table Emplacement de la table de l’élément de ligne JSON de l’entité.
    sourceJSON.items.sys_id Chaîne Sys_id de l’enregistrement d’entité source.
    sourceJSON.items.table Chaîne Nom de table de l’entité source. Exemple : sn_pss_core_service_contract_line.
    targetJSON Objet Requis. JSON d’entité cible dans lequel consolider le JSON source. Ne doit pas être nul ou vide. Suit la même structure d’objet que l’entité source (sourceJSON paramètre).
    targetJSON={
      "attributes": {Object},
      "entitlement_characteristic": {Object},
      "sys_id": "String",
      "table": "String,
      "line_item": {Object}
      }
    }
    targetJSON.attributes Objet Paires clé-valeur représentant les attributs d’entité cible. Chaque attribut est un objet avec une propriété value. Suit la même structure d’objet que les attributs source (sourceJSON.items.attributes paramètre).
    "attributes": {
      "end_date": {"value": "String"},
      "product_offering": {"value": "String"},
      "quantity": {"value": "String"},
      "start_date": {"value": "String"}
    }

    Exemple : { « product_offering » : { « value » : « xr48... « }, « quantité » : { « value » : « 5 » } }

    targetJSON.LineItems Tableau d'objets Facultatif. Tableau JSON de l’entité de l’élément de ligne enfant sur la cible. Suit la même structure d’objet que sourceJSON.items.lineItems.
    "lineItems": {
        "sys_id": "String",
        "table": "String",
        "attributes": {Object},
        "characteristics": {Object}
      }
    targetJSON.lineItems.attributes Objet Paires clé-valeur représentant les attributs de l’entité. Chaque attribut est un objet avec une propriété value. Suit la même structure que sourceJSON.items.attributes.
    "attributes": {
      "characteristic": {Object},
      "value": {Object}
    }
    targetJSON.lineItems.characteristics Objet Paires clé-valeur représentant la caractéristique de l’élément de ligne. La caractéristique est un objet avec une propriété value. Suit la même structure que sourceJSON.items.characteristics.
    "characteristic": {
      "value": "String"
    }
    targetJSON.ÉlémentsLigne.Produits couverts Tableau des JSON d’entités de produits couverts associés à l’élément de ligne. Suit la même structure que sourceJSON.items.coveredProducts.
    "coveredProducts": [Array]
    targetJSON.lineItems.sys_id Sys_id de l’élément de ligne JSON d’entité.
    targetJSON.lineItems.table Emplacement de la table de l’élément de ligne JSON de l’entité.
    targetJSON.sys_id Chaîne Sys_id de l’enregistrement d’entité cible.
    targetJSON.table Chaîne Nom de table de l’entité cible. Exemple : sn_pss_core_service_contract
    Tableau 8. Renvoie
    Type Description
    Objet Résultat JSON consolidé. Le JSON de l’entité fusionnée et consolidée contient tous les attributs des tableaux enfants cibles et fusionnés/consolidés.

    Retourne targetJSON si la consolidation est désactivée ou si sourceJSON n’est pas valide.

    Renvoie null si targetJSON est nul ou vide.

    L’exemple suivant montre comment invoquer la méthode de consolidation via LeadToCashService. Cela consolide un JSON d’entité source contenant des éléments de ligne dans un JSON d’entité cible. Les éléments de ligne avec la même offre de produits sont consolidés.

    Cet exemple instancie directement LeadToCashService pour plus de simplicité, mais en production, votre sous-classe personnalisée doit être enregistrée via le point d’extension et invoquée via PrimitiveUtil.
    Remarque :
    MyConsolidationService est un include de script personnalisé qui doit être créé en étendant ConsolidationService. La logique pour les méthodes remplaçables (enableConsolidation(), getHashConfig(), canConsolidateEntity(), canMergeEntity(), canConsolidateJSONs(), overrideAttributeValues()) doit être ajoutée dans MyConsolidationService. MyLeadToCashService étend LeadToCashService et renvoie MyConsolidationService de getConsolidationService().
    var sourceToTargetConfigID = "sn_cont_ent_wf_contract_to_quote";
    
    var util = new sn_l2c_core.LeadToCashService(sourceToTargetConfigID);
    
    var sourceJSON = {
        "items": [{
            "sys_id": "a1b2c3d4e5f6",
            "table": "sn_pss_core_service_contract_line",
            "attributes": {
                "product_offering": {
                    "value": "po_001"
                },
                "quantity": {
                    "value": "5"
                },
                "start_date": {
                    "value": "2026-01-01"
                },
                "end_date": {
                    "value": "2026-12-31"
                }
            },
            "characteristics": [{
                "sys_id": "ch_001",
                "table": "sn_pss_core_entitlement_characteristic",
                "attributes": {
                    "characteristic": {
                        "value": "speed"
                    },
                    "value": {
                        "value": "100mbps"
                    }
                }
            }],
            "coveredProducts": []
        }]
    };
    
    var targetJSON = {
        "sys_id": "t1a2b3c4d5e6",
        "table": "sn_quote_mgmt_core_quote",
        "attributes": {
            "account": {
                "value": "acct_001"
            }
        },
        "lineItems": [{
            "sys_id": "li_001",
            "table": "sn_quote_mgmt_core_quote_line_item",
            "attributes": {
                "product_offering": {
                    "value": "po_001"
                },
                "quantity": {
                    "value": "3"
                },
                "start_date": {
                    "value": "2026-03-01"
                },
                "end_date": {
                    "value": "2026-11-30"
                }
            },
            "characteristics": [{
                "sys_id": "ch_002",
                "table": "sn_pss_core_entitlement_characteristic",
                "attributes": {
                    "characteristic": {
                        "value": "speed"
                    },
                    "value": {
                        "value": "100mbps"
                    }
                }
            }],
            "coveredProducts": []
        }]
    };
    
    var additionalParams = {};
    var output = util.consolidate(sourceJSON, targetJSON, additionalParams);
    gs.info("Consolidated output = " + JSON.stringify(output));

    Sortie :

    {
      "sys_id": "t1a2b3c4d5e6",
      "table": "sn_quote_mgmt_core_quote",
      "attributes": {
        "account": {
          "value": "acct_001"
        }
      },
      "lineItems": [
        {
          "sys_id": "li_001",
          "table": "sn_quote_mgmt_core_quote_line_item",
          "attributes": {
            "product_offering": {
              "value": "po_001"
            },
            "quantity": {
              "value": "8"
            },
            "start_date": {
              "value": "2026-01-01"
            },
            "end_date": {
              "value": "2026-12-31"
            }
          },
          "characteristics": [
            {
              "sys_id": "ch_002",
              "table": "sn_pss_core_entitlement_characteristic",
              "attributes": {
                "characteristic": {
                  "value": "speed"
                },
                "value": {
                  "value": "100mbps"
                }
              }
            }
          ],
          "coveredProducts": []
        }
      ]
    }

    L’exemple suivant montre comment appeler la méthode consolidée avec un sourceJSON null. Dans ce cas, seules les entités enfants dans targetJSON sont consolidées. Cela est utile lorsque la cible contient déjà des éléments de ligne en double qui doivent être fusionnés.

    var sourceToTargetConfigID = "sn_cont_ent_wf_contract_to_quote";
    
    var util = new sn_l2c_core.LeadToCashService(sourceToTargetConfigID);
    
    var targetJSON = {
        "sys_id": "t1a2b3c4d5e6",
        "table": "sn_quote_mgmt_core_quote",
        "attributes": {
            "account": {
                "value": "acct_001"
            }
        },
        "lineItems": [{
                "sys_id": "li_001",
                "table": "sn_quote_mgmt_core_quote_line_item",
                "attributes": {
                    "product_offering": {
                        "value": "po_001"
                    },
                    "quantity": {
                        "value": "5"
                    }
                },
                "characteristics": [],
                "coveredProducts": []
            },
            {
                "sys_id": "li_002",
                "table": "sn_quote_mgmt_core_quote_line_item",
                "attributes": {
                    "product_offering": {
                        "value": "po_001"
                    },
                    "quantity": {
                        "value": "3"
                    }
                },
                "characteristics": [],
                "coveredProducts": []
            }
        ]
    };
    
    var output = util.consolidate(null, targetJSON, {});
    
    gs.info("Consolidated output = " + JSON.stringify(output));

    Sortie :

    {
      "sys_id": "t1a2b3c4d5e6",
      "table": "sn_quote_mgmt_core_quote",
      "attributes": {
        "account": {
          "value": "acct_001"
        }
      },
      "lineItems": [
        {
          "sys_id": "li_001",
          "table": "sn_quote_mgmt_core_quote_line_item",
          "attributes": {
            "product_offering": {
              "value": "po_001"
            },
            "quantity": {
              "value": "8"
            }
          },
          "characteristics": [],
          "coveredProducts": []
        }
      ]
    }

    ConsolidationService : enableConsolidation()

    Méthode pouvant être remplacée qui contrôle si la consolidation est activée pour cette instance de service. L’implémentation de base renvoie la valeur false si elle n’est pas remplacée. Les classes implémentables doivent remplacer cette méthode pour retourner la valeur true afin d’activer la consolidation.

    Tableau 9. Paramètres
    Nom Type Description
    Néant
    Tableau 10. Renvoie
    Type Description
    Booléen Marqueur indiquant si le service a réussi à activer la consolidation.
    Valeurs valides :
    • vrai : le service est activé pour la consolidation.
    • faux : le service n’est pas activé pour la consolidation.

    Valeur par défaut : false

    L’exemple suivant montre comment remplacer enableConsolidation() dans un ConsolidationService personnalisé.
    Remarque :
    MyConsolidationService est un include de script personnalisé qui doit être créé en étendant ConsolidationService.
    var MyConsolidationService = Class.create();
    
    MyConsolidationService.prototype = Object.extendsObject(sn_l2c_core.ConsolidationService, {
        enableConsolidation: function() {
            return true;
        },
    
        type: 'MyConsolidationService'
    });
    
    
    var service = new MyConsolidationService();
    
    var isEnabled = service.enableConsolidation();
    
    gs.info("Consolidation enabled = " + isEnabled);
    Sortie :
    Consolidation enabled = true

    ConsolidationService : getHashConfig()

    Méthode remplaçable qui renvoie la configuration de hachage pour le regroupement des entités avant la consolidation. La configuration spécifie les attributs et les types de contexte enfant qui génèrent un hachage MD5 pour chaque entité. Les entités avec le même hachage sont regroupées pour une consolidation par paires. L’implémentation de base renvoie un objet vide lorsqu’elle n’est pas remplacée.

    Tableau 11. Paramètres
    Nom Type Description
    Néant
    Tableau 12. Renvoie
    Type Description
    Objet Un objet JSON mappant les noms des tables à leur configuration de hachage. Chaque entrée de table contient :
    1. attributs (tableau de chaînes) : noms de champs d’attributs dont les valeurs sont incluses dans le hachage.
    2. childContextTypes (tableau de chaînes) : facultatif. Noms des tables enfants dont les valeurs de hachage sont incluses de façon récursive dans le hachage parent.

    Format de retour attendu : { « table_name » : { « attributes » : ["field1 », « field2"], « childContextTypes » : ["child_table_name"] } }

    Lorsque la configuration de hachage d’une table est un objet vide {}, toutes les entités de ce type sont consolidées en une seule entité.

    Lorsque la configuration de hachage d’une table est introuvable (non définie ou nulle), une erreur est consignée et les entités sont renvoyées inchangées. L’implémentation de base renvoie un objet vide lorsqu’elle n’est pas remplacée.

    L’exemple suivant montre comment remplacer getHashConfig() pour définir des attributs de hachage pour les lignes de contrat et les caractéristiques de droit.

    var MyConsolidationService = Class.create();
    
    MyConsolidationService.prototype = Object.extendsObject(sn_l2c_core.ConsolidationService, {
    
    
        enableConsolidation: function() {
    
            return true;
    
        },
    
    
        getHashConfig: function() {
    
            return {
    
                "sn_quote_mgmt_core_quote_line_item": {
    
                    "attributes": ["product_offering"],
    
                    "childContextTypes": ["sn_pss_core_entitlement_characteristic"]
    
                },
    
                "sn_pss_core_entitlement_characteristic": {
    
                    "attributes": ["characteristic", "option", "value"]
    
                },
    
                "sn_pss_core_covered_product": {
    
                    "attributes": ["sold_product"]
    
                }
    
            };
    
        },
    
    
        type: 'MyConsolidationService'
    
    });
    
    
    var service = new MyConsolidationService();
    
    var config = service.getHashConfig();
    
    gs.info("Hash config = " + JSON.stringify(config));
    Sortie :
    Hash config = {
        "sn_quote_mgmt_core_quote_line_item": {
            "attributes": ["product_offering"],
            "childContextTypes": ["sn_pss_core_entitlement_characteristic"]
        },
        "sn_pss_core_entitlement_characteristic": {
            "attributes": ["characteristic", "option", "value"]
        },
        "sn_pss_core_covered_product": {
            "attributes": ["sold_product"]
        }
    }

    ConsolidationService : getPrimary(Objet json1, Objet json2)

    Méthode pouvant être remplacée pour déterminer le JSON principal lorsque deux JSON sont en cours de consolidation. Pour les attributs non remplacés, les valeurs d’attribut du JSON primaire sont utilisées sur le résultat consolidé. L’implémentation de base renvoie le json1 s’il n’est pas remplacé.

    Tableau 13. Paramètres
    Nom Type Description
    json1 Objet Premier JSON d’entité à consolider. Contient sys_id, table, attributs et tableaux enfants.
    json2 Objet Deuxième JSON d’entité à consolider. Contient sys_id, table, attributs et tableaux enfants.
    Tableau 14. Renvoie
    Type Description
    Objet JSON primaire sélectionné. Les attributs de ce JSON deviennent les valeurs par défaut sur le résultat consolidé. Doit être json1 ou json2. L’implémentation de base renvoie le json1 s’il n’est pas remplacé.

    L’exemple suivant montre comment remplacer getPrimary() pour sélectionner l’entité dont la date de début antérieure est primary.

    // Custom ConsolidationService with getPrimary override
    var MyConsolidationService = Class.create();
    
    MyConsolidationService.prototype = Object.extendsObject(sn_l2c_core.ConsolidationService, {
    
        enableConsolidation: function() {
            return true;
        },
    
        getPrimary: function(json1, json2) {
            var date1 = json1.attributes.start_date ? json1.attributes.start_date.value : "";
            var date2 = json2.attributes.start_date ? json2.attributes.start_date.value : "";
            return date1 <= date2 ? json1 : json2;
        },
    
        type: 'MyConsolidationService'
    });
    
    // json1 — earlier start date
    var json1 = {
        sys_id: { value: "a1b2c3d4e5f6" },
        table: "sn_pss_core_service_contract_line",
        attributes: {
            product_offering: { value: "po_abc123" },
            quantity: { value: "5" },
            start_date: { value: "2024-01-01" }
        }
    };
    
    // json2 — later start date
    var json2 = {
        sys_id: { value: "f6e5d4c3b2a1" },
        table: "sn_pss_core_service_contract_line",
        attributes: {
            product_offering: { value: "po_abc123" },
            quantity: { value: "3" },
            start_date: { value: "2024-06-01" }
        }
    };
    
    var result = new MyConsolidationService().getPrimary(json1, json2);

    Sortie :

    // result === json1 → true
    // "2024-01-01" <= "2024-06-01" is true, so json1 (earlier start date) is returned
    
    {
        sys_id: { value: "a1b2c3d4e5f6" },
        table: "sn_pss_core_service_contract_line",
        attributes: {
            product_offering: { value: "po_abc123" },
            quantity: { value: "5" },
            start_date: { value: "2024-01-01" }
        }
    }

    ConsolidationService : overrideAttributeValues(objet json1, objet json2, objet consolidatedJSON)

    Méthode remplaçable, appelée après la consolidation de deux JSON, pour mettre à jour les attributs sur le JSON consolidé. L’implémentation de base n’est pas opérationnelle si elle n’est pas remplacée.

    Les cas d’utilisation courants incluent la sommation de quantités, le calcul de plage de dates (début au plus tôt/fin au plus tard), le recalcul des termes et le suivi des consolidated_from.

    Tableau 15. Paramètres
    Nom Type Description
    json1 Objet Premier JSON d’entité consolidé. Il s’agit du JSON primaire (tel que déterminé par getPrimary()). Contient les attributs d’origine avant consolidation.
    json2 Objet Deuxième JSON d’entité qui a été consolidé. Il s’agit du JSON secondaire. Contient les attributs d’origine avant consolidation.
    JSON consolidé Objet Le résultat JSON après la fusion. Modifiez directement les attributs de cet objet pour appliquer une logique personnalisée. Contient initialement une copie complète des attributs du JSON primaire avec les tableaux enfants fusionnés.
    Tableau 16. Renvoie
    Type Description
    nul Cette méthode ne renvoie pas de valeur. Modifiez directement l’objet consolidatedJSON .
    L’exemple suivant montre comment remplacer overrideAttributeValues() pour additionner des quantités et calculer des plages de dates lors de la consolidation d’éléments de ligne.
    var MyConsolidationService = Class.create();
    
    MyConsolidationService.prototype = Object.extendsObject(sn_l2c_core.ConsolidationService, {
    
        enableConsolidation: function() {
    
            return true;
    
        },
    
        overrideAttributeValues: function(json1, json2, consolidatedJSON) {
    
            // Sum quantities from both entities; fall back to 0 if quantity has no value
            var qty1 = parseInt(json1.attributes.quantity ? json1.attributes.quantity.value : "0");
            var qty2 = parseInt(json2.attributes.quantity ? json2.attributes.quantity.value : "0");
            consolidatedJSON.attributes.quantity = {
                "value": String(qty1 + qty2)
            };
    
            // Use the earliest start date; fall back to empty string if start_date has no value
            var start1 = json1.attributes.start_date ? json1.attributes.start_date.value : "";
            var start2 = json2.attributes.start_date ? json2.attributes.start_date.value : "";
            consolidatedJSON.attributes.start_date = {
                "value": start1 <= start2 ? start1 : start2
            };
    
            // Use the latest end date; fall back to empty string if end_date has no value
            var end1 = json1.attributes.end_date ? json1.attributes.end_date.value : "";
            var end2 = json2.attributes.end_date ? json2.attributes.end_date.value : "";
            consolidatedJSON.attributes.end_date = {
                "value": end1 >= end2 ? end1 : end2
            };
    
            // Record the sys_ids of the source entities that were merged into this consolidated result
            var consolidatedFrom = [];
            if (json1.sys_id) consolidatedFrom.push(json1.sys_id);
            if (json2.sys_id) consolidatedFrom.push(json2.sys_id);
            consolidatedJSON.attributes.consolidated_from = {
                "value": consolidatedFrom.join(",")
            };
    
        },
    
        type: 'MyConsolidationService'
    
    });

    ConsolidationService : postHierarchyConsolidation(objet consolidatedJSON)

    Méthode pouvant être remplacée qui applique les modifications finales au JSON consolidé une fois la consolidation hiérarchique terminée. L’implémentation de base n’est pas opérationnelle si elle n’est pas remplacée.

    Le système appelle cette méthode sur le résultat consolidé final dans la méthode consolidate(), ainsi que sur chaque entité de résultat dans processHashGroup().

    Tableau 17. Paramètres
    Nom Type Description
    JSON consolidé Objet Objet JSON consolidé entièrement traité une fois que toutes les fusions et consolidations sont terminées. Modifiez directement cet objet pour appliquer les transformations finales.
    Tableau 18. Renvoie
    Type Description
    nul Cette méthode ne renvoie pas de valeur. Modifiez directement l’objet consolidatedJSON .

    L’exemple suivant montre comment remplacer postHierarchyConsolidation() pour définir un marqueur sur l’entité consolidée.

    var MyConsolidationService = Class.create();
    
    MyConsolidationService.prototype = Object.extendsObject(sn_l2c_core.ConsolidationService, {
    
    
        enableConsolidation: function() {
    
            return true;
    
        },
    
    
        postHierarchyConsolidation: function(consolidatedJSON) {
    
            if (consolidatedJSON && consolidatedJSON.attributes) {
    
                consolidatedJSON.attributes.is_consolidated = {
                    "value": "true"
                };
    
            }
    
        },
    
    
        type: 'MyConsolidationService'
    
    });

    ConsolidationService : preProcess(Objet sourceJSON, objet targetJSON, objet additionalParams)

    Méthode remplaçable appelée avant la fusion et la consolidation pour effectuer des tâches de prétraitement personnalisées telles que la création de cartes en bloc ou la recherche de données de mise en cache.

    Stocker les résultats calculés sur cet objet (par exemple, this.targetHeaderId = « sample_sys_id »). Cette méthode ne renvoie aucune valeur.

    Tableau 19. Paramètres
    Nom Type Description
    Cible source Objet Sortie de sourceJSON à consolider. Accepte la sortie JSON de la méthode LeadtoCashCore : délimité createInstance() ou effect(). Il peut s’agir d’un objet JSON à entité unique ou d’un objet JSON contenant un tableau d’éléments de JSON à plusieurs entités. Peut être nul ou vide.
    targetJSON Objet Requis. JSON d’entité cible pour la consolidation.
    additionalParams Objet Facultatif. Données supplémentaires transmises par l’appelant.
    Tableau 20. Renvoie
    Type Description
    nul Cette méthode ne renvoie aucune valeur. Stocker les résultats calculés sur cet objet pour les utiliser dans les étapes de consolidation suivantes.

    L’exemple suivant montre comment remplacer preProcess() pour mettre en cache un ID d’en-tête cible à utiliser pendant la consolidation.

    var MyConsolidationService = Class.create();
    MyConsolidationService.prototype = Object.extendsObject(sn_l2c_core.ConsolidationService, {
    
        enableConsolidation: function() {
            return true;
        },
    
        preProcess: function(sourceJSON, targetJSON, additionalParams) {
            // Cache the target entity's sys_id for use in subsequent consolidation steps
            this.targetHeaderId = targetJSON.sys_id;
            // If sourceJSON and sourceJSON.items are both present, store the item count; otherwise default to 0
            this.sourceCount = sourceJSON && sourceJSON.items ? sourceJSON.items.length : 0;
        },
    
        type: 'MyConsolidationService'
    });