# Cartes d’adhésion (contacts Secutix)

Le connecteur Secutix ne se limite pas aux billets d'événement. Il peut aussi synchroniser **contacts Secutix**. Cela débloque un flux « carte de membre dans Wallet ». La Carte représente le contact et reste synchronisée.

## Ce que vous pouvez construire

Vous pouvez émettre une Carte Wallet qui se comporte comme une carte de membre :

* Une Carte par membre (un contact Secutix).
* Code-barres / QR code pour l'identification sur le site.
* Mises à jour automatiques lorsque les données du contact changent.
* Retour optionnel d'installation/désinstallation écrit dans Secutix.

{% hint style="info" %}
Secutix reste la source de vérité pour le profil du membre. Wallet Crew émet et distribue la Carte.
{% endhint %}

<details>

<summary>Cas d’utilisation réels</summary>

Modèles qui fonctionnent bien en production :

* **Renouvellement d'adhésion sur site** : scanner un QR code, mettre à jour le contact, actualiser la Carte.
* **Inscription en libre-service** : les membres s'inscrivent depuis une page de campagne.
* **Inscription assistée par le personnel** : les équipes d'accueil utilisent un formulaire au lieu de l'interface Secutix.
* **Capture du consentement** : stocker les critères d'opt-in dans Secutix lors de l'enregistrement.
* **Messagerie segmentée** : utiliser l'état d'installation pour cibler uniquement les membres ayant installé la Carte.

</details>

## Créer et mettre à jour des contacts depuis un formulaire d'enregistrement

Utilisez un Wallet Crew **formulaire d'enregistrement** pour :

* Créer un nouveau contact Secutix.
* Mettre à jour un contact Secutix existant.
* Distribuer immédiatement la carte de membre dans Apple Wallet / Google Wallet.

Cela fonctionne bien lorsque vous ne voulez pas exposer l'interface Secutix au personnel. Cela convient aussi aux flux d'inscription en libre-service.

### Point d'entrée par QR code

Afficher un QR code qui ouvre le formulaire d'enregistrement sur un téléphone. Idéal pour l'acquisition sur site. Pensez au foyer, au guichet ou aux stands partenaires.

### Cartographie : compte Wallet Crew ↔ contact Secutix

Lorsque la synchronisation des contacts est activée, Wallet Crew mappe **champs de compte** à **champs de contact Secutix**. Personnalisez la cartographie lorsque vous devez lire/écrire des critères Secutix spécifiques. C'est courant pour les consentements, les indicateurs de segmentation ou les champs hérités.

Ajoutez votre script de cartographie personnalisé dans la configuration Secutix **Avancé** .

<p align="center"><a href="https://admin.thewalletcrew.io/tenant/~/integrations/secutix/settings" class="button secondary" data-icon="chevrons-right">Écran de configuration Secutix</a></p>

#### Hook de cartographie avancée des contacts

Enregistrer `extensions.secutix.contact.mapper`.

* `MapToSecutix(compte, requête)` s'exécute **avant** appelant Secutix.
* `MapToNeostore(réponse, compte)` s'exécute **après** Secutix répond.

```javascript
/**
 * Applique une cartographie améliorée des données de compte neostore vers une requête de contact Secutix.
 * La cartographie standard est déjà appliquée sur l'objet request avant l'appel de cette fonction.
 *
 * @param {Object} account - Données provenant de neostore.
 * @param {Object} request - Requête envoyée à Secutix avec la cartographie par défaut déjà remplie.
 */
function mapToSecutix(account, request){
  request.ExternalContactCriterionData = [{ CriterionIdCode : 'OPT_CO', Values : [account["consents_email"] ? 'true' : 'false'] }];
}

/**
 * Applique une cartographie améliorée d'une réponse de contact Secutix vers un compte neostore.
 * La cartographie standard est déjà appliquée sur l'objet account avant l'appel de cette fonction.
 *
 * @param {Object} response - Réponse reçue de Secutix.
 * @param {Object} account - Données envoyées à neostore avec la cartographie par défaut déjà remplie.
 */
function mapToNeostore(response, account){
  response.ContactCriteria = response.ContactCriteria || [];
  account["consents_email"] = !!response.ContactCriteria.find(c => c.CriterionIdCode === 'OPT_CO' && c.Values != null && c.Values[0] === 'true');
}

export default function(context) {
  context.register('extensions.secutix.contact.mapper', {
    MapToSecutix : mapToSecutix,
    MapToNeostore: mapToNeostore
  });
}
```

#### Mise à jour du statut d'installation sur le contact

Ce hook vous permet de persister les signaux d'installation/désinstallation de la Carte dans les critères de contact Secutix. Utilisez-le pour piloter la segmentation ou les rapports opérationnels dans Secutix.

Implémenter `extensions.secutix.contact.passUpdater`:

```javascript
/**
 * Déclenché lorsqu'un statut d'installation de carte de membre change.
 *
 * @param {Object} request - SaveIndividualContactRequest Secutix.
 * @param {boolean} isInstalled - `true` si la carte est installée, sinon `false`.
 * @param {number} device - Appareil sur lequel le statut d'installation a changé (0 = Apple, 2 = Google).
 * @returns {Promise<void>} Pas de valeur de retour ; modifie la requête sur place.
 */
async function onPassInstallationStatusChanged(request, isInstalled, device){
  request.ExternalContactCriterionData = [
    {
      CriterionIdCode : 'W_' + (device == 0 ? "APPLE" : "GOOGLE"),
      Values : [isInstalled ? 'Installé' : 'Désinstallé']
    }
  ];
}

export default function(context) {
  context.register('extensions.secutix.contact.passUpdater', {
    OnPassInstallationStatusChanged: onPassInstallationStatusChanged
  });
}
```
