Manuel administrateur

Guide complet pour gérer le catalogue, les commandes et les comptes.

Sommaire

  1. Se connecter en admin
  2. Comprendre les onglets
  3. Dashboard
  4. Gérer les produits
  5. Gérer les visuels
  6. Familles, séries, régions
  7. 🔥 Top ventes par région
  8. Valider les commandes
  9. Mercuriales (catalogues clients)
  10. Gérer les comptes clients
  11. 🔧 Onglet Orphelins NEW
  12. 🏢 Groupes multi-enseignes
  13. 🟢 Présence en ligne
  14. 🎪 Module Salon
  15. 📄 Module Devis / Proforma NEW
  16. 📡 Stand Live — Dashboard + Export + Reset NEW
  17. 🔄 Mises à jour automatiques NEW
  18. 🔒 Sécurité & RGPD NEW
  19. 📲 Bouton Installer l'app
  20. 🚨 Kill-switch (lockdown)
  21. Activer / désactiver
  22. Annuler une action (Cmd+Z)
  23. Exporter / sauvegarder
  24. Mettre à jour le site
  25. Conventions

1. Se connecter en admin

  1. Allez sur https://portail.editions-b.com/admin.html
  2. Saisissez votre identifiant (email ou login court) et votre mot de passe.
  3. Une bordure dorée apparaît : vous êtes en mode admin.

Identifiants admin disponibles

Le champ login accepte aussi bien un email qu'un login texte court :

LoginTypeMot de passe
responsablecommercial@editions-b.comEmailBakary81073!
sebastienLogin courtBakary81073!
bakaryLogin courtBakary81073!
💡 Les trois logins sont équivalents : ils donnent accès à la même interface admin complète.

Mécanisme d'authentification

La connexion tente d'abord Supabase Auth. Si Supabase refuse (ou est indisponible), un fallback local prend le relais automatiquement — vous êtes connecté sans même le voir.

La RPC resolve_login_to_email convertit un login court (ex: sebastien) en email Supabase en cherchant dans client_usersclientsadmins.

🔒 L'accès admin est strictement réservé. Pour ajouter un nouvel administrateur, contactez votre développeur (création dans la table admins + Supabase Auth requise).

2. Comprendre les onglets

La barre du haut donne accès à tous les onglets de gestion.

OngletRôle
📊 DashboardVue d'ensemble : KPI, alertes, activité
📦 ProduitsListe des produits (cartes, magnets, mugs…)
🖼 VisuelsBibliothèque visuelle
🗂 FamillesRegroupements de produits
🎨 SériesCollections thématiques
🗺 RégionsZones géographiques
🔥 Top ventesBestsellers par région (auto + manuel)
📬 InscriptionsDemandes de création de compte par les revendeurs
📈 StatsIndicateurs de vente
📚 CataloguesMercuriales personnalisées
💰 GrillesGrilles tarifaires partagées
👥 ComptesClients et sous-utilisateurs (badge orange si modifications client)
🔧 OrphelinsComptes en anomalie — détection et réparation en 1 clic NEW
🟢 En lignePrésence live des clients connectés
🎪 SalonModule Maison & Objet 2026 : inscriptions stand, dashboard live NEW
⬇ ExportSauvegarde / restauration JSON + codes EAN

3. Dashboard

Votre point d'entrée :

4. Gérer les produits

Onglet 📦 Produits. Un produit = un format (ex : Carte postale 15×10).

Créer un produit

  1. Cliquez + Nouveau produit.
  2. Renseignez : code, nom, famille, taille, prix HT, minimum.
  3. Cliquez Enregistrer.

Édition rapide

Cliquez directement sur les cellules du tableau pour modifier en ligne. Pour une édition complète, cliquez sur ✏️.

Édition en lot

Cochez plusieurs produits → la barre d'actions apparaît : augmenter/baisser les prix d'un pourcentage, supprimer en lot, etc.

5. Gérer les visuels

Onglet 🖼 Visuels. Le cœur du catalogue (1100+ visuels).

Filtres

Ajouter / modifier une photo NEW

Cliquez ✏️ Modifier sur le visuel → la modale s'ouvre. Dans la zone dorée, glissez-déposez votre image (ou bouton 📁 Choisir un fichier). Le watermark « éditions B. » est appliqué automatiquement. Validez avec Enregistrer.

Pour agrandir une miniature dans la liste, cliquez dessus → l'image s'ouvre en grand sur fond noir, clic ailleurs ou ✕ pour fermer.

Réordonner

Attrapez la poignée à gauche d'une ligne et glissez où vous voulez. L'ordre est sauvé automatiquement.

Best-seller NEW

Attribuez le badge best-seller à un visuel depuis sa fiche (bouton Marquer best-seller) ou en sélectionnant plusieurs visuels dans la liste → barre d'actions groupées → Marquer best-seller / Retirer best-seller. Le pictogramme trophée s'affiche immédiatement côté client.

Nouveauté NEW

Dans la fiche d'un visuel, champ Nouveauté jusqu'au : date de fin d'affichage du badge. À la création d'un visuel, cette date est automatiquement fixée à +4 mois. Modifiez-la pour prolonger ou raccourcir la période. Laissez vide (ou date passée) pour désactiver le badge.

💡 Le nom de fichier suit le format CODE_REGION_SUJET.jpg. C'est géré automatiquement, ne vous en préoccupez pas.

6. Familles, séries, régions

Pour chaque entité : nom, icône, position d'affichage, et bouton activer / désactiver.

