Hooks utilisés
| Hook | Rôle |
|---|---|
actionCartSave | Met à jour la dernière activité d'un panier suivi. |
actionValidateOrder | Marque le panier commandé et attribue la commande à une relance. |
actionFrontControllerSetMedia | Script de capture de l'e-mail invité, case de consentement, message du panier restauré, déclenchement opportuniste. |
registerGDPRConsent, actionDeleteGDPRCustomer, actionExportGDPRData | Module RGPD officiel : suppression et export des paniers suivis et du journal d'un client. |
actionObjectShopAddAfter | Greffe les hooks pour une nouvelle boutique. |
Tâche planifiée
Console :
*/10 * * * * cd /chemin/vers/prestashop && php bin/console websource:cartrecovery:run >/dev/null 2>&1
| Option | Rôle |
|---|---|
--limit=N | Plafond d'e-mails de ce passage. |
--dry-run | Simulation : rien n'est envoyé ni enregistré. |
--force | Traite aussi les boutiques où le module est désactivé. |
Sortie : Paniers ajoutés au suivi : 0 | envoyées : 0 | capturées (mode capture) : 1 | échecs : 0 | ignorés : 0 | purge : 0.
URL (jeton par boutique, cron_token) :
GET /module/websourcecartrecovery/cron?token=<jeton>
GET /index.php?fc=module&module=websourcecartrecovery&controller=cron&token=<jeton>
{"ok": true, "sent": 0, "captured": 1, "failed": 0, "skipped": 0, "tracked": 0, "locked": false}
Compteurs uniquement, aucune donnée personnelle. Un verrou empêche deux passages simultanés. Autres réponses : {"ok": false, "error": "forbidden"} (jeton incorrect), {"ok": false, "error": "rate_limited"}, {"ok": true, "skipped": "too_soon"}.
Contrôleurs publics
| Contrôleur | Rôle |
|---|---|
recover?t=<jeton signé> | Restaure le panier (produits, quantités, déclinaisons, codes promo, bon si voucher_auto_apply) puis redirige vers le panier ou la commande (redirect_to). Jeton expiré, falsifié ou épuisé : page neutre. |
unsubscribe?t=<jeton signé> | Désinscription en un clic ; lien « Me réabonner ». |
capture | POST depuis le tunnel de commande : e-mail d'un invité, avec consentement selon consent_mode. Protégé par jeton CSRF et limitation de débit. |
track | Pixel d'ouverture (si open_pixel). |
cron | Voir ci-dessus. |
Jetons : Token\TokenSigner, HMAC-SHA256 avec WSCR_SECRET, sans donnée personnelle, durée token_ttl_days, token_max_uses utilisations.
Réglages
Clé WSCR_SETTINGS (JSON, par boutique), assainie par Settings\Settings::sanitize() :
| Champ | Défaut | Rôle |
|---|---|---|
enabled | 0 | Détection et envoi. |
mode | capture | capture ou live. |
delays | {1:60, 2:1440, 3:4320} | Minutes depuis la dernière activité. |
steps_enabled | {1:1, 2:1, 3:1} | Relances actives. |
min_gap_minutes, max_age_days, min_cart_total | 30, 14, 0 | Séquence. |
batch_size, max_per_hour, pause_ms | 20, 120, 150 | Débit. |
capture_enabled, consent_mode, consent_text, customers_need_optin | 1, checkbox, {}, 0 | Capture et consentement (none ou checkbox). |
templates | {1:"classic", 2:"promo", 3:"lastchance"} | Gabarits : classic, minimal, promo, lastchance, theme. |
texts, legal_text | {} | iso → relance → clé → texte (subject, title, intro, cta, outro). |
use_theme_colors, colors, logo_url, from_name | 1, {brand, accent, text, bg}, vide, vide | Apparence des e-mails. |
voucher_enabled, voucher_from_step, voucher_type, voucher_value, voucher_days, voucher_min_amount, voucher_auto_apply | 0, 2, percent, 10, 7, 0, 1 | Bon de réduction (percent ou amount). |
token_ttl_days, token_max_uses, redirect_to | 14, 5, cart | Lien de récupération (cart ou order). |
open_pixel, restore_notice, opportunistic | 0, 1, 0 | Options. |
retention_days, attribution_days | 90, 7 | Conservation et attribution. |
test_allowlist, cron_token | vide | Adresses de test, jeton de cron. |
Autre clé : WSCR_SECRET (secret des jetons).
Tables
| Table | Colonnes |
|---|---|
{prefix}websourcecartrecovery_cart | id_tracked, id_cart, id_shop, id_lang, id_currency, id_customer, email, firstname, source, consent, consent_at, last_activity, status, id_cart_rule, coupon_code, recovered_order, recovered_amount, recovered_at, date_add, date_upd |
{prefix}websourcecartrecovery_log | id_log, id_tracked, id_cart, id_shop, id_lang, id_currency, step, email, subject, status, cart_total, snapshot, click_count, restored_cart, id_order, error, file, sent_at, opened_at, clicked_at, converted_at, date_add |
{prefix}websourcecartrecovery_optout | id_optout, email_hash, id_shop, source, date_add |
Boîte de capture : fichiers var/logs/websourcecartrecovery/<AAAAMMJJ-HHMMSS-xxxxxxxx>.html.
Bons de réduction
Service\VoucherService : règle de panier au code WSCR-…, unique par panier, usage unique, liée au client s'il a un compte, en pourcentage ou en montant dans la devise du panier. Supprimés à la désinstallation.
E-mails
Mail\MailRenderer::render($template, $context, $texts, $palette) produit le HTML (tables, styles intégrés, mode sombre par prefers-color-scheme) et la version texte. Variables de texte : {firstname}, {cart_total}, {cart_url}, {products}, {shop_name}, {coupon_code}, {unsubscribe_url}. Couleurs : Mail\Palette (lues dans websourcethemeconfig par Theme\ThemeColors s'il est installé). Fichiers au format PrestaShop : mails/{fr,en}/cartrecovery_<gabarit>.{html,txt}.
Les adresses de test (@example.invalid, .test…) ne sont jamais envoyées, même en mode live.
Écran d'administration
index.php?controller=AdminModules&configure=websourcecartrecovery&wscr_tab=<onglet> avec dashboard, carts, reminders, settings, templates, cron.
| Paramètre | Rôle |
|---|---|
POST wscr_do = save, preview, test_send + wscr_csrf | Enregistrement, aperçu sans enregistrer (pv_step, pv_lang, pv_dark), envoi de test (test_email, test_real). |
GET wscr_act = send_now, cancel, reactivate + id + csrf | Actions sur un panier. |
GET wscr_act = run_now, regen_token, demo_create, demo_purge, capture_clear + csrf | Actions de l'onglet cron. |
GET wscr_export, wscr_days, wscr_view, p, f_<filtre> | Export CSV, période, message capturé, page, filtres. |
Classes principales
Websource\CartRecovery\… : Service\Runner (run(), sendNow()), Schedule\Scheduler, Schedule\Eligibility, Service\MessageBuilder, Service\CartRestorer, Service\RestorePlanner, Service\Conversions, Db\Store, Mail\Mailer, Util\Throttle, Util\Retention, Console\RunCommand.
Tests
php tests/run.php (autonome), php tests/integration.php all (instance PrestaShop, adresses @example.invalid uniquement), php tests/build_mail_files.php.