← Retour

🥋 Changelog — Nakama

Historique des évolutions de l'application
Version 1.14
en cours

🛡️ Guide de test d'intrusion

  • Nouveau guide PENTEST.md pour auditer sa propre installation : cadre et précautions, banc d'essai, cartographie, authentification, sessions/CSRF/CORS, autorisation, données lisibles sans connexion, injections, en-têtes, configuration serveur, plan d'audit et gabarit de fiche.
  • Points relevés à la lecture du code, à confirmer sur l'instance de test (voir le fichier TODO).

📝 TODO : backlog après la mise en production

  • Nouvelle section en tête du fichier TODO, arbitrée point par point le 14/10/2026 : ce qui est réglé, ce qui attend la levée du gel, ce qui est à vérifier, ce qui est gardé et ce qui est abandonné.
  • Documentation corrigée au passage : compteurs de tests, en-tête de la version 1.12 (« en production »), limites du guide d'installation.

📘 Guide de déploiement : installation pas à pas sur un serveur neuf

  • Le guide de déploiement est réécrit : 11 étapes pour installer Nakama sur un serveur neuf, dont la création de la base de données à la main (panneau de l'hébergeur, ligne de commande ou phpMyAdmin), et un tableau de dépannage des erreurs d'installation.
  • La liste des fichiers à déposer, incomplète, est corrigée ; le guide précise aussi quoi ne pas déposer et comment gérer le fichier caché .htaccess.
  • PHP 8.0 ou plus est nécessaire (le README indiquait à tort 7.4).
  • Serveurs Red Hat (Rocky, Alma, Fedora) : paquets, droits d'écriture et SELinux ; MariaDB par socket (hôte localhost plutôt que 127.0.0.1) ; rappel de se connecter sur login.php avant setup.php.

🥋 Catégories : choisir le tapis de la première poule

  • Nouveau champ « 1ʳᵉ poule sur le tapis » (onglet Catégories, à côté de « Poule n°1 ») : la première poule de la catégorie va sur ce tapis, les suivantes sur les tapis cochés suivants, puis la distribution reboucle.
  • Vide : rien ne change (la première poule va au premier tapis coché). Le tapis choisi doit être l'un des tapis cochés pour la catégorie.
  • S'applique à la prochaine génération des poules : pour une catégorie déjà générée, utiliser « Régénérer les combats ».

🐿️ Page des crédits : logo Sciurus, page épurée

  • Le logo de Sciurus Web & Formation est affiché sur la page des crédits.
  • Retirés : le bloc technique (front-end, back-end, hébergement), la mention « Site réalisé par… » et le nom et le rôle du développeur. L'adresse de contact est conservée.

✉️ Horaires dans les courriels et sur la page des parents

  • La page d'inscription des parents affiche un encadré « La compétition » au-dessus du formulaire : date, lieu, programme et horaires par catégorie.
  • Le courriel reprend maintenant les mêmes horaires que la page d'accueil, sous la date et le lieu : programme de la journée (pesées, combats…) et planning par catégorie.
  • Rien n'est ajouté si les champs sont vides. Les courriels déjà envoyés ne changent pas ; une relance contiendra les horaires.
  • En interne, le lecteur d'horaires est partagé entre la page et les courriels (nouveau fichier home-schedule.php).

🔒 Page de confidentialité : cases à cocher « rien à signaler »

  • Dans Configuration → Vie privée / RGPD, trois cases permettent de dire « le club est seul responsable », « base légale : intérêt légitime » et « aucune donnée transmise à un tiers » : les encarts « à personnaliser » correspondants disparaissent de la page publique.
  • L'encart d'en-tête n'apparaît plus que s'il reste quelque chose à renseigner.

🏷️ Page de connexion : numéro de version à jour

  • La page de connexion affichait encore « Version 1.12 » ; elle affiche maintenant 1.14.

🐛 « N clubs sans email » : les contacts de la fiche membres comptent

  • L'accueil de l'admin annonçait des clubs « sans email de contact » alors qu'ils avaient des contacts dans leur fiche (cas des clubs importés par CSV). Le compteur reconnaît maintenant ces adresses, comme les boutons « Inviter tous » et « Relancer tous ».

🎟️ Tombola : annoncer les lots avant le tirage

  • On peut saisir les lots sans numéro de billet, puis ajouter le numéro gagnant au fur et à mesure.
  • Un interrupteur « Afficher les lots avant le tirage » (désactivé par défaut) montre les lots sans gagnant sur la page publique, avec « Tirage à venir ». Désactivé, seuls les lots tirés sont visibles.
  • Sur écran large, la présentation est à gauche et la tombola à droite ; sur téléphone, la tombola reste en haut.
  • Le titre devient « Les lots de la tombola » tant qu'aucun numéro n'est tiré.
Version 1.13
13/10/2026

📅 Page d'accueil : bouton « Ajouter à mon agenda »

  • Un bouton télécharge la compétition (titre, date, lieu, carte) pour l'ajouter à l'agenda du téléphone ou de l'ordinateur, sur la journée entière.
  • La date doit contenir l'année (« Samedi 14 mars 2026 ») ; sinon le bouton n'apparaît pas, pour ne jamais enregistrer une mauvaise date.

🔐 Mot de passe admin : plus remis à « change-moi » par un déploiement

  • Le fichier des identifiants n'est plus dans le dépôt : seul un modèle auth-config.php.dist y reste. Le vrai auth-config.php est créé sur le serveur et n'est plus écrasé.
  • Installation neuve : connexion avec admin / change-moi, puis changement du mot de passe dans Configuration.

🧭 Page d'accueil : liens rapides vers les sections

  • Des pastilles en haut de page (Tombola, Programme, Planning, Restauration, Bar) font défiler jusqu'à la section voulue.
  • Seules les sections affichées y figurent, et seulement s'il y en a au moins deux. Sur téléphone, les pastilles passent à la ligne : toutes sont visibles.

🔗 Page d'accueil : aperçu du lien et paiement mis en avant

  • Le lien partagé (WhatsApp, SMS, Facebook…) affiche le titre, la date, le lieu et une phrase d'accroche.
  • Pas d'image dans l'aperçu pour le moment (le logo est intégré à la page).
  • Les pointillés entre les produits et leurs prix ont disparu (prix toujours alignés à droite).
  • Les moyens de paiement sont dans un encadré bien visible avec une icône carte.

🍽️ Page d'accueil : des icônes devant Restauration, Bar et paiement

  • Une petite icône devant « Restauration » (couverts), devant « Bar » (verre) et devant la phrase des moyens de paiement (carte bancaire).

✨ Page d'accueil : en-tête, présentation et planning plus lisibles

  • Titre de la compétition : majuscule au premier mot (même saisi en minuscules) et taille réduite.
  • Une icône devant la date et devant le lieu ; « Voir sur la carte » devient un bouton ; « Retrouve ton combattant » tient sur une ligne sur grand écran.
  • Présentation plus aérée (filet doré, interligne plus grand).
  • Planning par jour : titres de jour soulignés, étiquette « Pesée » en petites capitales, catégories plus lisibles.
  • Heures alignées d'une ligne à l'autre et bien séparées du libellé, quelle que soit la police affichée.
  • Polices ajoutées au dépôt : le dossier fonts/ (Barlow et Barlow Condensed) est versionné dans git et à déployer avec index.php. Sans lui, la page affiche une police de secours.

📥 Import de clubs depuis un fichier CSV

  • Nouveau : onglet Clubs → « Importer des clubs (CSV) ». Une ligne par contact : Club ; Prénom ; Nom ; Email ; Téléphone. Un fichier d'exemple est fourni (import-clubs-exemple.csv).
  • Une confirmation annonce ce qui sera créé avant toute écriture. Un club déjà présent n'est jamais recréé ni modifié, seuls ses nouveaux contacts sont ajoutés ; rejouer le fichier ne change rien.
  • Les clubs et les invitations modifiés ailleurs pendant l'import sont conservés.
Version 1.12
en production

🔎 Recherche d'un athlète : « nom prénom » accepté, meilleurs résultats d'abord

  • Corrigé : taper le nom avant le prénom (« martin ana ») ne trouvait rien. Chaque mot saisi doit maintenant se retrouver dans le nom de l'athlète, dans n'importe quel ordre.
  • Amélioré : avec un nom partiel, l'enfant cherché pouvait être écarté au profit de noms qui contiennent les mêmes lettres au milieu d'un mot. Les résultats sont classés : nom complet exact, puis début de prénom ou de nom, puis le reste.

🐛 Liste des clubs : modifications conservées

  • Corrigé : pendant l'envoi d'invitations (plusieurs secondes), une modification de club faite ailleurs était effacée quand l'envoi marquait le club « invité ». Même défaut en créant un club depuis une administration restée ouverte : un « invité » posé ailleurs pouvait redevenir « non invité », et le club recevoir une seconde invitation.
  • Les clubs sont maintenant toujours écrits à partir de la liste fraîche du serveur.

🐛 Administration restée ouverte : pesées conservées

  • Corrigé : une page d'administration restée ouverte pendant la pesée remettait les anciens poids et présences au premier enregistrement. Les modifications sont maintenant fusionnées avec celles du serveur, champ par champ : un prénom corrigé ici et un poids saisi à la pesée sont tous deux conservés.
  • L'onglet Athlètes se met à jour tout seul (toutes les 5 secondes, sans gêner la saisie en cours).
  • Limite : si le même champ du même athlète est modifié des deux côtés, la saisie faite ici l'emporte.
Version 1.11
08/10/2026

🔎 Recherche d'un athlète : liste tronquée signalée

  • Corrigé : la recherche de la page de suivi n'affiche que les 30 premiers résultats, sans le dire : avec un nom partiel, on ne retrouvait pas toujours l'enfant. Une phrase « Voici les 30 premiers résultats correspondants… » apparaît maintenant quand il y en a d'autres, et seulement dans ce cas. Taper le prénom et le nom reste le plus sûr.

🐛 Liste d'un club limitée à 60 athlètes

  • Corrigé : pour un club de plus de 60 athlètes, la page du club (et la page de suivi du club) n'affichait que les 60 premiers. Un athlète tout juste validé, placé en fin de liste, restait invisible alors qu'il était bien enregistré, et le compteur ne bougeait pas. La liste d'un club est maintenant complète. Les athlètes déjà validés réapparaissent après la mise à jour.

🐛 Athlète validé qui disparaissait

  • Corrigé : un athlète ajouté par un club (par exemple une demande de parent que le prof vient de valider) n'apparaissait pas dans l'administration avant un rechargement de la page, et le premier enregistrement fait depuis l'administration pouvait l'effacer de la base. Il est maintenant conservé et s'affiche dès que vous changez d'onglet ou revenez sur la page.
  • À savoir : seuls les ajouts sont repris. Une modification faite ailleurs (poids ou présence saisis à la pesée) peut encore être écrasée depuis une page d'administration restée ouverte longtemps : rechargez-la avant de modifier la liste des athlètes.

✉️ Courriels repris

  • Corrigé : l'invitation se contredisait (« sans créer de compte », puis « cette page nécessite un mot de passe » après la signature). L'étape mot de passe n'apparaît plus que si la page en exige un, et avant la signature.
  • Corrigé : « Bonjour bonjour, » quand un contact n'a pas de prénom (désormais « Bonjour, »).
  • Corrigé : le repli « ouvrir mon logiciel de messagerie » de la fiche club donnait un lien « Club introuvable » et ignorait vos textes personnalisés. Il utilise maintenant exactement le texte de l'envoi réel. Si le message est trop long pour un lien, il est copié dans le presse-papiers.
  • Nouveau : chaque courriel part aussi en version mise en forme (HTML) : en-tête, encadré date et lieu, boutons, pied avec l'adresse de contact. Aucune image distante, aucun pixel espion.
  • Nouveau : l'invitation indique le nom, la date et le lieu de la compétition, et propose le lien « parents » tant que ces inscriptions sont ouvertes. Les réponses arrivent à votre adresse de contact.
  • Important : le lien d'inscription du club est présenté comme réservé au club. Un encadré « IMPORTANT » rappelle, juste sous ce lien, de ne jamais le transmettre aux parents (il permet de modifier et de supprimer des athlètes) et indique quel lien leur donner à la place. Ce rappel est ajouté automatiquement aux textes personnalisés qui contiennent le lien.
  • Nouveau, dans la Configuration : une carte « Aperçu des courriels » montre l'invitation ou la relance exactement comme un club la recevra, à largeur d'ordinateur ou de téléphone. Elle prend en compte vos textes même non enregistrés, n'envoie rien et ne crée aucun lien. Le bouton « M'envoyer un test » envoie le même courriel à votre adresse de contact, avec « [TEST] » dans l'objet.
  • Ton homogène : vouvoiement pour les clubs, tutoiement pour l'administrateur.
  • À savoir : les liens des courriels utilisent le nom de serveur configuré ; la page de diagnostic affiche l'adresse utilisée, à vérifier avant d'envoyer. Un texte personnalisé copié de l'ancien modèle garde sa contradiction : utilisez « Réinitialiser aux modèles par défaut ».

📱 QR code du lien « parents »

  • Nouveau : chaque club a un QR code de son lien parents, pour le communiquer facilement : un parent le scanne et arrive directement sur le formulaire d'inscription. Il s'affiche sur la page d'inscription du prof et sur la fiche du club.
  • Deux façons de le diffuser : télécharger le QR code en image (pour l'envoyer par message ou courriel), ou imprimer une affiche A4 prête à afficher au dojo, avec le nom du club, le QR code, trois étapes et le lien en clair.
  • Il suit le lien : si le lien parents est régénéré, le QR code change avec lui.
  • Confidentialité : le lien parents contient une clé d'accès. Le QR code est donc calculé dans votre navigateur, avec une petite bibliothèque hébergée sur le serveur, sans jamais envoyer le lien à un service extérieur. Cela fonctionne aussi sans connexion.
  • À déployer : un nouveau dossier vendor/, à rendre lisible par le serveur web après le dépôt. S'il ne l'est pas, la page du prof affiche « QR code indisponible », et le lien reste utilisable.
  • À confirmer : la lecture a été vérifiée avec un décodeur logiciel ; scanne l'affiche imprimée avec quelques téléphones avant de la diffuser largement.

🖼️ Favicon manquant sur plusieurs pages

  • Corrigé : les onglets « Fiche club » et « Inscription » s'affichaient sans icône. Plusieurs pages contiennent deux en-têtes (la page d'erreur et la vraie page) et l'icône n'était déclarée que dans l'un d'eux.
  • Même correction pour la connexion d'un club, le suivi par club (page normale et page « Club introuvable »), les pages d'information des parents (« Lien invalide », « Inscriptions closes ») et cette page de changelog.
  • Un test automatique vérifie désormais que chaque page déclare l'icône, pour que le défaut ne revienne pas.
  • À savoir : le navigateur garde les icônes en cache très longtemps. Si elle n'apparaît pas tout de suite, recharge la page sans cache (Ctrl + Maj + R) ou ferme et rouvre l'onglet.

🔒 Fichiers publics en 403 : permissions du serveur

  • Constaté sur le serveur réel : l'icône (favicon-32.png) répondait 403 alors que les pages s'affichaient normalement. Cause : les droits des fichiers, pas le code. Les fichiers statiques sont lus par le serveur web (www-data), qui ne pouvait pas lire un fichier déposé avec des droits trop stricts.
  • Correction côté serveur : propriétaire my_webapp, groupe www-data, dossiers en 750, fichiers en 640. À refaire après chaque dépôt de fichiers. Procédure complète dans DEPLOIEMENT.md.
  • Un contrôle de déploiement (deploy/public_assets.robot) vérifie, après une mise en ligne, que chaque ressource publique est servie et identique au dépôt.

📥 Inscriptions par les parents

  • Nouveau : chaque club a maintenant deux liens. Le lien du prof ne change pas. Un nouveau lien « parents » ouvre un simple formulaire : le parent dépose une demande d'inscription et voit « Demande envoyée ». Il ne voit aucun athlète et ne peut rien modifier ni supprimer.
  • Pourquoi : le lien du prof permet d'ajouter, modifier et supprimer tous les athlètes du club. Donné aux parents, il leur donnait les pouvoirs du prof.
  • Côté prof : sur sa page d'inscription, le lien à donner aux parents, et la liste des demandes à valider : Valider, Corriger puis valider, ou Refuser. Un nom déjà inscrit est signalé. Une demande n'apparaît dans aucune liste de compétition (pesée, poules, suivi, planning) tant qu'elle n'est pas validée.
  • Côté organisateur : un badge « n à valider » sur chaque club, le lien parents sur la fiche du club (avec un bouton pour le régénérer s'il a trop circulé), et un interrupteur pour fermer les inscriptions dans Configuration.
  • Données d'enfants : seulement le prénom, le nom et la catégorie (plus un contact facultatif du parent). Une demande traitée est supprimée avec son contact, une demande jamais traitée l'est au bout de 30 jours, et l'adresse du parent n'est jamais conservée en clair. La page de confidentialité le mentionne.
  • Protection contre les abus : champ piège pour les robots, délai minimal avant l'envoi, limite par adresse, plafond de demandes par club, doublons ignorés.
  • À faire après la mise en ligne : si les parents ont déjà le lien du prof, le régénérer (fiche du club), puis leur donner le lien parents.
  • Corrigé : un admin qui ouvrait la page d'inscription d'un club voyait « 0 demande » alors qu'il y en avait.

🔍 Suivi public — afficher ou non le classement

  • Nouveau : un réglage permet de ne plus montrer aux familles la place obtenue dans la poule (« 1er », « 2e »…) sur la page de suivi. Il se trouve dans l'onglet Configuration, carte « Page de suivi publique ». La case est cochée par défaut : rien ne change tant qu'on n'y touche pas.
  • Masqué, la page montre toujours le nom, la poule, le tapis et l'état de la poule. Le classement reste visible dans l'admin, sur la page Annonces et sur les documents imprimés.
  • Effet en direct : les pages déjà ouvertes chez les familles se mettent à jour en quelques secondes, sans rechargement.
  • Ce réglage masque l'affichage ; il ne remplace pas un contrôle d'accès aux résultats.

🏠 Page d'accueil publique — nouveau design

  • Nouveau : la page que voient les familles sur téléphone est entièrement refaite. L'en-tête est plus compact et suit la largeur du contenu, avec le nom de l'événement, la date, le lieu et le logo du club.
  • Recherche d'un combattant en tête de page : le nom saisi ouvre le suivi avec la recherche déjà lancée. C'est ce que la plupart des familles viennent faire, elle était jusqu'ici tout en bas.
  • Tombola en billets, passée avant le reste dès que des résultats existent. Restauration et bar côte à côte, en carte de menu, avec les moyens de paiement en une phrase. Remerciement aux partenaires, pied de page centré.
  • Confidentialité : les polices sont désormais hébergées sur le serveur, la page ne contacte plus Google (aucune adresse IP de visiteur transmise à un tiers). Tout ce que saisit l'organisateur est protégé contre l'injection de code, et seuls les liens http(s):// sont affichés.
  • À déployer ensemble : index.php, infos-admin.php, suivi.php et le dossier fonts/.

🗓️ Programme et planning, y compris sur plusieurs jours

  • Programme en frise : l'heure en grand, le libellé à côté. Une ligne par moment qui commence par l'heure (8h00 Pesée) suffit, même s'il n'y en a qu'une. Une phrase simple (« Pesée de 8h00 à 9h30. Début des combats à 10h. ») est convertie en frise, mais seulement si elle est sans ambiguïté : dans le doute, le texte reste tel quel, pour ne jamais afficher une heure mal lue.
  • Plusieurs jours : une ligne avec le jour seul (« Samedi 14 mars ») devient un titre, et les heures qui suivent lui appartiennent. Le titre de la section devient « Programme ».
  • Planning par catégorie : tu saisis toujours une case par catégorie, mais la page regroupe tout jour par jour, trié par heure, et réunit les catégories qui ont la même heure et le même libellé (« 18h00 Pesée → Mini-poussins, Poussins »). Les jours sont mis dans l'ordre quel que soit l'ordre de saisie, un jour par colonne sur ordinateur. Les remarques et les textes libres sont conservés sous le planning.
  • Remplace l'ancienne liste « Poussins : 18h00 Pesée, 9h30 Combats » sur une ligne.

⚙️ Administration des infos publiques

  • Nouveau champ « Date de la compétition » et nouvelle carte « Planning des catégories » (une case de texte par catégorie).
  • Un seul bouton suffit à tout enregistrer : avant, chaque carte n'enregistrait que ses propres champs, et des horaires saisis pouvaient être perdus sans aucun message. Une mention « Modifications non enregistrées » et un avertissement à la sortie de la page évitent désormais l'oubli.
  • Vérification automatique après l'enregistrement : l'admin contrôle que la page d'accueil affiche bien le planning, et prévient s'il reste une ancienne version de la page en ligne.

🧭 Navigation — Clubs passe en tête de l'admin

  • Modifié : l'onglet Clubs se place juste après Avancement dans la barre d'onglets, et la tuile Clubs devient la première de la page d'accueil de l'admin. L'ordre suit le déroulé d'une compétition : on envoie les liens d'inscription aux clubs avant que leurs athlètes soient inscrits.

🧹 Diagnostic — supprimer les fichiers oubliés depuis le navigateur

  • Nouveau : la page de diagnostic propose un bouton pour supprimer chaque fichier oublié sur le serveur (anciennes pages pesee.html et annonces.html qui contournent la protection par compte, assistant d'installation, script de migration), sans passer par SFTP. Elle empêche de supprimer l'assistant d'installation avant que la base fonctionne, ou le script de migration tant que l'ancien fichier SQLite existe, et ne peut effacer aucun autre fichier.
  • Faille corrigée : le bouton de suppression de l'ancien fichier SQLite n'avait pas de protection contre les requêtes forgées depuis un autre site. Il en a une.
  • Si le serveur ne permet pas la suppression depuis le navigateur, la page l'explique et indique de passer par SFTP.

🔒 Sécurité — fichiers de configuration et sauvegardes protégés

  • Faille corrigée : sur un serveur Nginx, les fichiers de configuration (mots de passe, jetons) et le dossier des sauvegardes SQL n'étaient pas protégés — la protection n'existait que pour Apache. Un fichier qui répond « vide » n'est pas pour autant protégé : une copie oubliée ou une panne de PHP l'aurait servi en clair.
  • Sauvegardes : sous Nginx, les fichiers du dossier backups/ (mots de passe hachés, coordonnées des membres) étaient téléchargeables si leur adresse était connue. C'est désormais bloqué, comme les dossiers de tests et les fichiers cachés.
  • Nouveau : une liste de protection unique pour Apache (.htaccess) et pour Nginx (nginx-protections.conf.example, à installer puis à inclure d'une seule ligne dans la configuration du site — le coller en vrac fait refuser le rechargement par Nginx). Un contrôle de déploiement vérifie sur le vrai site que 27 fichiers sensibles répondent bien « interdit » ou « introuvable ».
  • À faire sur chaque serveur Nginx : rien ne change tant que la protection n'est pas installée. Le pas à pas est dans DEPLOIEMENT.md.

🔒 Sécurité — la liste des athlètes n'est plus lisible sans connexion (NAK-SEC-001)

  • Faille corrigée : les prénoms, noms, clubs, sexes et poids des athlètes étaient accessibles sans connexion à quiconque connaissait l'adresse de l'API. Ils sont désormais réservés aux comptes organisateur et bénévole.
  • Modifié : les pages publiques de suivi et d'inscription utilisent une recherche minimale (prénom, nom, club, catégorie — jamais le sexe ni le poids, sauf le poids de ses propres athlètes pour un club connecté). La recherche de la page de suivi attend désormais 2 lettres et une courte pause après la frappe.
Version 1.10
01/10/2026

🧹 Pesée — retrait du bouton "✓ Valider le poids"

  • Modifié : le bouton ✓ à côté du champ de poids a disparu. Taper ailleurs sur la page ou la touche Entrée restent les deux façons de valider une saisie, et fonctionnent aussi bien sur mobile que sur ordinateur.

🎟️ Tombola — saisie des résultats et affichage public

  • Nouveau : une page pour saisir les résultats de la tombola (numéro de billet + lot gagné), réordonnable par flèches, accessible à l'admin ou à un nouveau rôle bénévole dédié "Tombola". Une carte apparaît automatiquement sur la page d'accueil publique dès qu'un lot est saisi, dans le même ordre.

🔤 Athlètes — la liste se trie désormais par nom de famille

  • Bug corrigé : la liste de l'onglet Athlètes n'était triée sur aucun critère. Elle est désormais triée par nom de famille, et affiche "NOM Prénom" — comme la page de pesée. Aucun effet sur l'import CSV.

🧭 Avancement — l'étape "Réglages de l'événement" renvoyait au mauvais onglet

  • Bug corrigé : son bouton "Ouvrir" menait à l'onglet Configuration, où le champ demandé n'a jamais existé.
  • Modifié : "Nom de la compétition" déménage dans l'onglet Configuration, plus logique pour un réglage général. L'étape de l'Avancement est scindée en deux, chacune avec son lien correctement ciblé.

🔍 Pesée — filtrer par statut de pesée (NAKSUP-31)

  • Nouveau : un menu "Tous les combattants / Pesés uniquement / Non pesés uniquement" à côté de la recherche, pour retrouver en un coup d'œil qui reste à peser.

🏆 Classement — la validation d'une poule devient obligatoire pour compter (NAKSUP-29)

  • Bug corrigé : dévalider une poule n'avait aucun effet sur le classement par club, ses points restaient comptés. La validation est désormais obligatoire pour qu'une poule compte, que ce soit dans le classement en direct, la comparaison de saisons ou l'archivage — une poule jamais validée, ou dévalidée, ne rapporte plus aucun point.

🔤 Pesée — le nom de famille s'affiche en premier

  • Modifié : sur chaque carte de la page de pesée, le nom de famille s'affiche avant le prénom. La liste se trie désormais par nom de famille plutôt que par prénom ; la recherche continue de fonctionner sur les deux.

🖨️ Poules — présélection de la catégorie affichée à l'impression

  • Modifié : entrer dans le détail d'une catégorie présélectionne automatiquement cette catégorie dans les menus d'impression et de réimpression d'une poule. Revenir à la grille des catégories remet l'état par défaut.

📊 Historique — comparer un club et les catégories entre plusieurs saisons

  • Nouveau : un sélecteur pour voir l'évolution d'un club saison par saison (points, victoires, athlètes engagés), et un tableau du nombre de combattants par catégorie et par saison. Les saisons archivées et la saison en cours sont comparées ensemble, dans l'ordre chronologique.

🧹 Logique dupliquée regroupée, vrais tests unitaires JS

  • Modifié : cinq fonctions vivaient en plusieurs copies indépendantes — justement ce qui avait causé le bug "+27kgs" de la 1.9. Elles vivent maintenant à un seul endroit, partagé entre les pages concernées. 33 nouveaux tests automatiques vérifient cette logique.

💾 Sauvegardes automatiques

  • Nouveau : une sauvegarde compressée peut désormais être écrite sur le serveur sans intervention (tâche planifiée), avec vérification après écriture et rotation automatique. L'onglet Configuration affiche l'état de la dernière sauvegarde, et un bouton permet d'en lancer une à la demande.

🔄 Pesée — un poids saisi n'est plus perdu si le réseau coupe

  • Bug corrigé : quand l'envoi d'un poids échouait (wifi instable), le poids restait affiché mais n'était jamais renvoyé, et disparaissait au retour du réseau sans aucun signal.
  • Nouveau : les poids sont mis en file d'attente et renvoyés automatiquement (badge « En attente d'envoi » sur la carte, compteur dans le bandeau). La file survit au rechargement de la page. Session expirée : le bandeau invite à recharger, et les poids sont renvoyés après la reconnexion. Poids refusé par le serveur : un message s'affiche sous le champ.

📝 Documentation — le modèle de sécurité de l'API est de nouveau exact

  • Corrigé : les commentaires qui décrivent qui peut lire et écrire quoi dans l'API étaient périmés (ils ignoraient les bénévoles par rôle, les sessions club et le jeton anti-falsification). Ils sont réécrits d'après le code. Aucun changement de comportement.

🔧 Inscription club — un club sans athlète peut de nouveau inscrire son premier athlète

  • Bug corrigé (présent depuis la 1.8) : la règle « seul l'organisateur crée un club » s'appliquait aussi aux comptes club et exigeait qu'un athlète de ce club existe déjà. Un club qui n'avait encore personne d'inscrit était refusé et ne pouvait pas commencer. La règle ne vise plus que les bénévoles.

🔐 Sécurité — coordonnées des clubs réservées à l'administrateur

  • Corrigé : la liste des clubs (coordonnées des membres, jetons d'inscription) était lisible sans connexion. Elle n'est plus accessible qu'à l'administrateur. Aucun usage légitime n'est touché. La liste des athlètes, nécessaire au suivi public, reste lisible.

🔗 Liens de club — régression de la 1.9 corrigée

  • Bug corrigé : un club dont le nom contient un « + » (ex. « Judo + Jujitsu ») avait un lien de suivi qui ne fonctionnait plus. Le lien d'un club redevient celui d'origine.

🧪 Tests — 16 nouveaux tests

  • Nouvelles vérifications automatiques : protection de la lecture des données de clubs, règle de création de club (dont le premier athlète d'un club), cohérence des liens entre navigateur et serveur. Suite API : 39 tests sur 39 passent.
Version 1.9
28/09/2026

✅ Avancement — nouvel onglet : où en est l'organisation de la compétition

  • Nouveau : un onglet « Avancement », juste après Accueil, avec une checklist en trois temps (avant la compétition, le jour J, après) et un compteur global « X / 16 étapes ». Chaque étape indique son état et renvoie à l'onglet concerné.
  • 10 étapes se calculent automatiquement à partir des données : réglages, catégories, inscriptions, vérifications de l'Accueil, pesée, poules générées, combats terminés, poules validées, médailles remises. 6 autres se cochent à la main (liens envoyés aux clubs, inscriptions clôturées, bénévoles prêts, feuilles imprimées, palmarès, résultats transmis, saison archivée), et sont remises à zéro à chaque nouvelle saison.

🥋 Tapis — le détail d'un tapis respecte la catégorie cliquée

  • Bug corrigé : un clic sur « Tapis N » d'une catégorie affichait tous les combats de ce tapis, toutes catégories confondues. Le détail n'affiche désormais que la catégorie choisie, avec un bouton « Voir toutes les catégories » pour retrouver l'affichage complet du tapis. Le filtre est conservé en changeant de tapis.

🖨️ Impression — plus de tableaux vides

  • Bug corrigé : à l'impression par club, un club n'ayant qu'un seul combattant s'imprimait avec la moitié droite du tableau entièrement vide. Il n'affiche maintenant qu'un seul groupe de colonnes.
  • Bug corrigé : à l'impression par tapis, un tapis dont tous les combats sont annulés s'imprimait avec son titre et un tableau sans aucune ligne. Il n'est plus imprimé du tout ; si plus rien n'est à imprimer, un message l'indique au lieu d'une feuille vide.

🖨️ Impression — nom de fichier PDF qui reflète le document

  • Modifié : en enregistrant une impression au format PDF, le nom de fichier proposé était toujours le même, quelle que soit la feuille. Il décrit maintenant ce qui est imprimé, suivi du nom de l'événement — par exemple « Poules - Benjamins -30kg - Compétition Amicale Kaizen », « Répartition par tapis - Toutes les catégories - … » ou « Palmarès - … ». Couvre toutes les impressions : poules, palmarès, résultats, répartitions par club et par tapis, affiche de suivi en direct.

✏️ Pesée — modifier le nom, le prénom et le club d'un athlète ; club obligatoire (NAKSUP-24)

  • Nouveau : un bouton ✏️ sur chaque carte d'athlète de la page pesée ouvre une fenêtre pour corriger son prénom, son nom et son club. Seul ce qui a changé est enregistré, le poids n'est jamais touché. Nom : mêmes règles que partout ailleurs. Club : seuls les clubs existants sont proposés, en créer un reste réservé à l'admin (appliqué aussi côté serveur).
  • Modifié : le club est désormais obligatoire — un athlète appartient forcément à un club. Exigé à l'ajout (pesée et onglet Athlètes) et à l'édition (onglet Athlètes, qui permettait d'effacer un club). Un athlète déjà en base sans club peut être régularisé depuis sa fenêtre de modification.

🗂️ Poules / Tableaux — grille de tuiles par catégorie (NAKSUP-19)

  • Modifié : l'onglet affiche désormais une grille de tuiles, une par catégorie — icône, nom, athlètes pesés et statut des poules. Un clic ouvre le détail de cette catégorie uniquement, avec un lien de retour. Remplace l'ancienne liste repliable/dépliable de toutes les catégories à la suite.

🧹 Pesée — libellé "Poids (kg) — enregistré automatiquement" retiré (NAKSUP-14)

  • Modifié : la ligne au-dessus du champ poids, sur chaque carte d'athlète, a été retirée — jugée inutile et prenant de la place. Gain de compacité surtout utile sur mobile.

📱 Signaler un bug — page dédiée sur mobile (NAKSUP-22, NAKSUP-8)

  • Bug corrigé : le formulaire YouTrack en fenêtre popup s'adaptait mal aux petits écrans.
  • Nouveau : report-bug.php, page dédiée avec le même formulaire en mode intégré. Sur ordinateur, le bouton flottant habituel reste inchangé ; sur mobile, il est remplacé par un petit bouton qui mène vers cette page.

⚖️ Pesée — avertissement hors catégorie manquant à l'ajout d'un athlète

  • Bug corrigé : le contrôle poids/catégorie existait pour peser un athlète déjà présent, mais n'était jamais déclenché à l'ajout d'un nouvel athlète — n'importe quel poids pouvait être enregistré sans avertissement. La même fenêtre (avec suggestion automatique) s'applique désormais aussi à l'ajout.

🔤 Nom de famille — majuscule forcée, chiffres et symboles interdits (NAKSUP-20)

  • Nouveau : le nom de famille n'accepte plus que lettres (accents inclus), apostrophe, tiret et espace — toujours enregistré en MAJUSCULES. Couvre les 6 endroits où un nom se saisit (ajout/édition, imports CSV et texte collé, pesée, inscription club), plus un filet de sécurité côté serveur pour un appel API direct.

⚖️ Pesée — fiabilise l'avertissement hors catégorie (NAKSUP-15, NAKSUP-16)

  • Bug corrigé : les liens de pesée par catégorie traitaient + et - de façon identique — "Poussinets -27kgs" et "Poussinets +27kgs" généraient le même lien, verrouillant la mauvaise catégorie. Corrigé dans pesee.php, app.html (source du lien) et club.php.
  • Bug corrigé : deux vérifications de poids pouvaient se déclencher simultanément pour la même saisie, ouvrant deux fenêtres d'avertissement qui se marchaient dessus. Un verrou empêche désormais ce chevauchement.
  • Modifié : la fenêtre d'avertissement propose désormais la catégorie qui correspond réellement au poids saisi, revalidée en boucle si le choix fait ne convient toujours pas.
  • Modifié : quand une catégorie correspond clairement, la fenêtre ne propose plus qu'elle seule — la liste complète ne reste proposée que si aucune ne correspond clairement.

🧑‍🤝‍🧑 Pesée — vue "Tous les combattants" (NAKSUP-10)

  • Nouveau : une tuile "Tous les combattants" apparaît en première position sur l'écran de choix de catégorie, avec son propre décompte. Affiche la liste complète, tous athlètes confondus — filtre et formulaire d'ajout restent libres, contrairement à une tuile de catégorie précise.

🔢 Pesée — poids négatif ou texte parasite acceptés (NAKSUP-12)

  • Bug corrigé : la validation du poids reposait sur parseFloat, trop permissif — un signe négatif était accepté tel quel, et du texte parasite en fin de saisie ("42*") était silencieusement ignoré plutôt que rejeté. Nouvelle validation stricte : toute la saisie doit être composée uniquement de chiffres, avec au plus une virgule ou un point décimal.

📱 Pesée — menus déroulants perturbés par l'actualisation automatique (mobile) (NAKSUP-7)

  • Bug corrigé : sur mobile, ouvrir le menu "Club" (ou "Catégorie") pendant l'ajout d'un athlète pouvait le fermer ou le perturber en pleine sélection — la page reconstruit ces menus toutes les 2 secondes, y compris pendant qu'ils sont ouverts. Chaque menu vérifie désormais s'il a le focus avant de se reconstruire.

⚖️ Pesée — poids obligatoire à l'ajout d'un athlète (NAKSUP-7)

  • Nouveau : le formulaire "Ajouter un athlète" a désormais un champ Poids, obligatoire — mêmes règles que partout ailleurs sur la page (virgule ou point acceptés, arrondi au kilo entier, saisie invalide bloquée).
  • Bug corrigé au passage : après un premier ajout réussi, le formulaire vidait la catégorie même quand elle était verrouillée par le lien d'accès à la page, empêchant tout ajout suivant.

🔍 Pesée — barre de recherche qui sort de l'écran (NAKSUP-7)

  • Modifié : la barre de recherche/filtre reste désormais fixée juste sous l'en-tête en faisant défiler la liste — filtrer fortement la liste pouvait auparavant faire remonter toute la page, sortant le champ de l'écran sur mobile en pleine saisie.

🔗 Site internet du club — lien cassé sans http(s)://

  • Bug corrigé : le site internet du club, saisi sans http:// ni https:// devant, donnait un lien cassé pointant vers une page interne à Nakama plutôt que le vrai site externe. https:// est désormais ajouté automatiquement si absent, à l'enregistrement et à l'affichage.

🔒 Bouton de déconnexion manquant pour l'admin (pesée, marque, annonces)

  • Bug corrigé : sur pesee.php, marque.php et annonces.php, le lien de déconnexion n'apparaissait que pour une session bénévole — une session admin n'avait aucun moyen de se déconnecter depuis ces trois pages.
  • Modifié : repositionné en haut à droite, cohérent avec la partie admin.
  • Bug corrigé au passage : la version bénévole chevauchait le titre sur un écran de téléphone étroit — raccourcie, le nom reste accessible au survol.
Version 1.8
26/09/2026

🖨️ Tapis — impression par club plus compacte (NAKSUP-2, NAKSUP-3)

  • Modifié : "Imprimer par club" affiche désormais 2 combattants par ligne, colonnes réduites à Nom / Prénom / Tapis — réduit fortement le nombre de pages.
  • Modifié : orientation passée en paysage pour cette impression précise. Les autres impressions restent en portrait.
  • Modifié : ligne de contexte répétée sous chaque club retirée, redondante avec l'en-tête de la page.

🧪 Jeu de données de test réel avec poids

  • Nouveau : import_test_nakama_poids.csv — les mêmes 858 athlètes réels, avec un poids plausible déjà rempli pour chacun (environ 1 sur 6 délibérément élevé, pour garantir des poules à écart notable). Nouvelle carte dédiée dans Outils de test, n'écrase rien de l'existant.

📊 Poules — tableau récapitulatif par catégorie (NAKSUP-4)

  • Nouveau : une fois les poules générées, un tableau récapitulatif affiche pour chacune son numéro, le nombre de combattants, et l'écart de poids min/max en % — mis en évidence au-delà de 10%. Repère un déséquilibre entre poules d'un coup d'œil, sans ouvrir chacune.

⚖️ Pesée — arrondi au kilo entier, poids affiché au niveau du nom (NAKSUP-5)

  • Modifié : la saisie du poids accepte toujours les décimales (virgule ou point), mais la valeur est désormais arrondie au kilo entier avant d'être enregistrée.
  • Modifié : dans l'onglet Athlètes, le badge "✓ pesé" affiche maintenant le poids réel ("✓ 42kg") directement à côté du nom, plutôt qu'une simple confirmation sans le chiffre.

🔒 Pesée — création de club réservée à l'admin (NAKSUP-6)

  • Modifié : un bénévole utilisant pesee.php ne peut plus créer un nouveau club à la volée en ajoutant un athlète — seuls les clubs déjà connus sont proposés. Appliqué aussi côté serveur, pas seulement à l'affichage. L'admin garde cette possibilité.

🐛 Pesée — saisie invalide effacée en silence

  • Bug corrigé : le champ poids (type="number") effaçait silencieusement toute saisie jugée invalide par le navigateur avant même que le code ne la voie — texte, voire une virgule décimale française, se retrouvait enregistré comme "champ vidé" sans message. Passé en texte avec clavier numérique ; message d'erreur dédié désormais affiché, rien n'est enregistré.
  • Bug corrigé (suite) : ce message partageait la bannière réseau, effacée par le rafraîchissement automatique toutes les 2 secondes — il disparaissait avant d'être lu. Déplacé dans un espace dédié, qui survit désormais aux rafraîchissements.

🐞 Signaler un bug — bouton intégré (admin et bénévoles)

  • Nouveau : bouton flottant "Signaler un bug" intégré dans l'interface admin et les trois outils bénévoles (marque, pesée, annonces) — toujours visible en bas à droite pendant le travail. Ouvre un formulaire en ligne YouTrack qui crée directement le ticket. Réservé à l'admin et aux bénévoles connectés, jamais visible pour un club.

✉️ Adresse de contact mise à jour

  • Modifié : l'adresse de contact affichée (crédits, landing page) passe à contact@nakama-judo.fr.

🔒 Fuite d'information sur une page publique

  • Bug corrigé : une page publique (accessible sans être connecté) affichait, dans certains cas, un message de repli trop détaillé sur la structure interne des fichiers du serveur. Message simplifié ; la marche à suivre complète déplacée vers la documentation de déploiement, non publique.

🎨 Identité visuelle — vrai logo Nakama

  • Nouveau : icônes PWA, favicons (ajoutés à 19 pages qui n'en avaient aucun) et logo sur les pages de connexion remplacent les icônes provisoires et l'emoji 🥋 utilisés jusqu'ici. Landing page mise à jour aussi (en-tête, pied de page, favicon).
  • Bug corrigé : icône illisible à 32px avec le texte japonais inclus (retour utilisateur avec capture) — recadrage sans le kanji, affichage porté à 52px sur les pages de connexion.

📋 Résultats — colonne Points retirée en affichage normal

  • Modifié : la colonne "Points" n'apparaît plus en affichage normal — ne reste que Athlète / Classement. Reste visible en affichage avancé, aux côtés de Victoires. Texte d'aide corrigé au passage (mentionnait seulement "Victoires").

🔑 "Mot de passe oublié ?" (admin et clubs)

  • Nouveau : lien "Mot de passe oublié ?" sur login.php (admin) — envoie un lien à l'adresse de contact configurée, jeton haché à usage unique valable 1h. Sans email configuré, indique de modifier auth-config.php directement.
  • Nouveau : même principe sur club-login.php — envoi séparé à chaque membre du club, jamais groupé.
  • Nouveau : contact principal (⭐, club.php) — s'il est désigné, seul lui reçoit les demandes de réinitialisation, pour éviter la confusion si plusieurs membres déclenchent chacun la leur. Sans désignation, repli sur tous les membres.

👥 Gestion de fiche club en self-service

  • Nouveau : un club connecté peut gérer sa propre fiche (club.php?token=...) — logo, membres, consultation des liens. Jamais renommage, emails, régénération du lien ou suppression, réservés à l'admin. Action API dédiée updateOwnClub avec liste blanche stricte, club toujours déterminé par la session serveur.
  • Nouveau : un troisième lien ("Lien de gestion de la fiche") ajouté à la vue admin de club.php — l'admin n'avait auparavant aucun moyen de le trouver ou de le transmettre au club.
  • Choix délibéré : cette page exige toujours un mot de passe, même si l'inscription elle-même en est dispensée (config.clubLoginRequired).
  • Bug corrigé : club-login.php n'acceptait que inscription-club.php comme cible de redirection — accepte désormais club.php aussi.

🔴 Bug critique — connexion club impossible quand le mot de passe était requis

  • Bug corrigé, critique : depuis le durcissement du jeton d'inscription, club-login.php comparait le jeton reçu à un nom de club slugifié — ne correspondait jamais, rendant toute connexion club impossible dès que clubLoginRequired était actif (réglage par défaut). Résout désormais via le jeton, comme inscription-club.php. Testé sur la chaîne complète réelle.

🤖 Tests Robot Framework supplémentaires

  • Nouveau : accès par rôle staff, réinitialisation de mot de passe club, la race condition config en conditions réelles de navigateur, et un verrou sur le bug critique ci-dessus. Tests unitaires PHP étendus à 45 tests.

🧪 Tests unitaires PHPUnit (base de la pyramide de Cohn)

  • Nouveau : tests/unit/DbFunctionsTest.php, 32 tests sur les fonctions pures de db.php (kaizen_slugify, nakama_club_slug_matches, nakama_has_broad_athlete_access, nakama_session_club_name). Complète robot-tests/ (service/API et navigateur).
  • Refactor : les trois dernières fonctions déplacées de api.php vers db.php pour rester testables sans mock lourd — protection IDOR reconfirmée fonctionnelle après ce changement.

🤖 Tests automatisés (Robot Framework)

  • Nouveau : suite de tests Robot Framework (robot-tests/), 17 tests, ciblés sur les vrais bugs/failles corrigés récemment — CSRF (5 actions), IDOR sur les athlètes par club, verrouillage de connexion, poids non enregistré sur pesee.php (test navigateur réel). Autonome, README dédié.
Version 1.7
21/09/2026

🐛 Débordement horizontal sur pesee.php (régression)

  • Bug corrigé : le libellé du champ poids, rallongé dans un correctif précédent, dépassait la largeur tolérée (white-space: nowrap sans repli possible) et faisait déborder toute la page horizontalement sur écran étroit. Le label est désormais sur sa propre ligne.

📋 Inscription club — liste des athlètes déjà inscrits

  • Nouveau : champ de recherche par nom/prénom, insensible aux accents. Nombre d'athlètes affiché à côté du titre.
  • Modifié : affichage au format "Nom Prénom", trié alphabétiquement par nom puis prénom.

🐛 Poids non enregistré sur pesee.php (mobile notamment)

  • Bug corrigé : la sauvegarde n'était déclenchée que par la touche Entrée — perdre le focus autrement (fermer la page, clavier mobile qui ne déclenche pas d'Entrée fiable) n'enregistrait rien. La perte de focus enregistre désormais aussi le poids saisi.
  • Complément : le clavier numérique restait affiché après validation. Ajout d'un vrai bouton "✓" à côté du champ, entièrement fiable quel que soit le téléphone, plutôt que de dépendre du bouton d'action du clavier virtuel.

🔐 Sécurité — IDOR exploitable sur la gestion des athlètes par les clubs

  • Bug corrigé, exploitable : la vérification "ce club ne touche que ses propres athlètes" se basait sur un paramètre clubSlug envoyé par le client, jamais recoupé avec la session connectée — confirmé par exploitation réelle avant correctif. Résolu désormais côté serveur, depuis la session.

📱 Installation en app (PWA)

  • Nouveau : suivi.php, marque.php, pesee.php et annonces.php sont désormais installables comme une app — icône sur l'écran d'accueil, plein écran sans barre d'adresse, fonctionne même sans réseau une fois ouvertes une première fois. Exige HTTPS sur un vrai domaine.
  • Bug corrigé : sur les quatre pages, le service worker pouvait ne jamais s'enregistrer (addEventListener('load', ...) posé après que l'événement se soit déjà produit) — silencieusement, sans erreur visible. Enregistrement immédiat désormais.

🐛 Perte de config lors d'une sauvegarde depuis app.html

  • Bug corrigé : modifier le logo du club (ou tout autre réglage) depuis app.html écrasait silencieusement les sponsors/restauration/bar/paiement ajoutés entre-temps via infos-admin.php, à cause d'une copie de config périmée en mémoire. Les 10 points de sauvegarde de app.html relisent désormais la version fraîche avant d'écrire.

🤝 Sponsors

  • Nouveau : carte "Sponsors" dans infos-admin.php (nom, logo, site web) — affichés sur index.php, suivi.php et suivi-club.php, logos cliquables ou repli en texte simple.
  • Bug corrigé : les sponsors n'apparaissaient pas sur l'écran de sélection de club de suivi-club.php (sans ?club=) — ce fichier contient deux pages distinctes, chacune avec son propre script ; corrigé sur les deux.

🧪 Données de test

  • Corrigé : les athlètes de test (bouton "1100 athlètes de test" et import_test_nakama.csv) étaient importés avec un poids déjà rempli, donc vus comme "pesés" dès l'import. Poids vidé sur les deux sources.

👥 Comptes bénévoles

  • Nouveau : possibilité de modifier les rôles (Pesée/Annonces/Table de marque) d'un compte bénévole déjà créé — auparavant, il fallait supprimer et recréer le compte pour changer ses droits.

📚 Documentation

  • Mis à jour : README.md repris en profondeur — table de marque en direct, suivi public, page d'accueil publique, fiches club, confidentialité/RGPD, diagnostic/statut, sauvegarde/restauration, sécurité renforcée.

🔐 Sécurité — audit complet (CSRF, cookies, en-tête Host)

  • Corrigé : 5 actions de api.php (toggleMedal, declareWinner, deleteAthlete, addAthlete, updateAthlete) ne vérifiaient que la session, jamais le jeton CSRF. marque.php, annonces.php, pesee.php et inscription-club.php n'avaient d'ailleurs aucun jeton CSRF disponible — corrigé aux quatre endroits.
  • Corrigé : nouveau session-config.php (cookie httponly, SameSite=Lax, secure en HTTPS), inclus dans les 25 fichiers concernés.
  • Corrigé : diagnostic.php utilise désormais SERVER_NAME plutôt que l'en-tête Host (falsifiable) pour son auto-test réseau.
  • Audit plus large (injection SQL, XSS, mots de passe, jetons, uploads) sans autre point à corriger.
Version 1.6
17/09/2026

🎨 Page publique — logo plus visible

  • Modifié : le logo d'index.php était trop petit et carré — passé à une boîte large et courte, mieux adaptée à un logo au format paysage, tout en restant propre pour un logo carré.

🔐 Sécurité — identifiants plus robustes

  • Nouveau : les identifiants générés côté client utilisent désormais crypto.getRandomValues() (cryptographiquement sûr) au lieu de Math.random(). Bouton de migration pour les clubs sur l'ancien format.
  • Nouveau : le lien d'inscription (inscription-club.php) utilisait le nom du club, trivialement devinable — utilise désormais un jeton opaque aléatoire, sans rapport avec le nom. Migration automatique des clubs existants, bouton de régénération manuelle en cas de fuite suspectée.

🔍 Suivi public

  • Nouveau : statut final « 🏅 Médailles remises » sur suivi.php et suivi-club.php, au-dessus de « Terminé » — se déclenche dès que la case correspondante est cochée dans annonces.php.

📋 Résultats

  • Nouveau : boutons « Affichage normal » / « Affichage avancé » — le mode normal masque la colonne « Victoires ».
  • Bug corrigé : la première version de cette bascule empêchait les poules de s'afficher au tout premier chargement de l'onglet. Corrigé.

🐛 Liens cassés après le déménagement admin.php

  • Bug corrigé : trois endroits d'app.html (lien de Suivi sur l'Accueil, lien de pesée par catégorie, liens des comptes club) calculaient encore l'adresse de base en repérant index.php, devenu incorrect depuis le déplacement de l'admin vers admin.php. Corrigé aux trois endroits.

🏠 Page publique de la compétition & restructuration de l'admin

  • Nouveau : index.php sert désormais une page publique d'informations sur la compétition (présentation, horaires de pesée, lieu), sans authentification.
  • Déplacé : l'admin déménage vers admin.php (mêmes identifiants). ⚠️ Les signets existants doivent être mis à jour.
  • Nouveau : infos-admin.php, page dédiée pour éditer le contenu public, plutôt qu'un énième onglet dans app.html — même principe que club.php/status.php/diagnostic.php.
  • Nouveau : carte « 🍔 Restauration » — liste de produits (nom + prix), affichée sur index.php si au moins un produit existe.
  • Nouveau : carte « 🍹 Bar » — même fonctionnement, liste indépendante avec son propre bloc sur la page publique.
  • Nouveau : carte « 💰 Moyens de paiement acceptés » — cases à cocher (espèces, chèque, carte, virement, ANCV), affichées sur index.php.

🎙️ Annonces

  • Modifié : les poules pas encore récompensées sont désormais triées par ancienneté de validation (la plus ancienne en premier) plutôt que par ordre alphabétique de catégorie, pour qu'une poule tout juste validée ne double jamais une plus ancienne encore en attente.

🏛️ Clubs — simplification & correctif email

  • Bug corrigé : la fiche club promettait un repli mailto: si l'envoi direct n'est pas configuré, mais ce repli n'existait pas réellement — le bouton échouait silencieusement sans jamais ouvrir de logiciel de messagerie. Corrigé.
  • Simplifié : dans l'onglet Clubs de l'admin, chaque club est désormais un simple lien direct vers sa fiche — plus d'édition en ligne, plus de boutons individuels dans la liste.
  • Enrichi : club.php gagne le renommage, le statut "Invitation envoyée", l'impression de l'affiche, et la suppression du club (avec ses athlètes rattachés).

🐛 Navigation

  • Corrigé : recharger la page (F5) sur un onglet précis ramenait systématiquement à Accueil. L'URL contient désormais l'onglet actif (#clubs, #athletes...), repris au chargement.

📋 Résultats (impression)

  • Modifié : le palmarès par club regroupe désormais chaque club par catégorie (triées alphabétiquement), et à l'intérieur de chaque catégorie, les athlètes sont triés par ordre alphabétique.

🔐 HTTPS

  • Nouveau : redirection automatique http:// → https:// fournie dans .htaccess (Apache) et documentée dans nginx.conf.example (Nginx) — nécessite un certificat SSL déjà installé sur le domaine.

🏛️ Clubs

  • Corrigé : club.php empêchait de supprimer le dernier membre d'un club — le bouton de suppression du dernier membre restant est désormais désactivé, avec un message explicite.

🔒 Confidentialité / RGPD

  • Nouveau : les sections « À personnaliser » de confidentialite.php sont désormais remplissables depuis Configuration → « Vie privée / RGPD » — plus besoin d'éditer le fichier PHP. Un champ vide continue d'afficher l'avertissement d'origine.
Version 1.5
13/09/2026

⚡ Performance (lecture groupée)

  • Nouveau : api.php propose une lecture groupée (plusieurs clés en une seule requête) en plus de la lecture par clé existante.
  • Optimisé : suivi.php, suivi-club.php, marque.php et annonces.php faisaient une requête HTTP séparée par combat à chaque rafraîchissement (5s) — remplacé par des lots de 100 clés max. 250 combats chargés en 7 requêtes au lieu de 250+.

🏛️ Clubs (fiche dédiée)

  • Nouveau : « club.php », une vraie page par club — logo, fiche membres (nom/prénom/email/téléphone), remplace l'ancien contact unique.
  • Nouveau : chaque membre reçoit ses emails d'invitation/relance séparément des autres, avec une salutation personnalisée à son propre prénom.
  • Nouveau : migration à la demande de l'ancien contact vers la fiche membres — jamais automatique.

🏠 Accueil

  • Nouveau : encart « Vérifications avant de démarrer » — repère automatiquement les oublis fréquents (athlètes sans catégorie, poids hors catégorie, clubs sans email, catégories sans athlète, catégories sans poule générée, tapis non défini). Chaque point cliquable amène à l'onglet concerné.

🥋 Table de marque (résilience réseau)

  • Nouveau : marque.php résiste désormais aux coupures wifi — chaque sauvegarde retente automatiquement en cas d'échec (délai croissant), aucune saisie n'est perdue.
  • Corrigé : le rafraîchissement automatique pouvait silencieusement écraser un combat dont la sauvegarde était en attente — il ne le fait plus.
  • Badge « 🔄 En attente… » visible tant qu'une sauvegarde n'est pas confirmée.

🔍 Suivi public

  • Nouveau : notifications navigateur — bouton « 🔔 Me notifier des changements » sur suivi.php et suivi-club.php, se déclenche dès qu'une poule change de statut, tant que l'onglet reste ouvert.
  • Nouveau : « suivi-club.php », variante de suivi.php montrant tous les athlètes d'un club d'un coup, sans recherche à faire. Lien copiable depuis l'onglet Clubs de l'admin.
  • Nouveau : ouvrir suivi-club.php sans club précisé affiche un écran de sélection (une tuile par club) au lieu d'une erreur.
  • Nouveau : recherche + pagination (25 par page) sur l'écran de sélection et sur la liste des athlètes de chaque club — la détection de changement continue de fonctionner pour tous les athlètes, même masqués.
  • Nouveau : filtre par catégorie sur suivi-club.php, combinable avec la recherche par nom.
  • Retiré : le badge de classement a été retiré de suivi-club.php.
  • Nouveau : bouton « 🖨️ Imprimer l'affiche » (Accueil et onglet Clubs) — affiche imprimable avec QR code, prête à coller au mur ou donner à un coach.

🛠️ Administration

  • Nouveau : « status.php », page de statut réservée à l'admin — instance/base accessibles (avec temps de réponse), version de l'appli, compteurs de données, espace disque.
  • Nouveau : la section « Dépannage » (onglet Configuration) devient « 🛠️ Administration », regroupant statut et diagnostic serveur.
  • Enrichi : « diagnostic.php » détecte désormais les fichiers oubliés sur le serveur (anciennes versions .html non protégées, scripts à usage unique), teste réellement si « .htaccess » est pris en compte par le serveur, et indique si l'envoi d'emails SMTP est configuré.

🧑‍🤝‍🧑 Athlètes & Pesée

  • Nouveau : pagination (25 par page) sur l'onglet Athlètes de l'admin et sur la page de pesée — évite de faire défiler une liste de plusieurs centaines d'athlètes d'un bloc. Masquée automatiquement quand tout tient sur une seule page.

📋 Résultats (impression)

  • Nouveau : bouton « 🏆 Imprimer le palmarès » — podium (1er/2e/3e) de toutes les poules validées, toutes catégories confondues, en un seul document.
  • Nouveau : bouton « 🖨️ Imprimer par club » — position finale de chaque athlète, regroupée par club. Menu déroulant « Tous les clubs » / un club précis pour un document limité à un seul club.
Version 1.4
12/09/2026

🔍 Suivi public

  • Nouveau : page publique « suivi.php », sans authentification — recherche par nom pour retrouver sur quel tapis et quelle poule se trouve un athlète. Pensée pour être partagée via un QR code.
  • Onglet Accueil : nouvelle carte avec le lien et un QR code prêt à afficher/imprimer, plus un bouton pour copier le lien.
  • Classement affiché une fois la poule validée dans Résultats — jamais un résultat provisoire.
  • Bug corrigé : « Valider cette poule » ne sauvegardait jamais les valeurs affichées dans pool-results tant que personne n'avait manuellement retapé un champ — corrigé, la validation fige désormais les valeurs réellement affichées.
  • Statut affiné : avant validation, « À venir »/« En cours » se base sur l'impression de la feuille de poule (pas sur la table de marque, que tout le monde n'utilise pas forcément) — créée non imprimée → « À venir », imprimée → « En cours », validée → « Terminé ».

⚖️ Pesée & Inscription club

  • Modifié : le champ « Poids (kg) » a été retiré du formulaire d'inscription club — un athlète s'inscrit désormais sans poids déclaré, celui-ci ne provient plus que de la pesée sur place. Modifier un athlète existant ne touche plus jamais à son poids.
  • Modifié : sur la table de pesée, le poids ne se valide plus qu'avec la touche Entrée — taper un chiffre puis cliquer ailleurs sans Entrée n'enregistre plus rien.
  • Supprimé : la case « Présent » a disparu — un athlète est considéré pesé dès que son poids est confirmé par Entrée. Champ Poids aussi retiré du formulaire d'ajout de la pesée elle-même.
  • Répercussions mises à jour dans l'admin : compteur « pesé(s) », badge « ✓ pesé », filtre Athlètes, et la génération de poules (n'inclut que les athlètes avec un poids confirmé).
  • Nouveau : quand le poids ne correspond pas à la catégorie, une vraie fenêtre à trois choix remplace le simple message forcer/annuler — changer de catégorie et valider, forcer sans changer, ou annuler.
  • Modifié : dans l'onglet Athlètes, l'avertissement de poids hors catégorie est désormais un badge « ⚠️ Hors catégorie » juste à côté du nom, plutôt qu'un texte en dessous.

🏛️ Clubs

  • Nouveau : un club peut désormais renseigner plusieurs emails de contact, séparés par une virgule — les invitations/relances leur sont envoyées à tous, en SMTP comme en mailto:. Rétrocompatible avec les clubs n'ayant qu'une seule adresse.
  • Bug corrigé : quand la protection par mot de passe de la page d'inscription est désactivée, les emails d'invitation/relance mentionnaient quand même un lien de définition de mot de passe — trompeur. Corrigé côté SMTP et mailto:.

🏷️ Catégories

  • Nouveau : le champ « Tapis » d'une catégorie devient des pastilles à cocher, une par tapis disponible — l'admin choisit précisément lesquels cette catégorie peut utiliser (ex : tapis 2 et 4 seulement). Présentation compacte, au moins un tapis doit rester coché. Rétrocompatible avec les catégories déjà configurées.

🥋 Tapis (impression)

  • Modifié : le bouton « 🖨️ Imprimer » demande désormais « Par tapis » ou « Par club » via une fenêtre. Dans les deux cas, plus aucun saut de page forcé — tient sur le minimum de feuilles.
  • Renommé : le bouton « Par club » devient « 🖨️ Pour les coachs » — comportement inchangé (un club par page), distinct du nouveau choix « Par club » de la fenêtre.
Version 1.3
11/09/2026

📋 Résultats

  • Nouveau : le score judo de chaque athlète s'affiche à côté de son nom, calculé depuis les combats notés sur la table de marque.
  • Nouveau : ordre de départage complet en cas d'égalité de victoires — ippons, waza-ari, yuko, shido reçus, puis confrontation directe (le vainqueur du combat entre les deux athlètes passe devant).
  • Modifié : la colonne « Points » affiche le score de combat cumulé (ippon = 100, waza-ari = 10, yuko = 1), plutôt que les points de classement/barème.
  • Bug corrigé : la colonne « Victoires » pouvait afficher une valeur figée enregistrée précédemment au lieu du résultat réel une fois le combat tranché sur la table de marque. Corrigé : dès qu'un combat de la poule est tranché via la table de marque, le compte en direct devient la seule source de vérité — la saisie 100% manuelle (sans table de marque) continue de fonctionner normalement.

🥋 Table de marque

  • Nouveau : page dédiée (« marque.php ») pour la personne qui note les résultats sur un tapis — lien verrouillé par tapis, protégée par un compte bénévole à rôle limité.
  • Score détaillé façon judo : compteurs séparés par combattant (Ippon, Waza-ari, Yuko, Shido), pas un simple champ numérique.
  • Le 3e shido attribue automatiquement un ippon à l'adversaire (hansoku-make), avec retrait automatique si corrigé.
  • Un seul ippon possible par combat — l'activer pour l'un retire automatiquement celui de l'autre.
  • Validation explicite obligatoire : le score ne finalise plus jamais un combat tout seul — une bannière suggère un vainqueur (score au format « 013.0 / 004.0 »), à confirmer via « ✅ Valider ce résultat ». « ↩️ Annuler la validation » pour corriger une erreur.
  • « Décision de l'arbitre » en repli permanent — fonctionne désormais comme le score : un clic sélectionne juste, sans plus jamais valider directement. Confirmation requise via « ✅ Valider ce résultat ».
  • Plusieurs poules sur un même tapis alternent désormais leurs combats entre elles, au lieu de les enchaîner poule par poule.

🔒 Sécurité

  • Faille corrigée : les actions serveur utilisées par « inscription-club.php » n'avaient aucune vérification d'appartenance au club — n'importe qui avec le lien d'un seul club pouvait, via un appel direct à l'API, modifier ou supprimer les athlètes de n'importe quel autre club. Corrigé : chaque écriture vérifie désormais que l'athlète concerné appartient bien au club du lien utilisé, avec blocage aussi de toute tentative de réassignation vers un autre club. pesee.php et l'admin restent non concernés (légitime pour eux).
  • Nouveau : « inscription-club.php » est désormais protégée par un compte propre à chaque club (en plus de l'isolation ci-dessus, qui reste active dans tous les cas) — compte créé automatiquement, mot de passe défini par le club lui-même via un lien reçu par email (SMTP et mailto:), ajouté automatiquement tant qu'il ne s'est jamais connecté. Nouvelle section « 🏛️ Comptes club » dans l'onglet Comptes, avec un réglage pour désactiver cette exigence de connexion si besoin (l'isolation entre clubs reste protégée dans tous les cas).
Version 1.2
11/09/2026

👥 Comptes

  • Nouveau : onglet dédié « 👥 Comptes », regroupant le compte administrateur et les comptes bénévoles (pesée/annonces), auparavant dans l'onglet Configuration devenu trop chargé.

🏠 Accueil

  • Nouveau : l'onglet Accueil rejoint le rafraîchissement automatique toutes les 5 secondes (comme Tapis/Classement/Résultats) — les compteurs des tuiles se mettent à jour tout seuls.

⚖️ Pesée

  • Bug : un raté réseau transitoire pendant le rafraîchissement automatique pouvait casser le verrouillage d'un lien dédié (« ?cat=... ») — le champ « Catégorie » du formulaire se retrouvait vide et bloqué. Corrigé avec une nouvelle tentative automatique en cas d'échec, et les catégories ne sont plus écrasées par une réponse vide une fois déjà chargées correctement.

📋 Résultats

  • Les champs Victoires et Classement n'acceptent désormais plus que des chiffres — tout autre caractère est retiré au fur et à mesure de la frappe.
  • Nouveau : bouton « ✅ Valider cette poule » — verrouille ses champs, détermine désormais si elle apparaît sur la page Annonces. Les poules pas encore validées remontent en haut de la liste.

🏷️ Catégories

  • Nettoyage : retrait des champs « Pesée » et « Combats » (formulaire d'ajout et ligne de chaque catégorie) — c'étaient deux champs orphelins, jamais exploités ailleurs dans l'appli.
  • Le libellé « Poule n°1 = » a perdu son signe « = » superflu.

🔒 RGPD

  • Nouveau : page publique d'information légale (« confidentialite.php ») couvrant les obligations du RGPD — modèle avec sections « à personnaliser » clairement marquées, à compléter par l'organisateur.
  • Nouveau : case de consentement obligatoire sur le formulaire d'inscription club, avec lien vers la politique de confidentialité.

🎙️ Annonces

  • Nouveau : page dédiée (« annonces.php ») pour l'annonceur des résultats — liste les poules explicitement validées dans Résultats (pas simplement « tous les combats terminés »), avec leur classement validé (jamais différent de celui de l'admin), podium visuel, case « Médailles remises » par poule. Se rafraîchit automatiquement.
  • Bug critique corrigé : cocher « Médailles remises » échouait systématiquement pour un compte staff (rôle « annonces ») — 401 affiché à tort comme un problème de connexion. Nouvelle action dédiée, avec verrouillage en base pour éviter qu'un deuxième appareil n'écrase le changement.

🔒 Sécurité

  • Nouveau : « pesee.php » et « annonces.php » (anciennement publiques) sont désormais protégées par des comptes bénévoles nommés, à rôle limité, distincts du mot de passe admin — gérés depuis l'onglet Configuration (« 👥 Comptes bénévoles »). Identifiants stockés en base (inclus dans les sauvegardes SQL), mais explicitement bloqués en lecture/écriture publique.
Version 1.1
10/09/2026

🏠 Accueil

  • Nouveau : la tuile « Athlètes » de la page d'accueil affiche aussi le nombre de pesés, juste en dessous du nombre d'inscrits.

🗂️ Poules / Tableaux

  • Nouveau : possibilité de créer une poule vide, pour composer une répartition entièrement à la main — depuis zéro ou en complément d'une répartition déjà en place. Les poules restées vides sont ignorées lors de la génération des combats, et peuvent être supprimées d'un clic (« 🗑️ Supprimer cette poule »).
  • Le résumé « Génération par catégorie » affiche désormais aussi le nombre d'athlètes concernés, pas seulement le nombre de combats générés.
  • Nouveau : possibilité de replier/déplier une catégorie en cliquant sur son nom — utile pour les longues listes, seul le résumé reste visible une fois repliée.
  • Bug critique : avec une grosse catégorie (beaucoup de poules), une écriture « match:<id> » pouvait ponctuellement échouer sous la charge lors de la génération — ce combat n'était alors jamais réellement créé en base malgré matchIndex qui le référençait quand même (« combat fantôme », invisible partout). Corrigé : nouvelle tentative automatique sur chaque écriture en échec, avec un message clair si l'échec persiste malgré tout. Même correctif côté lecture (12 endroits : Résultats, Classement, Tapis, impression). Testé de bout en bout avec des échecs aléatoires simulés sur un cas réel (21 poules).

🏛️ Clubs

  • Nouveau : fiche club enrichie (onglet Clubs) — contact (nom, email, téléphone), case « Invitation envoyée », et nombre d'athlètes déjà inscrits calculé en direct. Renommer un club fait suivre automatiquement ses athlètes déjà inscrits.
  • Nouveau : boutons « 📧 Inviter » et « 🔔 Relancer » par club — ouvrent un email pré-rempli via le logiciel de messagerie de l'admin, et notent automatiquement l'invitation/la date de relance.
  • Nouveau : envoi direct des invitations/relances depuis Nakama (sans passer par le logiciel de messagerie), en configurant les identifiants SMTP d'une boîte mail existante (onglet Configuration → « 📧 Envoi d'emails »). Client SMTP interne sans dépendance externe, avec test de connexion immédiat. Optionnel — sans configuration, les boutons continuent d'utiliser mailto:.
  • Nouveau : bouton « 📧 Inviter tous les clubs en attente » — envoie l'invitation en une fois à tous les clubs ayant un email de contact et pas encore marqués invités (nécessite le SMTP configuré), avec suivi de progression et résumé final.
  • Nouveau : bouton « 🔔 Relancer tous les clubs sans inscription » — même principe, pour les clubs sans aucun athlète inscrit pour l'instant.
  • Nouveau : textes d'invitation/relance personnalisables (onglet Configuration → « ✏️ Textes des emails ») — sujet et corps modifiables, avec variables {salutation}, {club}, {lien}, {organisateur}. S'applique au mailto: comme à l'envoi SMTP direct.
  • Nouveau : refonte de l'affichage — une tuile compacte par club (nom, nombre d'athlètes, statut d'invitation), qui se déploie au clic pour afficher le détail complet, au lieu d'une longue liste tout affichant en permanence. Le formulaire « Créer un club » est désormais replié par défaut.

🏆 Classement

  • Nouveau : l'onglet Classement se rafraîchit désormais automatiquement toutes les 5 secondes, comme l'onglet Tapis.
  • Nouveau : chaque titre de classement (Général, Masculin, Féminin, chaque catégorie) affiche le nombre de combattants déjà comptabilisés — le nombre avec résultats effectivement saisis, pas le total des inscrits.

📋 Résultats

  • Bug : une poule (re)générée pendant qu'on consultait l'onglet Résultats pour cette catégorie n'apparaissait pas tant qu'on ne resélectionnait pas la catégorie — l'onglet ne se rafraîchissait jamais automatiquement. Corrigé, avec une protection pour ne pas écraser une saisie en cours pendant le rafraîchissement.
  • Précision : un signalement complémentaire a permis de trouver une cause plus profonde (écritures manquantes lors de la génération sur une grosse catégorie) — voir le bug critique corrigé dans « 🗂️ Poules / Tableaux » ci-dessus.

⚖️ Pesée

  • Nouveau : écran d'accueil par tuiles (une par catégorie, avec compteur mis à jour en direct) quand la page de pesée est ouverte sans lien dédié — plus besoin du lien exact d'une catégorie. Lien « ◀ Changer de catégorie » ajouté sur la vue verrouillée pour y revenir.
  • Sous-titre de l'en-tête mis à jour : « Sélectionnez la catégorie à peser — tout se sauvegarde automatiquement, en direct. »

📜 Historique

  • Bug critique corrigé : le bouton « Archiver cette saison » ne faisait littéralement rien la toute première fois qu'on ouvrait l'onglet Historique (aucune saison encore archivée) — privé de tout gestionnaire de clic dans ce cas précis. Corrigé et testé de bout en bout.
  • Nouveau : après avoir archivé une saison, confirmation proposée pour vider la liste des combattants — catégories et clubs conservés (souvent réutilisés d'une saison à l'autre).
  • Nouveau : possibilité de supprimer une archive (« ✕ » à côté de « Voir »), avec confirmation.
  • Correction d'espacement entre les boutons « Voir » et « ✕ » de chaque archive.
Version 1.0 (Finale)
07/09/2026

🌐 Général

  • Nouveau : page 404 personnalisée (404.html), dans le même esprit visuel que « Club introuvable »/« Catégorie introuvable », plutôt que le message par défaut du serveur.
  • Nouveau : support Nginx en plus d'Apache — .htaccess ne fonctionne que sous Apache. Nouveau fichier nginx.conf.example reproduisant les mêmes protections, testé de bout en bout avec un vrai Nginx + PHP-FPM.
  • Nouveau : sauvegarde SQL en un clic depuis l'onglet Configuration — génère et télécharge un export SQL complet de la base, réimportable tel quel via mysql ou phpMyAdmin.
  • Nouveau : restauration graphique d'une sauvegarde depuis la même carte — fusionne avec les données actuelles par défaut, avec une case à cocher optionnelle pour vider la base avant de restaurer.
  • Correction CSS : les boutons sous forme de lien n'affichaient jamais leur vrai style. Corrigé.

🧑‍🤝‍🧑 Athlètes

  • Nouveau : filtre « Pesée » dans l'onglet Athlètes (Tous / Pesés seulement / Non pesés seulement), à côté du filtre par catégorie.

🏛️ Inscription en ligne

  • Nouveau : filtre par catégorie sur la liste « Athlètes déjà inscrits » (menu déroulant simple, côté client) — aide les clubs à retrouver leurs athlètes dans une longue liste.
  • Nouveau : page « Club introuvable » repensée, avec un bouton « Contacter l'organisateur » (visible si un email de contact est renseigné — onglet Configuration → nouveau champ « Email de contact »).

⚖️ Pesée

  • Toilettage visuel, dans le même esprit que la nouvelle page « Club introuvable » : ombres douces sur les cartes, page « Catégorie introuvable » repensée. Purement visuel.
  • Rafraîchissement automatique accéléré : 6 secondes → 2 secondes. Les mises à jour faites depuis un autre appareil apparaissent donc plus vite.
  • Nouveau : ce délai est désormais réglable depuis l'onglet Configuration de l'admin (entre 1 et 30 secondes, 2 par défaut).
  • Bug important : si un rafraîchissement automatique arrivait pendant la saisie d'un poids, ce qui n'avait pas encore été validé pouvait être effacé. Corrigé : le rafraîchissement n'affecte plus le champ en cours de frappe, et rattrape les mises à jour manquées dès qu'on le quitte.

🔐 Sécurité

  • Nouveau : changement de l'identifiant et du mot de passe admin directement depuis l'onglet Configuration — plus besoin d'éditer auth-config.php à la main. Le mot de passe actuel est revérifié côté serveur avant tout changement.
  • Nouveau : le mot de passe admin est désormais stocké haché plutôt qu'en clair. Migration automatique et transparente au prochain login réussi.
  • Nouveau : limitation des tentatives de connexion — blocage 5 minutes après 5 échecs consécutifs pour un identifiant donné.
  • Nouveau : protection contre le CSRF sur les écritures admin — un jeton unique par session est vérifié à chaque écriture.

🧪 Outils de test

  • Nouveau : jeu de données de test « réel » (858 athlètes, les 11 catégories prédéfinies), reconstitué à partir de vraies feuilles de pesée d'une édition précédente. Bouton dédié pour l'importer en un clic.

⚖️ Corrections

  • Bug critique (récidive) : les catégories prédéfinies pouvaient encore être recréées automatiquement avec de nouveaux identifiants si categories et athletes échouaient tous les deux à charger en même temps (typiquement lors d'un redéploiement ou redémarrage serveur). La recréation automatique et silencieuse est désormais entièrement supprimée : le bouton « Créer les catégories prédéfinies » (onglet Catégories) reste l'unique moyen de les (re)créer, sans jamais écraser celles déjà en place.
  • Bug important : un accroc réseau au tout premier chargement (fréquent sur mobile, ex : au réveil du téléphone) pouvait laisser l'appli bloquée sur « 0 athlète / 0 catégorie » indéfiniment, sans bandeau visible, jusqu'à fermer et rouvrir le navigateur. La reconnexion automatique relance désormais un chargement complet plutôt que de juste faire disparaître le bandeau — la récupération est maintenant automatique.
  • Bug : le lien d'inscription généré dans l'onglet Clubs était cassé — il gardait index.php dans le chemin (reste d'avant l'ajout de l'authentification), donnant un lien du type .../index.php/inscription-club.php?club=... au lieu de .../inscription-club.php?club=.... Corrigé.
Version 0.9 (Bêta 2)
06/09/2026

🏷️ Catégories

  • Nouvelles catégories prédéfinies pour les Poussinets/Poussins : Poussinets -23kgs, Poussinets -27kgs, Poussinets +27kgs (ajout d'un palier -23kgs), et Poussins -28kgs / Poussins +28kgs (remplacent les anciens paliers -30kgs/+30kgs). Poussinettes et Poussines inchangées.
  • Jeux de données de test mis à jour en conséquence : 1100 athlètes désormais (100 par catégorie, sur les 11 catégories prédéfinies).

🖨️ Feuilles de poules imprimées

  • Impression désormais en format paysage (la feuille « Répartition par tapis » reste en portrait).
  • Polices, espacements et hauteurs de lignes agrandis pour remplir correctement la page A4.
  • Format des poules de 2 revu en profondeur : « Poule n° » à côté du titre, ligne méta réduite, colonne « Cla » en tête sans colonne Classement séparée, nouveau barème dédié (Ippon 100 pts / Waza-Ari 10 pts / Yuko ou décision 1 pt / Décision 0 pt).
  • Poules de 3 et plus : les cases correspondant à un combat auquel l'athlète ne participe pas sont maintenant noircies (au lieu d'un simple fond grisé). Motif vérifié exact contre une vraie feuille de référence pour des poules de 3, 4 et 5.
  • Les cases noircies s'impriment désormais correctement même sans l'option « Graphiques d'arrière-plan » cochée dans le navigateur (réglage par défaut le plus courant) — jusqu'ici elles restaient blanches à l'impression réelle malgré un aperçu correct à l'écran.
  • Nouveau : feuille de poule vierge, sans athlètes réels — pratique pour avoir des feuilles de secours toutes prêtes ou une poule improvisée le jour J. Choix du nombre d'athlètes (2 à 6) et, en option, d'une catégorie à préremplir.
  • Bug important : les poules de 5 et 6 athlètes débordaient sur une 2e page après l'agrandissement des polices. Taille adaptée automatiquement selon le nombre d'athlètes — toutes les tailles (2 à 6) tiennent désormais sur une seule page A4.
  • Bug important : l'impression pouvait générer plusieurs pages blanches en trop selon le contenu présent sur l'onglet ouvert au moment d'imprimer (ex : une feuille vierge donnait 7 pages au lieu d'1). Corrigé.
  • Titre par défaut des feuilles imprimées (« Compétition Amicale ») : inclut désormais automatiquement le nom du club s'il est renseigné, ex. « Compétition Amicale Kaizen Saint Sébastien ». Sans effet si un nom d'événement personnalisé est déjà saisi.
  • Nouveau : réimpression d'une poule précise — choix de la catégorie puis du numéro de poule exact, avec les vraies données déjà générées. Pratique en cas de feuille perdue ou abîmée sur le terrain.
  • Éditeur manuel de poules : déplacer un athlète vers une poule qui en compte déjà 6 est désormais bloqué (avec message explicatif).
  • Éditeur manuel de poules : après « Générer les poules », « Régénérer les combats » ou « Réinitialiser la répartition », une sélection d'athlète en cours pouvait rester affichée à tort, même si les données étaient déjà correctes. Corrigé.
  • Bug important : l'API ne renvoyait aucun en-tête anti-cache. Le navigateur pouvait mettre en cache une réponse et la resservir après une modification, donnant l'impression que l'affichage ne se mettait pas à jour jusqu'à un rechargement complet. Corrigé.
  • Génération automatique des poules : nouvelle règle de répartition par défaut, poules de 4 en priorité — reste 0 → que des poules de 4 ; reste 1 → une poule de 5 ; reste 2 → deux poules de 3 ; reste 3 → une poule de 3 (le reste toujours en poules de 4).
  • Nouveau : la saisie du poids est désormais bloquée (ajout, édition, pesée) quand il ne correspond plus à la catégorie à limite de poids de l'athlète (Poussinets/Poussins), avec 1 kg de marge. Un bouton « Continuer quand même » reste disponible pour les cas exceptionnels. L'avertissement reste aussi affiché dans l'onglet Athlètes.
  • Nouveau : règle fédérale des 10% d'écart de poids maximum entre deux combattants d'une poule — l'avertissement existant dans l'onglet Poules/Tableaux apparaît désormais aussi directement sur les feuilles imprimées (bandeau rouge, « prévenir les parents »), visible sur le terrain.
  • Note d'aide ajoutée près du bouton d'impression des poules, pour penser à décocher « En-têtes et pieds de page » dans la fenêtre d'impression (sinon le nom de la page et l'URL s'ajoutent en haut de chaque feuille).
  • Champ « Poids » (vide, jamais rempli) retiré de l'en-tête des feuilles de poules de 3 athlètes et plus — la poule de 2 ne l'avait déjà plus.
  • Nouveau : temps de combat par défaut selon la tranche d'âge, appliqué automatiquement sur les feuilles imprimées — Poussinets 1min, Poussins 1min30, Benjamins 2min, Minimes 3min. Le champ « Temps de combat » de la Configuration ne sert plus que de repli pour une catégorie personnalisée.
  • Nouveau : impression « par club » dans l'onglet Tapis (une par catégorie) — une page par club, avec Nom/Prénom/Catégorie/Poule/Tapis et un rappel du contexte sur chaque page, à remettre aux entraîneurs.
  • Onglet Tapis : retrait des deux boutons d'impression globaux en haut de page, jugés inutiles.
  • Sur mobile, le sous-titre de l'en-tête pouvait passer sous le bouton « Déconnexion » quand il retournait à la ligne. Corrigé.

⚙️ Configuration

  • Logo du club affiché partout où c'est pertinent : en-tête de l'admin, feuilles de poules imprimées (en haut à gauche), feuille « Répartition par tapis », pesée multi-appareils, page d'inscription en ligne par club.
  • Numéro de version affiché sur la page de connexion, avec un lien direct vers le changelog.
  • Site internet du club : si renseigné, le nom du club dans l'en-tête devient un lien cliquable vers ce site ; sans site renseigné, texte simple comme avant.

🗑️ Suppressions

  • Retrait de la page d'inscription 100 % autonome (hors-ligne) — l'inscription en ligne par club couvre le besoin.

🗄️ Base de données

  • Changement majeur : passage de SQLite à MariaDB pour le stockage des données, afin de mieux supporter les écritures concurrentes. Nécessite désormais une base MariaDB/MySQL accessible depuis l'hébergement.
  • Nouveau : db-config.php.dist, modèle des identifiants de connexion à la base (protégé, comme auth-config.php). Le vrai db-config.php se crée une seule fois via setup.php ou à la main, et n'est jamais écrasé par un redéploiement ultérieur.
  • Nouveau : setup.php, assistant d'installation web — un formulaire teste la connexion, crée la table et écrit db-config.php automatiquement, avec un message « Configuration terminée » et un bouton direct vers l'admin une fois fait.
  • Nouveau : migrate-sqlite-to-mariadb.php, script à usage unique pour récupérer les données d'une installation existante encore sous SQLite.
  • diagnostic.php teste désormais la connexion MariaDB au lieu de SQLite, et signale un ancien fichier .sqlite pas encore migré — avec un bouton « 🗑️ Supprimer ce fichier » (avec confirmation) directement sur la page.
  • Sécurité : diagnostic.php n'est plus accessible publiquement — connexion admin requise. Accessible depuis l'onglet Configuration, section « 🔧 Dépannage ».

🧑‍🤝‍🧑 Athlètes

  • Nouveau : le tapis assigné (dès qu'un combat est généré) s'affiche désormais à côté du nom de chaque athlète dans l'onglet Athlètes (« 🥋 Tapis X »).

🗂️ Poules / Tableaux

  • Nouveau : seuls les athlètes pesés (case « Présent » cochée) peuvent désormais être mis en poule, que ce soit à la génération automatique ou lors de l'ajout d'un athlète « orphelin » à une poule déjà générée.

⚖️ Corrections

  • Bug critique : dans db.php, l'ordre de deux lignes faisait que les identifiants de db-config.php étaient systématiquement écrasés par des valeurs vides au moment de la connexion — l'API échouait avec une erreur MariaDB quel que soit le contenu réel du fichier. Corrigé.
  • Pesée : le compteur « au total » affichait le nombre total d'athlètes de la compétition même avec un filtre actif, au lieu du nombre correspondant au filtre. Corrigé.
  • Pesée : un lien pointant vers une catégorie renommée ou supprimée affichait la page normale avec le filtre simplement déverrouillé, sans explication. Affiche maintenant une page d'erreur dédiée (« Catégorie introuvable »), cohérente avec la page « Club introuvable » des inscriptions en ligne.
  • Tapis (vue par catégorie) : les colonnes Nom/Prénom/Club des tableaux de poule n'étaient pas alignées entre elles. Largeurs de colonnes désormais fixes et identiques sur toutes les poules.
  • Pesée : le bandeau « Connexion au serveur impossible » restait affiché indéfiniment une fois apparu, même après le retour de la connexion — une coupure réseau de quelques secondes (fréquente sur mobile) donnait l'impression d'un problème persistant. Il se referme maintenant automatiquement dès qu'une requête réussit à nouveau.
  • Admin : le même bandeau, affiché en superposition fixe en haut de l'écran, recouvrait et rendait inaccessible le bouton « Déconnexion ». Il pousse maintenant le contenu vers le bas au lieu de le survoler, avec une vérification automatique toutes les 3 secondes tant qu'il est affiché.
  • Import CSV / texte collé : un athlète dont la catégorie indiquée ne correspondait à aucune catégorie déjà créée se retrouvait sans catégorie, silencieusement. Le comportement reste le même (l'import n'utilise que des catégories déjà existantes), mais un message liste maintenant clairement les catégories introuvables en fin d'import.
  • Bug important : supprimer une catégorie ne touchait jamais aux athlètes qui y étaient rattachés — ils gardaient une référence vers une catégorie qui n'existe plus, les rendant invisibles/cassés partout sans explication. La suppression prévient désormais du nombre d'athlètes concernés et les fait repasser en « sans catégorie » (visibles et corrigibles). Nouveau filtre « — Sans catégorie — » dans l'onglet Athlètes pour les retrouver facilement, y compris ceux déjà touchés avant le correctif.
  • Nouveau : possibilité de modifier un athlète existant (bouton ✏️) — prénom, nom, club, poids, catégorie, grade. Jusqu'ici, la seule façon de corriger un athlète était de le supprimer et de le recréer.
  • Bug important : les boutons de la liste d'athlètes (✕, et maintenant ✏️) ne répondaient jamais au tout premier affichage de l'onglet Athlètes — seulement après avoir touché le filtre ou la recherche une première fois. Corrigé.
  • Édition d'un athlète : le club actuel n'était jamais présélectionné dans le menu déroulant, au risque de le perdre par erreur en enregistrant. Corrigé.
  • Bug critique : si la récupération des catégories échouait au chargement (souci réseau passager, notamment juste après un redéploiement), l'appli pouvait croire à tort que la base était vierge et recréait les catégories prédéfinies avec de nouveaux identifiants — cassant le lien avec les athlètes déjà rattachés. Les catégories ne sont désormais recréées automatiquement que si la base est vraiment vierge (aucune catégorie et aucun athlète).
  • Liste des athlètes : un athlète dont la catégorie pointait vers un identifiant qui n'existe plus s'affichait avec un nom de catégorie vide au lieu du message « sans catégorie » en rouge. Corrigé.
Version 0.1 (Bêta 1)
04/09/2026
Première version bêta complète de l'application de gestion de compétition.

🥋 Athlètes

  • Fiche athlète complète : prénom, nom, club, sexe (déduit automatiquement de la catégorie choisie), poids, catégorie, grade.
  • Import en masse par fichier CSV ou par texte collé.
  • Recherche et filtre par catégorie dans la liste (pensé pour de gros effectifs — testé jusqu'à 1000 athlètes).
  • Club en menu déroulant (clubs déjà connus + option « + Nouveau club »).
  • Catégorie obligatoire à la création.

🏷️ Catégories

  • 10 catégories prédéfinies du club, créées en un clic (et automatiquement au tout premier lancement).
  • Catégories personnalisées possibles en plus.
  • Par catégorie : heure de pesée, heure des combats, nombre de tapis dédiés, et numéro de départ pour la numérotation des poules.
  • Lien de pesée dédié généré automatiquement pour chaque catégorie.

🗂️ Poules / Tableaux

  • Génération automatique des poules qui priorise le rapprochement de poids, avec évitement des clubs en second plan.
  • Alerte visuelle si l'écart de poids dans une poule dépasse 10 %.
  • Éditeur manuel : toucher un athlète pour le sélectionner, toucher une autre poule pour l'y déplacer.
  • Un combattant ne se retrouve jamais sur deux tapis différents : chaque poule entière est assignée à un seul tapis.
  • Impression des feuilles de poules fidèle à une feuille de compétition réelle (barème, ordre des combats, tapis et numéro de poule pré-remplis).
  • Format spécial pour les poules de 2 athlètes (catégorie Poussinets) : barème par points, bloc « Classement final » séparé.

🥋 Tapis

  • Vue de consultation « qui est sur quel tapis », organisée par catégorie puis par tapis — pas de saisie de score dans l'appli.
  • Feuille imprimable récapitulative « Répartition par tapis », filtrable par catégorie ou toutes en une fois.

📋 Résultats

  • Tableau éditable par poule : Victoires et Classement saisis à la main, Points calculés automatiquement à partir du barème.
  • Pré-remplissage automatique à partir des combats déjà notés en direct, si disponibles.
  • Les points ne sont attribués à un club que lorsque la poule est entièrement terminée.

🏆 Classement

  • Nouvel onglet séparé de « Clubs », avec podium visuel (top 4) du classement général.
  • Classements détaillés : général, masculin/féminin, par catégorie.
  • Barème de points basé uniquement sur le classement en poule (1er / 2e / 3e / 4e et plus), configurable.

🏛️ Clubs & inscriptions en ligne

  • Onglet Clubs recentré sur la gestion des clubs participants et l'export des données.
  • Lien d'inscription hébergé généré automatiquement pour chaque club, nom déjà intégré — inscriptions directes dans l'onglet Athlètes.
  • Un club peut corriger ses propres inscriptions.
  • Synchronisation automatique des clubs détectés chez les athlètes (import, ancienne saisie...).
  • Suppression d'un club : prévient du nombre d'athlètes rattachés et les supprime avec lui si confirmé.
  • Page d'inscription autonome, 100 % hors-ligne, en secours.

⚖️ Pesée

  • Page dédiée multi-appareils, connectée en direct : plusieurs bénévoles peuvent peser en même temps sans se marcher dessus.
  • Cocher « Présent », ajuster le poids réel, ajouter un athlète de dernière minute.
  • Lien dédié par catégorie qui verrouille le filtre et le formulaire d'ajout.

📜 Historique

  • Archivage d'un instantané complet en fin de saison, consultable et comparable d'une édition à l'autre.

⚙️ Configuration

  • Nouvel onglet Configuration : nom et logo du club (image redimensionnée automatiquement à 300×300px max avant enregistrement). Prévu pour accueillir d'autres réglages généraux par la suite.

🏠 Accueil & navigation

  • Nouvel onglet Accueil (par défaut à l'ouverture) : cartes cliquables avec icône vers chaque section.

🔒 Sécurité

  • Authentification de l'admin (identifiant/mot de passe, session), protection de l'accès direct au contenu de l'admin.
  • Les pages publiques restent sans compte, mais ne peuvent qu'ajouter/modifier des athlètes.
  • Écritures atomiques côté serveur : deux appareils utilisés en même temps ne s'écrasent jamais mutuellement.

🧪 Outils de test

  • Section dédiée (hors navigation principale), qui peut être masquée via une case à cocher.
  • Import en un clic d'un jeu de données de test (1000 athlètes fictifs).
  • Réinitialisation complète de la base de données (avec confirmation, action irréversible).

🛠️ Divers

  • Export SQLite complet et exports CSV (athlètes, combats, classement clubs).
  • Page de diagnostic serveur pour vérifier PHP/SQLite/droits d'écriture.
  • Documentation technique complète dans le code.
  • Page de crédits, avec lien de retour.
  • Mise en page corrigée pour ne plus déborder horizontalement sur mobile.
  • Renommage de l'application : « Kaizen Judo » (nom du club, source de confusion) devient Nakama. Migration automatique et transparente du fichier de base de données au premier chargement, sans perte de données.
  • Page de changelog (celle-ci), accessible depuis un lien en pied de page.

Corrections de bugs notables

  • Chargement parfois bloqué sur « Chargement… » au premier affichage d'un onglet.
  • Athlètes/clubs disparaissant du classement dès qu'une seule valeur était saisie manuellement dans une poule.
  • Erreur 500 sur les pages d'inscription en ligne (extension PHP mbstring).
  • Regroupement automatique de catégories par poids (fonctionnalité retirée, remplacée par des catégories fixes).
Le détail complet et le suivi des bugs restants sont dans KNOWISSUES.md, sur le serveur.