# Extensibilité

L’extensibilité personnalise la façon dont le connecteur résout les contacts, mappe les champs et formate les événements. Cela est principalement utilisé par les équipes techniques lorsque le comportement par défaut ne correspond pas au modèle de données.

## Configuration

L’extensibilité est configurée dans la console d’administration The Wallet Crew. Chaque point d’entrée est un script JavaScript stocké dans le connecteur Bloomreach **Paramètres avancés**.

La préproduction est le point de départ recommandé. Cela réduit le risque de casser la segmentation de production et les déclencheurs de scénarios.

{% stepper %}
{% step %}

#### Ouvrir les paramètres avancés du connecteur Bloomreach

<p align="center"><a href="https://admin.thewalletcrew.io/tenant/~/integrations/bloomreach/advanced" class="button secondary" data-icon="chevrons-right">Ouvrir la page Paramètres avancés</a></p>

Chaque point d’entrée a son propre emplacement de script :

* Recherche de contact
* Intercepteur d’événements
* Mappeur client
  {% endstep %}

{% step %}

#### Commencez par le changement le plus petit possible

La Recherche de contact est généralement implémentée en premier lorsque l’e-mail n’est pas l’identifiant principal. L’Intercepteur d’événements est généralement implémenté en premier lorsque le nommage des événements ou la gouvernance est requis.

Garder les changements petits facilite l’isolement des problèmes d’attribution et d’ingestion.
{% endstep %}

{% step %}

#### Validez le comportement de bout en bout

La validation couvre généralement les deux sens du connecteur :

* Une activité fonctionne toujours (mettre à jour la Carte / Notify / appliquer le privilège).
* Un événement est toujours attribué au contact Bloomreach attendu.

Lorsque l’Intercepteur d’événements est utilisé, la validation doit confirmer le nom final de l’événement et les propriétés visibles dans Bloomreach.
{% endstep %}

{% step %}

#### Déployer en production et surveiller

Une fois que le comportement en préproduction correspond aux attentes, les mêmes scripts peuvent être appliqués en production. Lorsque les événements sont utilisés comme déclencheurs de scénario, il est recommandé de déployer pendant une fenêtre de changement.
{% endstep %}
{% endstepper %}

## Points d’entrée de l’extensibilité

Les scripts du connecteur sont configurés dans les paramètres avancés du connecteur Bloomreach dans la console d’administration The Wallet Crew.

{% hint style="warning" %}
Les changements peuvent impacter le suivi des événements et l’exécution des scénarios. Un environnement de préproduction est recommandé pour les tests.
{% endhint %}

### Recherche de contact

Une Carte est liée à des identifiants externes (e-mail, téléphone, member ID, ...). Lorsqu’un événement se produit sur une Carte, le connecteur doit l’associer à un contact Bloomreach.

La Recherche de contact personnalise la façon dont ces identifiants sont convertis en identifiants de contact Bloomreach.

```js
/**
 * Récupérer l’identifiant de contact à partir des identifiants de la Carte pour déterminer le contact Bloomreach d’une Carte.
 * L’implémentation par défaut utilise l’e-mail comme identifiant enregistré
 *
 * Cette méthode est asynchrone, ce qui permet d’appeler des services web externes si nécessaire.
 *
 * @param {Record<string, any>} identifiers - Paires clé-valeur des identifiants de la Carte
 * @returns {Promise<Record<string, string>>} Objet avec la clé 'registered' contenant l’identifiant de contact côté Bloomreach
 */
async function getContactIdentifiers(identifiers) {
  // Exemple : utiliser l’e-mail comme identifiant de contact
  // il s’agit de l’implémentation par défaut
  return { "registered": identifiers["email"] };
}

export default function (context) {
  context.register('extensions.bloomreach.contactFinder', {
    GetContactIdentifiers: getContactIdentifiers
  });
}
```

### Intercepteur d’événements

L’Intercepteur d’événements peut transformer `eventName` et `properties` avant d’envoyer l’événement à Bloomreach. C’est utile pour les conventions de nommage, le filtrage et l’enrichissement.

Renvoyer `null` supprime l’événement.

