📝 v3.5.25-alpha — Help text wizard contact : champ organisation

✅ Fix

  • class-wizard-schema.php — champ frnix_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_by dans le schéma + bug dans can_write_field qui 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 — ajout writable_by sur 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 : exige manage_options OU is_principal_of_same_org()
    • Default fallthrough changé : truefalse (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 meta contact_organisation='true' + matching frnix_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_individuel DENY (admin only) ✅
  • Principal → autre membre de son orga : contact_* ALLOW ✅
  • Principal orga A → membre orga B : can_edit rejette 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_edit and can_write_field dupliquent partiellement la logique « is principal of same org ». Pourrait factoriser via le nouveau helper is_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 m pour le texte). Aucun byte UTF-8 transité via MCP, accents préservés.
  • Title attribute en HTML entities (m&eacute;diath&egrave;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=frnix renvoyait 403 pour les admins (ex : Frédéric Eppendahl, login studio, role administrator).
  • 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 bien manage_options.
  • Cause racine : URL hardcodée fausse. Le menu slug réel est frnix-manager (cf. class-admin-page.php:1497-1505), pas frnix. WP renvoie 403 générique pour tout slug non enregistré.

✅ Fix

  • render-wizard.php:178admin.php?page=frnixadmin.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=X or /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 $type and $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_replace par anchors ASCII pour préserver le line ending CRLF du fichier (détecté runtime).
  • Block remplacé : 760 bytes → 1 192 bytes (+432).
  • Le legacy check $_GET['admin_user_id'] est supprimé : couvert par $entity_id qui est déjà mappé depuis ce param par class-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ès wp_enqueue_media(), gaté par current_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éthode has_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 — voir setup.php constructeur L25-31).
  • Avantage : wp_localize_script('happyfilesData') + tous les enqueues dépendants (dashicons, jquery) gérés automatiquement.

🚫 Hors-scope

  • Pas touche à wp.media({...}) dans wizard.js — les frame: 'select' + state: 'library' de v3.5.19 restent.
  • Choix de edit_users (et non upload_files) pour rester cohérent avec le gate admin existant L314.
🎯 v3.5.19-alpha — HappyFiles dans wp.media picker admin

✅ Fait

  • wizard.jsopenMediaPickerAdmin() : ajout de frame: 'select' + state: 'library' dans l'objet wp.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 library explicite réactive les onglets HappyFiles dans le picker.

⚠️ Si le fix ne suffit pas (test à faire en local)

  • Fallback documenté : retirer entièrement library de l'objet et filtrer après frame.open() via frame.state().get('library').props.set({type:'image'}).
📦 v3.5.18-alpha — Wizard contact : last_name required (PROD)

✅ Fait

  • schema_contact() : champ last_name passe en required = 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:805if (empty($first_name) && empty($last_name)) laisse passer last_name vide si first_name pré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.php vraiment déchargée (chargement résiduel dans class-plugin.php commenté)
  • Restriction emails génériques supprimée dans class-elementor-handler.php — tous les emails créent un compte
  • Fallback +tag dans class-magic-login.php
  • Bouton inline « Éditer » sous le nom supprimé dans shortcode-dashboard.php
  • detect_organization() and consolidate() 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.com retiré de frnix_associated_domains de Zayo Europe — 5 users gmail détachés
  • outlook.com (BoumIT) et hotmail.co.uk (HOTMAIL) nettoyés — 2 users détachés
  • Victoria Eppendahl (ID 2572) détachée d’ARAPEDE