OngletDescriptionFamilles actuelles
🗂 FamillesTypes de produitsIllustrations, Cartes postales, Magnets, Plateaux, Puzzles, Porte-clés, Décoration, Présentoirs
🎨 SériesStyles graphiquesClassique, Stripes, Pop Blue, Pop Pink, Versailles, EMU, Culture, Sport (inclut Rugby)
🗺 RégionsZones géographiquesParis, Bretagne, Normandie, Pays Basque, Landes, Gironde, Pyrénées, Occitanie, Sud-Est, Charente, Grand Est, Corse, Espagne, Culture

7. 🔥 Top ventes par région NEW

Onglet 🔥 Top ventes. Le portail calcule automatiquement les 20 visuels les plus commandés sur 30 jours, par région.

  1. Choisissez une région dans le sélecteur.
  2. La liste des 20 top ventes s'affiche.
  3. Glissez-déposez (ou ↑↓) pour réordonner manuellement.
  4. Cliquez 📌 pour épingler un visuel : il restera en place malgré les recalculs auto.
  5. Cliquez 🗑 pour retirer un visuel.
  6. Bouton ↻ Recalculer pour forcer le calcul auto à partir des commandes.
💡 Le top se met à jour automatiquement à chaque nouvelle commande. Les visuels désactivés sont exclus.

8. Valider les commandes clients

Bouton orange 📋 Commandes clients dans la barre admin → page de support (auto-rafraîchissement toutes les 30 s).

  1. Cliquez sur une commande pour voir le détail.
  2. Examinez : client, lignes, total, note.
  3. Choisissez : Valider, Modifier, Refuser, ou Confirmer partiellement.
  4. Le client est notifié automatiquement.
📧 Notification email auto : à chaque nouvelle commande/création client, un email est envoyé à responsablecommercial@editions-b.com avec le récap complet, les vignettes (créations) et reply-to du client (clic « Répondre » → vous lui répondez direct). Service : Resend (3 000 mails/mois gratuits).
📦 Frais de port : si le montant net d'une commande client est entre son minimum et son franco, une participation de 15 € est ajoutée automatiquement. Modifiable par client (champ « Port € » dans la fiche, mettre à 0 pour désactiver).

⚡ Actions en lot — gagner du temps sur les vagues de commandes NEW

Une case à cocher est disponible à gauche de chaque commande dans la liste. Dès que vous cochez au moins une case, une barre d'actions bleue apparaît en haut de la liste avec :

BoutonActionStatut éligible
ToutCoche toutes les commandes visibles (filtres statut + filtre groupe respectés)
AucuneDécoche tout
✓ ConfirmerPasse les commandes au statut confirmée avec qtyConfirmed = qtyAsked sur chaque lignePrécommande, partielle
🚚 ExpédierPasse les commandes au statut expédiéeConfirmée uniquement
📊 CSVTélécharge un CSV des commandes sélectionnées (ID, client, statut, date, total brut, total net, note)Toutes
⨯ AnnulerAnnule les commandes (le client est notifié)Toutes sauf déjà annulée/expédiée
  1. Filtrez d'abord la liste si besoin (statut « Précommande » + filtre groupe par exemple).
  2. Cochez « Tout » ou cochez manuellement les commandes ciblées.
  3. Cliquez l'action voulue → confirmation popup avec le nombre exact de commandes éligibles.
  4. Toast en bas indique « X confirmée(s) · Y échec(s) ».
💡 Le CSV est en UTF-8 BOM avec séparateur ; — s'ouvre directement dans Excel/Numbers en français sans manip.
⚠ Le bulk « Confirmer » ignore les ajustements de quantité que vous auriez tapés dans le détail. Pour confirmer en gardant des reliquats, ouvrez la commande et utilisez « ◐ Partielle + reliquat » classique.

8 ter. 🎨 Suivi des créations personnalisées NEW

Les demandes de création client apparaissent dans support.html → onglet Créations. Pour chaque demande :

💡 Cycle complet : le client décrit son besoin et joint 1-2 visuels. Vous briefez les graphistes, qui développent plusieurs propositions. Vous les renvoyez au client pour qu'il choisisse. Le visuel validé est ensuite décliné sur les supports du catalogue.

8 bis. 📬 Inscriptions revendeurs NEW

Les nouveaux revendeurs peuvent s'inscrire eux-mêmes via la page inscription.html. Leurs demandes apparaissent dans l'onglet 📬 Inscriptions en attente de validation.

  1. Onglet 📬 Inscriptions → la liste des comptes en attente s'affiche.
  2. Cliquez 📝 Configurer & valider sur une demande.
  3. La modale habituelle de fiche client s'ouvre pré-remplie avec les infos saisies (login, nom, email, téléphone, ville).
  4. Complétez : profil, catalogue assigné, mercuriale, conditions commerciales (remise, franco, minimum, paiement), adresses.
  5. Cliquez Enregistrer → le compte est activé immédiatement et le revendeur peut se connecter.
💡 Si la demande n'est pas légitime, cliquez ✕ Refuser pour supprimer la demande.

9. Mercuriales (catalogues clients)

Une mercuriale définit ce que voit chaque client. Exemple : un musée ne voit pas les produits sportifs.

  1. Onglet 📚 Catalogues+ Nouvelle mercuriale.
  2. Renseignez : nom, régions, styles, familles autorisés.
  3. Définissez : prix visibles, commandes activées.
  4. Affectez la mercuriale dans la fiche client.

9 ter. 🏷 Codes-barres EAN NEW

Attribuez un code EAN à chaque référence vendue (couple visuel × produit). Les EAN sont stockés en base, jamais affichés côté client, et exportables à la demande. Section accessible depuis l'onglet ⬇ Export.

