📝 v3.5.25-alpha — Help text wizard contact : champ organisation
✅ Fix
class-wizard-schema.php— champfrnix_organization_id: help text remplacé par « Recherchez votre organisation, ou laissez vide. ».- Bump frnix-manager v3.5.24-alpha → v3.5.25-alpha (header + define FRNIX_VERSION)
- Bump
FRNIX_Wizard::VERSION= '3.5.25-alpha'
🧾 Justification
- Ancien help text invitait à cocher
frnix_is_individuel, mais ce champ est verrouillé admin-only depuis v3.5.24 → instruction obsolète. - Beaucoup de contacts FRNIX existants n'ont pas d'orga (consultants indépendants, étudiants, externes). L'absence d'orga est un état légitime, pas une exception à signaler.
🔐 v3.5.24-alpha — Fix sécurité : 4 switchers wizard contact gatés + can_write_field corrigé
🛡️ Audit sécurité (résumé v3.5.23-alpha)
- 4 switchers (frnix_is_individuel, contact_organisation, contact_votant, contact_facturation) étaient modifiables côté serveur par un membre non-admin éditant son propre profil via /mon-profil/.
- Cause : aucune clé
writable_bydans le schéma + bug danscan_write_fieldqui ne vérifiait pas le rôle réel (juste mode='membre' + valeur dans liste). - Vecteur d'attaque : aucun outil custom requis. Membre clique sur les switchers de son wizard, ajax accepte. Self-promotion Principal/Votant/Facturation/Individuel possible.
✅ Fix v3.5.24 (Option B audit)
class-wizard-schema.php— ajoutwritable_bysur 4 champs :frnix_is_individuel→['admin'](statut administratif)contact_organisation→['admin', 'org_editor'](Principal délègue)contact_votant→['admin', 'org_editor']contact_facturation→['admin', 'org_editor']
class-wizard-ajax.php::can_write_field()— réécrite pour vérifier le rôle réel :self: exige$current_uid === $entity_id(type=contact)org_editor: exigemanage_optionsOUis_principal_of_same_org()- Default fallthrough changé : true → false (plus défensif)
- Signature étendue :
can_write_field($field, $mode, $entity_id, $type='contact')
- Nouveau helper
FRNIX_Wizard_Ajax::is_principal_of_same_org($current_uid, $entity_id, $type)— vérifie metacontact_organisation='true'+ matchingfrnix_organization_id. Gère type=contact (compare orgas) et type=org (compare directement). - Bump frnix-manager v3.5.23-alpha → v3.5.24-alpha (header + define FRNIX_VERSION)
- Bump
FRNIX_Wizard::VERSION= '3.5.24-alpha'
🧾 Validation 6 cas (mental + code review)
- Membre lambda → son profil : 4 champs sensibles DENY ✅
- Principal → son propre profil :
contact_*ALLOW (org_editor match),frnix_is_individuelDENY (admin only) ✅ - Principal → autre membre de son orga :
contact_*ALLOW ✅ - Principal orga A → membre orga B :
can_editrejette au niveau entité (avant champ) ✅ - Admin → n'importe quel profil : ALLOW ✅
- Membre forge mode='membre'/'admin' via curl : DENY (vrais checks de rôle) ✅
📋 TODO reporté (non bloquant sécu)
- UX lecture-seule : afficher les switchers verrouillés en disabled + help text contextuel (« Statut administratif géré par l'équipe FRNIX », « Désigné par décision de l'organisation », etc.). Estimé : 2-3 fichiers + JS state Alpine + template switcher conditionnel. Non trivial → reporté en session ultérieure. Le fix serveur (writable_by + can_write_field) suffit pour la sécurité ; sans UX, le membre voit le switcher cliquable et l'ajax retourne silencieusement (skip + 200, pas d'erreur visible).
- Refactor mineur :
can_editecan_write_fielddupliquent partiellement la logique « is principal of same org ». Pourrait factoriser via le nouveau helperis_principal_of_same_org.
🎨 v3.5.23-alpha — UI : bouton médiathèque admin (texte court + tooltip)
✅ Fix UI mineur
render-wizard.php:455— Texte du bouton médiathèque admin (état vide) raccourci de « Choisir depuis la médiathèque FRNIX (admin) » → « Médiathèque FRNIX (admin) ».- Ajout d'un attribut
title="Choisir depuis la médiathèque FRNIX (admin)"sur le bouton (tooltip au hover) pour conserver le texte explicite en accessibilité. - Bump frnix-manager v3.5.22-alpha → v3.5.23-alpha (header + define FRNIX_VERSION)
- Bump
FRNIX_Wizard::VERSION= '3.5.23-alpha' (cache-bust assets, pour cohérence)
📎 Détails techniques
- Patch via 2 str_replace ciblés avec anchors ASCII (
@click.stop="openMediaPickerAdmin(field.key)">pour la position d'insertion ; préfixe ASCII<i class="fas fa-photo-film"></i> Choisir depuis la mpour le texte). Aucun byte UTF-8 transité via MCP, accents préservés. - Title attribute en HTML entities (
médiathèque) plutôt qu'UTF-8 brut, par sécurité transport. Render navigateur identique. - Line ending CRLF détecté et préservé pour la ligne insérée.
🛡️ v3.5.22-alpha — Bug fix : URL admin TBB FRNIX hardcodée (403)
🐞 Bug
/wp-admin/admin.php?page=frnixrenvoyait 403 pour les admins (ex : Frédéric Eppendahl, loginstudio, roleadministrator).- Diagnostic : ce n'était PAS un problème de capability. Toutes les pages admin du plugin utilisent
manage_options(cap WP standard), aucune cap custom n'existe. Frédéric a bienmanage_options. - Cause racine : URL hardcodée fausse. Le menu slug réel est
frnix-manager(cf.class-admin-page.php:1497-1505), pasfrnix. WP renvoie 403 générique pour tout slug non enregistré.
✅ Fix
render-wizard.php:178—admin.php?page=frnix→admin.php?page=frnix-manager(bouton « TBB FRNIX » du wizard frontend, admin only)frnix-mon-compte/includes/public-pages.php:432— même str_replace (origine du copy-paste vers render-wizard.php).- Vérification post-patch : grep
page=frnix(?![a-z-])sur tout le plugin → 0 occurrence restante. - Bump frnix-manager v3.5.21-alpha → v3.5.22-alpha (header + define FRNIX_VERSION)
- Bump
FRNIX_Wizard::VERSION= '3.5.22-alpha' (cache-bust assets, par cohérence même si wizard.js inchangé)
🔗 v3.5.21-alpha — Lien « Mon tableau de bord » context-aware (admin impersonation)
🐞 Bug
- Sur
/mon-profil/?admin_user_id=Xou/mon-organisation/?admin_org_id=Y(admin impersonation), le bouton « Mon tableau de bord » en haut du wizard pointait toujours vers le TBB de l'admin connecté, pas vers le TBB du contact/orga édité.
✅ Fix
render-wizard.php:155-166— logique de calcul de l'URL TBB refaite, basée sur$typee$entity_id(déjà en scope) au lieu du seul$_GET['admin_user_id']legacy.- Cas gérés : (a) admin sur contact X →
/mon-compte/?admin_user_id=X+ label « TBB de [Prénom Nom] » ; (b) admin sur orga Y →/mon-organisation/?admin_org_id=Y+ label « TBB de [titre orga] » ; (c) admin sur son propre profil → defaults inchangés ; (d) membre normal → defaults inchangés. - Bump frnix-manager v3.5.20-alpha → v3.5.21-alpha (header + define FRNIX_VERSION)
- Bump
FRNIX_Wizard::VERSION= '3.5.21-alpha' (cache-bust assets)
⚙️ Détails techniques
- Patch via
substr_replacepar anchors ASCII pour préserver le line endingCRLFdu fichier (détecté runtime). - Block remplacé : 760 bytes → 1 192 bytes (+432).
- Le legacy check
$_GET['admin_user_id']est supprimé : couvert par$entity_idqui est déjà mappé depuis ce param parclass-wizard.php:121-122. Pas de régression.
👑 v3.5.20-alpha — Sidebar HappyFiles dans wp.media (frontend wizard, admin only)
✅ Fait
class-wizard.php::enqueue_wizard_assets()— ajout d'un appel\HappyFiles\Init::run()->setup->just_enqueue()aprèswp_enqueue_media(), gaté parcurrent_user_can('edit_users')+ triple guard (class_exists / isset / method_exists).- Bump frnix-manager v3.5.19-alpha → v3.5.20-alpha (header + define FRNIX_VERSION)
- Bump
FRNIX_Wizard::VERSION= '3.5.20-alpha' (cache-bust assets)
🎯 Problème résolu
- HappyFiles ne hooke que
admin_enqueue_scripts. En frontend, sa méthodehas_media_modal()ne tourne pas → sidebar HappyFiles invisible dans le modal wp.media du wizard frontend. - Solution : utiliser le pattern HappyFiles natif
just_enqueue()(même hook que celui déjà prévu pour Beaver Builder, BeTheme, Cornerstone — voirsetup.phpconstructeur L25-31). - Avantage :
wp_localize_script('happyfilesData')+ tous les enqueues dépendants (dashicons, jquery) gérés automatiquement.
🚫 Hors-scope
- Pas touche à
wp.media({...})danswizard.js— lesframe: 'select'+state: 'library'de v3.5.19 restent. - Choix de
edit_users(et nonupload_files) pour rester cohérent avec le gate admin existant L314.
🎯 v3.5.19-alpha — HappyFiles dans wp.media picker admin
✅ Fait
wizard.js—openMediaPickerAdmin(): ajout deframe: 'select'+state: 'library'dans l'objetwp.media({...})pour activer la sidebar HappyFiles dans le modal admin.- Bump frnix-manager v3.5.18-alpha → v3.5.19-alpha (header + define FRNIX_VERSION)
- Bump
FRNIX_Wizard::VERSION= '3.5.19-alpha' (cache-bust assets wizard.js)
🎯 Problème résolu
- Avant :
library: { type: 'image' }seul désactivait les intégrations tierces → sidebar HappyFiles invisible → impossible de retrouver un logo parmi 2000+ médias. - Après : le state
libraryexplicite réactive les onglets HappyFiles dans le picker.
⚠️ Si le fix ne suffit pas (test à faire en local)
- Fallback documenté : retirer entièrement
libraryde l'objet et filtrer aprèsframe.open()viaframe.state().get('library').props.set({type:'image'}).
📦 v3.5.18-alpha — Wizard contact : last_name required (PROD)
✅ Fait
- schema_contact() : champ
last_namepasse enrequired = true - Help text reformulé : Pour un contact de type service, utilisez par exemple first_name='Service' et last_name='Facturation'.
- Bump frnix-manager v3.5.17-alpha → v3.5.18-alpha (header + define FRNIX_VERSION)
- Bump
FRNIX_Wizard::VERSION= '3.5.18-alpha' (cache-bust assets wizard.js / wizard.css)
⚠️ Écart documenté (TODO refonte registrations)
class-pending-registrations.php:805—if (empty($first_name) && empty($last_name))laisse passerlast_namevide sifirst_nameprésent. Concerne le formulaire public d'inscription, pas le wizard admin.- À aligner lors de la session refonte email / pending.
Session 18 avril 2026 — Wizard FRNIX v1.0.11-alpha — Sprint majeur (BIS uniquement)
Module wizard complet déployé sur BIS
- Mode admin/membre : 100% fonctionnel
- Mirroring rôles validé (5/5 scénarios)
- Étape 7 Contacts rattachés (list/attach/detach/create)
- Cycle retour orga après édition contact (save + redirect étape 7)
- Clic libre sur puces en mode admin
- Lien parent_org dans header contact
- last_name auto-fill NC pour entités morales
Fix bugs
- UTF-8 encoding, unicode escapes, autocomplete org, MIME FontAwesome, validation média legacy
À faire next
- Mode qualification pour Samuel (460 orgas)
- NON déployé sur PROD — validation BIS en cours
🗓️ Session 16 avril 2026 — frnix-manager v3.2.3 → v3.2.7
Versions déployées
- frnix-manager v3.2.3 → v3.2.7 (prod + bis)
- frnix-events-manager : inchangé v1.3.71
Corrections critiques
- Fix enable-app-passwords.php manquant sur BIS → routes REST restaurées (569 routes vs 48)
- render-unified-tables.php corrompu (handler frnix_bulk_invite avec CSS injecté) → fichier reconstruit complet
Nouvelles fonctionnalités
- Fiche orga publique : tous les contacts rattachés affichés (plus de filtre sur les rôles)
- Email sous le nom dans la fiche orga (14px) pour identifier les doublons
- Modale admin « Contacts » refaite from scratch : tableau avec avatar, P/F/V checkboxes, Contacter/Voir/Détacher, ajout contact, tri alphabétique
- Colonne « Inscrit le » triable dans tableau contacts admin
- Colonne « Créée le » triable dans tableau organisations admin
- Bouton « ← Tableau de bord FRNIX » sur toutes les pages admin
- Lien « Gestion des événements » pointe vers frnix-manager&tab=events
- Widget « Comptes à valider » ajouté sur l’onglet stats du dashboard
- Suppression page frnix-administration (add_submenu_page commenté, redirections mises à jour)
Corrections comportement
- Contact principal : requête corrigée pour lire contact_organisation=’true’ (au lieu de frnix_role_principal=’1′)
- Notifications rôles P/F/V : désactivées quand modification par admin, actives quand modification par membre orga
- Nouvelles orgas créées via « Comptes à valider » : catégorie non_membre par défaut + jamais masquées
- Anti-doublon création orga : bouton désactivé immédiatement au clic
- Redirections frnix-administration remplacées par frnix-organisations dans tous les fichiers
- Orgas sans catégorie en base : 33 mises à jour → non_membre
- Alan Chollet IELO : entrée pending #649 résolue (déjà rattaché à org)
- Hook updated_user_meta : nettoyage auto des pending quand frnix_organization_id est mis à jour
- Scan wp_user : rattachement auto des users dont le domaine email correspond à une orga existante
- Inscription événement : fallback domaine email pour déterminer statut membre
- Filtre get_pending() : exclut les emails déjà rattachés à une organisation
- 9 organisations masquées (_frnix_hidden) démasquées (dont doublons AIRBUS, Etherlinx)
Fichiers modifiés
- frnix-manager/frnix-manager.php
- frnix-manager/includes/modules/admin/render-unified-tables.php
- frnix-manager/includes/modules/admin/class-admin-page.php
- frnix-manager/includes/modules/admin/class-dashboard-entries.php
- frnix-manager/includes/modules/admin/class-admin-administration.php
- frnix-manager/includes/modules/admin/render-inscrits.php
- frnix-manager/includes/modules/admin/render-new-contact.php
- frnix-manager/includes/modules/admin/render-new-org.php
- frnix-manager/includes/class-pending-registrations.php
- frnix-manager/includes/class-official-contact.php
- frnix-manager/frnix-mon-compte/includes/render-organisation.php
- frnix-manager/frnix-mon-compte/includes/ajax-handlers.php
- frnix-events-manager/includes/class-form-handler.php
- frnix-events-manager/includes/class-admin-page.php
- frnix-events-manager/includes/class-history-page.php
🗓️ Session 12 avril 2026 — frnix-manager v3.1.3 → v3.2.1
Versions déployées
- frnix-manager v3.1.3 → v3.2.1 (prod)
- frnix-events-manager : inchangé v1.3.71
Corrections bugs (v3.1.4 → v3.1.9)
- Emails
+tag@acceptés tels quels à l’inscription - Cycle de validation des comptes supprimé —
class-account-validation.phpvraiment déchargée (chargement résiduel dansclass-plugin.phpcommenté) - Restriction emails génériques supprimée dans
class-elementor-handler.php— tous les emails créent un compte - Fallback
+tagdansclass-magic-login.php - Bouton inline « Éditer » sous le nom supprimé dans
shortcode-dashboard.php detect_organization()econsolidate()désactivés — plus d’auto-rattachement ni de fusion automatique de comptes
Nouvelles fonctionnalités (v3.2.0 → v3.2.1)
- Onglet « Mon organisation » masqué quand aucune orga liée
- Onglet RGPD toujours visible pour tous les utilisateurs (correction condition trop restrictive)
- Comptes de test exclus de la recherche contacts admin via meta
frnix_is_test_account - Cap résultats recherche contacts porté de 10 à 20
Corrections de données
gmail.comretiré defrnix_associated_domainsde Zayo Europe — 5 users gmail détachésoutlook.com(BoumIT) ethotmail.co.uk(HOTMAIL) nettoyés — 2 users détachés- Victoria Eppendahl (ID 2572) détachée d’ARAPEDE
Prochaines étapes
- Répercuter corrections v3.2.1 sur BIS
- Email one-shot contacts principaux
- Bug responsivité single page event
- Colonne « Société déclarée » (frnix_company_name) dans tableau contacts admin
12 avril 2026 — Suppression workflow validation — création directe des comptes à l’inscription
Catégories : feature, workflow
Actions :
frnix-managerv3.1.4 → v3.1.5class-elementor-handler.php: suppression du branchementneeds_validation()/create_pending()— tous les emails pro créent désormais le compte WP directement sans passer par la file d’attente- Vidage manuel des 20 comptes pending et 2 comptes confirmed restants → validated via SQL (phpMyAdmin bis + Claude Code prod)
- Liste « En attente » vide sur bis et prod
- Déployé sur bis puis prod + purge caches LiteSpeed + OPcache
12 avril 2026 — Refonte workflow inscriptions — suppression validation comptes + acceptation emails +tag
Catégories : feature, workflow
Actions :
frnix-managerv3.1.3 → v3.1.4- Suppression du cycle de validation des comptes (cron
frnix_check_pending_accountsJ+7/J+30, suspension automatique) - Désactivation de
class-account-validation.php(déchargée du plugin principal) - Suppression du filtre
frnix_inscription_emaildansclass-email-consolidation.php— les emails +tag@ sont désormais acceptés tels quels à l’inscription, sans conversion vers l’email principal - Nettoyage automatique du cron au premier chargement post-mise à jour (via version-flush)
- Déployé sur BIS puis PROD
frnix-manager — 10/04/2026 — Fix accès pages admin cachées + lien fiche contact dashboard
Catégorie : bug-fix
Actions effectuées :
- Bug 1 (reorder_menu) : les pages cachées du sidebar (frnix-administration, frnix-account-validation, etc.) étaient exclues de
$submenulors du reorder — WordPress refusait l’accès par URL directe. Fix : re-ajout des pages cachées en fin de$resultavant$submenu['frnix-manager'] = $result. - Bug 2 (dropdown quick search) : le lien contact pointait vers
frnix-administration&search_contact=au lieu de la fiche/mon-compte/. Corrigé vershome_url('/mon-compte/?admin_user_id=' . $user->ID . '&nocache=1')—nocache=1nécessaire car LiteSpeed Cache servait la page sans exécuter le PHP.
Version : frnix-manager 3.1.3 (BIS + PROD)
frnix-manager — 09/04/2026 (suite 3) — Tableaux Contacts + Organisations — fonctionnalités avancées
Fichiers modifiés :
includes/modules/admin/render-unified-tables.php(60KB+)assets/js/pending-actions.js
Fonctionnalités livrées :
- Tableau Organisations : popover « Nb contacts » avec ronds colorés P/F/V/B/A + nom + email + cliquables
- Bouton « 🔍 Contacts » par orga : modal recherche contacts similaires avec Levenshtein
- Modal contacts similaires : contacts déjà rattachés + checkboxes P/F/V inline auto-save + Voir/Masquer + ajout manuel + création nouveau contact
- Pastilles rôle par lettre (P/F/V/B/A/?) avec couleurs
- Bouton changer catégorie orga inline (✏️ + select)
- Bouton Supprimer orga → frnix_org_hidden=1 + filtre « Orgas supprimées » + Restaurer
- Compteur Nb contacts exclut contacts masqués
- Export CSV filtré « Exporter la sélection en CSV » sur ligne filtres Contacts + Organisations
- Export sélection groupée renommé « Exporter la sélection »
- Contacts masqués exclus des recherches similaires et du popover Nb contacts
- Fiche orga dédiée class-fiche-org.php créée mais commentée (bouton Éditer → /mon-compte/?tab=organisation&org_id=)
frnix-manager — 09/04/2026 (suite) — Onglet « En attente » — fusion inscriptions + comptes WP, actions fonctionnelles
Fichiers modifiés :
includes/modules/admin/render-unified-tables.php—frnix_render_pending_view()fusionnée,wp_enqueue_scriptdéplacé dans la fonction, handlers validate/reject accountassets/js/pending-actions.js— handlersfrnix-p-validate-accountefrnix-p-reject-accountajoutés
Fonctionnalités livrées :
- Onglet « En attente » fusionne 2 sources :
wp_frnix_pending_registrations(inscriptions) + comptes WP avecfrnix_account_status IN (pending/confirmed) - Badge Source : Inscription=orange / Compte=bleu
- Valider compte →
frnix_account_status=validated→ ligne disparaît du tableau - Rejeter compte →
frnix_hidden=1→ ligne disparaît, visible dans filtre « Emails masqués » - JS
pending-actions.jschargé viawp_enqueue_scriptdansfrnix_render_pending_view()(FRNIX_PLUGIN_URL) - Filtres mutuellement exclusifs rôle/statut dans tableau Contacts
- Compteur Admins TBB : fusion WP administrators +
frnix_role_admin=1 - Samuel (ID2) + Amandine (ID351) + Philippe (ID348) :
frnix_organization_id=23761+frnix_role_admin=1sur BIS
frnix-manager — 09/04/2026 — Connexion TBB → tableaux unifiés + filtres mutuellement exclusifs
Fichiers modifiés :
includes/modules/admin/class-admin-page.php— liens TBB → frnix-contacts/frnix-organisations, compteur Admins étendu (WP + frnix_role_admin)includes/modules/admin/render-unified-tables.php— filtre role_filter=admin étendu à frnix_role_admin=1, filtres mutuellement exclusifs (role/statut auto-reset)
Fonctionnalités livrées :
- Liens TBB cliquables → tableaux unifiés : Admins/Board/Principaux/Facturation/Votants →
frnix-contacts&role_filter=.../ Actifs/Partenaires/Individuels/Non-membres →frnix-organisations&cat_filter=... - Compteur Admins TBB : fusion WP administrators +
frnix_role_admin=1(Samuel ID2, Amandine ID351, Philippe ID348 ajoutés) - Filtre
role_filter=admindans tableau Contacts : détecte WP administrator OUfrnix_role_admin=1 - Filtres mutuellement exclusifs : changer rôle reset statut et vice versa, form auto-submit
Notes BIS :
- Samuel (ID2), Amandine (ID351) :
frnix_organization_id=23761+frnix_role_admin=1(à répliquer sur PROD) - Philippe Duby (ID348) :
frnix_role_boardvidé +frnix_role_admin=1(à répliquer sur PROD)
frnix-manager — 08/04/2026 (suite 2) — Tableau Contacts unifié — En attente, filtres, tri, masquage
Fichiers modifiés :
includes/modules/admin/render-unified-tables.php(43 134 octets) — tableau contacts completassets/js/pending-actions.js(4 511 octets) — handlers JS modals pending
Fonctionnalités livrées :
- Onglet « En attente » dans le tableau Contacts : fusion
wp_frnix_pending_registrations(inscriptions) + comptes WPfrnix_account_status IN (pending/confirmed) - Badges Source : Inscription=orange / Compte=bleu
- Actions Inscription : Valider / Rattacher / Ignorer / Rejeter (handlers
frnix_pending_*) - Actions Compte : Valider →
frnix_account_status=validated/ Rejeter →frnix_hidden=1(masqué) - Colonnes triables : Date / Nom / Email / Organisation / Source / Statut (▲▼⇅)
- Filtre « Emails masqués » : affiche tous les contacts avec
frnix_hidden=1(suspendus, rejetés, masqués manuellement) - Bouton « Supprimer » → masque (
frnix_hidden=1), bouton « Restaurer » dans filtre masqués - Filtre « Emails persos » : contacts avec domaine Gmail/Hotmail/Outlook/etc
- Badge « Associé » : contacts avec
frnix_is_alias_ofnon vide - Bouton « Rattacher à un contact » pour emails persos / « Rattacher à une orga » pour emails pro
- JS
pending-actions.jsséparé (plus de heredoc PHP→JS)
Notes :
- Rejeter un compte =
frnix_hidden=1(pas suspended) — comportement unifié avec bouton Supprimer - Tableau Organisations : bouton Éditer pointe vers
/membres/$slug(page front) - Crashes BIS évités :
gotosupprimé, JS externalisé en.jsséparé
frnix-manager — 08/04/2026 (suite) — Tableaux unifiés Contacts + Organisations — render-unified-tables.php
Fichiers créés/modifiés :
includes/modules/admin/render-unified-tables.php(nouveau, ~28KB) —frnix_render_contacts_unified()+frnix_render_organisations_unified()+ 6 handlers AJAX + JS inlineincludes/modules/admin/class-admin-page.php—render_contacts_page()remplacé par appel unifié,render_organisations_page()ajouté, submenufrnix-organisationsenregistréfrnix-manager.php—require_once render-unified-tables.phpajouté
Fonctionnalités livrées :
- Tableau Contacts unifié : colonnes ☐/Nom/Email/ORGANISATION/RÔLE(S)/Statut/Actions — 992 contacts, pagination 50/page
- Filtres : recherche texte + rôle + statut (Validé/En attente/Confirmé/Suspendu/Contacts uniques/Comptes persos) + bouton Réinitialiser
- Badges rôles colorés : Principal=#0099FF, Votant=#FF9800, Facturation=#64CA8C, Board=#9C27B0, Admin=#888
- Actions par ligne : Voir (
/mon-compte/?admin_user_id=) + Inviter + Rattacher (détection auto email perso/pro) - Rattacher email pro → modal autocomplete orga (
frnix_pending_search_org) - Rattacher email perso → modal autocomplete contact (
frnix_search_contact_for_alias) +frnix_set_alias - Barre actions groupées : Demande de mise à jour CONTACT + Exporter CSV avec page HTML intermédiaire
- Export CSV : page HTML avec textarea + bouton télécharger (séparateur ; Excel FR)
- Comptes persos rattachés (
frnix_is_alias_of) masqués par défaut, visibles via filtre Comptes persos - Tableau Organisations unifié : colonnes ☐/Logo/Nom/Catégorie/Contact principal/Email principal/Nb contacts/Actions
Notes techniques :
- Nonce dual :
frnix_pending_noncepour search org,frnix_admin_noncepour les autres handlers - Exclusion comptes test via
FRNIX_Test_Accounts::get_test_user_ids() - Garde-fou BIS sur
frnix_bulk_invite(FRNIX_BIS_NO_EMAIL_USERS) class-fiches.phpcréé puis supprimé (approche abandonnée au profit des tableaux)
nn
frnix-manager — 08/04/2026 — Module invitations — templates, UI 3 modes, anti-spam
Fichiers modifiés :
includes/class-invitation-email.php(nouveau) —FRNIX_Invitation_Email::send_invitation()includes/class-frnix-email-template.php— templateinvitation_memberenregistré dansinit_templates()includes/modules/admin/class-admin-page.php— UI invitations 3 modes + 6 handlers AJAXincludes/class-gdpr-export.php— fix double-wrap HTML (bypassFRNIX_Email_Template::send(),wp_mail()direct)wp-config.phpBIS —define('FRNIX_BIS_NO_EMAIL_USERS', true)
Fonctionnalités livrées :
- Fix rapport RGPD : HTML brut corrigé —
generate_html_report()bypassewrap()viawp_mail()direct - Template invitation éditable : slug
invitation_member, variables{{first_name}} {{last_name}} {{magic_url}} {{site_name}}, visible dans/wp-admin/admin.php?page=frnix-email-templates - Module invitations — panneau « 📨 Envoi d’invitations » dans onglet Administration avec 3 modes :
- Test sur moi : envoie à current_user, pas de garde-fou BIS
- Sélection manuelle : autocomplete avec recherche SQL sur first_name/last_name/user_email, tags supprimables
- Par catégorie : 2 axes (catégorie orga / rôle contact), count en live
- Anti-spam : exclusion systématique des contacts avec
_last_login/wfls-last-login/frnix_last_modifiednon vide - Garde-fou BIS :
FRNIX_BIS_NO_EMAIL_USERSbloque les modes 2 et 3, UI bouton disabled + label « Envoi désactivé (BIS) » - Fix Comptes test : retiré de
frnix_cleanup_submenus()qui cassait l’accès admin
Notes techniques :
frnix_account_statusfilter : pending/confirmed uniquement (validated/active/suspended exclus défensivement)- Taxonomie
member_category: nettoyage à planifier (ELEM/NL inutiles, doublons membre-actif/membre-electeur/membre-individuel) - Catégories orga hardcodées :
membre_actif/membre_partenaire/membre_individuel/non_membre(post_metafrnix_org_category)
Session 08/04/2026 — Migration rôles multi-flags + nettoyage orgas/contacts [Feature, Refactor, Migration]
Refactor modèle rôles contacts :
- Abandon de
frnix_contact_role(single value) au profit de 4 metas binairesfrnix_role_principal/votant/facturation/boardpermettant le multi-rôles - Migration des metas legacy
contact_organisation/facturation/votant(string « true ») vers les nouveaux flags - BIS : 475 principaux / 81 votants / 103 facturation / 8 board
- PROD : 451 principaux / 38 votants / 48 facturation / 8 board
- Nettoyage votants non-rattachés à une orga ACTIF (BIS: 381 / PROD: 376 supprimés)
- Nettoyage facturation rattachés à des non-membres
- Auto-marquage des single-contact orgas (actif/partenaire/individuel/non-membre)
Dashboard FRNIX patché :
$user_countsbasculé surfrnix_role_*au lieu des metas legacy- Compteur « Contacts » filtré sur frnix_member + frnix_contact (au lieu de tous les wp_users)
- Tuile « Nouveaux (30j) » supprimée — grille passée à 3 colonnes
frnix_org_categorypeuplé sur les 579 orgas PROD viafrnix_get_organization_type()- Cases
adminseboarddans les filtres dashboard aligés sur le nouveau modèle
Création/migration utilisateurs :
- 3 admins créés sur BIS avec IDs PROD via SQL direct (Striolet 2, Estrade 351, Duby 348)
- 25 contacts facturation créés sur PROD depuis
email_de_facturationdes orgas actives - 13+19 contacts créés via script externe (PROD/BIS) pour FOLIATEAM, I3D.NET, KYXAR, NETALIS, RETELIT, KYXAR, POST LUX, VERISIGN, WORLDLINE…
- HUB ONE : email avec point-virgule sanitisé incorrectement par WP — corrigé manuellement via SQL
Fusion FAIR :
- 5 doublons FAIR fusionnés vers FAIR Conseil et Services (25818) sur BIS et PROD
- FAIR Conseil basculé en actif, Raphaël Boukris (2820) rattaché comme principal/facturation/votant
UI dashboard mon-compte :
- Bouton « Éditer » inopérant corrigé :
frnixSetMode(window.frnixEditMode || 'admin') - Bandeau preview activé pour les admins (
$show_banners=true) avec retrait CSS defrnix-preview-mode - Règle CSS
.frnix-preview-mode .frnix-banner { display:none }commentée
Maintenance CSS :
- Mu-plugin
frnix-header-css-fix.php: regen complet (page/post/jet-engine) sur init si critique manquant + clear_cache hook - Cron horaire
frnix_css_regenajouté sur BIS et PROD - Carte « Maintenance CSS » + AJAX
frnix_regen_cssdans onglet Outils
TODO :
- FrnixCore_EmailManager (toujours en attente)
- 57 orgas actives sans contact (export CSV dispo :
uploads/orgas-sans-contact.csv) - Tuile « Membres » du dashboard compte des organisations, pas des users — à clarifier
Session 07/04/2026 — Templates emails + migration PROD v3.0.8 [Feature, Deploy, UI]
Feature :
class-email-templates.php: éditeur TinyMCE (Visuel), suppression tabs HTML/Aperçu, generate_preview() lit les overrides, bouton Éditer ouvre en Aperçu, bouton Aperçu ouvre version sauvegardée dans nouvel ongletclass-unsubscribe.php: nouveau module, token sécurisé bin2hex/sha256, page /desinscription/, suspension compte, footer email avec lien « Se désinscrire » (conditionnel user_id)- 1019 comptes existants migrés en statut « validated »
- Menu admin nettoyé (frnix_cleanup_submenus) sur BIS et PROD
- CSS JetEngine ID 14878 ajouté au mu-plugin frnix-header-css-fix.php
Deploy :
- Migration PROD complète : 7 modules v3.0.8 + 9 fichiers sync BIS→PROD
- Table
wp_frnix_unsubscribe_tokenscréée sur BIS et PROD - Page /desinscription/ créée sur BIS (ID 26205) et PROD (ID 26189)
TODO :
- FrnixCore_EmailManager pour centraliser wp_mail() avec user_id
- Nettoyage emails : +tag, restructuration 3 champs, suppression alias
- Navigation admin style Apple avec sous-onglets conditionnels
