# Vérification d'Âge PrestaShop – Modal Bloquante pour CBD, Alcool, Vape & Pro de Santé

> Le module dfagegate ajoute une modale de vérification d'âge bloquante à votre boutique PrestaShop 8 ou 9. Il couvre deux marchés distincts : le mode standard pour les produits réglementés…

- Page: <https://www.datafirefly.com/documentation/verification-age-prestashop-modal-cbd-alcool-vape-medical/>
- Langue: fr
- Mis à jour le: 2026-09-28
- Autres langues: [en](https://www.datafirefly.com/en/documentation/verification-age-prestashop-modal-cbd-alcool-vape-medical/index.md), [es](https://www.datafirefly.com/es/documentation/verification-age-prestashop-modal-cbd-alcool-vape-medical/index.md), [de](https://www.datafirefly.com/de/documentation/verification-age-prestashop-modal-cbd-alcool-vape-medical/index.md), [it](https://www.datafirefly.com/it/documentation/verification-age-prestashop-modal-cbd-alcool-vape-medical/index.md), [pl](https://www.datafirefly.com/pl/documentation/verification-age-prestashop-modal-cbd-alcool-vape-medical/index.md), [pt](https://www.datafirefly.com/pt/documentation/verification-age-prestashop-modal-cbd-alcool-vape-medical/index.md), [nl](https://www.datafirefly.com/nl/documentation/verification-age-prestashop-modal-cbd-alcool-vape-medical/index.md)
- Index: <https://www.datafirefly.com/documentation/llms.txt>

Le module **dfagegate** ajoute une modale de vérification d'âge **bloquante** à votre boutique PrestaShop 8 ou 9. Il couvre deux marchés distincts : le **mode standard** pour les produits réglementés par âge (CBD, alcool, vape, armurerie, briquets, produits 18+), et le **mode médical** pour les dispositifs médicaux réservés aux professionnels de santé au sens de l'article L5122-9 du Code de la santé publique.

**Compatibilité** — PrestaShop 1.7.7+, 8.x et 9.0. PHP 7.4 minimum, 8.1+ recommandé. Multi-boutique et multilingue (FR/EN/ES/DE pré-remplis à l'installation).

## Installation

L'installation suit le workflow PrestaShop standard. Après achat sur DataFirefly, vous recevez un fichier ZIP `dfagegate-X.Y.Z.zip`.

### Via le back-office (recommandé)

1. Connectez-vous à votre back-office PrestaShop
2. Rendez-vous dans **Modules → Catalogue de modules**
3. Cliquez sur **Charger un module** en haut à droite
4. Sélectionnez le ZIP `dfagegate-X.Y.Z.zip`
5. Une fois l'upload terminé, cliquez sur **Installer**

### Via FTP

1. Décompressez le ZIP localement
2. Uploadez le dossier `dfagegate/` dans `modules/` de votre PrestaShop
3. Rendez-vous dans **Modules → Catalogue de modules**
4. Recherchez « DataFirefly Age Gate » et cliquez sur **Installer**

**Important** — Après l'installation, **le module est désactivé par défaut**. C'est volontaire : cela vous permet de configurer les textes et le mode avant de bloquer votre boutique. Rendez-vous dans la configuration du module et activez le toggle dans l'onglet _Général_ une fois tout paramétré.

## Premier paramétrage

Accédez à la configuration : **Modules → Modules installés → DataFirefly Age Gate → Configurer**.

La configuration est organisée en 6 onglets :

- **Général** — activation, mode, type de vérification, âge minimum, périmètre d'affichage
- **Contenu** — textes multilingues (titre, message, boutons, mentions légales)
- **Apparence** — logo, couleurs, backdrop blur
- **Comportement** — cookie, redirection, bypass
- **Mode médical** — professions et RPPS/ADELI (n'apparaît qu'en mode médical)
- **Logs & RGPD** — journalisation, statistiques et diagnostic

### Onglet Général

C'est ici que vous configurez le comportement principal du module.

- **Activer le module** — toggle Oui/Non, contrôle l'affichage global de la modale
- **Mode** — _Standard_ (CBD, alcool, vape, armurerie) ou _Médical_ (professionnels de santé)
- **Type de vérification** — _Bouton oui/non_, _Date de naissance_, ou _Déclaration profession_
- **Âge minimum** — 18 par défaut, 21 pour certains marchés (Norvège pour l'alcool par exemple)
- **Périmètre d'affichage** — toute la boutique, catégories ciblées ou produits ciblés (voir ci-dessous)
- **Tester la modale** — bouton qui ouvre la boutique en mode aperçu (voir la section Diagnostic)

**Quel type de vérification choisir ?** Le _bouton oui/non_ convient à la majorité des cas (CBD, alcool grand public, vape) : rapide, faible friction, effet dissuasif suffisant pour un contrôle DGCCRF. La _date de naissance_ est plus stricte et recommandée pour l'armurerie ou les liquides nicotinés. La _déclaration profession_ est réservée au mode médical.

### Périmètre d'affichage : cibler des catégories ou des produits

Depuis la version 1.1.0, le réglage **Périmètre d'affichage** de l'onglet Général propose trois modes :

- **Toute la boutique** — la modale s'affiche sur toutes les pages. C'est le comportement historique et la valeur par défaut
- **Catégories ciblées uniquement** — la modale s'affiche sur les pages des catégories cochées et sur les fiches des produits qui leur appartiennent. La sélection se fait dans un arbre de catégories avec cases à cocher, filtre de recherche instantané et compteur de sélection
- **Produits ciblés uniquement** — la modale ne s'affiche que sur les fiches des produits sélectionnés. Recherchez par nom ou par référence, les suggestions apparaissent au fil de la saisie, et chaque produit retenu devient une étiquette supprimable

En mode catégories, l'option **Inclure les sous-catégories** (activée par défaut) couvre automatiquement toute la descendance des catégories cochées : cochez « CBD » et ses sous-catégories « Huiles », « Fleurs » ou « Résines » sont couvertes sans les cocher une à une. L'expansion repose sur les nested sets de PrestaShop, en une seule requête.

**Boutique mixte ?** C'est le cas d'usage typique du ciblage : une épicerie fine qui vend aussi des spiritueux, une parapharmacie avec un rayon matériel pro. Ciblez le rayon réglementé par catégorie : il est protégé, et le reste de la boutique reste accessible sans modale.

**Mode produits et pages de listing** — En mode produits ciblés, les pages de listing (catégorie, recherche, nouveautés) ne déclenchent pas la modale : seules les fiches produits sélectionnées la déclenchent. Pour couvrir un rayon entier, listing compris, préférez le ciblage par catégorie.

La décision d'affichage se prend **côté serveur**, pas en JavaScript. Le commentaire diagnostic de la balise head indique le périmètre actif : `scope=all`, `scope=categories` ou `scope=products`. À l'enregistrement, un périmètre ciblé avec une sélection vide est refusé avec un message d'erreur, pour éviter de bloquer la configuration dans un état incohérent.

### Onglet Contenu

Chaque langue activée dans votre PrestaShop dispose de son propre bloc de textes. Les valeurs par défaut sont pré-remplies en **FR, EN, ES et DE**. Pour chaque langue vous pouvez configurer :

- **Titre** — apparaît en gros au sommet de la modale (par défaut : « Vérification d'âge »)
- **Message** — texte explicatif principal, les retours à la ligne sont préservés
- **Bouton confirmer** — libellé du bouton positif (par défaut : « J'ai 18 ans ou plus »)
- **Bouton refuser** — libellé du bouton négatif
- **Mention légale** — texte en bas de modale (par défaut : « L'abus d'alcool est dangereux pour la santé. À consommer avec modération. »)
- **Message en cas de refus** — écran affiché quand l'utilisateur refuse, avant redirection

**HTML** — Le contenu est sanitisé à l'enregistrement (texte brut uniquement). Les retours à la ligne sont convertis en balises <br> au rendu via un filtre `nl2br` automatique.

### Onglet Apparence

Personnalisez le look de la modale pour qu'il colle à votre charte graphique :

- **Logo** — PNG, JPG, SVG ou WEBP, 2 Mo max, affiché en haut de la modale
- **Couleur de fond** — couleur de la carte principale (blanc par défaut)
- **Couleur primaire** — titre et bouton principal (noir #111111 par défaut)
- **Couleur du texte** — corps du message
- **Couleur de l'overlay** — voile derrière la modale, accepte les formats CSS `rgba()` et hex (par défaut : `rgba(15,15,20,0.85)`)
- **Backdrop blur** — flou en arrière-plan (effet moderne, marche sur tous les navigateurs actuels)

### Onglet Comportement

Contrôle la persistance du choix et les cas d'exclusion.

- **Durée du cookie** — en jours (90 par défaut). Mettre `0` pour un cookie de session (supprimé à la fermeture du navigateur)
- **URL de redirection en cas de refus** — laissez vide pour n'afficher que le message de refus, ou renseignez une URL externe (Google, page fournisseur, etc.)
- **Bypass IP** — liste d'IPs (une par ligne) pour lesquelles la modale ne s'affiche pas. Idéal pour vous et votre équipe pendant les tests
- **Bypass URLs** — chemins partiels exclus. Pré-rempli avec `/legal`, `/contact`, `/cgv`, `/mentions-legales`, `/politique-confidentialite`
- **Bypass clients connectés** — si activé, les clients déjà logués ne voient pas la modale (utile si votre boutique est réservée aux comptes déjà validés)

### Onglet Mode médical

Cet onglet ne s'applique que si le **mode** est réglé sur _Médical_ et le **type de vérification** sur _Déclaration profession_.

- **Liste des professions** — une par ligne. Par défaut : Médecin, Pharmacien, Infirmier(ère), Kinésithérapeute, Dentiste, Vétérinaire, Autre professionnel de santé. Personnalisable selon votre cible
- **Numéro RPPS / ADELI obligatoire** — si activé, un champ apparaît dans la modale. Validation par regex acceptant 9 à 11 chiffres. **Le numéro n'est pas stocké**, il sert uniquement à la validation côté serveur

**Conformité juridique** — Le mode médical matérialise une déclaration sur l'honneur au sens de l'article L5122-9 du Code de la santé publique, qui réserve la publicité de certains dispositifs médicaux aux professionnels de santé habilités. **Ce module ne dispense pas d'une revue juridique de votre catalogue par un avocat spécialisé**. Consultez votre conseil pour valider votre configuration.

### Onglet Logs & RGPD

Journalisation optionnelle, statistiques et informations de conformité.

- **Logger les refus** — enregistre chaque refus dans la table `ps_dfagegate_log` avec IP hashée SHA-256 (jamais en clair), date, raison
- **Rétention des logs** — durée de conservation en jours (365 par défaut, `0` pour illimitée). Les refus plus anciens que cette durée sont supprimés automatiquement à chaque ouverture de la page de configuration

Depuis la version 1.1.0, cet onglet affiche aussi les **statistiques des refus** : total sur les 30 derniers jours, répartition par raison, et les 15 derniers refus avec date, raison, âge déclaré et profession le cas échéant. Un bouton **Purger tous les logs de refus** (avec confirmation) vide la table pour la boutique courante.

Cet onglet affiche également un pense-bête RGPD :

- **Cookie déposé** — `dfagegate_ok`
- **Catégorie** — strictement nécessaire (conformité légale d'accès)
- **Données** — valeur « 1 », durée configurable, SameSite=Lax, Secure si HTTPS

## Configurer selon votre marché

Voici quelques configurations types pour vous inspirer.

### Boutique CBD grand public

- Mode : **Standard**
- Type de vérification : **Bouton oui/non**
- Âge minimum : **18**
- Durée du cookie : **90 jours** (bon équilibre entre conformité et UX)
- URL de redirection : _vide_ (juste le message de refus)
- Mention légale : « La consommation de cannabidiol peut interagir avec certains médicaments. Consultez votre médecin. »

### Boutique de spiritueux / alcool premium

- Mode : **Standard**
- Type de vérification : **Date de naissance** (contrôle plus strict pour marchés premium)
- Âge minimum : **18** (ou 21 pour les marchés US/Norvège)
- URL de redirection : `https://www.eatandrink.gouv.fr/` ou toute page d'information officielle
- Mention légale : « L'abus d'alcool est dangereux pour la santé. À consommer avec modération. »

### Boutique de vape / e-liquides nicotinés

- Mode : **Standard**
- Type de vérification : **Date de naissance** (fortement recommandé pour la nicotine)
- Âge minimum : **18**
- Logger les refus : **Oui** (utile en cas de contrôle DGCCRF)

### Boutique d'armurerie

- Mode : **Standard**
- Type de vérification : **Date de naissance** (obligatoire)
- Âge minimum : **18**
- Bypass URLs : ajouter `/reglementation`, `/permis-de-chasse`
- Logger les refus : **Oui**

### Épicerie fine avec rayon spiritueux (boutique mixte)

- Mode : **Standard**
- Type de vérification : **Bouton oui/non**
- Périmètre d'affichage : **Catégories ciblées**, avec la catégorie Spiritueux cochée et les sous-catégories incluses
- Résultat : la modale ne s'affiche que sur le rayon spiritueux et ses fiches produits, le reste de l'épicerie reste sans friction

### Boutique matériel médical (dispositifs pro)

- Mode : **Médical**
- Type de vérification : **Déclaration profession**
- Liste des professions : Médecin, Pharmacien, Kinésithérapeute, Ostéopathe (à adapter à votre catalogue)
- Numéro RPPS / ADELI obligatoire : **Oui**
- Bypass clients connectés : **Oui** (si vous validez déjà la profession à l'inscription)

## Comment fonctionne la vérification par date de naissance

Contrairement à un simple bouton, la vérification par date de naissance fait un calcul **côté serveur** et non côté navigateur. Voici le déroulement complet :

1. Le visiteur saisit jour, mois et année dans la modale
2. Le JavaScript envoie ces valeurs au contrôleur AJAX `DfagegateAjaxModuleFrontController`
3. PHP valide la date avec `checkdate()` puis calcule l'âge via `DateTimeImmutable::diff()`
4. Si l'âge est inférieur au seuil configuré, le serveur renvoie une réponse JSON `success=false, denied=true` avec le message d'erreur
5. La modale affiche le message de refus et redirige après 2 secondes
6. Si l'âge est supérieur ou égal, le cookie `dfagegate_ok` est posé et la modale se ferme

**Pourquoi côté serveur ?** Un contrôle purement JavaScript peut être bypassé via DevTools en moins de 10 secondes. Le calcul serveur garantit qu'un utilisateur sous l'âge légal ne peut pas accéder au site, même avec des connaissances techniques. C'est essentiel pour tenir un contrôle DGCCRF.

Notez que **la date de naissance n'est jamais stockée** — elle est utilisée le temps d'un calcul puis oubliée. Seule la validation binaire (accepté / refusé) est retenue via le cookie.

## Comment fonctionne le mode médical

Le mode médical suit une logique similaire mais avec des champs différents :

1. La modale affiche une liste déroulante de professions (configurable) et éventuellement un champ RPPS/ADELI
2. Une case à cocher de **déclaration sur l'honneur** est présente et obligatoire
3. Le contrôleur AJAX valide que la profession est sélectionnée
4. Si RPPS/ADELI obligatoire, le serveur valide le format via une expression régulière qui accepte de 9 à 11 chiffres consécutifs
5. Aucun stockage : ni la profession ni le numéro ne sont conservés en base — le cookie `dfagegate_ok` matérialise uniquement le passage réussi

**Choix de conception** — La régulation L5122-9 exige une matérialisation de la déclaration, pas nécessairement une vérification en temps réel auprès de l'annuaire national. Notre approche est _compliance minimum viable_ : on demande la déclaration, on la valide formellement, on trace le refus si activé, mais on ne collecte pas de donnée personnelle inutile. Si vous avez besoin d'une vérification RPPS en temps réel contre l'annuaire ANS, c'est un développement custom à part.

## Multi-boutique

Le module est **100% compatible multi-boutique**. Toutes les configurations (mode, type de vérification, textes multilingues, couleurs, bypass, périmètre d'affichage) sont stockées par contexte boutique via `id_shop_group` et `id_shop`. Cela signifie que vous pouvez avoir dans un même PrestaShop :

- Une boutique **CBD FR** en mode standard 18 ans avec textes en français
- Une boutique **vape UK** en mode standard 18 ans avec textes en anglais
- Une boutique **matériel médical DE** en mode médical avec RPPS obligatoire et textes en allemand

Pour configurer une sous-boutique spécifique :

1. Dans le sélecteur de contexte en haut du back-office, choisissez la sous-boutique cible
2. Ouvrez la configuration du module
3. Modifiez les valeurs — elles seront persistées pour cette boutique uniquement

Les **hooks sont enregistrés sur toutes les boutiques** au moment de l'installation via `Shop::getCompleteListOfShopsID()`, évitant le piège classique du module qui ne tourne que sur la boutique courante.

## Compatibilité avec les thèmes personnalisés

Le module utilise le hook standard `displayBeforeBodyClosingTag` pour injecter la modale juste avant la fermeture de la balise body. Ce hook est censé être universel sur PrestaShop 1.7.5+.

Malheureusement, **certains thèmes personnalisés n'appellent pas ce hook** dans leur layout. Pour ce cas, dfagegate embarque un **fallback JavaScript** :

1. Le PHP pré-rend le HTML complet de la modale et le passe au JS via `Media::addJsDef`
2. Au `DOMContentLoaded`, le script vérifie si l'élément avec l'ID `dfagegate-modal` existe dans le DOM
3. Si oui, tout va bien — le hook a fonctionné
4. Si non, le script injecte lui-même la modale via `insertAdjacentHTML('beforeend', ...)`
5. Un message `console.info` confirme l'activation du fallback : « [dfagegate] modal injected via JS fallback (theme does not trigger displayBeforeBodyClosingTag). »

**Résultat pratique** — Le module marche sur n'importe quel thème PrestaShop 1.7.5+, y compris les thèmes personnalisés incomplets, **sans avoir à modifier le layout**. Vous pouvez le déployer sans coordination avec votre agence thème.

## Diagnostic et debug

Une fois activé, dfagegate ajoute un **commentaire HTML dans la balise head** de chaque page front, sous la forme « dfagegate v1.1.0 enabled=1 scope=all should_display=1 ».

Ce commentaire est votre premier point de diagnostic. Consultez le code source d'une page front (Ctrl+U ou Cmd+U) et cherchez « dfagegate ».

| Commentaire | Interprétation |
| --- | --- |
| Pas de commentaire du tout | Le hook `displayHeader` n'est pas enregistré — vérifiez que le module est bien installé et actif |
| `enabled=0` | Le toggle « Activer le module » est sur Non dans l'onglet Général |
| `enabled=1 should_display=0` | Un bypass est actif (votre IP est whitelistée, l'URL courante matche un chemin exclu, ou vous êtes client connecté avec bypass activé), ou la page courante est en dehors du périmètre ciblé — vérifiez la valeur `scope=` |
| `enabled=1 should_display=1` | Tout va bien côté serveur. Si la modale n'apparaît pas, regardez la console navigateur pour un éventuel message de fallback JS ou d'erreur |

### La modale n'apparaît toujours pas ?

Checklist rapide :

1. Le commentaire diagnostic est-il présent avec `should_display=1` ? Sinon, corrigez la config
2. Ouvrez la boutique en **navigation privée**. Le cookie `dfagegate_ok` peut être posé depuis une session précédente
3. Vérifiez votre IP dans les bypass de l'onglet _Comportement_
4. En périmètre ciblé, vérifiez que la page testée appartient bien aux catégories ou produits sélectionnés
5. Ouvrez la console navigateur (F12). Cherchez `[dfagegate]` pour d'éventuels messages d'injection fallback ou d'erreur
6. Consultez les logs PrestaShop dans **Paramètres avancés → Logs**, filtrez sur « dfagegate »
7. **Videz le cache PrestaShop** après chaque changement de configuration : _Paramètres avancés → Performances → Vider le cache_

### Tester avec le mode aperçu

Depuis la version 1.1.0, le bouton **Tester la modale** de l'onglet Général ouvre la boutique dans un nouvel onglet avec le paramètre `?dfagegate_preview=1`. Dans ce mode :

- La modale s'affiche **même si le cookie dfagegate_ok est déjà posé**
- Confirmer ne dépose **aucun cookie** : le test est répétable à volonté, sans navigation privée ni suppression manuelle

En périmètre ciblé, naviguez vers une page couverte en conservant le paramètre dans l'URL pour voir la modale.

### Réinitialiser le cookie côté navigateur

Pour retester la modale sans changer d'IP :

1. Ouvrez les DevTools (F12)
2. Onglet **Application** (Chrome) ou **Storage** (Firefox)
3. Section **Cookies** → votre domaine
4. Supprimez la ligne `dfagegate_ok`
5. Rechargez la page

## Conformité RGPD

Le module est conçu pour être conforme RGPD par défaut.

### Le cookie `dfagegate_ok`

- **Type** — strictement nécessaire au respect d'une obligation légale d'accès
- **Base légale** — exempté de consentement préalable au sens de l'article 82 de la loi Informatique et Libertés (recommandations CNIL)
- **Valeur** — binaire (`1` = confirmé)
- **Durée** — configurable (90 jours par défaut), ou session si vous mettez 0
- **Attributs** — `SameSite=Lax`, `Secure` automatique en HTTPS, `Path=/`

**Concrètement** — Vous n'avez **pas besoin** d'ajouter ce cookie à votre bannière de consentement. Il rentre dans la même catégorie que le cookie de session PrestaShop ou le cookie CSRF : nécessaire au fonctionnement légal du site, donc exempt.

### Les logs de refus

Si vous activez l'option _Logger les refus_, chaque refus est enregistré dans la table `ps_dfagegate_log` avec :

- `id_shop` — sous-boutique concernée
- `reason` — raison du refus (`user_refused` ou `dob_under_age`)
- `age` — âge déclaré si applicable
- `profession` — profession déclarée si applicable
- `ip_hash` — **SHA-256 de l'IP**, jamais l'IP en clair
- `date_add` — horodatage

Le hachage SHA-256 rend l'IP **non réversible** tout en permettant de dédupliquer les tentatives (une même IP produira toujours le même hash). C'est le compromis recommandé par la CNIL pour la statistique d'accès.

La **rétention est automatique** depuis la 1.1.0 : les entrées plus anciennes que la durée configurée (365 jours par défaut) sont purgées à chaque ouverture de la page de configuration. Une durée limitée dans le temps est exactement ce que le principe de minimisation du RGPD attend d'un journal de ce type. Les statistiques de l'onglet Logs (total 30 jours, répartition par raison, derniers refus) se fondent sur ces mêmes données hashées.

### Les données de vérification

- La **date de naissance** transite via AJAX pour le calcul mais **n'est jamais stockée**
- Le **numéro RPPS/ADELI** est validé côté serveur puis **oublié**, jamais stocké
- Seule la **validation binaire** est conservée, via le cookie

## Structure technique et intégration

Pour les développeurs qui veulent aller plus loin ou intégrer le module dans un workflow personnalisé.

### Hooks utilisés

- `displayHeader` — injecte le commentaire diagnostic
- `actionFrontControllerSetMedia` — enregistre CSS et JS, passe la config et le HTML pré-rendu de la modale au JS
- `displayBeforeBodyClosingTag` — rend la modale côté serveur (fallback JS si absent du thème)

### Points d'entrée AJAX

Le contrôleur AJAX répond à l'URL `/module/dfagegate/ajax` et accepte deux actions :

- `action=confirm` — avec les paramètres selon le type de vérification (rien pour yes/no, day/month/year pour DOB, profession/rpps pour médical)
- `action=refuse` — enregistre le refus et retourne l'URL de redirection

Les réponses sont en JSON. Une confirmation renvoie `success=true`. Un refus par âge insuffisant renvoie `success=false`, `denied=true` et le message d'erreur adapté. Une erreur de validation renvoie `success=false` avec le message. Un refus utilisateur renvoie `success=true` et `redirect_url` contenant l'URL de redirection configurée.

### Schéma de base de données

Une seule table est créée : `ps_dfagegate_log`. Elle contient les colonnes `id_log` (clé primaire auto-incrémentée), `id_shop`, `reason` (varchar 64), `age` (nullable), `profession` (varchar 128 nullable), `ip_hash` (char 64 pour le SHA-256) et `date_add` (datetime). Deux index secondaires optimisent les requêtes de reporting : `idx_shop_date` sur (id_shop, date_add) et `idx_reason` sur reason.

## Désinstallation

Deux niveaux de désinstallation :

### Désactiver sans supprimer

**Modules → Modules installés → DataFirefly Age Gate → Désactiver**. La configuration est conservée, la table de logs aussi. Vous pouvez réactiver à tout moment sans reconfigurer.

### Désinstaller complètement

**Modules → Modules installés → DataFirefly Age Gate → Désinstaller**. Cette action :

- Supprime la table `ps_dfagegate_log`
- Supprime toutes les entrées de configuration (23 clés scalaires + 6 clés multilingues)
- Désenregistre les hooks
- Retire le module du système

**Attention** — La désinstallation est **irréversible**. Si vous voulez conserver l'historique des logs de refus (pour un audit CNIL par exemple), exportez la table avant.

## Support et mises à jour

Chaque licence inclut :

- **12 mois de mises à jour** — compatibilité PrestaShop, corrections, améliorations
- **Support technique par email** — réponse sous 24h ouvrées, FR/EN
- **Remboursement 30 jours**
- **Code source non chiffré** — vous êtes libre d'adapter le module à vos besoins spécifiques

Pour toute question technique ou signalement de bug, contactez-nous depuis votre compte DataFirefly. Précisez la version de PrestaShop, la version de PHP, la version du module (visible en haut de l'écran de configuration), et si possible le commentaire diagnostic présent dans la balise head de votre boutique.