Workflow en 3 étapes

  1. Télécharger une matrice — deux options :
    • ⬇ Matrice complète : CSV pré-rempli avec toutes vos références (visuel × produit) du catalogue. Si des EAN sont déjà en base, ils sont déjà dans le fichier. Idéal pour ajouter/modifier ligne par ligne.
    • ⬇ Matrice vierge : modèle vide avec en-têtes + 2 lignes d'exemple à remplacer. Idéal si votre logiciel sort directement les EAN couplés aux références.
  2. Compléter : ouvrez le CSV avec votre logiciel ou Excel, remplissez la colonne ean (et notes en option), enregistrez en CSV UTF-8.
  3. Importer : bouton ⬆ Importer CSV. Les lignes vides sont ignorées, les lignes existantes sont mises à jour (upsert). Un compteur s'affiche en bas.

Format CSV

Séparateur point-virgule ;, encodage UTF-8 BOM (compatible Excel français). Colonnes obligatoires :

Les colonnes visual_name, region, product_name, product_size sont incluses dans la trame pour vous repérer mais ne sont pas réimportées.

Export à la demande

💡 Les EAN ne sont jamais visibles dans l'interface client (catalogue, commande, mon-compte). Ils servent uniquement pour vos exports internes.

9 bis. 💰 Grilles tarifaires partagées NEW

Une grille tarifaire est un tarif réutilisable applicable à plusieurs clients d'un coup (ex: « Standard », « Revendeur premium », « Musée »). Plus besoin de saisir les remises client par client.

Cascade de calcul (du plus prioritaire au moins)

  1. Mercuriale individuelle du client (prix custom dans sa fiche) — toujours prioritaire
  2. Grille tarifaire assignée au client :
    1. Prix d'exception sur ce produit (écrase tout le reste)
    2. Remise par famille (ex: -25 % sur les magnets)
    3. Remise par défaut de la grille (ex: -15 % sur tout)
  3. Prix catalogue standard (aucune remise)

Créer / éditer une grille

  1. Onglet 💰 Grilles+ Nouvelle grille.
  2. Onglet Général : identifiant slug (ex: revendeur-premium), nom, description interne, remise par défaut %, position.
  3. Onglet Remises famille : pour chaque famille du catalogue, saisir une remise % spécifique (vide = remise par défaut appliquée).
  4. Onglet Prix d'exception : cocher des produits + saisir un prix € unitaire qui écrase tout (pour les négos précises).
  5. Onglet 🔍 Aperçu : sélectionner un produit pour voir le prix calculé en temps réel + la règle appliquée.
  6. Cliquez 💾 Enregistrer.

Assigner à un client

  1. Onglet 👥 Comptes → ouvrez la fiche d'un client.
  2. Section Catalogue & conditions → champ Grille tarifaire.
  3. Sélectionnez la grille (ou « — Tarif catalogue (sans grille) — » pour ne rien appliquer).
  4. Enregistrez la fiche.
💡 Le client voit ses prix appliqués mais jamais le nom de la grille — c'est un outil purement interne. Pour partager le tarif avec un client, utilisez l'onglet 📚 Catalogues et la mercuriale visuels.

Dupliquer / supprimer

⚠ La mercuriale individuelle d'un client (prix saisis directement dans sa fiche) reste toujours prioritaire sur la grille. Utile pour les négos ad hoc d'un client unique sans toucher à la grille partagée.

10. Gérer les comptes clients

Onglet 👥 Comptes.

Créer un client

  1. Cliquez + Nouveau client.
  2. Renseignez : login, nom commercial, contact, email, profil.
  3. Définissez : remise, franco, minimum, délai de paiement.
  4. Choisissez la mercuriale.

Créer un compte de connexion NEW

Pour permettre à un nouvel utilisateur de se connecter (employé, sous-utilisateur grand compte, etc.) :

  1. Onglet 👥 Comptes → bouton doré 🔐 Créer un compte de connexion.
  2. Renseignez : login (ex: bastien), mot de passe (≥ 8 caractères), nom complet.
  3. Sélectionnez le client business auquel rattacher ce compte.
  4. Choisissez le rôle : Admin, Acheteur ou Lecture seule.
  5. Cliquez Créer le compte — l'utilisateur peut se connecter immédiatement.
💡 La création est entièrement automatique : compte d'authentification Supabase + liaison à la fiche client en un seul clic.

Sous-utilisateurs (grands comptes)

Pour les grands comptes (ex: Galeries Lafayette), créez plusieurs comptes de connexion rattachés au même client business avec des rôles différents.

Mercuriale visuels — restreindre les visuels d'un client NEW

Pour limiter un client à une sélection précise de visuels (en plus du catalogue assigné) :

  1. Ouvrez la fiche client (✏️ Modifier).
  2. Section 🖼 Visuels autorisés → cochez Restreindre à une sélection de visuels.
  3. Filtrez par recherche (code, nom, ville) ou par région, puis cochez les visuels souhaités.
  4. Boutons Cocher visibles / Décocher visibles pour cocher tous ceux du filtre courant.
  5. Compteur en temps réel : « X visuels sélectionnés ».
  6. Enregistrez la fiche.
💡 Si la mercuriale visuels est vide, le client voit tous les visuels de son catalogue normal.

✏️ Modifications client (auto-service) NEW

Le client peut désormais modifier lui-même ses informations depuis sa page ⚙ Mon compte (lien dans le header du catalogue) :

Champs verrouillés côté client (impossibles à modifier, même via console) : login de connexion, catalogue assigné, mercuriale, remise, franco, min commande, paiement. Ces champs restent 100 % sous votre contrôle.

📍 Comment savoir qu'un client a modifié sa fiche

💡 La synchronisation est bi-directionnelle : si vous modifiez la fiche côté admin, le client voit la nouvelle valeur en rechargeant sa page Mon compte. Pas d'email envoyé — uniquement le badge admin.

⚠ Sécurité : suppression / réinitialisation NEW

