=== Altivax Cockpit ===
Contributors: altivax
Tags: woocommerce, ecommerce, stock, orders, shipping, promotions, notifications, cockpit
Requires at least: 6.0
Tested up to: 6.5
Requires PHP: 7.4
WC requires at least: 7.0
WC tested up to: 9.0
Stable tag: 1.7.5
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Le cockpit e-commerce tout-en-un pour WooCommerce : stock, commandes, promotions, livraison et notifications, pensé pour le marché MENA.

== Description ==

ATS Commerce Cockpit réunit dans une interface unique et moderne les outils essentiels au pilotage d'une boutique WooCommerce : gestion de stock, suivi des commandes, promotions, livraison et notifications.

Cette version (Sprint 1 — « Fondation ») met en place l'ossature technique du plugin :

* Architecture modulaire (8 modules activables/désactivables).
* API REST interne sécurisée (espace de noms `ats-cockpit/v1`).
* Interface admin React (SPA) avec design system dédié.
* Système de licence client (protocole ALTIVAX) avec mode développeur hors-ligne.
* Migrations de base de données, capacités, réglages et cycle de vie d'activation.

Les modules métier (tableau de bord, stock, commandes, etc.) seront livrés au fil des sprints suivants.

== Installation ==

1. Téléversez le dossier `ats-commerce-cockpit` dans `/wp-content/plugins/`, ou installez le ZIP via Extensions > Ajouter.
2. Activez l'extension depuis le menu « Extensions » de WordPress.
3. WooCommerce doit être installé et actif.
4. Ouvrez le menu « ATS Cockpit » dans l'administration.

== Frequently Asked Questions ==

= WooCommerce est-il obligatoire ? =

Oui. Le plugin se désactive proprement si WooCommerce n'est pas actif.

= Comment tester sans clé de licence réelle ? =

Utilisez une clé commençant par `ATS-DEV-` : elle s'active en mode hors-ligne pour le développement.

== Changelog ==

= 1.7.5 =
* Suivi du parc : le plugin signale une fois par jour son domaine, sa version et son statut de licence au serveur ALTIVAX (beacon anonyme, sans donnée personnelle). Permet à ALTIVAX de voir les installations Free et licenciées. Désactivable via wp-config.php : define('ATS_COCKPIT_NO_BEACON', true);

= 1.7.4 =
* Découpage freemium ACTIVÉ par défaut : à l'installation, seule la version Free (Dashboard, Revenue, Stock, Orders) est active ; les modules Promotions, Shipping, Payment, Clients, Analytics et Notifications nécessitent une licence active. Bypass dev via wp-config.php : define('ATS_COCKPIT_LICENSE_BYPASS', true);
* Activation de licence : le message d'erreur du serveur (ex. « limite de sites atteinte ») est désormais affiché tel quel.

= 1.7.3 =
* Le panneau « Diagnostic » (outil de développement) est désormais masqué par défaut. Pour le réactiver en dev, ajouter dans wp-config.php : define('ATS_COCKPIT_DEV_TOOLS', true);

= 1.7.2 =
* Réglage liste de villes : la liste des pays actifs est remplacée par une simple ligne de résumé (« Actif sur N de vos lieux de vente »). Plus de mur de pays — c'est automatique, piloté par les lieux de vente WooCommerce.

= 1.7.1 =
* Réglage liste de villes : la liste des pays actifs n'encombre plus la carte. Affichage d'un simple compteur (« Actif sur N pays ») avec un lien « Voir la liste » repliable.

= 1.7.0 =
* Liste de villes au checkout : désormais ACTIVE PAR DÉFAUT et appliquée automatiquement à tous les pays où la boutique vend (réglage WooCommerce « Lieux de vente ») qui disposent d'une liste de villes. Plus aucune sélection de pays à faire — un simple interrupteur reste disponible pour couper la fonction.
* Badge « Commandes » dans le menu : il représente maintenant les commandes À TRAITER (en attente / en pause / en cours) et reste affiché tant qu'elles ne sont pas traitées, au lieu de disparaître à la première visite.

= 1.6.2 =
* Correctif : l'erreur « Ville est obligatoire » au checkout (blocs) est résolue. La ville choisie dans la liste déroulante est désormais recopiée dans le champ ville natif AVANT la validation (checkout classique + blocs).
* Réglage liste de villes : ajout d'un champ de recherche pour filtrer la liste des pays (le jeu de données couvre le monde entier) ; les pays sélectionnés restent toujours visibles.

= 1.6.1 =
* Liste déroulante de villes : le champ « ville » texte natif est désormais masqué pour les pays concernés — un seul champ « Ville » (liste déroulante) reste au checkout. Le libellé suit la langue de la boutique (« Ville » en français).
* La ville choisie est recopiée dans le champ ville de la commande (documents, étiquettes, fiche commande) ; le système de frais de livraison se base dessus.