Prochaines étapes

  1. Répercuter corrections v3.2.1 sur BIS
  2. Email one-shot contacts principaux
  3. Bug responsivité single page event
  4. 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-manager v3.1.4 → v3.1.5
  • class-elementor-handler.php : suppression du branchement needs_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-manager v3.1.3 → v3.1.4
  • Suppression du cycle de validation des comptes (cron frnix_check_pending_accounts J+7/J+30, suspension automatique)
  • Désactivation de class-account-validation.php (déchargée du plugin principal)
  • Suppression du filtre frnix_inscription_email dans class-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 $submenu lors du reorder — WordPress refusait l’accès par URL directe. Fix : re-ajout des pages cachées en fin de $result avant $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é vers home_url('/mon-compte/?admin_user_id=' . $user->ID . '&nocache=1')nocache=1 né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 :

  1. Tableau Organisations : popover « Nb contacts » avec ronds colorés P/F/V/B/A + nom + email + cliquables
  2. Bouton « 🔍 Contacts » par orga : modal recherche contacts similaires avec Levenshtein
  3. Modal contacts similaires : contacts déjà rattachés + checkboxes P/F/V inline auto-save + Voir/Masquer + ajout manuel + création nouveau contact
  4. Pastilles rôle par lettre (P/F/V/B/A/?) avec couleurs
  5. Bouton changer catégorie orga inline (✏️ + select)
  6. Bouton Supprimer orga → frnix_org_hidden=1 + filtre « Orgas supprimées » + Restaurer
  7. Compteur Nb contacts exclut contacts masqués
  8. Export CSV filtré « Exporter la sélection en CSV » sur ligne filtres Contacts + Organisations
  9. Export sélection groupée renommé « Exporter la sélection »
  10. Contacts masqués exclus des recherches similaires et du popover Nb contacts
  11. 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.phpfrnix_render_pending_view() fusionnée, wp_enqueue_script déplacé dans la fonction, handlers validate/reject account
  • assets/js/pending-actions.js — handlers frnix-p-validate-account and frnix-p-reject-account ajoutés

Fonctionnalités livrées :

  1. Onglet « En attente » fusionne 2 sources : wp_frnix_pending_registrations (inscriptions) + comptes WP avec frnix_account_status IN (pending/confirmed)
  2. Badge Source : Inscription=orange / Compte=bleu
  3. Valider compte → frnix_account_status=validated → ligne disparaît du tableau
  4. Rejeter compte → frnix_hidden=1 → ligne disparaît, visible dans filtre « Emails masqués »
  5. JS pending-actions.js chargé via wp_enqueue_script dans frnix_render_pending_view() (FRNIX_PLUGIN_URL)
  6. Filtres mutuellement exclusifs rôle/statut dans tableau Contacts
  7. Compteur Admins TBB : fusion WP administrators + frnix_role_admin=1
  8. Samuel (ID2) + Amandine (ID351) + Philippe (ID348) : frnix_organization_id=23761 + frnix_role_admin=1 sur 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 :

  1. Liens TBB cliquables → tableaux unifiés : Admins/Board/Principaux/Facturation/Votants → frnix-contacts&role_filter=... / Actifs/Partenaires/Individuels/Non-membres → frnix-organisations&cat_filter=...
  2. Compteur Admins TBB : fusion WP administrators + frnix_role_admin=1 (Samuel ID2, Amandine ID351, Philippe ID348 ajoutés)
  3. Filtre role_filter=admin dans tableau Contacts : détecte WP administrator OU frnix_role_admin=1
  4. 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_board vidé + 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 complet
  • assets/js/pending-actions.js (4 511 octets) — handlers JS modals pending

Fonctionnalités livrées :

  1. Onglet « En attente » dans le tableau Contacts : fusion wp_frnix_pending_registrations (inscriptions) + comptes WP frnix_account_status IN (pending/confirmed)
  2. Badges Source : Inscription=orange / Compte=bleu
  3. Actions Inscription : Valider / Rattacher / Ignorer / Rejeter (handlers frnix_pending_*)
  4. Actions Compte : Valider → frnix_account_status=validated / Rejeter → frnix_hidden=1 (masqué)
  5. Colonnes triables : Date / Nom / Email / Organisation / Source / Statut (▲▼⇅)
  6. Filtre « Emails masqués » : affiche tous les contacts avec frnix_hidden=1 (suspendus, rejetés, masqués manuellement)
  7. Bouton « Supprimer » → masque (frnix_hidden=1), bouton « Restaurer » dans filtre masqués
  8. Filtre « Emails persos » : contacts avec domaine Gmail/Hotmail/Outlook/etc
  9. Badge « Associé » : contacts avec frnix_is_alias_of non vide
  10. Bouton « Rattacher à un contact » pour emails persos / « Rattacher à une orga » pour emails pro
  11. JS pending-actions.js sé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 : goto supprimé, JS externalisé en .js sé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 inline
  • includes/modules/admin/class-admin-page.phprender_contacts_page() remplacé par appel unifié, render_organisations_page() ajouté, submenu frnix-organisations enregistré
  • frnix-manager.phprequire_once render-unified-tables.php ajouté