10 bis. 🛒 Mode commercial — prendre commande pour un client NEW

Permet à vos commerciaux (ou à vous-même) de prendre commande au nom d'un client en RDV. Le commercial se connecte avec son propre compte, sélectionne le client, ajoute les articles et envoie la commande à sa place. Toute la traçabilité est conservée.

Créer un compte commercial

Les commerciaux ont des droits restreints (pas de gestion catalogue, pas de suppression, pas de configuration sensible). Pour créer un commercial, exécutez ce SQL dans Supabase :

DO $$
DECLARE v_user_id uuid := gen_random_uuid();
BEGIN
  INSERT INTO auth.users (id, email, encrypted_password, email_confirmed_at, raw_user_meta_data, aud, role, instance_id)
  VALUES (v_user_id, '', crypt('', gen_salt('bf')), now(), '{}'::jsonb, 'authenticated', 'authenticated', '00000000-0000-0000-0000-000000000000');
  INSERT INTO public.admins (user_id, login, name, role)
  VALUES (v_user_id, '', '', 'commercial');
END $$;

Workflow en RDV

  1. Le commercial se connecte sur le portail avec ses identifiants.
  2. Il accède à admin.html → onglet 👥 Comptes.
  3. Trouve le client (recherche par nom/ville) → bouton doré 🛒 Commande.
  4. Confirmation → un nouvel onglet s'ouvre sur le catalogue avec un bandeau rouge :
    🛒 MODE COMMERCIAL — Vous prenez commande au nom de [Boutique X]
  5. Il navigue le catalogue, ajoute les produits au panier, va sur Commande, valide.
  6. La commande est créée au nom du client, avec une note auto qui contient :
    [Commande prise par [Nom commercial] le DD/MM/YYYY]
  7. Bouton ↩ Quitter le mode en haut à droite du bandeau pour retourner à l'admin.

Restrictions UI selon rôle

Si le compte a role='commercial' dans la table admins, certains éléments sont automatiquement cachés dans admin.html :

💡 Vous (super-admin) gardez l'accès à TOUT. Le bouton 🛒 Commande fonctionne aussi pour vous — utile pour tester ou prendre une commande à la place d'un client par téléphone.

Sécurité

Suivi côté admin

Dans support.html, les commandes prises par les commerciaux apparaissent comme les autres, avec leur note auto qui contient le tag [Commande prise par...]. Pour filtrer, utilisez la recherche par mot-clé sur la note ou exportez la liste en CSV.

10 ter. 🏢 Groupes multi-enseignes NEW

Pour gérer les clients de type groupe (Lagardère, Fnac, etc.) qui possèdent plusieurs enseignes filles avec leur propre SIRET, leur propre adresse de livraison et facturation, mais une vue consolidée côté direction.

Modèle

Créer un groupe

  1. Créez d'abord le client parent comme un client classique (ex : « Groupe Lagardère » avec login lagardere-grp). Renseignez les coordonnées de la société mère.
  2. Créez ensuite chaque enseigne fille (ex : « Lagardère CDG T2 », login lagardere-cdg).
  3. Dans le champ Société mère / Groupe (en haut de la fiche), choisissez le parent. Enregistrez.
  4. Le badge 📁 Groupe … apparaît dans la liste des clients sur les filles. Le parent reçoit le badge 🏢 Groupe (N enseignes).

Dashboard groupe consolidé NEW

Quand vous ouvrez la fiche d'un client parent avec des filles, une section 🏢 Enseignes de ce groupe s'affiche avec :

Switch d'enseignes côté manager NEW

Le manager du groupe se connecte avec le compte parent. Sur le dashboard, le catalogue et la commande, un bandeau violet/or en haut de page lui propose un sélecteur :

Le choix d'une fille bascule tout le contexte : panier, conditions tarifaires, adresse de livraison, remise. Le badge EN COURS : nom-enseigne rappelle le contexte actif. Persisté 8 h, révocable à tout moment en revenant sur « Groupe ».

💡 Idéal pour qu'une centrale d'achats passe les commandes de chaque magasin sans avoir à se déconnecter/reconnecter.

Filtre groupe dans support.html NEW

Dans support.html, un sélecteur 🏢 Tous les groupes & clients apparaît au-dessus des filtres statut dès qu'il existe au moins un groupe en base. Choisissez un groupe → la liste se restreint au parent + ses enseignes filles. Le titre devient « Commandes — Groupe XYZ ».

Export CSV consolidé

Sur une commande appartenant à un membre de groupe, le bouton 📊 Export groupe apparaît dans le détail. Il télécharge un CSV consolidé de toutes les commandes du groupe (parent + filles) : order_id, enseigne_login, enseigne_nom, status, date, nb_lignes, nb_unites, note.

Notification email au manager du groupe NEW

Quand une enseigne fille passe une commande, le manager du groupe parent reçoit automatiquement par email un récapitulatif :

L'envoi se fait en plus du mail à vous (admin) et du mail de confirmation au client. Le manager parent ne reçoit le mail que si :

💡 Cas Lagardère : la centrale d'achats reçoit les récaps de chaque commande de chaque enseigne, sans pour autant être impliquée dans la validation.

Sécurité

10 ter. 🔧 Onglet Orphelins — réparer les comptes cassés NEW

L'onglet 🔧 Orphelins détecte automatiquement les comptes clients en anomalie (sans compte Auth Supabase, email non confirmé, liaison client_users brisée, etc.) et vous permet de les réparer en 1 clic.

Quand l'utiliser ?

Fonctionnement

  1. Cliquez sur l'onglet 🔧 Orphelins → bouton ↻ Analyser.
  2. Le portail interroge la base via la RPC list_orphan_accounts et liste tous les comptes en anomalie.
  3. Chaque ligne affiche le login client, le type de problème détecté, et un ou plusieurs boutons d'action.
  4. Cliquez sur l'action recommandée → la réparation s'effectue en temps réel.