= 1.6.0 =
* Nouveauté : liste déroulante de villes au checkout. Le champ « Région/État » devient une liste de villes pour les pays choisis (Réglages dans Livraison → Zones). Approche native compatible avec le checkout par blocs.
* Les tarifs conditionnels matchent désormais la ville choisie dans cette liste (et restent tolérants à la saisie libre : casse, accents, espaces).

= 1.5.2 =
* Correctif livraison : les tarifs conditionnels (par pays / ville / montant du panier) s'appliquent désormais automatiquement au checkout, sans devoir ajouter la méthode à une zone WooCommerce. Quand une règle correspond à la destination, elle remplace le tarif natif de la zone.
* Priorité au plus spécifique : une ville ciblée (ex. Marrakech = 0) n'hérite plus aussi du tarif générique du pays. Casablanca tombe correctement sur la règle « pays » (ex. 50).

= 1.5.1 =
* Correctif majeur : les modes de paiement personnalisés (Wafacash, paiement en agence…) s'affichent désormais sur le checkout par blocs de WooCommerce, comme les passerelles natives. Auparavant ils n'apparaissaient que sur l'ancien checkout (shortcode).

= 1.5.0 =
* Virement bancaire : gérez toutes vos banques (CIH, Attijari…) directement depuis le plugin, sur la ligne « Virement bancaire ». Les comptes sont enregistrés dans WooCommerce et s'affichent au checkout quand le client choisit ce mode — plus besoin d'ouvrir les réglages WooCommerce.
* Modes de paiement personnalisés : suppression du « type de mode » pour éviter la confusion. Un mode personnalisé est désormais une simple information (intitulé, description, instructions, statut) ; le virement multi-banques se gère sur la passerelle native.
* Correctif : les banques de virement apparaissent bien au checkout (auparavant un mode « virement » personnalisé pouvait rester invisible selon le type de page de paiement).

= 1.4.0 =
* Nouveautés : pastilles de notification dans le menu (façon Commentaires/Médias de WordPress). Quand de nouvelles commandes arrivent, un badge chiffré apparaît sur « Commandes » (et « Clients » pour les nouveaux clients).
* Les nouvelles commandes sont surlignées dans la liste (pastille + fond lime) ; chaque ligne redevient normale dès qu'on agit dessus (ouverture, changement de statut). Le badge se vide quand on entre dans le module.
* i18n : couverture bilingue finalisée — sous-titres de modules, écrans d'aide, messages de licence, documents imprimés, écrans d'erreur/chargement. Interface 100 %% EN/FR.

