CORRECTIF CUMULATIF — site WiFi Zone (130 fichiers + cette notice). Il REMPLACE tous les correctifs précédents : installez celui-ci seul.

=== NOUVEAU : LES FORMULAIRES DE CRÉATION, COMME MIKHMON MAIS EN FRANÇAIS (dans votre style et vos polices)

 1) GÉNÉRER DES TICKETS EN MASSE (menu Tickets > Générer, et onglet « Générer » de chaque routeur) — champs, dans l'ordre de Mikhmon :
    Quantité · Serveur · Mode utilisateur · Longueur du code ou du nom · Préfixe · Caractères · Profil · Temps limite · Limite de données (MB/GB) · Commentaire.
    - SERVEUR : la liste déroulante contient « all » (choisi à l'ouverture) puis TOUS les serveurs hotspot du routeur, lus sur le routeur (gardés 10 minutes).
      Routeur injoignable : seul « all » est proposé, avec la mention « Serveurs hotspot non lus » ; la génération reste possible (elle part plus tard, avec le même serveur).
    - MODE UTILISATEUR : « Utilisateur & mot de passe » ou « Utilisateur = mot de passe » (le choix d'avant est conservé : « Utilisateur = mot de passe »).
    - LONGUEUR DU CODE OU DU NOM : de 4 à 10 caractères AU HASARD, après le préfixe (comme Mikhmon). Un préfixe de 2 + 8 = codes de 10 caractères (valeur de départ). L'écran affiche « Code final : 2 + 8 = 10 caractères ».
    - PRÉFIXE : libre (lettres et chiffres, 2 à 8 caractères, mis en majuscules). Plus de liste de revendeurs. Une phrase s'affiche pendant la saisie :
        « ✔ Ce préfixe correspond au revendeur Nina (préfixe 26) : ses ventes lui seront attribuées. »   ou
        « Aucun revendeur ne correspond à « 99 » : ces tickets seront vendus sans revendeur (rangés dans « Autres »). »
      Seuls les 2 PREMIERS caractères reconnaissent le revendeur (« 2699 » = le revendeur 26). Seuls les revendeurs actifs rattachés à ce routeur sont reconnus.
      Le préfixe est OBLIGATOIRE (2 caractères au moins) : les 2 premiers caractères d'un code servent à attribuer la vente ; sans préfixe ils seraient au hasard et pourraient correspondre par erreur au préfixe d'un revendeur.
    - CARACTÈRES : Aléatoire abcd · ABCD · aBcD · 5ab2c34d · 5AB2C34D · 5aB2c34D (les six de Mikhmon) + « Aléatoire 1234 (chiffres) » (celui de vos codes actuels, choisi au départ).
      Les caractères ambigus (O, I, l, 0, 1) sont évités dans les jeux de lettres, pour la lisibilité.
    - PROFIL : TOUS les profils du routeur, « default » en premier, avec ou sans prix. Un profil sans prix affiche un avertissement : ses tickets utilisés seront signalés « en attente » dans les alertes, sans être comptés comme des ventes.
    - TEMPS LIMITE (rétabli) : format [wdhm] : 30m, 3h, 1d, 4w3d (30d = 30 jours, 12h = 12 heures). Vide : pas de limite. Doit être INFÉRIEUR à la validité du profil (égal : permis) :
      sinon le bouton est bloqué et un message le dit. Il est envoyé au routeur (limit-uptime), aussi pour les tickets préparés quand le routeur était injoignable.
    - PLUS DE « PROFIL CALCULÉ » : le code ne contient plus le numéro du profil (avant : préfixe + n° du profil + chiffres). Les anciens tickets restent valables ; les ventes et le stock ne changent pas
      (ils lisent les 2 premiers caractères du code et le profil enregistré sur le routeur, jamais le numéro de profil).

 2) UN SEUL UTILISATEUR (fiche du routeur > Utilisateurs > « Créer 1 utilisateur ») — champs, dans l'ordre :
    Serveur · Nom ou code · Mot de passe · Profil · Temps limite · Limite de données · Commentaire.
    - Le MOT DE PASSE est toujours affiché en clair ; la case « Identique au nom ou code » le recopie en direct (champ non modifiable tant qu'elle est cochée) ; décochée, on le saisit librement.
    - Serveur : « all » + tous les serveurs du routeur ; profil : tous les profils (« default » d'abord) ; temps limite : mêmes règles que ci-dessus.

 3) L'ASSISTANT IA PREND EN COMPTE LE TEMPS LIMITE : « 50 tickets 1J-300FCFA pour Nina, temps limite 3h » (ou « limite de temps 90 min », « temps limite 2 jours »).
    Il est retenu, vérifié (format, inférieur à la validité du profil), affiché dans le résumé (ligne « Temps limite » : « 3 h » ou « Aucun ») et envoyé au routeur. Il ne le DEMANDE pas quand la phrase n'en parle pas.
    Ses codes suivent aussi le nouveau format (préfixe du revendeur + 8 caractères). Ses exemples utilisent des profils avec prix (jamais « default »).

=== INSTALLATION
 1. cPanel > Gestionnaire de fichiers > « public_html » (le dossier qui CONTIENT wifi.douaweproshop.ci) > envoyer le zip > Extraire, en remplaçant les fichiers. .env et vos données ne sont pas touchés.
 2. Dans wifi.douaweproshop.ci/bootstrap/cache : supprimer les fichiers .php (garder .gitignore).
 3. Aucune nouvelle migration. (« Mettre à jour la base » si vous n'aviez pas installé le correctif précédent.)
 4. Vider le cache du navigateur du téléphone, ouvrir « Générer des tickets », puis essayer : préfixe 26 → la phrase doit nommer le revendeur ; temps limite « abc » → bouton bloqué.
 Nettoyage facultatif des restes d'anciennes versions : php artisan site:nettoyer (liste), puis --appliquer (déplace sans rien supprimer) ; --restaurer=DOSSIER remet tout.

=== CONSERVÉ DES VERSIONS PRÉCÉDENTES
 Alertes WhatsApp aux administrateurs d'espace, commande vocale sans mots répétés, application installable, miniatures des routeurs, envoi des lots par e-mail/WhatsApp, réparation du VPN et du cron, nettoyage des restes
 (voir les notices précédentes : tout est conservé).

=== VÉRIFICATIONS
 Suite complète sur une copie nettoyée de votre site : 1 719 tests, 0 échec. Nouveaux tests : 21 pour la génération en masse, 12 pour l'utilisateur seul, plus ceux de l'assistant (temps limite, validité, nouveau format).
 Vrai Chrome sur téléphone (copie de votre site) : phrase de reconnaissance du revendeur (« 26 » → Nina, « 2699 » → Nina, « 99ZZ » → aucun revendeur), case Attribution visible seulement pour un revendeur reconnu, temps limite invalide ou
 plus long que la validité → bouton bloqué et message, mot de passe qui suit le nom, aucun message d'erreur JavaScript.
 NON VÉRIFIÉ : la lecture réelle des serveurs hotspot (/ip/hotspot/print) et l'acceptation du temps limite par un VRAI routeur MikroTik (essayé avec un faux routeur fidèle) ; un vrai téléphone.