Actions de réparation disponibles

ActionCe qu'elle faitCas d'usage
Confirmer emailMarque l'email Auth comme confirmé côté SupabaseClient dont le compte Auth existe mais email non confirmé → connexion bloquée
Lever banSupprime le bannissement du compte AuthCompte banni suite à trop de tentatives échouées ou manipulation accidentelle
Relinker user_idRépare le lien entre clients.user_id et le compte Auth existantLa FK user_id est nulle ou pointe vers un mauvais utilisateur
Peupler emailsCopie l'email du client dans la table client_users là où il est manquantSous-utilisateurs sans email dans client_users
Recréer compte AuthCrée un tout nouveau compte Supabase Auth pour ce client (login + email + mot de passe)Le compte Auth n'existe plus du tout — cas extrême
💡 Le bandeau orange ⚠ Réparer en 1 clic peut aussi apparaître directement sur les fiches client dans l'onglet Comptes. Il propose les mêmes actions sans avoir à aller dans l'onglet Orphelins.
⚠ L'action Recréer compte Auth génère un nouveau mot de passe aléatoire — pensez à le communiquer au client après la réparation. Les autres actions n'affectent pas le mot de passe existant.

Cas multi-enseignes (ex: COTOREL)

Pour les groupes multi-enseignes, un seul compte Auth peut être lié à plusieurs lignes dans client_users (une par enseigne), mais un seul clients.user_id. C'est normal : l'onglet Orphelins en tient compte et ne signalera pas d'anomalie dans ce cas.

Audit log

Toutes les créations et réparations de comptes sont tracées dans la table account_creation_log. Pour consulter l'historique :

  1. Ouvrez le SQL Editor Supabase.
  2. Exécutez : SELECT * FROM account_creation_log ORDER BY created_at DESC LIMIT 50;
  3. Chaque ligne contient : login, action, résultat (succès/erreur), horodatage, user_id concerné.
💡 Ce log est précieux pour diagnostiquer un problème de compte : vous voyez exactement ce qui s'est passé, quand, et si une réparation a déjà été tentée.

10 quater. 🟢 Présence en ligne

Voir à tout moment qui est connecté sur le portail, sur quelle page, depuis combien de temps. Plus historique des 7 derniers jours.

Indicateur permanent dans la barre

Une pastille verte 🟢 En ligne <N> est toujours visible dans la barre des onglets admin. Elle se met à jour automatiquement toutes les 30 s, même si vous êtes sur un autre onglet. Verte = au moins 1 utilisateur connecté · Grise = personne.

Onglet 🟢 En ligne

Cliquez sur la pastille → l'onglet s'ouvre avec deux blocs :

Mise à jour temps réel

Quand un client se connecte/déconnecte ou change de page, la liste se rafraîchit automatiquement sans rechargement grâce à Supabase Realtime. La pastille du badge se met aussi à jour côté barre, même si vous n'êtes pas sur l'onglet.

Comment ça marche techniquement

Confidentialité

Côté admin uniquement (RLS Supabase bloque la lecture aux clients). Aucune information personnelle au-delà du login + nom + page. Pas de tracking IP/géolocalisation. Le user-agent est stocké uniquement à des fins de debug (mobile vs desktop).

10 quinquies. 📲 Bouton « Installer l'app » côté client NEW

Vos clients peuvent installer le portail comme une vraie application sur leur téléphone ou ordinateur. Un bouton 📱 Installer l'app apparaît automatiquement en bas à droite de leur écran (sur Chrome, Edge, Android — pas iOS).

Conditions d'affichage

Que se passe-t-il après installation ?

💡 iOS Safari ne supporte pas beforeinstallprompt — les utilisateurs iPhone passent par « Partage → Sur l'écran d'accueil ». Documenté dans l'aide utilisateur, section 11.

11 bis. 🎪 Module Salon Maison & Objet 2026 NEW

Un module complet pour gérer les inscriptions de prospects au stand pendant le salon, et convertir ces contacts en revendeurs actifs sur le portail.

URL du stand

Ouvrez salon.html sur les iPads/borne du stand. URL directe :

https://portail.editions-b.com/salon.html

Accéder à l'onglet Salon dans l'admin

Onglet 🎪 Salon dans admin.html → toute la configuration et le dashboard en un seul endroit.

Activer / désactiver le module

  1. Onglet 🎪 Salon → section Module salon.
  2. Toggle ON/OFF : active ou désactive les inscriptions sur salon.html.
  3. Quand désactivé, un bandeau orange s'affiche dans l'admin pour rappeler l'état.

Configurer les conditions Salon 2026

Section Conditions commerciales Salon 2026 dans l'onglet. Ces conditions s'appliquent automatiquement à la 1re commande de chaque compte salon :

ParamètreDescription
Remise %Remise salon appliquée sur tous les articles
Franco €Seuil de livraison offerte pour la 1re commande salon
Minimum €Montant minimum de la 1re commande salon
Délai de paiementJours de paiement accordés (ex: 30 jours)
💡 Ces conditions sont valables uniquement sur la 1re commande du compte. Les commandes suivantes utilisent les conditions standard définies dans la fiche client.

Éditer l'email de bienvenue

Section Email de bienvenue. Variables disponibles dans le corps :

Workflow visiteur (côté stand)

  1. Le visiteur s'approche de l'iPad/borne sur le stand.
  2. Il saisit son email, un mot de passe, son nom et sa société sur salon.html.
  3. Le compte est créé immédiatement → il reçoit son email de bienvenue avec ses identifiants.
  4. Il peut parcourir le catalogue Premium directement depuis l'iPad.
  5. Sa 1re commande bénéficie des conditions salon configurées.