```js
/**
 * Intercepter les événements avant de les envoyer à Bloomreach.
 * Utilisez cela pour transformer dynamiquement les noms d’événements ou les propriétés.
 * Exemple : ajouter des champs calculés, renommer des propriétés, filtrer des données
 *
 * @param {Object} eventData - Objet de données d’événement
 * @param {string} eventData.Name - Nom de l’événement suivi
 * @param {Record<string, string>} eventData.Properties - Attributs/métadonnées de l’événement
 * @returns {Promise<Object>} Objet de données d’événement modifié - peut être null pour omettre cet événement
 */
async function interceptEvent({ Name, Properties }) {
  // Exemple : renvoyer l’événement tel quel (aucune transformation)
  // Modifiez selon vos besoins
  return { Name, Properties };
}

export default function (context) {
  context.register('extensions.bloomreach.event.interceptor', {
    Intercept: interceptEvent
  });
}
```

### Mappeur client

Le Mappeur client personnalise le mappage entre les champs du formulaire d’inscription de The Wallet Crew et les champs Bloomreach. Cela est utilisé lorsque des données sont envoyées à Bloomreach ou récupérées depuis Bloomreach avec des composants comme PassDataProvider et CustomerFlowElement.

```js
/**
 * Mappe les données du compte Wallet Crew vers les propriétés Bloomreach.
 *
 * @param {Object} account - L’objet compte Wallet Crew avec des champs comme firstName, email, etc.
 * @param {Object} properties - Objet de propriétés Bloomreach à remplir (modifié sur place)
 */
function mapToBloomreach(account, properties) {
  // Exemples de mappage - à personnaliser selon vos noms de champs
  if (account?.firstName) {
    properties["first_name"] = account.firstName;
  }
  if (account?.lastName) {
    properties["last_name"] = account.lastName;
  }
  if (account?.email) {
    properties["email"] = account.email;
  }
}

/**
 * Mappe les données client Bloomreach vers les champs du compte Wallet Crew.
 *
 * @param {Object} customer - Objet client Bloomreach avec Properties et Identifiers
 * @param {Object} account - L’objet compte Wallet Crew à remplir (modifié sur place)
 */
function mapFromBloomreach(customer, account) {
  // Exemples de mappage - à personnaliser selon vos noms de champs
  if (customer && customer.Properties) {
    if (customer.Properties["first_name"]) {
      account["firstName"] = customer.Properties["first_name"];
    }
    if (customer.Properties["last_name"]) {
      account["lastName"] = customer.Properties["last_name"];
    }
    if (customer.Properties["email"]) {
      account["email"] = customer.Properties["email"];
    }
  }
}

export default function (context) {
  context.register('extensions.bloomreach.mapper', {
    MapToBloomreach: mapToBloomreach,
    MapFromBloomreach: mapFromBloomreach
  });
}
```

## FAQ

<details>

<summary><strong>La Recherche de contact peut-elle appeler des services externes ?</strong></summary>

Oui. La Recherche de contact est asynchrone et peut appeler des services externes lorsque c’est nécessaire.

Ceci est généralement utilisé lorsque l’identifiant de contact Bloomreach n’est pas directement stocké sur la Carte. Les schémas courants incluent la résolution d’un `memberId` en e-mail, ou le mappage de plusieurs identifiants vers un unique identifiant Bloomreach « registered ».

</details>

<details>

<summary><strong>Un événement peut-il être supprimé avant d’atteindre Bloomreach ?</strong></summary>

Oui. L’Intercepteur d’événements peut retourner `null` pour omettre un événement.

C’est utile pour la gouvernance et la réduction du bruit. Les exemples incluent le filtrage des événements de scan des Cartes de test, la suppression des propriétés sensibles, ou l’ignorance des événements à fort volume qui ne sont pas exploitables dans Bloomreach.

</details>

<details>

<summary><strong>Quand le Mappeur client est-il utilisé ?</strong></summary>

Le Mappeur client est utilisé lorsque des données Bloomreach sont lues ou écrites via des composants du connecteur. Les points d’entrée typiques sont PassDataProvider (lecture) et CustomerFlowElement (écriture).

Il n’est pas utilisé par toutes les activités. Par exemple, l’envoi d’un message Notify ne nécessite pas le Mappeur client, sauf si les propriétés Bloomreach sont également utilisées comme source de données pour le rendu de la Carte.

Le Mappeur client est l’endroit idéal pour harmoniser les conventions de nommage, les formats de données et les champs facultatifs. Il aide aussi à maintenir la stabilité des modèles de Carte lorsque les noms de champs Bloomreach changent.

</details>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.thewalletcrew.io/connectors/fr/marketing-automation/bloomreach/extensibility.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
