Loading
Insurance
InsQuoteService:createUpdateQuote

InsQuoteService:createUpdateQuote

Utilisez ce service pour créer un devis pour de nouvelles affaires, mettre à jour un devis existant avec de nouvelles informations ou créer un devis de recommandation. Pour les mises à jour, la quoteId du devis à mettre à jour doit être incluse dans les options distantes.

Remarque
Remarque

Avant l'exécution de ce service, le système exécute une vérification de l'utilisateur invité.

Ce service peut être utilisé par des utilisateurs invités. Un utilisateur invité qui exécute une tâche OmniScript, Procédure d'intégration ou Interface utilisateur peut continuer. Ce service est exécuté. Cependant, les quoteId et les opportunityId sont cryptés dans ces cas. Par conséquent, les utilisateurs invités ne peuvent pas afficher ces ID.

Important
Important

Utilisez le service InsQuoteService:createUpdateQuote pour mettre à jour le devis et les éléments de ligne de devis, au lieu d'utiliser le mappeur de données Omnistudio.

Classe: InsQuoteService

Méthode : createUpdateQuote

Fonctionnement

  1. Le service recherche le inputKey dans le JSON d'entrée. Le nœud inputKey contient les informations dont le service a besoin pour créer ou mettre à jour un devis. Les informations requises pour ce service comprennent :

    • opportunityId

    • endDate (facultatif)

    • effectiveDate

    • Enregistrements productConfigurationDetail

    • instanceKey

      Requis pour identifier plusieurs instances de la même spécification

    • insuredItems nœud

      Dans ce nœud, le service attend une liste de spécifications d'articles assurés et de spécifications de partie assurée, en utilisant les productCode de chaque spécification comme clé.

    • Term__c

      Utilisez-le pour mettre à jour le champ Term__c du Devis.

  2. Utilise les informations du JSON d'entrée pour créer le devis.

  3. Renvoie un ID de devis dans le JSON de sortie.

  4. Crée un objet Devis qui inclut les éléments de ligne suivants :

    1. Utilise les produits racine définis dans productConfigurationDetail pour créer ou mettre à jour les éléments de ligne de devis racine.

    2. Lors de la mise à jour d'un devis existant, les enregistrements du productConfigurationDetail qui ne figurent pas encore dans le devis sont ajoutés et ceux qui figurent déjà dans le devis sont mis à jour.

    3. Utilise les spécifications d'articles assurés, les spécifications de partie assurée et les spécifications de couverture en tant qu'éléments de ligne de devis : ParentItemId__c = rootItem.Id.

    4. L'élément de ligne de devis de l'élément assuré principal et les lignes de devis de la partie assurée enfant ont une relation plusieurs:plusieurs. Ces relations sont stockées dans l'objet Relation d'élément de devis. Si une ligne de devis d'élément assuré a des relations avec plusieurs lignes de devis de partie assurée, le champ PrimaryChildLineitemId__c est utilisé pour déterminer laquelle de ces relations est la principale.

      Par exemple, Joan Smith et John Smith sont conducteurs de Lexus 250 ; Joan Smith est définie comme étant le conducteur principal. L'élément de ligne de devis Lexus 250 a des PrimaryChildLineItemId__c pointant vers l'élément de ligne de devis de Joan Smith. Tous les ParentItemId2__c des éléments de ligne de devis pointent vers les SubParentItemId__c des couvertures enfants rootItem.Id. pointent vers l'élément principal assuré. Les champs Élément de ligne de devis de l'élément assuré et Élément de ItemName__c de ligne de devis de la partie assurée sont stockés avec le instanceKey de cet élément.

    5. L'élément de ligne de devis de l'élément principal assuré inclut le prix.

  5. Pour les nouveaux devis, si createOpportunity est true et qu'aucun opportunityId n'est fourni, crée un enregistrement Opportunité en utilisant le nœud JSON OpportunityDetails de la inputKey.

  6. Si calculateCommission est true, appelle InsCommissionService.processQuoteCommission, qui prépare l'entrée pour le service InsCommissionService.calculate. Lorsque le service de calcul a traité l'entrée, il stocke la valeur de commission calculée dans Quote.CommissionAmount__c.

