Guide complet pour gérer le catalogue, les commandes et les comptes.
Le champ login accepte aussi bien un email qu'un login texte court :
| Login | Type | Mot de passe |
|---|---|---|
responsablecommercial@editions-b.com | Bakary81073! | |
sebastien | Login court | Bakary81073! |
bakary | Login court | Bakary81073! |
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_users → clients → admins.
admins + Supabase Auth requise).La barre du haut donne accès à tous les onglets de gestion.
| Onglet | Rôle |
|---|---|
| 📊 Dashboard | Vue d'ensemble : KPI, alertes, activité |
| 📦 Produits | Liste des produits (cartes, magnets, mugs…) |
| 🖼 Visuels | Bibliothèque visuelle |
| 🗂 Familles | Regroupements de produits |
| 🎨 Séries | Collections thématiques |
| 🗺 Régions | Zones géographiques |
| 🔥 Top ventes | Bestsellers par région (auto + manuel) |
| 📬 Inscriptions | Demandes de création de compte par les revendeurs |
| 📈 Stats | Indicateurs de vente |
| 📚 Catalogues | Mercuriales personnalisées |
| 💰 Grilles | Grilles tarifaires partagées |
| 👥 Comptes | Clients et sous-utilisateurs (badge orange si modifications client) |
| 🔧 Orphelins | Comptes en anomalie — détection et réparation en 1 clic NEW |
| 🟢 En ligne | Présence live des clients connectés |
| 🎪 Salon | Module Maison & Objet 2026 : inscriptions stand, dashboard live NEW |
| ⬇ Export | Sauvegarde / restauration JSON + codes EAN |
Votre point d'entrée :
Onglet 📦 Produits. Un produit = un format (ex : Carte postale 15×10).
Cliquez directement sur les cellules du tableau pour modifier en ligne. Pour une édition complète, cliquez sur ✏️.
Cochez plusieurs produits → la barre d'actions apparaît : augmenter/baisser les prix d'un pourcentage, supprimer en lot, etc.
Onglet 🖼 Visuels. Le cœur du catalogue (1100+ visuels).
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.
Attrapez la poignée ☰ à gauche d'une ligne et glissez où vous voulez. L'ordre est sauvé automatiquement.
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.
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.
CODE_REGION_SUJET.jpg. C'est géré automatiquement, ne vous en préoccupez pas.Pour chaque entité : nom, icône, position d'affichage, et bouton activer / désactiver.
| Onglet | Description | Familles actuelles |
|---|---|---|
| 🗂 Familles | Types de produits | Illustrations, Cartes postales, Magnets, Plateaux, Puzzles, Porte-clés, Décoration, Présentoirs |
| 🎨 Séries | Styles graphiques | Classique, Stripes, Pop Blue, Pop Pink, Versailles, EMU, Culture, Sport (inclut Rugby) |
| 🗺 Régions | Zones géographiques | Paris, Bretagne, Normandie, Pays Basque, Landes, Gironde, Pyrénées, Occitanie, Sud-Est, Charente, Grand Est, Corse, Espagne, Culture |
Onglet 🔥 Top ventes. Le portail calcule automatiquement les 20 visuels les plus commandés sur 30 jours, par région.
Bouton orange 📋 Commandes clients dans la barre admin → page de support (auto-rafraîchissement toutes les 30 s).
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 :
| Bouton | Action | Statut éligible |
|---|---|---|
| Tout | Coche toutes les commandes visibles (filtres statut + filtre groupe respectés) | — |
| Aucune | Décoche tout | — |
| ✓ Confirmer | Passe les commandes au statut confirmée avec qtyConfirmed = qtyAsked sur chaque ligne | Précommande, partielle |
| 🚚 Expédier | Passe les commandes au statut expédiée | Confirmée uniquement |
| 📊 CSV | Télécharge un CSV des commandes sélectionnées (ID, client, statut, date, total brut, total net, note) | Toutes |
| ⨯ Annuler | Annule les commandes (le client est notifié) | Toutes sauf déjà annulée/expédiée |
; — s'ouvre directement dans Excel/Numbers en français sans manip.Les demandes de création client apparaissent dans support.html → onglet Créations. Pour chaque demande :
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.
Une mercuriale définit ce que voit chaque client. Exemple : un musée ne voit pas les produits sportifs.
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.
ean (et notes en option), enregistrez en CSV UTF-8.Séparateur point-virgule ;, encodage UTF-8 BOM (compatible Excel français). Colonnes obligatoires :
visual_code — code du visuel (ex: 2147_PARIS_TOUR-EIFFEL)product_id — identifiant du produit (ex: cp, magnet)ean — votre EAN-13, GTIN, ou code internenotes (optionnel) — libellé court, fournisseur, etc.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.
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.
revendeur-premium), nom, description interne, remise par défaut %, position.Onglet 👥 Comptes.
Pour permettre à un nouvel utilisateur de se connecter (employé, sous-utilisateur grand compte, etc.) :
bastien), mot de passe (≥ 8 caractères), nom complet.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.
Pour limiter un client à une sélection précise de visuels (en plus du catalogue assigné) :
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.
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.
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 $$;
🛒 MODE COMMERCIAL — Vous prenez commande au nom de [Boutique X][Commande prise par [Nom commercial] le DD/MM/YYYY]Si le compte a role='commercial' dans la table admins, certains éléments sont automatiquement cachés dans admin.html :
localStorage avec expiration 2h (auto)orders.note — visible dans support.htmlDans 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.
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.
lagardere-grp). Renseignez les coordonnées de la société mère.lagardere-cdg).Quand vous ouvrez la fiche d'un client parent avec des filles, une section 🏢 Enseignes de ce groupe s'affiche avec :
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 ».
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 ».
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.
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 :
parent_client_id renseigné dans sa fiche.parent_client_id via la console — le trigger prevent_client_field_escalation bloque côté base.parent_client_id = NULL automatiquement (pas de cascade destructive).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.
list_orphan_accounts et liste tous les comptes en anomalie.| Action | Ce qu'elle fait | Cas d'usage |
|---|---|---|
| Confirmer email | Marque l'email Auth comme confirmé côté Supabase | Client dont le compte Auth existe mais email non confirmé → connexion bloquée |
| Lever ban | Supprime le bannissement du compte Auth | Compte banni suite à trop de tentatives échouées ou manipulation accidentelle |
| Relinker user_id | Répare le lien entre clients.user_id et le compte Auth existant | La FK user_id est nulle ou pointe vers un mauvais utilisateur |
| Peupler emails | Copie l'email du client dans la table client_users là où il est manquant | Sous-utilisateurs sans email dans client_users |
| Recréer compte Auth | Cré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 |
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.
Toutes les créations et réparations de comptes sont tracées dans la table account_creation_log. Pour consulter l'historique :
SELECT * FROM account_creation_log ORDER BY created_at DESC LIMIT 50;Voir à tout moment qui est connecté sur le portail, sur quelle page, depuis combien de temps. Plus historique des 7 derniers jours.
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.
Cliquez sur la pastille → l'onglet s'ouvre avec deux blocs :
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.
sessions_log au chargement.last_seen_at + current_page.ended_at est rempli (best-effort, marche pas si crash).sessions_online filtre automatiquement à last_seen < 90 s et ended_at IS NULL.cleanup_old_sessions() supprime les sessions > 7 jours (à appeler manuellement ou via pg_cron).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).
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).
beforeinstallprompt (critères Google : HTTPS, manifest valide, SW actif, etc.)beforeinstallprompt — les utilisateurs iPhone passent par « Partage → Sur l'écran d'accueil ». Documenté dans l'aide utilisateur, section 11.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.
Ouvrez salon.html sur les iPads/borne du stand. URL directe :
https://portail.editions-b.com/salon.html
Onglet 🎪 Salon dans admin.html → toute la configuration et le dashboard en un seul endroit.
Section Conditions commerciales Salon 2026 dans l'onglet. Ces conditions s'appliquent automatiquement à la 1re commande de chaque compte salon :
| Paramètre | Description |
|---|---|
| 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 paiement | Jours de paiement accordés (ex: 30 jours) |
Section Email de bienvenue. Variables disponibles dans le corps :
{{name}} — prénom ou nom de la société{{login}} — identifiant de connexion généré{{password}} — mot de passe initial{{login_url}} — URL directe vers le portail{{conditions}} — résumé des conditions salon (remise, franco, etc.){{free_creation_message}} — message sur la création sur-mesure offerte si applicableChaque 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.
Section Dashboard dans l'onglet Salon. Auto-rafraîchi toutes les 30 secondes :
salon_signupsUn 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.
Le portail se met à jour tout seul. Ni Cmd+Shift+R ni navigation privée ne sont nécessaires dans les cas normaux.
| Couche | Mécanisme | Rôle |
|---|---|---|
| 1 — Cache-Control HTTP | Fichier _headers Cloudflare | HTML, 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 SW | Service 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.json | Fichier à la racine, servi no-store | Polled toutes les 5 min, toujours frais. Permet de détecter une nouvelle version même en cas de SW inactif. |
| 4 — Multi-check | SW existant | Check au retour d'onglet (visibilitychange), au focus PWA Android. Purge panique si plus de 3 caches accumulés. |
Cas très rare (SW bloqué, cache corrompu) :
https://portail.editions-b.com/unstuck.htmlDans 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.
Ensemble des mesures de sécurité et de conformité RGPD actives sur le portail.
Quatre pages légales sont accessibles en footer sur toutes les pages client :
| Page | URL | Contenu |
|---|---|---|
| Mentions légales | /mentions-legales.html | Éditeur, hébergeur, directeur de publication |
| Politique de confidentialité | /politique-confidentialite.html | Données collectées, durées de conservation, droits RGPD |
| CGV | /cgv.html | Conditions générales de vente B2B |
| Cookies | /cookies.html | Politique cookies (localStorage, SW) |
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.
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.
Les en-têtes Content Security Policy bloquent l'injection de scripts non autorisés (protection XSS). CDN autorisés dans connect-src :
cdn.jsdelivr.net — SDK Supabase (chargé via CDN)cdnjs.cloudflare.com — bibliothèques JS tiercesrewxiypatvhyauffvpyd.supabase.co — API SupabaseEn cas d'erreur CSP visible en console (message « Refused to connect »), contactez votre développeur pour ajouter le domaine manquant dans le fichier _headers.
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.
signup-clientVos clients revendeurs disposent des droits RGPD standard (accès, rectification, suppression). Pour traiter une demande :
_UPGRADES_PLANS_PAYANTS.md à la racine du projet — à consulter si les quotas gratuits sont atteints.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.
Tous les éléments (produits, visuels, familles, séries, régions, mercuriales) peuvent être désactivés sans être supprimés.
Bouton ✓ Actif dans chaque ligne du tableau. Cliquez : il devient ⊘ Inactif et l'élément est masqué côté client.
Bouton ↶ Annuler en haut à droite, ou raccourci Cmd+Z (Mac) / Ctrl+Z (Windows).
Onglet ⬇ Export.
Bouton Exporter tout (JSON) : télécharge un fichier de sauvegarde du catalogue. Conservez-le avant chaque grosse modification.
Bouton Importer JSON → choisir un fichier d'export. Le catalogue actuel est écrasé.
Vous pouvez générer un BDC PDF formaté pour chaque commande, utilisable en interne ou avec le fournisseur.
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.
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.
| Statut | Action admin |
|---|---|
| draft | Éditer, supprimer, envoyer |
| sent | Renvoyer, copier lien, dupliquer |
| viewed | Le client a ouvert — éventuellement relancer |
| accepted | ↪ Convertir en commande (1 clic) |
| refused | Raison consultable dans la fiche |
| expired | Re-créer un devis si besoin |
| converted | Lien vers la commande générée |
notify-quote-viewed)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.
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.
Onglet 📡 Stand Live dans admin.html. Conçu pour être projeté grand écran pendant un salon en cours (Maison & Objet, foires, événements).
Bouton Exporter en Excel dans le header du dashboard. Génère Salon_export_YYYY-MM-DD_HHMMSS.xlsx à 4 onglets :
À utiliser après un salon pour relance commerciale ou archive comptable.
Bouton Réinitialiser (rouge bordeaux). Workflow sécurisé :
RESET-SALONreset-salon-data exécute :
[RESET RGPD])order_drafts, client_users, clients, auth.userssalon_signupsrgpd_deletionsCe qui n'est PAS touché : salon_config (toggle, terms, email template restent). Tu peux préparer un autre salon immédiatement.
Quand votre développeur fait des modifications :
_deploy.cd "/Users/[votre-user]/Desktop/Bon de commande copie"npx wrangler pages deploy _deploy --project-name=editions-b-commandesFormat : NNNN_REGION_SUJET.jpg
| Préfixe | Région |
|---|---|
| 2100 | Paris |
| 2200 | Bretagne |
| 2300 | Normandie |
| 2400 | Pays Basque |
| 2500 | Landes |
| 2600 | Gironde |
| 2700 | Pyrénées |
| 2800 | Occitanie |
| 2900 | Sud-Est |
| 3000 | Charente |
| 3100 | Grand Est |
| 3200 | Corse |
| 3300 | Espagne |
| 3400 | Culture |
Le watermark « éditions B. » est appliqué automatiquement à toute nouvelle photo. Toutes les photos existantes sont déjà watermarkées.
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.
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.
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.
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é.
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.
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.
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.
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.
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.
| Function | Rôle |
|---|---|
provision_client | Création atomique compte + lien client (remplace create-user pour nouveaux comptes) |
notify-new-request | Email Resend à chaque commande / création / inscription |
signup-client | Enregistre une demande d'inscription publique (pending = true) |
lockdown-toggle | Active / désactive le kill-switch |
create-user | Crée un compte Supabase Auth (compatibilité ancienne méthode) |
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.
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).
_headers Cloudflare — HTML/JS critiques en no-cache, must-revalidate, assets versionnés en cache long (1 an, immutable)release.sh à chaque déploiement, servi no-storevisibilitychange, focus PWA, purge panique 3+ cachescdn.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