Création sur-mesure offerte

Chaque compte salon dispose d'une création sur-mesure offerte (1 par compte). Le flag free_creation_used dans la table salon_signups passe à true dès qu'elle est utilisée. Pour activer la création offerte d'un client salon, contactez-le directement.

Dashboard live

Section Dashboard dans l'onglet Salon. Auto-rafraîchi toutes les 30 secondes :

Sécurité des inscriptions salon

Plan B — gestion d'incident au salon

Un document complet de gestion d'incident est disponible dans le dossier de travail : _PLAN_B_INCIDENT_SALON.md. Il couvre : Supabase down, quota emails Resend dépassé, WiFi salon injoignable, tablette en panne. À lire avant le salon.

💡 Checklist J-1 disponible dans _PLAN_B_INCIDENT_SALON.md : statut Supabase, quota Resend, tablette chargée, cache PWA actif.

11 bis. 🔄 Mises à jour automatiques NEW

Le portail se met à jour tout seul. Ni Cmd+Shift+R ni navigation privée ne sont nécessaires dans les cas normaux.

Comment ça marche (4 couches)

CoucheMécanismeRôle
1 — Cache-Control HTTPFichier _headers CloudflareHTML, CSS, JS critiques servis avec no-cache, must-revalidate : le navigateur revalide à chaque requête. Les assets versionnés (?v=N) sont en cache long (1 an) car le numéro change à chaque déploiement.
2 — Auto-reload silencieux SWService Worker détecte l'inactivitéSi 3 s sans activité (pas de focus input, pas de modal ouverte), la nouvelle version se charge automatiquement et silencieusement. Si actif : bandeau visible avec bouton « Recharger maintenant ».
3 — version.jsonFichier à la racine, servi no-storePolled toutes les 5 min, toujours frais. Permet de détecter une nouvelle version même en cas de SW inactif.
4 — Multi-checkSW existantCheck au retour d'onglet (visibilitychange), au focus PWA Android. Purge panique si plus de 3 caches accumulés.

Ce que vous voyez dans les cas normaux

💡 Le bandeau est informatif, pas bloquant. Vous pouvez terminer ce que vous faites — le rechargement attendra l'inactivité.

Si la mise à jour ne se déclenche pas

Cas très rare (SW bloqué, cache corrompu) :

  1. Ouvrez unstuck.html depuis l'URL : https://portail.editions-b.com/unstuck.html
  2. La page désinscrit tous les Service Workers, vide tous les caches, puis redirige vers la home.
  3. En dernier recours : Cmd+Shift+R (Mac) ou Ctrl+Shift+R (Windows) pour forcer un rechargement sans cache.
⚠ En dernier recours seulement : Navigation privée (Cmd+Maj+N / Ctrl+Shift+N). Aucune de ces manœuvres n'est nécessaire dans le fonctionnement normal.

Purge nucléaire (admin)

Dans l'interface admin, le bouton ♻ Purger le cache SW (si disponible dans la barre d'outils) envoie un message à tous les clients connectés pour recharger leur Service Worker. Alternative : déployez une nouvelle version — le bump automatique du numéro de cache fait le travail.

11 ter. 🔒 Sécurité & RGPD NEW

Ensemble des mesures de sécurité et de conformité RGPD actives sur le portail.

Pages légales disponibles

Quatre pages légales sont accessibles en footer sur toutes les pages client :

PageURLContenu
Mentions légales/mentions-legales.htmlÉditeur, hébergeur, directeur de publication
Politique de confidentialité/politique-confidentialite.htmlDonnées collectées, durées de conservation, droits RGPD
CGV/cgv.htmlConditions générales de vente B2B
Cookies/cookies.htmlPolitique cookies (localStorage, SW)

Consentement RGPD

Le formulaire d'inscription salon (salon.html) et le formulaire public (inscription.html) incluent une case de consentement RGPD obligatoire avant envoi. Sans consentement coché, l'inscription est bloquée.

Authentification admin — Supabase Auth + fallback local

Le mot de passe admin a été retiré de data.js. L'accès admin utilise Supabase Auth en priorité, avec un fallback local sécurisé si Supabase est indisponible ou refuse. Aucun mot de passe en clair exposé. Voir la section Connexion pour les 3 logins disponibles.

CSP Headers actifs (mis à jour v153)

Les en-têtes Content Security Policy bloquent l'injection de scripts non autorisés (protection XSS). CDN autorisés dans connect-src :

En cas d'erreur CSP visible en console (message « Refused to connect »), contactez votre développeur pour ajouter le domaine manquant dans le fichier _headers.

Cache-Control HTTP (Cloudflare, v155)

Toutes les pages HTML, le manifest et le Service Worker sont servis avec no-cache, must-revalidate : le navigateur revalide à chaque requête sans jamais servir une version périmée. Les assets versionnés (?v=N) sont en cache long (max-age=31536000, immutable) pour la performance — le changement de numéro de version garantit la fraîcheur. Les images sont cachées 30 jours.

Rate limiting

Droits RGPD des clients

Vos clients revendeurs disposent des droits RGPD standard (accès, rectification, suppression). Pour traiter une demande :

💡 Les plans d'upgrade Supabase Pro et Resend Pro sont documentés dans _UPGRADES_PLANS_PAYANTS.md à la racine du projet — à consulter si les quotas gratuits sont atteints.

11 quater. 🚨 Kill-switch — lockdown global

En cas d'urgence (rupture générale, maintenance critique, fermeture saisonnière), vous pouvez désactiver instantanément tout accès client au portail depuis la page lockdown.html.