Tous les utilisateurs qui appellent InsQuoteService:createUpdateQuote doivent disposer de l'autorisation Lire sur tous les champs de l'ensemble de champs Détails du devis si l'ensemble de champs est ajouté à l'objet Élément de ligne de devis.

Si l'ensemble de champs Détails du devis n'est pas ajouté à l'objet Élément de ligne de devis, tous les champs, y compris les champs personnalisés, sont lisibles pour les utilisateurs.

Suppléments

Voici comment ce service fonctionne avec les suppléments (taxes et frais) :

  • Si le champ taxesAndFees est spécifié dans un enregistrement JSON, un enregistrement QuotePricingAdjustment__c correspondant est conservé pour chaque élément de la liste taxesAndFees.

  • Si le champ taxAmount est spécifié dans un enregistrement JSON, le champ TaxAmount__c est défini sur la valeur du champ taxAmount dans le QuoteLineItem créé.

  • Si le champ feeAmount est spécifié dans un enregistrement JSON, le champ FeeAmount__c est défini sur la valeur du champ feeAmount dans le QuoteLineItem créé.

Ajout de champs supplémentaires aux éléments de ligne de devis

Si vous avez besoin de champs supplémentaires écrits dans Élément de ligne de devis par ce service, vous devez d'abord appeler le service InsProductJSONService:trimOffAttributeCategory.

Le flux qui permet ce fonctionnement dans un OmniScript ou une procédure d'intégration est le suivant :

  1. Étapes de configuration du produit

  2. Appel de service InsProductJSONService:trimOffAttributeCategory avec selectedValueAsObject défini sur true

  3. Transformation DataRaptor qui peut inclure un mappage entre des attributs et vos champs supplémentaires dans l'objet Élément de ligne de devis

  4. Appel de service InsQuoteService:createUpdateQuote

Options distantes

Option

Description

createInsuredItemsRelationships

true ou false

Si cette option est définie sur true, vous pouvez spécifier une liste de relations instanceKey > parentInstanceKey entre les éléments assurés.

Cette option prend en charge les relations parent > enfant et parent > enfant > élément assuré petit-enfant.

inputKey

Obligatoire.

Une clé JSON à partir de laquelle ce service extrait les informations nécessaires pour créer ou mettre à jour un devis.

N'utilisez pas % pour entourer la valeur de cette clé. Cette clé représente un nœud JSON, pas une variable.

Comme cette clé représente un nœud JSON et non un chemin, n'utilisez pas la notation parent:childnode:childnode path.

Pour accéder au chemin de données droit, saisissez-le dans le champ Chemin JSON Envoyer de la section Transformation Envoyer/Réponser lorsque vous ajoutez cette paire clé/valeur à une étape OmniScript.

insertInstance

true ou false

Lorsqu'il est défini sur true, le service insère des éléments de ligne de devis supplémentaires à un devis existant. Il ne met pas à jour l'en-tête du devis, l'élément de ligne racine ou un élément de ligne de devis parent.

Utilisez cette option pour créer un devis multi-instances volumineux via plusieurs appels de serveur, où le nouvel ensemble d'éléments de ligne de devis des instances est inséré dans le devis existant de chaque appel.

quoteId

Facultatif.

L'ID d'un devis existant que ce service met à jour, basé sur des informations nouvelles ou mises à jour. Utilisé lorsque le service doit mettre à jour un devis existant.

isMultiRoot

Facultatif.

Un indicateur booléen pour indiquer si le devis est un devis multiracine.

La valeur par défaut est false.

minimizeQliQuerySize

true ou false

Lorsqu'il est défini sur true, le service interroge uniquement les éléments de ligne de devis affectés. Plus précisément, les éléments de ligne de devis qui référencent le produit dans le nœud JSON du produit d'entrée ou dans le nœud JSON des éléments assurés.

populateCalcResults

true ou false

Lorsqu'il est défini sur false, le service ne remplit pas le champ rootItem.CalculatedPriceJSON_c et le champ Quote.CalculatedPriceJSON_c.

