Remarque : Unify Lookup nécessite une instance dédiée du serveur Unify Lookup — cette fonctionnalité n'est pas disponible sur les abonnements à infrastructure mutualisée — et DQE One doit déjà être installé dans votre organisation. Contactez le support DQE pour faire activer cette fonctionnalité pour votre organisation avant de suivre les étapes ci-dessous.
Paramètres personnalisés
- Accédez à la section Paramètres personnalisés (Custom Settings). Un paramètre personnalisé nommé DQE Unify Lookup est disponible.
- Cliquez sur Manage et créez une instance au niveau "organization default".
- Renseignez les informations requises.
- Allow Skip : permet aux utilisateurs d'ignorer les suggestions de Unify Lookup et de créer directement un nouvel enregistrement.
- App Named Cred : nom du named credential à utiliser.
- Displayed Fields : champs affichés dans le tableau de suggestions.
- Lookup record before insert : lorsque cette option est activée, les formulaires DQE de création/édition d'enregistrement lancent une recherche Unify Lookup avant de créer un nouvel enregistrement, en plus du remplacement du bouton Record Lookup décrit plus bas.
Accès à l'onglet de configuration Record Lookup
Ouvrez l'application DQE One, accédez à l'onglet DQE One Setup, puis sélectionnez le sous-onglet Lookup. Sélectionnez votre named credential et cliquez sur Connect. Cela établit la connexion entre votre organisation Salesforce et votre instance Unify Lookup Server.
Lancer une indexation
Après avoir cliqué sur Connect, l'application DQE One se charge sous la carte Setup avec deux onglets, Salesforce et Heroku Connect (Salesforce est sélectionné par défaut). Répétez les étapes ci-dessous pour chaque objet Salesforce que vous souhaitez rendre consultable via Record Lookup.
- Sur l'onglet Salesforce, cliquez sur Add (en haut à gauche). La fenêtre Add Salesforce Data Source s'ouvre.
- Dans cette fenêtre, sélectionnez l'objet Salesforce à indexer dans la liste déroulante et cliquez sur Add. L'objet apparaît alors comme une nouvelle ligne sous le bouton Add.
- Sur la ligne de l'objet, cliquez sur le bouton Rulesets et choisissez un ruleset dans la fenêtre Ruleset qui s'ouvre. Seuls les rulesets déjà configurés pour cet objet dans DQE Unify (sous forme d'un process Duplicate Check sur votre organisation Salesforce — voir "Set up Unify processes and rules") apparaissent dans cette liste ; si elle est vide, créez d'abord ce process.
- Facultatif : cliquez sur le bouton Filters et choisissez une List View Salesforce dans la fenêtre Input Filters pour n'indexer que les enregistrements correspondant à cette List View. Sans filtre défini, tous les enregistrements de l'objet sont indexés.
- Cliquez sur le bouton Index Database (icône lecture) sur la ligne de l'objet pour lancer l'indexation.
- Si cet objet avait déjà été indexé, une fenêtre de confirmation intitulée Erase previous indexation ? apparaît, avertissant que l'index précédent sera effacé et que les performances de recherche seront dégradées pendant la nouvelle indexation. Cliquez sur Yes pour continuer, ou sur No pour annuler.
- Une barre de progression s'affiche sur la ligne de l'objet et se met à jour en direct (Reading, puis Running, puis Finished) jusqu'à la fin de l'indexation. Une fois Finished affiché, les enregistrements de l'objet sont consultables via le bouton Record Lookup décrit plus bas.
La ligne de chaque objet propose aussi :
- une case à cocher pour exposer aussi cet objet via la recherche globale native de Salesforce (Federated Search, voir le guide API plus bas) ;
- Clear DB, pour supprimer ses données indexées sans retirer l'objet de la liste ;
- Delete Record Type, pour retirer complètement l'objet des sources de données (son ruleset et son filtre sont alors abandonnés).
Record Lookup
Une fois vos objets indexés, remplacez le bouton standard New de chacun d'eux par le bouton Record Lookup, afin que les utilisateurs puissent rechercher un enregistrement existant avant d'en créer un nouveau :
- Accédez à la configuration Salesforce (Setup).
- Ouvrez le gestionnaire d'objets (Object Manager).
- Sélectionnez l'objet concerné.
- Repérez le bouton New.
- Remplacez le bouton par le bouton Record Lookup.
Guide de l'API
Cette section décrit les API exposées par l'application Record Lookup.
Federated Search
OpenSearch Description
Salesforce fournit un protocole d'intégration pour les sources de données externes. La documentation complète est disponible dans la documentation Salesforce Federated Search.
Pour se conformer à ce protocole, l'application Unify Lookup expose une API XML-Atom en deux parties. La première partie décrit le format.
- Route : /api/openSearch.xml
-
Appel :
curl -X GET https://[YOUR APP URL]/api/openSearch.xml - Réponse :
Le format devant être identique pour toutes les réponses, la liste des champs est fixe. Pour chaque type d'enregistrement indexé dans l'application Unify Lookup, vous pouvez mapper une adresse, un email, un numéro de téléphone, un prénom et un nom.
Le champ Source correspond au type d'enregistrement. Par exemple, si l'application indexe des objets Salesforce, les valeurs possibles incluent Lead, Account et Contact. Pour des tables PostgreSQL externes, la source porte le nom de la table.
OpenSearch Format
La seconde API OpenSearch est celle de la demande de ressource elle-même.
Lorsque cette API est utilisée depuis la barre de recherche de sources externes de votre organisation Salesforce, les paramètres sont transmis automatiquement.
- Route : /api/openSearch
-
Paramètres :
- search (string) : termes de recherche
- orgId (string) : identifiant de l'organisation Salesforce
- recordType (string, optionnel) : restreint la recherche à un seul objet Salesforce ou une seule table PostgreSQL, par exemple Lead
-
Appel :
curl -X GET https://[YOUR APP URL]/api/openSearch?search=Ms. Cha Fadner&orgId=[YOUR ORG ID]&recordType=Lead - Réponse :
OpenSearch Golden Record
Une variante golden record de l'API OpenSearch ci-dessus : elle ne retourne que les enregistrements parents (golden) au lieu de tous les enregistrements correspondants. À configurer comme une seconde source de données externe Federated Search distincte si vous souhaitez une expérience de recherche dédiée, limitée aux golden records.
- Route de description : /api/openSearchGolden.xml
- Route de recherche : /api/openSearchGolden
-
Paramètres :
- search (string) : termes de recherche
- orgId (string) : identifiant de l'organisation Salesforce
-
Appel :
curl -X GET https://[YOUR APP URL]/api/openSearchGolden?search=Ms. Cha Fadner&orgId=[YOUR ORG ID]
API REST
En plus des API XML utilisées par votre organisation Salesforce, le serveur Unify Lookup expose des API permettant d'effectuer des recherches de pré-existence en temps réel depuis des systèmes externes. Cette section décrit ces API et leurs méthodes d'appel.
Authentification
Toutes les API décrites ci-dessous sont sécurisées par Basic Auth. Le nom d'utilisateur est l'identifiant de l'organisation Salesforce enregistrée, et le mot de passe est la clé de licence fournie par DQE Software. Il s'agit de la même clé que celle saisie dans les variables d'environnement de votre application.
Search
Cette API est un moteur d'autocomplétion sur une seule ligne de recherche. Elle retourne une liste d'enregistrements potentiels correspondant aux critères de recherche.
Route : /api/searchRecords
Cette route est aussi disponible sous /api/searchGolden — c'est un simple alias au comportement strictement identique, il ne filtre pas pour ne garder que les golden records.
Paramètres :
- search (string) : termes de recherche
- recordType (string, optionnel) : restreint la recherche à un seul objet Salesforce ou une seule table PostgreSQL, par exemple Lead
Tout autre paramètre de requête est également utilisé pour filtrer les résultats sur la valeur de ce champ, par exemple PostalCode=77000.
Structure de la réponse :
La réponse est une liste d'objets structurés avec des champs tels que Id, Source, FirstName, LastName, Phone, Email, Street, City, PostalCode, State et Country.
Exemple d'appel :
curl -X GET \ -H "Authorization: Basic {authorization_header}" \ https://[YOUR APP URL]/api/searchRecords?search=Ms. Chantal Fadner&recordType=LeadExemple de réponse :
[ { "Id": "00Q0900000E3ded7FUEAZ", "Source": "Lead", "FirstName": "rerere", "LastName": "azazaza", "Phone": "0*****31", "Email": "*****@hotmail.fr", "Street": "R************NIERES", "City": "A**********X", "PostalCode": "12345", "State": "", "Country": "France" } ]Lookup
Cette API effectue une recherche de pré-existence en comparant un enregistrement complet à l'ensemble des enregistrements indexés.
Route : /api/lookupRecords
Paramètres :
Vous pouvez fournir n'importe quelle paire clé/valeur présente dans votre formulaire, soit dans le corps de la requête, soit dans les paramètres de requête. Les clés sont sensibles à la casse. Les clés absentes des enregistrements sont ignorées.
Structure de la réponse :
La réponse est une liste d'objets structurés avec des champs tels que Id, Source, FirstName, LastName, Phone, Email, Street, City, PostalCode, State et Country.
Exemple d'appel :
curl -X GET \ -H "Authorization: Basic {authorization_header}" \ https://[YOUR APP URL]/api/lookupRecords?Email=airelue.fc@laposte.net&PostalCode=77961&Phone=0695473336&Street=Rue du Clos Gillet&FirstName=Aurélie&LastName=FUALKNERExemple de réponse :
[ { "Phone": "**********", "City": "A*****LE", "FirstName": "Au****ei", "MobilePhone": "", "State": "", "PostalCode": "12345", "LastName": "F****ER", "Country": "France", "Email": "ai******@laposte.net", "Street": "Rue ********et", "Id": "00Q0900000E37F3EAJ", "Source": "Lead" } ]Si aucun jeu de règles de déduplication n'a été importé dans votre application :
{ "status": "error", "error": "No rules set loaded yet" }Golden record
Cette API effectue une recherche de pré-existence en comparant un enregistrement complet à l'ensemble des enregistrements indexés. Contrairement à l'API précédente, elle ne renvoie que l'enregistrement ayant le meilleur score de correspondance.
Route : /api/lookupGolden
Paramètres :
Vous pouvez fournir n'importe quelle paire clé/valeur présente dans votre formulaire, soit dans le corps de la requête, soit dans les paramètres de requête. Les clés sont sensibles à la casse. Les clés absentes des enregistrements sont ignorées.
Ajoutez optionnellement strict: true pour exiger en plus que le meilleur match soit validé par la règle principale du ruleset ; si ce n'est pas le cas, le match suivant est essayé à la place, et aucun enregistrement n'est retourné si aucun ne passe la validation.
Structure de la réponse :
La réponse contient le taux de certitude, la règle ayant permis la correspondance, ainsi que l'enregistrement le plus proche.
Exemple d'appel GET :
curl -X GET \ -H "Authorization: Basic {authorization_header}" \ https://[YOUR APP URL]/api/lookupGolden?Email=ai************.net&PostalCode=1234&Phone=*******&Street=Ru*********t&FirstName=A******&LastName=F*****Exemple d'appel POST :
curl --location 'https://[YOUR APP URL]/api/lookupGolden' \ --header "Authorization: Basic {authorization_header}" \ --header 'Content-Type: text/plain' \ --data-raw '{ "recordType": "PersonAccount", "FirstName": "S*****", "LastName": "T****", "PersonEmail": "s************id" }'Exemple de réponse :
{ "certainty": 0.05298333333333333335, "matched_by": "Address", "record": { "Phone": "***************", "City": "**********", "FirstName": "Au***********", "MobilePhone": "", "State": "", "PostalCode": "12345", "LastName": "*******************", "Country": "France", "Email": "******************.net", "Street": "Rue ****************et", "Id": "00Q0900000E37F3EAJ", "Source": "Lead" } }Si aucun jeu de règles de déduplication n'a été importé dans votre application :
{ "status": "error", "error": "No rules set loaded yet" }Dans tous les autres cas :
{ "status": "error", "error": "bad request" }Add record
Utilisez cette API pour ajouter un enregistrement à votre registre d'indexation sans relancer un traitement sur l'ensemble de la base Salesforce.
Route : /api/add
Paramètres :
- recordType : nom API du SObject, par exemple Lead, Account ou Contact
- Id : identifiant Salesforce
Vous pouvez également fournir n'importe quelle paire clé/valeur présente dans votre enregistrement en paramètres de requête. Les clés sont sensibles à la casse. Les clés absentes des enregistrements sont ignorées.
Exemple d'appel GET :
curl -X GET \ -H "Authorization: Basic {authorization_header}" \ https://[YOUR APP URL]/api/add?recordType=Lead&Email=a************e.net&PostalCode=12345&Phone=0************&Street=Rue*************&FirstName=A**********&LastName=F********RExemple d'appel POST :
curl --location 'https://[YOUR APP URL]/api/add' \ --header 'Authorization: Basic {authorization_header}' \ --header 'Content-Type: text/plain' \ --data-raw '{ "0": { "Phone": "0***********6", "BillingStreet": "R***********t", "BillingPostalCode": "12345", "LastName": "*****", "PersonEmail": "a**************t", "BillingCity": "H*****************Y", "id": "[SALESFORCE ID]", "FirstName": "A****************e", "attributes": {"type":"PersonAccount"} } }'Réponse en cas de succès :
{ "status": "success", "label": "Record added" }Si le nom API de l'objet ne fait pas partie des objets actuellement autorisés à être indexés :
{ "status": "error", "label": "RecordType not mapped in your application" }Dans ce cas, rendez-vous dans l'application Lightning Unify Lookup et ajoutez l'objet.
Si l'enregistrement n'a pas pu être ajouté car la base Redis a atteint sa limite de stockage :
{ "status": "error", "label": "memory > max memory" }Dans tous les autres cas :
{ "status": "error", "error": "bad request" }Remove record
Utilisez cette API pour supprimer un enregistrement de votre registre d'indexation sans relancer un traitement sur l'ensemble de la base Salesforce.
Route : /api/delete
Paramètres :
- recordType : nom API du SObject, par exemple Lead, Account ou Contact
- Id : identifiant Salesforce
Vous pouvez également fournir n'importe quelle paire clé/valeur présente dans votre enregistrement en paramètres de requête. Les clés sont sensibles à la casse. Les clés absentes des enregistrements sont ignorées.
Supprimer un seul enregistrement :
curl -X GET \ -H "Authorization: Basic {authorization_header}" \ https://[YOUR APP URL]/api/delete?Id=00DX00000DJ19Q&recordType=Lead&Email=a*********netSupprimer plusieurs enregistrements :
curl -X POST https://[YOUR APP URL]/api/delete \ -H "Authorization: Basic {authorization_header}" \ -d "[JSON Data]"Le corps JSON doit être structuré comme suit :
{ "recordId": { "attributes": { "type": "recordType" } } }Réponse en cas de succès :
{ "status": "success", "label": "Record(s) removed" }Dans tous les autres cas :
{ "status": "error", "error": "Failed to remove record" }Index Database
Cette API démarre le processus d'indexation global sur un objet. L'objet doit déjà avoir été ajouté via l'interface à la liste des objets, et un ruleset doit être configuré pour celui-ci.
Route : /api/index
Paramètres :
- recordType : nom API du SObject ou nom de la table PostgreSQL, par exemple Lead, Account ou Contact
-
model :
SFpour indexer un objet Salesforce, ouHKpour indexer une table PostgreSQL -
access_token : jeton de session Salesforce valide (requis lorsque
model=SF) -
instance_url : URL de l'organisation Salesforce, au format
https://xxx.my.salesforce.com(requis lorsquemodel=SF)
Exemple d'appel :
curl -X GET \ -H "Authorization: Basic {authorization_header}" \ https://[YOUR APP URL]/api/index?recordType=Lead&model=SF&access_token=XXXXXXXXXX&instance_url=https://mysforg.my.salesforce.comRéponse en cas de succès :
{ "status": "success", "label": "indexing by Bulk started" }Si le nom API de l'objet ne fait pas partie des objets actuellement autorisés à être indexés :
{ "status": "error", "label": "RecordType not mapped in your application" }Dans ce cas, rendez-vous dans l'application Lightning Unify Lookup et ajoutez l'objet.
Dans tous les autres cas :
{ "status": "error", "error": "bad request" }Ressources Apex REST
Le package AppExchange Unify Lookup fournit des ressources sous forme de classes Apex, invocables depuis vos propres classes Apex ou via des API.
Authentification
Les ressources API décrites ci-dessous ne sont accessibles qu'avec un jeton Salesforce valide récupéré via l'API OAuth2. La variable {authorization_header} dans les exemples ci-dessous représente ce jeton de session.
UpdateDB
Pour ajouter ou supprimer des enregistrements de la base indexée, utilisez cette ressource REST. Fournissez les identifiants des enregistrements, le type d'objet et l'opération à appliquer.
Route : [YOUR SALESFORCE DOMAIN]/services/apexrest/UnifyLookup/updateDB/
Paramètres :
- ids : identifiants Salesforce séparés par des virgules
- sObjectName : nom API du SObject, par exemple Lead, Account ou Contact
-
action :
insertoudelete(sensible à la casse, en minuscules)
Exemple d'appel :
curl -X GET https://[YOUR SALESFORCE DOMAIN]/services/apexrest/UnifyLookup/updateDB/?ids=0017R00002ryGbZQAU,0017R00002kqzFHQAY&sObjectName=Account&action=insert \ -H "Authorization: Bearer {authorization_header}"Réponse en cas de succès :
{ "status": "success", "label": "Record added" }En cas d'erreur :
{ "status": "error", "label": "Failed to add record" }Appel depuis une classe Apex
Vous pouvez également appeler ces fonctions directement depuis vos classes Apex, car les fonctions Apex sont déclarées en global.
deleteRecord
List<String> ids = new List<String>{'0017R00002ryGbZQAU', '0017R00002kqzFHQAY'}; String sObjectName = 'Account'; Map<String, String> res = UnifyLookup.DQE_Lookup_update_db.deleteRecord(ids, sObjectName);insertRecord
List<String> ids = new List<String>{'0017R00002ryGbZQAU', '0017R00002kqzFHQAY'}; String sObjectName = 'Account'; Map<String, String> res = UnifyLookup.DQE_Lookup_update_db.insertRecord(ids, sObjectName);
Associé à