Activer le lockdown

  1. Ouvrez lockdown.html.
  2. Saisissez votre code secret et confirmez.
  3. Tous les clients voient immédiatement une page de maintenance — les nouvelles commandes sont bloquées.
  4. L'interface admin reste accessible normalement.

Désactiver le lockdown

  1. Retournez sur lockdown.html et saisissez votre code de récupération.
  2. Le portail redevient accessible immédiatement.
🔑 Si le code est perdu, un lien de récupération d'urgence est envoyé automatiquement. Contactez votre développeur.
💡 Le lockdown n'affecte pas l'interface admin — vous gardez accès à tout en permanence.

11. Activer / désactiver

Tous les éléments (produits, visuels, familles, séries, régions, mercuriales) peuvent être désactivés sans être supprimés.

Quand utiliser ?

Comment ?

Bouton ✓ Actif dans chaque ligne du tableau. Cliquez : il devient ⊘ Inactif et l'élément est masqué côté client.

💡 Désactivé ≠ supprimé. Vous pouvez réactiver à tout moment.

12. Annuler une action

Bouton ↶ Annuler en haut à droite, ou raccourci Cmd+Z (Mac) / Ctrl+Z (Windows).

⚠ L'undo couvre uniquement le catalogue (produits, visuels, etc.). Il ne restaure pas les modifications de comptes clients ou de mercuriales.

13. Exporter / sauvegarder

Onglet ⬇ Export.

Sauvegarde complète (JSON)

Bouton Exporter tout (JSON) : télécharge un fichier de sauvegarde du catalogue. Conservez-le avant chaque grosse modification.

Restaurer

Bouton Importer JSON → choisir un fichier d'export. Le catalogue actuel est écrasé.

Bon de commande PDF

Vous pouvez générer un BDC PDF formaté pour chaque commande, utilisable en interne ou avec le fournisseur.

📄 Module Devis / Proforma NEW

Onglet 📄 Devis dans admin.html. Permet de gérer le cycle commercial complet d'un devis professionnel : création, envoi, suivi, acceptation/refus, conversion en commande.

Créer un devis en 4 étapes

  1. Client : autocomplete sur les clients existants OU prospect libre (nom société, email, tel, ville, SIRET)
  2. Lignes : recherche catalogue avec autocomplete visuel + produit, qté et prix unitaire éditables
  3. Conditions : remise %, durée paiement, franco, validité (30 j par défaut), aperçu total HT temps réel
  4. Notes : note client (visible sur le devis) + note interne admin (jamais visible client)

Envoyer le devis

Deux options : Enregistrer en brouillon (status = draft) ou Enregistrer & Envoyer qui génère la référence DEV-2026-NNNN (séquentielle), envoie un email Resend au client avec lien partageable, et te notifie par mail.

Workflow statuts

StatutAction admin
draftÉditer, supprimer, envoyer
sentRenvoyer, copier lien, dupliquer
viewedLe client a ouvert — éventuellement relancer
accepted↪ Convertir en commande (1 clic)
refusedRaison consultable dans la fiche
expiredRe-créer un devis si besoin
convertedLien vers la commande générée

Notifications automatiques

Côté prospect (page publique)

URL devis.html?id=<slug> — pas de login requis. Layout magazine éditorial avec image visuel, lignes détaillées, conditions, note commerciale, 3 CTA (✓ Accepter · ✗ Refuser · 📞 Contacter), bouton 📥 Télécharger PDF.

Conversion en commande

Si le client accepte → bouton « ↪ Convertir en commande » apparaît en admin. En 1 clic : crée la commande dans orders, marque quotes.converted_order_id, status devis = converted. Tu retombes sur le BDC pour finaliser/expédier.

📡 Stand Live — Dashboard + Export + Reset NEW

Onglet 📡 Stand Live dans admin.html. Conçu pour être projeté grand écran pendant un salon en cours (Maison & Objet, foires, événements).

Métriques temps réel

📊 Export Excel

Bouton Exporter en Excel dans le header du dashboard. Génère Salon_export_YYYY-MM-DD_HHMMSS.xlsx à 4 onglets :

  1. Inscriptions (13 colonnes par signup)
  2. Commandes (10 colonnes + détail produits inline)
  3. Stats (KPIs globaux + Top visuels + Top commerciaux avec CA)
  4. Métadonnées (période, profil, timestamp)

À utiliser après un salon pour relance commerciale ou archive comptable.

🔄 Reset salon (double confirmation)

Bouton Réinitialiser (rouge bordeaux). Workflow sécurisé :

  1. Modal récap : « Tu vas supprimer tous les comptes salon, leurs commandes (anonymisées), paniers, inscriptions. Visuels et catalogue NON touchés. »
  2. Saisie obligatoire du mot exact RESET-SALON
  3. Edge Function reset-salon-data exécute :
    • Anonymise les commandes (conservées 10 ans pour comptabilité, tag [RESET RGPD])
    • Supprime order_drafts, client_users, clients, auth.users
    • Purge salon_signups
    • Audit log dans rgpd_deletions

Ce qui n'est PAS touché : salon_config (toggle, terms, email template restent). Tu peux préparer un autre salon immédiatement.

Workflow recommandé fin de salon

  1. Pendant le salon → suivre le dashboard, projeter en grand écran
  2. Fin du salon → cliquer 📊 Export Excel (sauvegarde leads)
  3. Relance commerciale dans les 7 jours sur les leads chauds
  4. Quand exploitation terminée → 🔄 Reset salon pour repartir vierge

14. Mettre à jour le site