Fonctionnalités livrées :

  1. Tableau Contacts unifié : colonnes ☐/Nom/Email/ORGANISATION/RÔLE(S)/Statut/Actions — 992 contacts, pagination 50/page
  2. Filtres : recherche texte + rôle + statut (Validé/En attente/Confirmé/Suspendu/Contacts uniques/Comptes persos) + bouton Réinitialiser
  3. Badges rôles colorés : Principal=#0099FF, Votant=#FF9800, Facturation=#64CA8C, Board=#9C27B0, Admin=#888
  4. Actions par ligne : Voir (/mon-compte/?admin_user_id=) + Inviter + Rattacher (détection auto email perso/pro)
  5. Rattacher email pro → modal autocomplete orga (frnix_pending_search_org)
  6. Rattacher email perso → modal autocomplete contact (frnix_search_contact_for_alias) + frnix_set_alias
  7. Barre actions groupées : Demande de mise à jour CONTACT + Exporter CSV avec page HTML intermédiaire
  8. Export CSV : page HTML avec textarea + bouton télécharger (séparateur ; Excel FR)
  9. Comptes persos rattachés (frnix_is_alias_of) masqués par défaut, visibles via filtre Comptes persos
  10. Tableau Organisations unifié : colonnes ☐/Logo/Nom/Catégorie/Contact principal/Email principal/Nb contacts/Actions

Notes techniques :

  • Nonce dual : frnix_pending_nonce pour search org, frnix_admin_nonce pour 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.php créé 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 — template invitation_member enregistré dans init_templates()
  • includes/modules/admin/class-admin-page.php — UI invitations 3 modes + 6 handlers AJAX
  • includes/class-gdpr-export.php — fix double-wrap HTML (bypass FRNIX_Email_Template::send(), wp_mail() direct)
  • wp-config.php BIS — define('FRNIX_BIS_NO_EMAIL_USERS', true)

Fonctionnalités livrées :

  1. Fix rapport RGPD : HTML brut corrigé — generate_html_report() bypasse wrap() via wp_mail() direct
  2. 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
  3. 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
  4. Anti-spam : exclusion systématique des contacts avec _last_login / wfls-last-login / frnix_last_modified non vide
  5. Garde-fou BIS : FRNIX_BIS_NO_EMAIL_USERS bloque les modes 2 et 3, UI bouton disabled + label « Envoi désactivé (BIS) »
  6. Fix Comptes test : retiré de frnix_cleanup_submenus() qui cassait l’accès admin

Notes techniques :

  • frnix_account_status filter : 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_meta frnix_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 binaires frnix_role_principal/votant/facturation/board permettant 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_counts basculé sur frnix_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_category peuplé sur les 579 orgas PROD via frnix_get_organization_type()
  • Cases admins and board dans 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_facturation des 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 de frnix-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_regen ajouté sur BIS et PROD
  • Carte « Maintenance CSS » + AJAX frnix_regen_css dans 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 onglet
  • class-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_tokens créé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

Login to your member area

Registration
You're already registered, so we'll see you soon!

Subscribe to the FRNIX Newsletter

By subscribing to the FRNIX newsletter, you will be regularly informed about :

What's more, you'll receive regular technical, financial and organisational updates on everything of interest to the interconnection community.