pricebook

Obligatoire.

Le nom du catalogue de prix associé à la spécification du produit.

Salesforce exige que les produits utilisés dans les éléments de ligne de devis contiennent une entrée au catalogue de prix.

recalculateTaxesAndFees

true ou false

Lorsqu'il est défini sur true, le service recalcule les taxes et les frais.

Lorsqu'il est défini sur false, le service ne recalcule pas les taxes et les frais.

Remarque
Remarque

Si vous définissez cette option sur false, vous devez également ajouter une ligne au modèle d'interface utilisateur ins-coverage-quote-runtime-container.

En ins-coverage-quote-runtime-container.js, à la ligne 115, saisissez : optionsMap.recalculateTaxesAndFees = false

createOpportunity

true ou false

Lorsqu'il est défini sur true, si aucun opportunityId n'est fourni, le service crée un enregistrement Opportunité en utilisant le nœud JSON OpportunityDetails du inputKey. Ce nœud est mappé avec les champs de la sObject d'opportunité.

returnQuote

true ou false

Lorsqu'il est défini sur true, la sortie du service inclut les détails du devis dans le nœud JSON quoteDetail.

calculateCommission

true ou false

Lorsqu'il est défini sur true, le service calcule les commissions pour les éléments racines et enregistre le montant total dans Quote.CommissionAmount.

Lorsqu'il est défini sur false (valeur par défaut), le service ne calcule pas les commissions.

Remarque
Remarque

Si vous définissez cette option sur true, vous devez également saisir au moins l'une des valeurs de code producteur ou production : primaryProducerId , productionCodeId ou productionCodeName.

primaryProducerId

Facultatif.

L'ID de producteur de transformation, c'est-à-dire le producteur utilisé pour récupérer le commissionScheduleId et calculer le montant de la commission.

productionCodeId

Facultatif.

L'ID de code de production.

productionCodeName

Facultatif.

Le nom de code de production a été transmis au service InsCommissionService.calculate.

Si vous ne saisissez pas de productionCodeId, le service utilise productionCodeName pour référencer le productionCodeId. Si vous saisissez les deux valeurs, mais qu'elles ne correspondent pas, la productionCodeId est prioritaire.

runEligibilityRequiredDefaultSelectedRules

Facultatif.

Les valeurs par défaut sont true.

Détermine si les règles Éligibilité et Sélectionné par défaut sont exécutées.

runRelationshipRules

Facultatif.

Les valeurs par défaut sont true.

Détermine si les règles de relation sont exécutées.

runSelectedValivationRules

Facultatif.

Les valeurs par défaut sont true.

Détermine si les règles Sélectionner la validation sont exécutées.

JSON d'entrée

Ce service recherche la valeur du inputKey. Accédez à l'onglet API de la spécification produit pour trouver le JSON d'entrée dont vous avez besoin pour ce service.

Dans cet exemple, inputKey = quotePolicyJSON.