= 1.3.1 =
* Correctif : le filtre par langue des templates de notification fonctionne (le champ langue est désormais renvoyé par l'API).
* Sécurité : le token Twilio et la clé API Wassenger sont désormais chiffrés en base (AES-256), comme le mot de passe SMTP.
* i18n : finalisation de la couverture bilingue (messages rapides de commande, documents imprimés bon de livraison/étiquette, libellés de segments, écran de chargement) — interface 100 %% EN/FR.

= 1.3.0 =
* Interface bilingue FR/EN : l'anglais devient la langue de base. Le tableau de bord s'affiche automatiquement en français quand WordPress est en français, en anglais sinon (aucun réglage à faire).
* Toute l'interface marchand est traduite (modules, onglets, libellés, messages, fenêtres) avec bascule automatique selon la langue du site.
* Architecture i18n légère côté React : dictionnaire de traduction et détection de la locale WordPress au démarrage.

= 1.2.0 =
* Module Notifications : bibliothèque de templates prête à l'emploi. 8 événements (créée, payée, en attente, expédiée, livrée, annulée, remboursée, paiement échoué) x Email/WhatsApp/SMS x 3 langues (FR/EN/AR), ton chaleureux.
* Templates fournis INACTIFS par défaut : le marchand les revoit puis les active.
* Éditeur enrichi : sélecteur de langue, aperçu en direct (bulle WhatsApp/SMS, RTL pour l'arabe), compteur de caractères SMS, insertion de variables.
* Nouveaux déclencheurs : « Commande expédiée » (quand un suivi est renseigné) et « Paiement échoué » ; type « Message manuel » pour les envois libres.
* Nouvelles variables : {lien_suivi}, {paiement}, {date}.
* Anti-doublon : un seul message par canal, dans la langue du site (plus d'envoi simultané des 3 langues).
* Migration base de données 1.0.4 (colonne langue des templates).

= 1.1.0 =
* Module Notifications : SMTP intégré. Configurez votre serveur SMTP directement dans le cockpit (serveur, port, TLS/SSL, identifiants, expéditeur), sans plugin SMTP tiers.
* Mot de passe SMTP chiffré en base (AES-256-CBC, clé dérivée des salts WordPress), jamais réaffiché.
* Bouton d'envoi d'un email de test depuis l'onglet Canaux.
* WhatsApp : direction produit retenue = voie officielle / passerelle (Twilio, Wassenger) — sans risque de bannissement.

= 1.0.0 =
* Version commerciale publique « Altivax Cockpit ».
* Nouveau nom et nouvelle identité visuelle (logo cockpit noir/lime) dans l'interface et côté Extensions.
* Le nom de la boutique réel est désormais utilisé dans les messages clients.
* Reprend l'intégralité des fonctionnalités validées : 10 modules, système de licence Lite/Full, signature RSA, mises à jour automatiques.

= 1.27.1 =
* Clé publique RSA ALTIVAX intégrée au produit via un fichier de configuration dédié (altivax-config.php), préservé entre les versions : la vérification d'authenticité des réponses serveur est désormais active par défaut.
* Priorité de résolution de la clé : constante wp-config.php > fichier de config embarqué > vide (dev).

= 1.27.0 =
* Mises à jour automatiques (L5) : le plugin se met à jour depuis le serveur ALTIVAX via le mécanisme natif de WordPress (page Extensions → « Mettre à jour »).
* Vérification signée : disponibilité de version récupérée depuis /update, réponse authentifiée par signature RSA, téléchargement via jeton signé (30 min).
* Mise à jour proposée uniquement si la licence est valide et dans la fenêtre de mises à jour (3 ans pour l'offre à vie).
* Fenêtre « Voir les détails » alimentée par le changelog du serveur ; cache de vérification de 6 h pour limiter les appels réseau.

= 1.26.0 =
* Gating Lite/Full (L4) : découpage des modules en deux offres. Lite (gratuit) = Tableau de bord, Recette, Stock, Commandes. Full (payant) = Promotions, Livraison, Paiement, Clients, Analytics, Notifications.
* Modules Full « visibles mais verrouillés » sans licence : écran d'aperçu présentant les bénéfices + bouton « Passer à Full », et cadenas dans la barre latérale (stratégie de conversion).
* Défense côté serveur : les endpoints REST d'un module Full verrouillé renvoient 402 (les modules Lite restent accessibles sans licence).
* Le statut effectif de licence (avec période de grâce) pilote le verrouillage.

= 1.25.0 =
* Licence (L3) : le plugin se branche sur le serveur ALTIVAX (licenses.altivax.com).
* Vérification de signature RSA des réponses serveur via clé publique embarquée (constante ATS_COCKPIT_LICENSE_PUBKEY) — protège contre un faux serveur de licence.
* Dégradation gracieuse : si le serveur est injoignable, période de grâce de 14 jours avant bascule automatique en version Lite ; l'écran Licence affiche les jours restants.
* Écran Licence enrichi : statut effectif, clé masquée, expiration, fenêtre de mises à jour (offre à vie : 3 ans).
* Vérification quotidienne (cron) consolidée ; statut « à vie » et « annuel » correctement distingués.

= 1.24.0 =
* Module Notifications complet — Email, WhatsApp et SMS opérationnels (plus de « bientôt disponible »).
* Canaux : Email (wp_mail, toujours dispo), WhatsApp via lien wa.me (manuel, sans compte), et connecteurs optionnels Twilio (SMS + WhatsApp) et Wassenger (WhatsApp). Onglet « Canaux » pour configurer les identifiants (secrets jamais réaffichés).
* Mode auto / semi-auto — réglage global ET par événement. En semi-auto, les messages passent par une « File d'attente » où l'owner valide d'un clic (lien wa.me pré-rempli pour WhatsApp). En auto, envoi immédiat dès l'événement.
* File d'attente avec actions : Ouvrir WhatsApp, Envoyer (email/SMS), Marquer comme envoyé.
* Anti-spam conservé (heures de silence, fréquence max, liste noire) et logs enrichis (statuts En attente / Envoyé / Échec / Ignoré).

= 1.23.0 =
* Cohérence du CA entre modules — Tableau de bord, Recette et Analytics utilisent désormais la MÊME définition : commandes placées = terminées + en cours + en attente (on-hold) + remboursées. Fini les chiffres divergents d'un écran à l'autre.
* CA net plus juste — les remboursements ne sont déduits que pour les commandes DONT LA VENTE est dans la période. Rembourser une vieille commande ne fausse plus le CA net du mois en cours (plus de jours négatifs sur la courbe, plus de « CA du jour > CA 30 jours »).
* Panier moyen unifié — calculé partout sur CA brut / nombre de commandes placées (même valeur dans les trois modules).
* Analytics — le CA affiché est désormais le CA net (libellé clarifié), avec coût et marge pondérés pour qu'une commande remboursée ne fausse plus la marge.
* Analytics — fiabilisation de la borne de période (heure incluse) et purge automatique du cache à chaque mise à jour ; le tableau de bord se rafraîchit aussi immédiatement après un changement de statut.

= 1.22.1 =
* Correctif — changement de statut de commande : passer une commande en « Terminée » ou « Annulée » échouait silencieusement (statut non enregistré depuis le tableau, la fiche commande ou le Kanban). En cause, une normalisation du préfixe « wc- » erronée qui corrompait ces deux statuts. Tous les statuts changent désormais correctement.

= 1.22.0 =
* Livraison — lien transporteur ↔ tarif conditionnel : chaque règle de tarif peut (optionnellement) être reliée à un transporteur. Affiché au checkout, l'option porte le nom du transporteur et la commande mémorise le transporteur choisi.
* Livraison — plusieurs transporteurs au même tarif : option avancée « candidats » avec une seule option au checkout et attribution automatique (rotation équilibrée) ou manuelle. Le cas « même prix, plusieurs transporteurs » est ainsi géré sans dupliquer le choix côté client.
* Livraison — colonne « Transporteur » dans le tableau des tarifs conditionnels.
* Transporteurs — bloc « Performance par transporteur (30 j) » : expéditions, CA net, délai moyen de livraison, taux de retour par transporteur.
* Recette — bloc « CA par transporteur » (nombre d'expéditions + CA net) à côté de la répartition par méthode de paiement.

= 1.21.0 =
* Paiement — menu dédié : les paiements quittent « Livraison » pour un module « Paiement » à part entière. Passerelles (ordre = ordre au checkout), activation/renommage/réordonnancement, modes hors-ligne personnalisés.
* Paiement — virement multi-comptes : un mode « Virement bancaire » peut regrouper plusieurs comptes/RIB (CIH, BMCE…), tous affichés au checkout sous une seule option. Validation du format RIB/IBAN par compte.
* Paiement — international : détection des passerelles Stripe/PayPal officielles, avec activation, lien de configuration (clés gérées par l'extension) ou assistant d'installation si absente. ATS Cockpit pilote sans jamais traiter le paiement lui-même.
* Recette — nouveau module : visibilité financière (CA brut/net, remboursements, encaissé vs en attente, cash COD à collecter, marge estimée, taxes, frais de livraison, panier moyen), évolution du CA net, répartition par méthode de paiement, historique des commandes et export CSV. Filtres par période et méthode de paiement.

= 1.20.0 =
* Villes — base mondiale : ajout d'une base de villes par pays (principales villes, ~180 pays) en plus de la liste MENA curatée (français). Une seule source alimente le checkout, les tarifs conditionnels et les promotions.
* Villes — chargement à la demande : les villes d'un pays ne sont chargées qu'après sélection du pays (route publique /geo/cities), au lieu d'envoyer toute la base. Plus léger et compatible international.
* Promotions : les champs « villes autorisées/exclues » dépendent désormais des pays sélectionnés (désactivés tant qu'aucun pays n'est choisi) ; exemples internationalisés.
* Tarifs conditionnels : la liste de villes se charge après le choix du pays (repli saisie libre si pays non couvert).

= 1.19.0 =
* Paiements — Modes structurés : chaque mode personnalisé a désormais un type (« Information simple » ou « Virement bancaire »). Pour le virement, des champs dédiés banque / titulaire / RIB-IBAN, avec validation du format (RIB Maroc = 24 chiffres, ou IBAN). Les coordonnées sont automatiquement affichées au checkout (sous le mode choisi), sur la page de confirmation et dans l'email.
* Promotions — Conditions avancées : un coupon peut être limité par pays (autorisés ou exclus), par ville (autorisées ou exclues), par montant max de commande, et réservé à la première commande. Ces conditions sont appliquées au checkout (le coupon est refusé avec un message clair si elles ne sont pas remplies). Les villes proposées proviennent du même dataset que le checkout.

= 1.18.1 =
* Tarifs conditionnels : le champ « ville » en administration devient une liste déroulante dépendante du pays, alimentée par le même dataset que le checkout (avec repli « saisie libre »). Évite les fautes de frappe et garantit la correspondance exacte avec la ville choisie par l'acheteur.
* Zones : note de clarification — les zones couvrent le pays/région (natif WooCommerce) ; la précision par ville et par montant se gère dans l'onglet « Tarifs conditionnels ».

= 1.18.0 =
* Livraison — Tarifs conditionnels : nouvel onglet permettant de définir des frais de livraison selon le pays, la ville et le montant du panier (min/max). Ces règles s'appliquent au checkout via la méthode d'expédition « Tarifs conditionnels ATS », à ajouter dans la ou les zones concernées. Permet des tarifs différents par ville.
* Produits — Images : l'éditeur de produit du cockpit permet désormais de choisir la photo principale et les images de galerie via la médiathèque WordPress (téléversement inclus).

= 1.17.0 =
* Livraison — Paiements (bloc 2/3) : nouvel onglet « Paiements ». Gestion des passerelles WooCommerce natives (activer/désactiver, renommer, réordonner — l'ordre s'applique au checkout) et création de modes de paiement personnalisés hors-ligne (virement, chèque, paiement en agence…) qui apparaissent réellement au checkout, avec instructions affichées sur la page de confirmation et dans l'email client.
* Checkout — Villes par pays (bloc 3/3) : le champ « ville » du tunnel d'achat devient une liste déroulante dépendante du pays (dataset MENA : Maroc, Algérie, Tunisie, Égypte, Arabie saoudite, Émirats, Qatar, Koweït, Bahreïn, Oman, Jordanie, Liban, Libye, Mauritanie). Saisie libre conservée pour les pays non couverts. Extensible via le filtre `ats_cockpit_cities`.

= 1.16.0 =
* Livraison — Zones natives WooCommerce : l'onglet Zones pilote désormais directement les zones d'expédition de WooCommerce (WC_Shipping_Zones). Création/édition/suppression de zones avec pays multiples et méthodes (tarif forfaitaire, livraison gratuite avec seuil, retrait sur place). Ces zones et tarifs s'appliquent directement au checkout (plus de couche parallèle sans effet). La zone « Reste du monde » est gérable (méthodes) mais non supprimable.
* Note : ce lot couvre le bloc 1/3 du chantier Livraison & Paiement. À suivre : gestion des passerelles + modes de paiement personnalisés (bloc 2), liste de villes par pays au checkout (bloc 3).

= 1.15.3 =
* Correctif majeur : le bundle de l'app admin est désormais entièrement encapsulé dans une IIFE (format de build + wrap post-minification). Corrige l'erreur « Identifier 'wp' has already been declared » qui empêchait l'app de démarrer — une variable du bundle entrait en collision avec la globale « wp » de WordPress en contexte de script classique. Aucune variable ne fuit plus dans le scope global (générique, valable sur tout site).
* Diagnostic : le message « script non exécuté » invite désormais à consulter la console du navigateur (erreur JS possible), au lieu d'accuser uniquement un optimiseur.

= 1.15.2 =
* Compatibilité optimiseurs : le chemin d'exclusion est désormais dérivé dynamiquement de l'URL du plugin (aucune valeur en dur, robuste même si le dossier est renommé). Réglage 100 % générique, valable sur n'importe quel site client.

= 1.15.1 =
* Compatibilité optimiseurs JS : le bundle de l'app admin est désormais marqué pour être ignoré par les plugins d'optimisation/minification/délai JS (Cloudflare Rocket Loader, WP Rocket, Autoptimize, LiteSpeed, WP Fastest Cache, SiteGround Optimizer, NitroPack…). Corrige le cas « la balise ats-app.js est présente mais ne s'exécute pas ». Les balises d'amorçage et de diagnostic sont également protégées (data-cfasync).

= 1.15.0 =
* Clients : création manuelle d'un client (compte WordPress), visible dans la liste même sans commande (segment « Prospect »).
* Clients : les comptes clients enregistrés sans commande apparaissent désormais dans la liste (base pour la création manuelle et l'import).
* Clients : nouveau segment « Vente non aboutie » pour les clients ayant passé des commandes mais sans achat finalisé (en attente, en pause, annulée ou échouée).
* Clients : import CSV (en-tête avec colonne email obligatoire ; colonnes reconnues : email, name, phone, city) — crée les comptes manquants et complète les existants, avec rapport créés / mis à jour / ignorés.
* Clients : filtres avancés (ville, nombre de commandes minimum, CA minimum) et tri configurable (CA, commandes, récence, nom).
* Clients : export CSV de la liste (toute la base ou un segment filtré).

= 1.14.1 =
* Tableau de bord : le chiffre d'affaires (jour / 7j / 30j) et la courbe d'évolution sont désormais NETS des remboursements (option A). Les ventes sont comptées à la date de la commande ; les remboursements (totaux comme partiels) sont déduits à la date du remboursement, comme dans WooCommerce Analytics. Le KPI « Remboursé (30j) » reste affiché séparément.

= 1.14.0 =
* Création de commande manuelle : nouveau bouton « Nouvelle commande » dans le module Commandes. Client existant (recherche) ou invité (saisie libre), produits + quantités (recherche), adresse de livraison, mode de paiement/livraison + frais de port, remise et frais manuels, et statut. La déduction de stock suit le statut choisi (comportement WooCommerce natif).
* Recherche : les résultats produits incluent désormais le prix.

= 1.13.0 =
* Remboursement par lignes : nouvelle fenêtre de remboursement (depuis la liste des commandes via le statut « Remboursée », et depuis le détail) permettant d'ajuster la quantité ET le montant remboursés par article (ex. retour d'un seul article sur deux), avec remise en stock optionnelle. Par défaut : remboursement total.
* Liste des commandes : ajout d'une colonne « Produits » (quantité + nom).
* Tableau de bord : nouveau KPI « Remboursé (30j) » avec comparaison vs période précédente.

= 1.12.1 =
* Correctif (remboursement) : la remise en stock ne fonctionnait pas. Le remboursement passait restock_items=true sans détail de lignes, or WooCommerce ne restocke que les lignes fournies. Désormais, cocher « Remettre les articles en stock » effectue un remboursement total par lignes (articles + frais + livraison, taxes incluses) et restaure réellement le stock.
* Correctif (journal de stock) : la remise en stock d'un remboursement n'était pas tracée. Ajout du hook woocommerce_restock_refunded_item -> mouvement « RETOUR ».
* Correctif (tableau de bord) : les KPIs sont rafraîchis immédiatement après un remboursement ou une édition de lignes (invalidation du cache 60 s côté serveur + des requêtes côté interface).
* Clarification UI : lorsque le restock est coché, le remboursement est explicitement total (le champ Montant est neutralisé). Le remboursement par montant partiel reste possible sans restock.

= 1.12.0 =
* [C4] Commandes : remboursement total/partiel (avec remise en stock optionnelle) et édition des quantités de lignes directement dans le cockpit.
* [C5] Produits : création et édition de produits simples (nom, SKU, prix, stock, coût, catégories, description) sans passer par l'éditeur WooCommerce. (Variations et images : à venir.)
* [C6] Recherche universelle (produits / commandes / clients) via la barre latérale ou le raccourci Ctrl/Cmd+K.
* [C7] Analytics : bénéfice et marge estimés (à partir du coût d'achat) + impression / export PDF du rapport.
* [C8] Précalcul quotidien des caches (index clients, agrégats analytics) via Action Scheduler / WP-Cron.
* [C9] Tests unitaires (Vitest) sur les utilitaires de formatage.
* [C10] RGPD : anonymisation irréversible des données personnelles d'un client sur ses commandes ; journal d'activité des actions sensibles (remboursements, créations, anonymisations) consultable dans Diagnostic.
* [C11] Internationalisation : fichier de traduction languages/ats-commerce-cockpit.pot (couche PHP localisable).

= 1.11.0 =
* [Consolidation C3] Wizard d'onboarding au premier accès : bienvenue, détection de l'environnement (WooCommerce, WP, PHP, catalogue), sélection des modules à activer, et écran de fin. Mémorisé via general.onboarded (ne réapparaît plus ensuite). Bouton « Passer » disponible.

= 1.10.2 =
* Licence : enforcement désactivé par défaut pendant le développement (tous les modules accessibles sans licence). La mécanique de blocage reste en place et s'activera via la constante ATS_COCKPIT_LICENSE_ENFORCE (ou le filtre ats_cockpit_enforce_license) lors du branchement du système de licence final.

= 1.10.1 =
* [Consolidation C2] Harnais de test end-to-end (tests/e2e) : environnement WordPress + WooCommerce jetable (docker-compose), smoke-test validant l'activation sans fatal, l'initialisation REST, le code < 500 de chaque endpoint de lecture, et l'enforcement de licence. Intégrable en CI. Aucun changement de comportement du plugin.

= 1.10.0 =
* [Consolidation C1] Enforcement de licence : les endpoints métier (Stock, Commandes, Promotions, Livraison, Clients, Analytics, Notifications, Tableau de bord) sont bloqués tant qu'aucune licence valide n'est active. Les écrans Réglages et Diagnostic restent accessibles pour permettre l'activation.
* Côté interface : écran « Licence requise » avec accès direct à l'activation.
* Bypass développement/support : définir define('ATS_COCKPIT_LICENSE_BYPASS', true); (ou ATS_COCKPIT_DEV) dans wp-config.php, ou via le filtre ats_cockpit_enforce_license.

= 1.9.0 =
* Internationalisation : l'extension n'est plus centrée MENA.
* Transporteurs : presets mondiaux (DHL Express, FedEx, UPS, TNT, USPS, Canada Post, Royal Mail, DPD, GLS, Colissimo, Chronopost, DHL Paket, PostNL, Bpost, Correos, Poste Italiane, PostNord, Australia Post, Aramex, Cainiao). Les transporteurs régionaux restent ajoutables en personnalisé.
* Zones : sélecteur de pays basé sur la liste complète WooCommerce (≈250 pays) au lieu d'une liste régionale.
* Devise : repli neutre (USD) ; la devise réelle reste celle de WooCommerce.
* WhatsApp : normalisation des numéros au format international (plus d'indicatif pays codé en dur).
* Textes d'interface neutralisés (placeholders, libellés).

= 1.8.2 =
* Correctif UI (généralisation) : tous les contrôles natifs (listes déroulantes, champs) posés sur une barre à fond foncé passent en fond clair / texte foncé. Concerne la barre d'action groupée des Commandes (en plus de celle du Stock déjà corrigée). Audit complet : plus aucun champ natif illisible sur fond sombre.

= 1.8.1 =
* Correctif UI Stock : dans la barre d'action groupée (fond noir), les listes déroulantes et le champ valeur passent en fond clair / texte foncé — désormais lisibles (les selects natifs n'héritaient pas de la couleur de texte du conteneur).

= 1.8.0 =
* Sprint 9 — Module Notifications : les 8 modules du cockpit sont désormais présents.
* Templates par canal (email/WhatsApp/SMS) liés à des déclencheurs de commande, avec insertion de variables et envoi de test.
* Email : envoi réel via wp_mail (fonctionnel sans configuration). WhatsApp/SMS : stubs journalisés en attente d'un fournisseur (Wassenger/Twilio).
* Déclenchement automatique sur événements WooCommerce (commande créée, changements de statut), encadré try/catch pour ne jamais perturber le tunnel de commande.
* Anti-spam : période de silence, limite quotidienne par destinataire, liste noire. Journal des envois.

= 1.7.0 =
* Sprint 8 — Module Analytics : reports prêts à l'emploi sur période (7j/30j/90j/12 mois) avec comparaison période précédente.
* KPIs : CA, commandes, panier moyen, taux d'annulation, taux de refus COD, nouveaux vs récurrents.
* Graphiques : évolution du CA, CA par mode de paiement, commandes par statut, CA par catégorie, CA par ville, top produits. Export CSV du CA quotidien.
* Différé (roadmap v1.1) : constructeur de rapports personnalisés, export PDF, cohortes/LTV par segment.

= 1.6.1 =
* Clients : seuils de segmentation entièrement personnalisables (CA VIP, nombre de commandes, fenêtres de récence à risque / dormant / perdu, seuil de refus COD) via une modale « Règles ». Enregistrement + recalcul immédiat.

= 1.6.0 =
* Sprint 7 — Module Clients (CRM léger) : table clients agrégés par email (enregistrés ET invités), segmentation RFM automatique (VIP, Fidèle, Nouveau, Dormant, À risque, Perdu, Refus COD), cache transient + bouton Recalculer.
* Fiche client : RFM/LTV, historique commandes, top produits, tags & note (clients enregistrés), actions WhatsApp/email, export RGPD (JSON).
* Limites assumées : tags/notes pour clients enregistrés uniquement ; suppression/anonymisation RGPD et campagnes de masse différées (campagnes -> module Notifications).

= 1.5.0 =
* Sprint 6 — Module Livraison : transporteurs configurables (presets MENA CTM/Amana/Aramex/DHL/Yalidine + personnalisés) avec URL de suivi, zones & tarifs (tarif fixe, seuil de gratuité, délai).
* Workflow Cash on Delivery : file d'attente COD, confirmation / report / refus, cash à collecter, cahier de livraison imprimable, relance WhatsApp pré-remplie.
* Suivi colis : saisie du numéro de suivi par commande, génération de l'URL de suivi depuis le template du transporteur, journalisation dans la commande.
* Note : les intégrations API transporteurs natives (création d'expédition / tracking auto) sont des stubs en attente des identifiants/doc API ; aucun credential n'est stocké.

= 1.4.5 =
* Correctif Commandes : wc_get_orders() peut renvoyer des objets OrderRefund (remboursements) qui n'ont pas les getters de facturation — d'où un fatal « Call to undefined method ...::get_formatted_billing_full_name() ». La liste est désormais restreinte au type shop_order, avec garde défensive (instanceof WC_Order) sur la liste, le détail et l'export.

= 1.4.4 =
* Commandes / Kanban : glisser-déposer nettement plus fluide (id glissé en ref pour ne plus re-rendre le tableau pendant le drag), retour visuel sur la colonne cible, déplacement optimiste instantané, garde anti-déplacement inutile.
* Commandes : message d'erreur de la table explicite + bouton « Réessayer ».
* Performance : la liste/Kanban des commandes ne charge plus les lignes d'articles de chaque commande (compteur non affiché) — requêtes nettement plus légères, évite les time-outs sur gros volumes.

= 1.4.3 =
* Correctif critique : renommage de ATS_Promotions_Controller::get_item() (collision de signature avec WP_REST_Controller::get_item) qui provoquait un fatal à la compilation de la classe pendant rest_api_init — et faisait donc tomber TOUTE l'API REST du cockpit dès que le module Promotions était actif. Audit de tous les controllers : aucune autre collision.

= 1.4.2 =
* Diagnostic : affiche désormais le dernier fatal serveur capturé (via l'amorçage) et le message d'erreur REST brut, même lorsque l'API REST est totalement en échec — pour identifier l'origine sans dépendre de l'API.

= 1.4.1 =
* Correctif critique : suppression des arrow functions (fn()) du module Promotions, incompatibles avec PHP < 7.4 et qui faisaient échouer tout l'enregistrement REST (dashboard, diagnostic, etc.) sur ces serveurs.
* Robustesse : chaque controller REST est désormais chargé dans un try/catch isolé — un controller défaillant ne peut plus faire tomber l'ensemble de l'API.

= 1.4.0 =
* Sprint 5 — Module Promotions : modèle unifié (coupons WC + promos custom) dans une seule liste filtrable.
* Codes promo : CRUD complet adossé aux coupons WooCommerce (type, valeur, montant min, limites, expiration, catégories, usage exclusif).
* Promos catalogue : prix dynamique sur produits/catégories/tout le catalogue, avec fenêtre horaire optionnelle (happy hour). Désactivées par défaut (aucun prix ne change tant qu'on n'active pas).
* Bundles : achetez X obtenez Y (remise % sur le produit lié), appliqué au panier.
* Wizard de création guidé (Type → Conditions → Avantage → Activation) et onglet Performance (top promos par utilisation).
* Sécurité/perf : application front en court-circuit si aucune promo active, jamais d'effet en admin, tout encapsulé.

= 1.3.0 =
* Sprint 4 — Module Commandes : table filtrée (recherche nom/téléphone/email/#, statut multi, paiement, dates), changement de statut inline, actions groupées (statut, export CSV).
* Vue détail 3 colonnes : produits/totaux, timeline (logs ATS + notes WC), client, statut, notes internes.
* Vue Kanban : colonnes par statut WooCommerce avec glisser-déposer pour changer le statut.
* Actions rapides : appel (tel:), WhatsApp pré-rempli (wa.me), email (mailto) via templates de communication intégrés.
* Documents imprimables : bon de livraison et étiquette générique (impression → PDF navigateur).
* Backend HPOS-safe (wc_get_orders / wc_get_order) ; timeline tracée dans wp_ats_order_logs via hooks WooCommerce.

= 1.2.0 =
* Sprint 3 — Module Stock central : table éditable inline (stock +/-, SKU, seuil, prix, promo), filtres avancés (recherche nom/SKU, catégorie, statut stock, type), actions groupées (stock, prix, seuil, gestion stock, dupliquer, corbeille, export sélection).
* Onglet Mouvements : historique filtrable (type, dates) avec stock avant/après et utilisateur.
* Synchronisation commandes : déduction (vente) et restauration (retour/annulation) tracées automatiquement dans les mouvements via les hooks WooCommerce.
* Réception fournisseur : entrée de stock avec coût d'achat unitaire (valorisation) + mouvement « Entrée ».
* Import/Export CSV : export filtrable ; import avec prévisualisation des changements avant application (rapprochement par SKU).
* Robustesse : coque applicative protégée contre une réponse /modules malformée.

= 1.1.1 =
* Dashboard : lecture directe du magasin de commandes (HPOS + legacy) au lieu des tables d'analytics WC (qui peuvent être vides). KPIs/graphiques/top produits désormais corrects sans dépendre d'un Analytics WC peuplé.

= 1.1.0 =
* Sprint 2 — Module Dashboard : 8 KPIs, 4 graphiques (CA 30j, statuts, top produits, sources de trafic*), alertes actives, actions rapides. (*nécessite Analytics)
* Panneau Diagnostic (outil de dev) et capture des erreurs serveur.

= 1.0.0 =
* Sprint 1 — Fondation : ossature du plugin, API REST, shell admin React, licence, migrations.

== Upgrade Notice ==

= 1.0.0 =
Première version (fondation technique).
