📝 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 en 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 of /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 en $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() en 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 en 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 en 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

Inloggen op je ledengebied

Registratie
Je bent al geregistreerd, dus we zien je snel!

Abonneer u op de FRNIX-nieuwsbrief

Door u te abonneren op de FRNIX nieuwsbrief, wordt u regelmatig op de hoogte gehouden van :

Bovendien ontvang je regelmatig technische, financiële en organisatorische updates over alles wat van belang is voor de interconnectiegemeenschap.