"quotepolicyJson": {
  "productConfigurationDetail": {
    "records": [{
          "rootProductId": "01t1I000002fuBoQAI",
          "rootProductCode": "AUTOROOT",
          "timestamp": 1534288040769,
          "hasInstanceKeys": true,
          "childProductsCount": 4,
          "instanceKeyChildren": 2,
          "pathFromChild": "[0]",
          "pathFromRoot": "[0]",
          "attributeCategories": {
            "records": [{
                "productAttributes": {
                  "records": [{
                      "parentProductId": "01t1I000002fuBoQAI",
                      "parentProductCode": "AUTOROOT",
                      "pathFromChild": "attributeCategories.records[0].productAttributes.records[0]",
                      "pathFromRoot": "attributeCategories.records[0].productAttributes.records[0]",
                      "userValues": "test",
                      "values": [{
                        "disabled": false,
                        "readonly": false
                      }]
                      "totalSize": 1
                    },
                    "id": "a1V1I0000007xJSUAY",
                    "Name": "Alan Health Attributes",
                    "Code__c": "AHA",
                    "displaySequence": 5
                  }
                ],
                "totalSize": 1
              },
              "childProducts": {
                "records": [{
                    "rootProductId": "a2f1I000000BI6JQAW",
                    "rootProductCode": "stolenProperty",
                    "customizeSectionsOpen": null,
                    "numberAttributes": 1,
                    "numberCategories": 1,
                    "originalIndex": 0,
                    "parentProductName": "Auto Root",
                    "pathFromRoot": "[0].childProducts.records[0]",
                    "attributeCategories": {
                      "records": [{
                        "productAttributes": {
                          "records": [{
                            "parentProductId": "a2f1I000000BI6JQAW",
                            "parentProductCode": "stolenProperty",
                            "originalAttributeIndex": 0,
                            "originalCategoryIndex": 0,
                            "originalProductIndex": 0,
                            "pathFromChild": "attributeCategories.records[0].productAttributes.records[0]",
                            "pathFromRoot": "childProducts.records[0].attributeCategories.records[0].productAttributes.records[0]",
                            "userValues": false,
                            "values": [...]
                              ...
                          }]
                          "totalSize": 1
                        },
                        "id": "a1V1I0000007xJSUAY",
                        "Name": "Alan Health Attributes",
                        "Code__c": "AHA",
                        "displaySequence": 5
                      }],
                      "totalSize": 1
                    },
                    "childProducts": {
                      ...
                    }
                    "Price": 80,
                    "productId": "01t1I000002fuBoQAI",
                    "Term__c": "Semi-Annual",
                    "PricingFormula__c": "SUM(AutoPremium__autoPremium + rentalTotal + medicalTotal + roadsideTotal + dedWaiverTotal + uninsuredMotoristPDTotal + uninsuredMotoristBITotal)",
                    "IsConfigurable__c": true,
                    "RecordTypeName__c": "Product",
                    "IsRecommended__c": false,
                    "ProductCode": "AUTOROOT",
                    "Name": "Auto Root",
                    "Id": "01t1I000002fuBoQAI",
                    "RawPriceData": [{
                        "aggregationResults": {},
                        "calculationResults": [{
                            "ID": "0",
                            "comprehensiveTotal": 500,
                            "rentalTotal": 40,
                            "medicalTotal": 10,
                            "roadsideTotal": 10,
                            "dedWaiverTotal": 10,
                            "uninsuredMotoristPDTotal": 0,
                            "uninsuredMotoristBITotal": 100,
                            "AUTO.instanceKey": "2015 Lexus LX250",
                            "DRIVER.FN": "Joan",
                            "DRIVER.LN": "Smith"
                          },
                          "ID": "1",
                          "comprehensiveTotal": 500,
                          "rentalTotal": 40,
                          "medicalTotal": 10,
                          "roadsideTotal": 10,
                          "dedWaiverTotal": 10,
                          "uninsuredMotoristPDTotal": 0,
                          "uninsuredMotoristBITotal": 100,
                          "AUTO.instanceKey": "2015 Lexus LX250",
                          "DRIVER.FN": "John",
                          "DRIVER.LN": "Smith"
                        },
                        ...
                      ]
                    },
                    {
                      "aggregationResults": {},
                      "calculationResults": [{
                          "ID": "4",
                          "comprehensiveTotal": 500,
                          "rentalTotal": 40,
                          "medicalTotal": 10,
                          "roadsideTotal": 10,
                          "dedWaiverTotal": 10,
                          "uninsuredMotoristPDTotal": 0,
                          "uninsuredMotoristBITotal": 100,
                          "AUTO.instanceKey": "2006 Honda Odyssey",
                          "DRIVER.FN": "Joan",
                          "DRIVER.LN": "Smith"
                        },
                        {
                          "ID": "5",
                          "comprehensiveTotal": 500,
                          "rentalTotal": 40,
                          "medicalTotal": 10,
                          "roadsideTotal": 10,
                          "dedWaiverTotal": 10,
                          "uninsuredMotoristPDTotal": 0,
                          "uninsuredMotoristBITotal": 100,
                          "AUTO.instanceKey": "2006 Honda Odyssey",
                          "DRIVER.FN": "John",
                          "DRIVER.LN": "Smith"
                        },
                        ...
                      ]
                    }
                  ],
                  "CalculatedPriceData": {
                    "2006 Honda Odyssey": {
                      "ID": "4",
                      "comprehensiveTotal": 500,
                      "rentalTotal": 40,
                      "medicalTotal": 10,
                      "roadsideTotal": 10,
                      "dedWaiverTotal": 10,
                      "uninsuredMotoristPDTotal": 0,
                      "uninsuredMotoristBITotal": 100,
                      "AUTO.instanceKey": "2006 Honda Odyssey",
                      "DRIVER.FN": "Joan",
                      "DRIVER.LN": "Smith"
                    },
                    "2015 Lexus LX250": {
                      "ID": "0",
                      "comprehensiveTotal": 500,
                      "rentalTotal": 40,
                      "medicalTotal": 10,
                      "roadsideTotal": 10,
                      "dedWaiverTotal": 10,
                      "uninsuredMotoristPDTotal": 0,
                      "uninsuredMotoristBITotal": 100,
                      "AUTO.instanceKey": "2015 Lexus LX250",
                      "DRIVER.FN": "Joan",
                      "DRIVER.LN": "Smith"
                    }
                  },
                  "displaySequence": -1
                }
              ]
            },
            "insuredItems": {
              "DRIVER": [{
                  "isPrimary": false,
                  "instanceKey": "Joan Smith",
                  "LN": "Smith",
                  "AGE": 20,
                  "FN": "Joan",
                  "GENDER": "Female",
                  "FirstName": "Joan",
                  "LastName": "Smith",
                  "partyId": "a0q1I000001emNeQAI"
                },
                {
                  "isPrimary": false,
                  "instanceKey": "John Smith",
                  "LN": "Smith",
                  "AGE": 30,
                  "FN": "John",
                  "GENDER": "Male",
                  "FirstName": "John",
                  "LastName": "Smith",
                  "partyId": "a0q1I000001emNfQAI"
                },
              ],
              "AUTO": [{
                  "autoLicNum": "Lexus",
                  "autoModel": "LX250",
                  "autoYear": 2015,
                  "instanceKey": "2015 Lexus LX250",
                  "BodyClass": "Sedan/Saloon",
                  "VehicleType": "PASSENGER CAR",
                  "isPrimary": true
                },
                {
                  "autoLicNum": "Honda",
                  "autoModel": "Odyssey",
                  "autoYear": 2006,
                  "instanceKey": "2006 Honda Odyssey",
                  "BodyClass": "Minivan",
                  "VehicleType": "MULTIPURPOSE PASSENGER VEHICLE (MPV)",
                  "isPrimary": true
                }
              ]
            },
            "accountId": "0011I00000QknfjQAB",
            "opportunityId": "0061I00000AV8gBQAT"
          }

Le JSON dans le inputKey inclut plusieurs paires clé/valeur dont le service a besoin pour créer ou mettre à jour un devis.

Clé

Valeur

opportunityId

L'ID d'opportunité généré.

accountId

L'ID de compte généré.

endDate

Facultatif.

La date à laquelle la police expire.

effectiveDate

La date à laquelle la police entre en vigueur.

productConfigurationDetail

Un groupe d'enregistrements qui suivent le modèle de structure JSON du produit.

Un élément de ligne de devis racine est créé ou modifié pour chaque enregistrement de produit du tableau.

Pour plus d'informations sur la structure et le contenu d'un produit, consultez Modèle de structure JSON produit.

additionalFields

Facultatif.

La clé de additionalFields s'applique uniquement aux paires clé/valeur des devis racine, pas aux éléments de ligne de devis. Pour des éléments de ligne de devis, ajoutez additionalFields en utilisant le JSON productConfigurationDetail.

insuredItems

Les paires clé/valeur des éléments assurés que le service utilise pour créer les éléments de ligne de devis des éléments assurés.

Que votre devis contienne une seule instance d'un élément assuré ou plusieurs éléments assurés, mettez en forme le nœud insuredItems avec un tableau d'enregistrements.

"insuredItems": {
  "DRIVER": [{
    "isPrimary": false,
    "instanceKey": null,
    "additionalFields": {},
    "productCode": "DRIVER",
    "productId": "01t1I000002fuByQAI",
    "FN": null,
    "GENDER": null,
    "LN": null,
    "partyId": null
  }],
  "AUTO": [{
    "isPrimary": true,
    "instanceKey": null,
    "additionalFields": {},
    "productCode": "AUTO",
    "productId": "01t1I000002fuBtQAI",
    "autoBrakes": false,
    "est_annual_mileage": "10001-20000",
    "autoLicNum": null,
    "autoModel": null,
    "autoStyle": null,
    "autoVIN": null,
    "autoYear": ""
  }]
}

Pour une instance unique d'un article assuré directement sous le produit racine dans la hiérarchie des produits, vous pouvez utiliser le format de cet exemple. Les enregistrements de insuredItems ici incluent les articles assurés et les valeurs que l'utilisateur a sélectionnées pour chacun d'eux. Nous prenons en charge ce JSON d'entrée, mais il provient d'une version antérieure et nous ne le recommandons pas.

"insuredItems": {
  "smallBusiness": {
    "protectionClass": 3,
    "yearBuilding": 2000,
    "yearWiring": 2000,
    "yearRoof": 2003,
    "yearPlumbing": 2000,
    "yearBusiness": 2002,
    "businessParkingLot": "no",
    "legalForm": "sole",
    "busLocation": "standalone",
    "busHours": 8,
    "busEmployees": 24,
    "bldgSprinker": "Y",
    "bldgFrame": "frame",
    "bldgAlarm": "none",
    "ageWiring": 18,
    "ageRoof": 15,
    "agePlumbing": 18,
    "ageBusiness": 16,
    "ageBuilding": 18,
    "SIC": "5451",
    "SICCategory": "Food Stores"

Pour les nouveaux devis, si createOpportunity est true et qu'aucun opportunityId n'est fourni, le service crée un enregistrement Opportunité en utilisant le nœud JSON OpportunityDetails du inputKey. Utilisez le OpportunityDetails:FieldName de format d'entrée. Voici un exemple de nœud OpportunityDetails.

"OpportunityDetails": {
      "AccountId": "0015f00000DSFgqAAH",
      "Name": "Auto Quote: Rachel Adams (2022-01-03)",
      "StageName": "Qualification",
      "CloseDate": "2022-01-03"
    },
Remarque
Remarque

Alternative preTransformBundle

Alternativement, vous pouvez définir une transformation DataRaptor qui mappe les données transmises dans le JSON d'entrée sous le format dont le service a besoin. Le JSON de sortie de ce DataRaptor est le JSON userInputs défini sous l'onglet API de la vue du produit. Définissez l'option preTransformBundle sur le nom du DataRaptor pour permettre au service d'utiliser le DataRaptor.

JSON de sortie

Le service renvoie l'ID du devis créé. Il renvoie également les détails du devis si l'entrée returnQuote est true, et l'ID d'opportunité si createOpportunity est true et si aucune opportunityId n'est fournie.

{
  "quoteDetail": {
    "stmpbhins04__PrimaryRootItemId__c": "0QLR00000000e3NOAQ",
    "stmpbhins04__TotalPremiumforTerm__c": 2000,
    "stmpbhins04__MonthlyPremium__c": 166.66666666666666,
    "stmpbhins04__StandardPremium__c": 2000,
    "Id": "0Q0R00000000WplKAE",
    "stmpbhins04__EndDate__c": "2022-05-04",
    "stmpbhins04__EffectiveDate__c": "2021-05-05",
    "stmpbhins04__Term__c": "Annual",
    "Name": "Auto Root",
    "OpportunityId": "006R0000002xk8QIAQ",
    "Pricebook2Id": "01sR0000001GULqIAO"
  },
  "quoteId": "0Q0R00000000WplKAE",
  "opportunityId": "006R0000002xk8QIAQ",
  "error": "OK"
}
 
Chargement
Salesforce Help | Article