Quand votre développeur fait des modifications :

  1. Le développeur prépare un dossier _deploy.
  2. Ouvrez Terminal (Cmd+Espace, tapez « Terminal »).
  3. Tapez : cd "/Users/[votre-user]/Desktop/Bon de commande copie"
  4. Puis : npx wrangler pages deploy _deploy --project-name=editions-b-commandes
  5. Attendez « Deployment complete ». L'URL stable reste editions-b-commandes.pages.dev.
💡 Le site est mis à jour en quelques minutes (selon la taille du dossier images).

15. Conventions

Codes visuels

Format : NNNN_REGION_SUJET.jpg

Préfixes par région

PréfixeRégion
2100Paris
2200Bretagne
2300Normandie
2400Pays Basque
2500Landes
2600Gironde
2700Pyrénées
2800Occitanie
2900Sud-Est
3000Charente
3100Grand Est
3200Corse
3300Espagne
3400Culture

Watermark

Le watermark « éditions B. » est appliqué automatiquement à toute nouvelle photo. Toutes les photos existantes sont déjà watermarkées.

🆕 Nouveautés mai 2026

🎪 Module Salon Maison & Objet 2026

Onglet 🎪 Salon dans admin.html. Page stand salon.html à ouvrir sur les iPads/borne. Inscriptions en temps réel, conditions salon configurables (remise, franco, minOrder, délai paiement), email de bienvenue avec variables, dashboard live (comptes/h, top visuels, par commercial), création sur-mesure offerte 1 par compte. Rate limiting anti-spam actif. Plan B incident dans _PLAN_B_INCIDENT_SALON.md.

🔧 Onglet Orphelins — réparation comptes en anomalie

L'onglet 🔧 Orphelins détecte les comptes cassés via list_orphan_accounts() et propose 5 actions de réparation : REPAIR_EMAIL_CONFIRM, REPAIR_UNBAN, REPAIR_RELINK_USER_ID, REPAIR_CLIENT_USERS_EMAIL, REPAIR_RECREATE_AUTH. Bandeau de réparation disponible aussi directement sur les fiches client. Toutes les opérations sont tracées dans account_creation_log.

🔒 Sécurité et RGPD

4 pages légales créées (mentions-legales, politique-confidentialite, cgv, cookies). Consentement RGPD obligatoire sur les formulaires salon et inscription. Rate limiting actif (5/min, 50/24h, 3/h/email). CSP headers actifs. Mot de passe admin retiré de data.js — Auth Supabase exclusive. _UPGRADES_PLANS_PAYANTS.md disponible pour les montées en charge.

🔄 Nouveau flux création de comptes (provision_client)

La création de compte passe désormais par l'Edge Function provision_client (remplace create-user pour les nouvelles créations). Transaction atomique : Auth + INSERT clients + client_users en une seule opération — plus de risque de compte partiellement créé. L'ancien create-user est conservé pour compatibilité.

📬 Onglet Inscriptions — valider les demandes signup

L'onglet Inscriptions regroupe toutes les demandes en attente (pending = true). Chaque ligne affiche nom, email, SIRET et message. Bouton Valider : active le compte et envoie un email de bienvenue via Resend. Bouton Rejeter : supprime la demande. Traitement recommandé sous 24-48 h ouvrées.

🏢 Multi-enseignes — créer parent + enfants

Dans la fiche client, un champ Groupe / parent rattache un client à un compte parent. Le parent dispose d'un dashboard consolidé (CA, commandes, statuts) de tous ses enfants. Dans l'onglet Support, filtre Groupe et export CSV par groupe disponibles. Migration 26 — colonnes parent_client_id et group_name.

🟢 Présence live — onglet dédié + pill topbar

L'onglet Présence affiche en temps réel les clients connectés via sessions_log + Supabase Realtime. Une pill verte dans la topbar indique le nombre de sessions actives. Cleanup automatique des sessions (cron migration 29). Migrations 28 + 29.

📦 Bulk actions support — valider/expédier/annuler en lot

Dans l'onglet Support, cocher plusieurs commandes puis choisir une action groupée : Valider, Expédier ou Annuler. Le bouton Exporter CSV génère un fichier des commandes sélectionnées ou du filtre actif.

📊 Export Excel/CSV/PDF par commande

Dans support.html, chaque fiche commande propose trois exports : Excel, CSV et PDF (bon de commande en paysage 8 colonnes). Bouton Modifier la commande permet de retourner dans le BDC sans perdre le panier.

📧 Edge Functions déployées

FunctionRôle
provision_clientCréation atomique compte + lien client (remplace create-user pour nouveaux comptes)
notify-new-requestEmail Resend à chaque commande / création / inscription
signup-clientEnregistre une demande d'inscription publique (pending = true)
lockdown-toggleActive / désactive le kill-switch
create-userCrée un compte Supabase Auth (compatibilité ancienne méthode)

🛠 Outil release.sh — déploiement en 1 commande

Le script release.sh à la racine automatise le cycle complet : bump de version (y compris version.json automatiquement), sync des fichiers vers _deploy/, déploiement Cloudflare. Remplace les 3 étapes manuelles par une seule commande.

🔐 Connexion admin — logins courts acceptés (v150–v153)

Le champ login accepte maintenant les logins texte courts (plus seulement les emails). Trois comptes admin disponibles : responsablecommercial@editions-b.com, sebastien, bakary — tous avec le même mot de passe. Un fallback local sécurisé prend le relais si Supabase est indisponible (avant : uniquement si Supabase down).

🔄 Anti-cache définitif — 4 couches (v155)

🛡️ CSP étendu — CDN Supabase autorisés (hotfix)

cdn.jsdelivr.net et cdnjs.cloudflare.com ajoutés dans connect-src. Le SDK Supabase est chargé depuis ces CDN — sans cette entrée, toutes les requêtes Supabase étaient silencieusement bloquées sur certains navigateurs stricts.

Dernière mise à jour : 12 mai 2026