# Changelog

Format : [Keep a Changelog](https://keepachangelog.com/fr/1.0.0/) · Versioning SemVer.

## [0.36.0] - 2026-07-14

### Ajouté
- **Upload de la vidéo teaser de l'accueil** : nouvelle carte « 🎬 Vidéo teaser » en tête du menu Photos — glissez votre MP4 (200 Mo max), suivez la **barre de progression**, aperçu intégré, remplacement et suppression en un clic. La vidéo n'est pas versionnée (trop lourde pour git) : téléversez-la sur chaque environnement, comme les logos. Limites PHP relevées via `.user.ini` (OVH compatible).

### Modifié
- **Tableau de bord** : tuiles cliquables, coûts IA corrigés (bug d'échelle ×1000), statuts et dates en français — voir 0.35.0 pour le détail des contenus.

## [0.35.0] - 2026-07-10

### Ajouté
- **Citations fantasy sourcées** sur les pages Créateurs, Chasse aux clés (Tolkien), Photographes (Ursula K. Le Guin), Troupes (Terry Pratchett) et Le thème (Neil Gaiman d'après G.K. Chesterton) — toutes authentiques et attribuées.
- **Nouvelle invitée : C by Camille**, costumière et corsetière lyonnaise spécialisée dans les mondes fantastiques (fiche sur la page Invités, lien Instagram, emplacement photo).
- **Page photographes** : les accrédités passent en pastilles compactes avec pop-up de fiche (infos et liens officiels) ; blocs officiels / accrédités / albums différenciés par couleurs ; section générique « Des artistes de l'instant » retirée.

### Modifié
- **Maître Frelon masqué** de tout le site (venue incertaine) : accueil, page Invités, gestionnaire de photos et réponse du chatbot. Tout est conservé en commentaire — réactivable en un instant s'il confirme.

## [0.34.0] - 2026-07-10

### Ajouté
- **Alerte « mise à jour de la base requise »** : après un déploiement qui ajoute des migrations, un bandeau rouge apparaît en haut de toutes les pages du back-office (super admin) avec un bouton « Appliquer maintenant » — fini les erreurs 500 silencieuses faute de migration.
- **Visibilité des photographes** : sur la page Photographes du back-office, décochez ceux qui ne doivent pas apparaître sur le site (annuaire et albums). Le choix survit aux ré-imports et au cron.
- **Officiels et accrédités séparés** sur la page « Nos photographes » : « Nos photographes officiels » d'abord (ordre alphabétique), puis « Vous pourrez aussi rencontrer : » pour les accrédités. Le statut vient du forfait.

### Corrigé
- **Import photographes en erreur (500)** : un champ « expérience » trop long était refusé par la base — colonne élargie, champs normalisés (spécialités reçues en chaîne converties en liste, textes tronqués défensivement). Vérifié contre l'API réelle.
- La page de réglages s'appelle désormais simplement **« Photographes »**.

## [0.33.0] - 2026-07-10

### Ajouté
- **Albums des anciennes éditions** sur la page « Nos photographes » : sous l'annuaire, les albums des **photographes officiels** des éditions passées, triés de la plus ancienne à la plus récente — vignette, nombre de photos et lien direct vers l'album sur le site des photographes. Au back-office : liste de tous les événements avec **cases à cocher** pour choisir les éditions affichées ; l'import (bouton + cron) rafraîchit l'annuaire **et** les albums cochés.

## [0.32.0] - 2026-07-09

### Ajouté
- **Page « Nos photographes » branchée sur l'API Festorga Photographe** : nouveau connecteur (même principe que La Comte / Orgexpo) avec menu « Photographes (accrédités) » dans le back-office — sélecteur d'événement, test de connexion, bouton « Importer dans le site ». La page du site remplace la zone iframe par un **annuaire natif** : avatar, pseudo, crédit photo, spécialités, bio, liens (portfolio, réseaux) et bouton « 📷 Voir ses photos » vers la galerie publique de chaque photographe. Rafraîchi automatiquement par le cron (import + journal), servi depuis le cache local (rapide, résiste aux pannes de l'API).

## [0.31.0] - 2026-07-03

### Ajouté
- **Espace Partenaires** : nouveau menu « Partenaires » dans le back-office (nom, lien, logo — PNG/SVG transparent conservé, ordre et publication). Sur le site : section « Nos partenaires » sur l'accueil (cartes cliquables, masquée si aucun partenaire) et rangée de logos en bas de **toutes** les pages, au-dessus du pied de page.

## [0.30.0] - 2026-07-03

### Ajouté
- **Appareil de confiance (2FA)** : après un code validé, cochez « Faire confiance à cet appareil pendant 30 jours » — le code n'est plus redemandé sur ce navigateur. Désactiver ou réenrôler la 2FA invalide automatiquement tous les appareils de confiance.

### Modifié
- **Fini les déconnexions à répétition** : la session passe de 2 h à **7 jours** d'inactivité, et « Se souvenir de moi » est coché par défaut à la connexion.
- **Médiathèque plus fluide** : le glisser-déposer d'une image ne recharge plus la page (déplacement instantané, compteurs mis à jour, petite confirmation).
- **Sélecteur « Bibliothèque » unifié** : dans le menu Photos, le choix d'une image affiche désormais les **dossiers** de la médiathèque (fil d'Ariane + navigation), comme dans le module Médiathèque.

## [0.29.0] - 2026-07-03

### Ajouté
- **Notes de version** : nouvelle page du back-office qui liste les nouveautés de chaque version, la plus récente en haut.
- **Adresses web propres** : les pages du site ont des adresses lisibles (`/le-theme`, `/univers`, `/concerts`…) au lieu des noms techniques. Les anciennes adresses redirigent automatiquement (rien ne casse).
- **Médiathèque organisable** : nouveau menu avec dossiers / sous-dossiers (3 niveaux), rangement des images par glisser-déposer, et bouton « Importer toutes les images du site » (sans doublon).
- **Logos personnalisables** : le logo du back-office et celui du site public se changent depuis « Paramètres du site » (transparence conservée).
- **Chasse aux clés** : les 4 badges à gagner sont nommés et illustrés (Guilde des Marchands, Explorateur, Dragonologue, Cartographe), avec la mention « dans la limite des stocks ».
- **Nouveaux cadres photo** : le TCG Yggdrasil Coliséum (accueil + thème), l'illustration Drakenfjord (thème), la soirée concerts, le badge d'Ambassadeur (personnages), l'image de remplacement des vignettes et l'affiche officielle sont désormais remplaçables depuis le menu Photos.
- **Cron OVH fiabilisé** : script dédié `cron/run.php` (plus besoin d'URL ni de jeton) + journal des exécutions visible dans « Import auto (Cron) ».

### Modifié
- **Accueil** : footer rééquilibré en 4 colonnes (avec liens pratiques et pages légales).
- **Univers** : couleurs réharmonisées avec le reste du site.
- **Invités** : rôles d'Arthur Pestel réordonnés (voix de Rustik en premier).
- **Le thème** : phrase Drakenfjord adoucie ; **Créateurs** : mise en page aérée (citation entre les deux blocs de texte).
- **Assistant Yggi** : la bulle flottante devient un « ? » plus explicite ; sur mobile, l'assistant s'ouvre depuis le menu (« Vous avez une question ? »).

### Corrigé
- **Formulaires du back-office** : les erreurs de validation s'affichent désormais clairement (bandeau rouge) — fini les réglages qui semblaient ne pas s'enregistrer (ex. mode « en construction »).

## [0.28.0] - 2026-06-30

### Ajouté
- **API v2 La Comte / Orgexpo** : prise en charge des données enrichies. **Sélecteur d'événement** (menu déroulant chargé depuis `/events/` et `/evenements.php`) dans les pages de réglage — fini la saisie manuelle de l'ID. **Filtrage par statut** : seuls les dossiers **validés** sont importés et affichés (les options/refusés sont ignorés). **Fiche troupe** festorga (logo, site, réseaux, email, description) + galerie `photos`. **Catégorie** (typologie) des exposants orgexpo. API publiques `/activities` et `/exposants` enrichies.

## [0.27.0] - 2026-06-30

### Ajouté
- **Base de connaissances enrichie** : 60 questions/réponses générées à partir du contenu réel du site (dates, lieu, accès, billetterie, invité d'honneur, concerts/artistes, spectacles, univers, personnages, chasse aux clés, Ygg, créateurs, infos pratiques), en 8 catégories. Bouton **« Importer la base de départ »** (idempotent, n'écrase pas vos articles) — fonctionne en local et en prod sans CLI. Données dans `database/data/festival-knowledge.json` + `FestivalKnowledgeSeeder`.
- **Page Base de connaissances repliable** : articles regroupés en **sections (catégories)** repliables, **« Base de connaissance générale » en premier**, chaque question **pliable/dépliable**, bouton **« Plier / déplier tout »**, filtre amélioré.

## [0.26.0] - 2026-06-30

### Ajouté
- **Carrousels d'images** : dans le menu Photos, chaque emplacement peut être passé en **carrousel** (case à cocher) avec un **intervalle réglable** (défaut 2 s) et l'ajout de **plusieurs images** (slides). Côté site, l'image concernée défile automatiquement — **flèches** sur les `<img>` (bannières, vignettes) et **défilement auto** sur les fonds CSS. Optimisation serveur appliquée aussi aux slides. Endpoint public `GET /api/v1/carousels`, runtime dans `site-dynamic.js`. Donne du dynamisme à l'accueil et aux pages.

## [0.25.0] - 2026-06-30

### Modifié
- **Optimisation des images garantie côté serveur** : chaque upload (et chaque affectation depuis la médiathèque) est désormais redimensionné (≤ largeur max) et recompressé en JPEG progressif **sur le serveur** (service `ImageOptimizer`, GD), en plus de l'optimisation navigateur. Fini les images en pleine résolution (ex. 6016×4016 / 13 Mo) si le canvas n'a pas pu s'exécuter. La commande `photos:optimize` réutilise le même service (support PNG/WebP, aplatissement de la transparence).

## [0.24.0] - 2026-06-30

### Ajouté
- **Bannière photo optionnelle par page** : chaque page intérieure peut recevoir une photo d'en-tête (`header-<page>.jpg`) via le menu Photos. Si présente, elle recouvre l'illustration SVG (avec dégradé de lisibilité) ; **sinon l'illustration reste** (repli automatique `onerror`). Géré par une règle unique dans `header.css` (le texte reste toujours au-dessus). 12 emplacements « Bannière de page » ajoutés au gestionnaire.

## [0.23.0] - 2026-06-30

### Ajouté
- **Optimisation en masse des images** : commande `php artisan photos:optimize` (options `--width`, `--quality`, `--threshold`, `--force`, `--library`) + **bouton « Optimiser les images »** dans le menu Photos (utile sur mutualisé sans CLI). Redimensionne à la largeur max et recompresse en JPEG progressif, met à jour dimensions/poids en base, conserve les crédits.

### Performance
- Images existantes optimisées : **~27 Mo économisés** (ex. `fantastique.jpg` 4,6 Mo → 379 Ko) — meilleur temps de chargement et score Lighthouse.

## [0.22.0] - 2026-06-30

### Ajouté
- **Médiathèque** : chaque image uploadée est désormais **archivée** (copie dédoublonnée par contenu) dans `public/img/library/`. Bouton **« 📚 Bibliothèque »** à côté de « Choisir une photo » : ouvre une galerie pour **réutiliser** une image déjà importée sur n'importe quel emplacement (en un clic, sans réupload). Rattrapage automatique des images déjà présentes sur le site.

## [0.21.2] - 2026-06-30

### Modifié
- **Photos rangées dans un dossier dédié `public/img/`** (au lieu de la racine). Les images existantes y ont été déplacées, toutes les pages du site repointées vers `/img/…`, ainsi que l'image de repli du JS, l'image de partage SEO par défaut et la page « en construction ». Le gestionnaire de photos enregistre désormais dans `public/img/`.

## [0.21.1] - 2026-06-30

### Modifié
- **Gestionnaire de photos basé sur les vraies images du site** : les emplacements correspondent désormais aux images réellement référencées par chaque page (scan des pages). L'upload écrit le fichier à son **emplacement réel** (racine publique) → l'image apparaît directement sur le site. « Manquante » = fichier absent. Les images **partagées** entre plusieurs pages sont synchronisées (un seul fichier, mis à jour partout). Compteur précisant les images uniques.

## [0.21.0] - 2026-06-30

### Ajouté
- **Gestionnaire de photos** (menu « Photos », Sources & contenus) : upload **page par page** en accordéon (page → emplacement, chacun repliable). Upload à gauche / **aperçu à droite**, tout en AJAX (sans rechargement). **Optimisation automatique** (redimensionnement + compression côté navigateur). **Lecture EXIF du crédit** (Artist/Copyright) avec champ éditable pré-rempli. **Compteurs X/X** global, par page et par emplacement pour repérer les images manquantes. Glisser-déposer. Photos stockées dans `public/site/photos/` (versionnées, incluses au déploiement).

## [0.20.0] - 2026-06-30

### Ajouté
- **Suivi d'audience propriétaire (Temps 2)** : analytics **maison, cookieless et anonyme** (l'IP n'est jamais stockée ; hachage quotidien non réversible pour les visiteurs uniques). Beacon léger injecté sur le site, endpoint `POST /api/v1/track` (respect du *Do Not Track*, exclusion des robots). Suivi des **clics billetterie** (conversion).
- **Tableau de bord « Statistiques »** (vue direction) : pages vues, visiteurs uniques, courbe par jour, pages populaires, sources de trafic, appareils, et engagement (billetterie, FAQ, chatbot, leads). Sélecteur 7/30/90 jours.

## [0.19.0] - 2026-06-30

### Ajouté
- **SEO (Temps 1)** : pages du site vitrine servies via Laravel avec **injection SEO côté serveur** — `canonical`, **Open Graph / Twitter** (aperçus de partage), favicon, et **données structurées JSON-LD** (`Festival`/Event, `Organization`, et `FAQPage` alimentée par la base de connaissances). Génération de **`sitemap.xml`** et **`robots.txt`** dynamiques. Lazy-loading automatique des images. Réglages SEO dans « Paramètres du site » (URL publique, image de partage, réseaux, dates/lieu, vérification Search Console).
- Le mode « en construction » s'applique désormais à **toutes** les pages publiques (plus seulement l'accueil).

### Modifié
- Pages HTML du site déplacées de `public/` vers `resources/site/` (servies par le contrôleur). Suppression du `robots.txt` statique qui bloquait l'indexation.

## [0.18.0] - 2026-06-29

### Modifié
- **Base de connaissances — édition en ligne** : page repensée en éditeur « une seule page ». Chaque article est une carte modifiable directement (question, réponse, catégorie, mots-clés, publication) avec **enregistrement automatique** (débounce + indicateur d'état par carte), bouton **Nouvel article** instantané, **filtre** en direct, boutons IA par carte, et stats (chatbot / FAQ). Endpoints JSON `knowledge.quick` et `knowledge.autosave`.

## [0.17.0] - 2026-06-29

### Ajouté
- **Réinitialisation de mot de passe** par e-mail (lien à durée limitée) : pages « Mot de passe oublié » / « Nouveau mot de passe », notification française, réponse neutre anti-énumération, mot de passe fort exigé. Lien ajouté sur la page de connexion.
- **Sauvegarde BDD automatisée** : commande `db:backup` (mysqldump + rétention GFS 7j/4s/12m via `DatabaseBackupService`), planifiée quotidiennement et déclenchée une fois par jour par le cron HTTP (utile sur mutualisé). Le module Base de données réutilise ce service.
- **Bandeau « développement »** configurable (`DEV_BANNER_*`), affiché hors production, pilotable depuis l'éditeur `.env`.

### Sécurité
- Tag Git de version posé à chaque déploiement (à partir de `v0.17.0`).

## [0.16.2] - 2026-06-29

### Modifié
- **Menu back-office réorganisé** : « Catégories » masqué du menu (toujours fonctionnel en interne, juste retiré de la navigation). Nouvelle section **« Sources & contenus »** regroupant Liens (menu Pro), La Comte, Orgexpo et Intégrations (iframes).

## [0.16.1] - 2026-06-29

### Ajouté
- **Menu « Import auto (Cron) »** (Super Admin) : mode d'emploi OVH pas à pas, URL du déclencheur (avec jeton), état des dernières synchros, et bouton d'import manuel.

### Supprimé
- Route de diagnostic temporaire `/__diag` (le 500 de prod est résolu).

## [0.16.0] - 2026-06-29

### Modifié
- **Renommage « Festorga » → « La Comte »** dans toute l'interface (menu, page, libellés, éditeur .env). Les identifiants techniques internes restent inchangés.

### Ajouté
- **Import automatique régulier** des sources : commande groupée `sources:import` (planifiée toutes les heures) + **déclencheur HTTP** `GET /api/v1/tasks/import?token=CRON_TOKEN` pour un cron externe (recommandé sur mutualisé). Voir `CRON.md`.

### Tests
- 59 tests : déclencheur d'import (jeton requis, lance les deux imports).

## [0.15.0] - 2026-06-29

### Modifié
- **Éditeur `.env` convivial** : remplacé le textarea brut par un **formulaire à champs labellisés et groupés** (Application, Base de données, E-mail, IA, Intégrations). Secrets en champ masqué (avec bouton afficher), booléens en menu Activé/Désactivé. Les commentaires et clés non listées du `.env` sont **préservés**. Un mode « édition avancée (texte brut) » reste disponible. Menu renommé « Configuration (.env) ».

## [0.14.2] - 2026-06-29

### Corrigé
- **Déploiement / 500 en prod** : le workflow excluait tout `storage/framework/*`, si bien que sur un serveur vierge ces dossiers n'existaient pas → Laravel ne pouvait pas compiler les vues (500 partout, y compris `/install`). Le workflow déploie désormais la structure `storage/` (fichiers `.gitignore`) ; seuls les `*.log` et le cache compilé restent exclus.

## [0.14.1] - 2026-06-29

### Modifié
- **Installateur** : demande désormais aussi l'**email** et le **mot de passe** de l'administrateur (validés : min. 10 car., maj/min/chiffre/spécial). Le compte Super Admin est créé avec ces identifiants (plus de mot de passe par défaut à changer).

## [0.14.0] - 2026-06-29

### Ajouté
- **Vrai installateur web** : `/install` fonctionne désormais **même sans `.env`** (middlewares cookies/session/CSRF contournés sur cette route). Si le `.env` est absent, l'installateur demande la **config base de données**, **génère l'`APP_KEY`**, **crée le `.env`** (vérif de la connexion BDD avant écriture), puis lance migrate + seed. Débloque la 1re mise en ligne sur mutualisé sans SSH.

### Tests
- 56 tests verts.

## [0.13.5] - 2026-06-29

### Modifié
- **Footer du site harmonisé** : passage du marron au dégradé **navy + liseré or**, titres dorés, liens animés — cohérent avec l'en-tête et les sections. Appliqué aux 13 pages via la feuille partagée.

## [0.13.4] - 2026-06-29

### Corrigé
- **Images cassées** (festorga renvoie parfois une URL de photo en 404) : ajout d'un repli automatique `onerror` → l'image du header s'affiche dès qu'une photo échoue à charger (404 ou URL vide), sur toutes les tuiles et pop-up (troupes, animations, créateurs).

## [0.13.3] - 2026-06-29

### Modifié
- **Troupes & animations sans photo** : même fond de repli que les exposants (image du header), sur les tuiles et les pop-up.

## [0.13.2] - 2026-06-29

### Modifié
- **Exposants** : on n'affiche plus ceux **sans numéro de stand** (filtré dans l'API publique). Les exposants **sans photo** reçoivent un **fond de repli** (image du header `ffl-header.jpg`), sur la tuile et la pop-up.

## [0.13.1] - 2026-06-29

### Modifié
- **Tuiles Animations** : description tronquée à **6 lignes** avec « … », **clic = ouverture en grand** (pop-up détail), et **images cadrées en haut** (`object-position: top`). Le cadrage haut s'applique aussi aux tuiles troupes/créateurs.

## [0.13.0] - 2026-06-29

### Ajouté
- **Créateurs / exposants en natif** (page Créateurs) via l'API **orgexpo** : tuiles côte à côte (une par exposant), clic → **pop-up** avec la fiche (photo, description, emplacement, **site web + Facebook + Instagram**). Fini l'iframe créateurs.
- **Menu back-office « Orgexpo (exposants) »** : ID événement, test de connexion, import ; clé `ORGEXPO_API_KEY` côté serveur.
- **Cache** `orgexpo_exposants` (colonne `status` prévue), commande `orgexpo:import` planifiée, API publique `GET /api/v1/exposants` (clés normalisées site/facebook/instagram).

### Tests
- 55 tests (152 assertions) : import orgexpo, API exposants normalisée, accès admin.

## [0.12.0] - 2026-06-29

### Modifié
- **Troupes** : affichage en **tuiles côte à côte** (une par troupe). Au clic, une **pop-up** s'ouvre par-dessus le site avec la fiche de la troupe (ses animations en cartes ; emplacements pour site web / réseaux sociaux prévus, affichés dès que la donnée sera disponible).
- **Animations** : la page liste désormais **toutes les activités festorga en tuiles**, avec filtres par type (cases à cocher cumulables : stand / spectacle / déambulation). La liste d'exemple est masquée quand les données réelles sont chargées.

### Note
- L'API festorga `/activities` fournit le nom de la troupe et ses animations (image, description, univers, emplacement) mais **pas le site web ni les réseaux sociaux** : ces liens apparaîtront automatiquement quand la source les exposera (ou via un futur petit éditeur back-office).

## [0.11.0] - 2026-06-29

### Ajouté
- **Éditeur de `.env`** dans le back-office, **réservé au Super Admin** (Administration → Éditeur .env). Utile sur hébergement mutualisé (sans SSH) pour régler BDD, clés API, mail, etc. Sécurités : **sauvegarde automatique** avant écriture (`storage/app/backups`), **garde-fou APP_KEY** (refus si absent/vide), vérification d'accès en écriture, `config:clear` après enregistrement, journal d'audit.

### Tests
- 52 tests (144 assertions) : accès Super Admin, refus non-super, garde-fou APP_KEY (sans écrire le vrai fichier).

## [0.10.0] - 2026-06-29

### Ajouté
- **Annuaire des troupes natif** sur le site (page Troupes) alimenté par festorga : fini l'iframe. Cartes par troupe (image, type, univers, emplacement, description) avec **filtres en cases à cocher cumulables** par type (stand / spectacle / déambulation).
- **Cache local** des activités (`festorga_activities`) : import via bouton back-office (« Importer dans le site ») + commande `festorga:import` planifiée toutes les heures. Purge automatique des activités retirées.
- **API publique** `GET /api/v1/activities` servie depuis le cache (rapide, résiliente, clé jamais exposée).
- Colonne `status` prévue dès maintenant pour un futur **tri par statut** (cases à cocher cumulables), quand l'API festorga l'exposera.

### Modifié
- L'iframe « Troupes » est retirée (remplacée par l'annuaire natif) ; le réglage iframe « troupes » disparaît (créateurs/photographes conservés).

### Tests
- 49 tests (138 assertions) : import en cache, API activités, service festorga.

## [0.9.0] - 2026-06-29

### Ajouté
- **Menu de réglage Festorga** (back-office) : connexion à l'API festorga pour récupérer les activités (stands, spectacles, déambulations) et les troupes d'un événement. Champ « ID événement » + bouton « Tester la connexion » qui affiche l'événement, le nombre d'activités et de troupes. La **clé API reste côté serveur** (`FESTORGA_API_KEY` dans le `.env`, jamais exposée).
- `FestorgaService` (appel API + résumé), réglage `festorga_event_id`, config `services.festorga`.

### Notes
- L'API festorga n'expose **que les activités validées/publiques** (endpoint `/activities`) : pas de statut de dossier ni d'endpoint dossiers/troupes séparés.

### Tests
- 47 tests (132 assertions) : service festorga (résumé), enregistrement de l'événement, test de connexion.

## [0.8.1] - 2026-06-29

### Corrigé
- **Header unifié sur tout le site** : une feuille commune `public/site/header.css` (le header v2 de l'accueil) est chargée après le CSS de chaque page. Corrige les divergences mobiles (certaines pages basculaient en menu burger dès 920px au lieu de 760px) → en-tête identique partout, surtout sur mobile.

## [0.8.0] - 2026-06-28

### Ajouté
- **Intégrations iframe pilotées par le back-office** : nouvelle page **Intégrations (iframes)** pour coller l'URL des annuaires Créateurs / Photographes / Troupes (table `site_embeds`). Les pages du site récupèrent l'URL via `/api/v1/site` et l'injectent automatiquement (plus besoin d'éditer le HTML).
- **Hauteur d'iframe réglable** par intégration : remède au scroll interne (une iframe cross-domaine ne pouvant pas mesurer sa hauteur). Bonus : `site-dynamic.js` écoute un `postMessage` de hauteur si la source coopère.

### Tests
- 44 tests (124 assertions) : API iframes, configuration d'une intégration.

## [0.7.0] - 2026-06-28

### Ajouté
- **Déploiement automatique** vers OVH mutualisé (`.github/workflows/deploy.yml`) : à chaque push sur `main`, build des dépendances dans le runner puis téléversement FTPS vers `fflv2/`. Secrets : `FTP_HOST`, `FTP_USER`, `FTP_PASSWORD`.
- **Installateur web** `/install` (mise en ligne sans SSH) : lance migrations + seed initial, **auto-désactivant** dès qu'un compte existe, protégé par `INSTALL_TOKEN` optionnel. Fonctionne avant toute migration (sans session/CSRF).

### Modifié
- `.env.example` : `SESSION_DRIVER`/`CACHE_STORE` passés à `file` (recommandé mutualisé), ajout d'`INSTALL_TOKEN`. Procédure de déploiement OVH réécrite dans `DEPLOY.md`.

### Tests
- 42 tests (118 assertions) : installateur (création des données, auto-désactivation).

## [0.6.0] - 2026-06-28

### Ajouté
- **FAQ du site alimentée par la base de connaissances** (source unique de vérité) : fini la double maintenance. Les questions sont **triées par popularité** (compteur d'ouvertures), les plus consultées en haut.
- **Suivi des ouvertures FAQ** : compteur `faq_opens` par question, visible dans le back-office (colonne « FAQ » à côté de « Chatbot »).
- **API** : `GET /api/v1/faq` (questions triées) et `POST /api/v1/faq/{uuid}/open` (incrémente le compteur).
- Le widget expose `window.Yggi.open()` pour ouvrir le chat depuis n'importe quel bouton.

### Modifié
- Le **formulaire de contact** de la page Infos & FAQ est remplacé par un **bloc convivial « Demandez à Yggi »** qui ouvre l'assistant IA (la capture de demande se fait via le chatbot, qui transmet à l'équipe s'il ne sait pas répondre).

### Tests
- 40 tests (110 assertions) : FAQ (contenu, tri par popularité, incrément d'ouverture).

## [0.5.0] - 2026-06-28

### Ajouté
- **Module de mise à jour de la base de données** (Super Admin) : état des migrations, application des migrations en attente **avec sauvegarde mysqldump automatique au préalable**, sauvegardes manuelles listées (`storage/app/backups`). Détection auto de mysqldump (ou `MYSQLDUMP_PATH`).
- **Prévisualisation** : un utilisateur connecté voit toujours le vrai site, même quand le mode « en construction » est actif (cookie `ygg_preview` + bypass serveur).

### Modifié
- **Page « en construction » redessinée** : thème clair et festif (crème, or, étincelles) au lieu du fond sombre.
- Typographie française : espace fine insécable avant `! ? : ;` (corrige le « ! » isolé en bout de ligne).

### Tests
- 37 tests (103 assertions) : module BDD (accès, migration), bypass construction connecté.

## [0.4.0] - 2026-06-28

### Ajouté
- **Menu « Pro » sur le site** : accès aux inscriptions externes (exposants, troupes, bénévoles, presse, photographes, stages). Les liens sont gérés dans le back-office.
- **Page « Liens » dans le back-office** (CRUD) : libellé, URL, ordre, publication. Pré-rempli avec les vraies URLs (orgexpo, Airtable, ammy) ; un lien sans URL n'apparaît pas.
- **URL de billetterie modifiable** depuis les Réglages : tous les boutons « Réserver » du site la reprennent dynamiquement (plus besoin d'éditer chaque page).
- **Mode « site en construction »** activable d'un clic dans les Réglages : affiche une page d'attente (nom, dates, lieu, affiche, accroche, note, liens Pro, bouton billetterie) et redirige les pages internes vers l'accueil. Contenu repris du site d'attente officiel.
- **API publique `GET /api/v1/site`** : billetterie, état du mode construction et liens Pro, consommée par le site via un script partagé (`/site/site-dynamic.js`).

### Technique
- Table `site_links` + modèle + seeder ; réglages `billetterie_url`, `site_construction`, `construction_slogan`, `construction_note`.
- Isolation des tests renforcée : purge du cache des réglages entre chaque test.

### Tests
- 32 tests (94 assertions) : API site, mode construction, CRUD liens, billetterie modifiable.

## [0.3.0] - 2026-06-28

### Ajouté
- **Site vitrine intégré** : les 13 pages publiques du Festival (accueil, univers, concerts, animations, FAQ, etc.) + visuels sont désormais servis par l'application (dossier `public/`). La racine `/` affiche l'accueil ; le back-office reste sur `/login` et `/admin`. Un seul dépôt, un seul déploiement.
- **Widget de chat « Yggi » embarqué** sur toutes les pages du site (même origine, sans CORS).
- **Formulaire de contact branché** (Infos & FAQ) sur `POST /api/v1/contact` avec **case de consentement RGPD** obligatoire, retours succès/erreur.
- Docs du site archivées dans `docs/site/` (guide d'intégration Elementor, liste des assets à fournir).

### Modifié
- `Content-Security-Policy` étendu aux Google Fonts (`fonts.googleapis.com` / `fonts.gstatic.com`) utilisées par le site vitrine.
- Route `/` : sert l'accueil public au lieu de rediriger vers le login.

### Tests
- 28 tests (84 assertions) : ajout de la couverture du site public (racine + login).

### À faire (contenu, par l'organisation)
- Déposer les ~27 images + la vidéo dans `public/` (voir `docs/site/ASSETS_A_FOURNIR_FFL_2026.md`) — sinon des placeholders s'affichent.
- Mettre l'URL Billetweb de l'édition 2026 (variable `BILLETTERIE` dans les pages) et les 3 URLs d'iframes (créateurs/photographes/troupes).

## [0.2.0] - 2026-06-28

### Ajouté
- **2FA TOTP** (RFC 6238, sans dépendance) : obligatoire pour Super Admin et Admin, optionnelle pour les éditeurs. Activation par QR code, défi à la connexion, secret chiffré en base, désactivation protégée par mot de passe.
- **RGPD** : export JSON d'un lead, corbeille avec restauration et **effacement définitif** (droit à l'oubli).
- **Pages légales** rédigées (mentions, confidentialité avec registre des traitements, CGU, cookies) + bandeau cookies CNIL (accepter/refuser).
- **Sécurité connexion** : verrouillage après 5 tentatives (15 min), en-tête **Content-Security-Policy** complet, HSTS `preload` en production.
- **CI/CD** : GitHub Actions (Pint + PHPUnit), configuration Pint, codebase entièrement formaté.
- **Documentation API** : spec OpenAPI 3.1 (`/openapi.yaml`) + Swagger UI (`/api/docs`).
- **Écosystème** : endpoint public `POST /api/v1/contact` (formulaire du site vitrine → lead + mail orga), **webhooks Hub signés HMAC-SHA256** (inactifs si non configurés).
- **Tableau de bord IA** enrichi : coûts (jour/mois/total), tokens cumulés, répartition par usage.
- **Confort** : recherche globale **Ctrl/⌘ + K**, export **CSV** des leads, carte d'onboarding au premier login, **persistance** de la conversation du widget (localStorage, historique rejoué).

### Corrigé
- Chatbot : faux positifs de recherche dus aux mots vides (« est », « comment », mots interrogatifs) qui matchaient par sous-chaîne. Ajout d'une liste de stopwords ; le test « question inconnue » passe désormais.

### Tests
- 26 tests (78 assertions) : chatbot, 2FA, permissions, sécurité/lockout, RGPD, contact/webhook, recherche, export CSV.

### Notes de périmètre (documentées, non implémentées en code)
- Installateur web `install.php` et module de migration BDD : la procédure artisan (`migrate --seed`) tient lieu d'équivalent validé (déploiement en ligne).
- Backups (spatie/laravel-backup), monitoring Sentry et notifications in-app : nécessitent secrets/services externes — à brancher selon l'hébergement.

## [0.1.0] - 2026-06-28

### Ajouté
- Socle Laravel 11 (MVC), structure de dossiers, documentation racine.
- Authentification (login/logout, hash bcrypt, throttle, régénération de session).
- Rôles : Super Admin, Admin, Éditeur + middleware de contrôle.
- Base de connaissances éditable (catégories + articles question/réponse).
- Chatbot public (API `/api/v1/chat`) : recherche dans la base, réponse via Claude limitée à la base, sinon capture de l'email et envoi à `ORG_CONTACT_EMAIL`.
- Widget de chat embarquable (`public/widget/chat-widget.js`).
- Journal d'audit, journal d'usage IA, réglages, gestion des leads et conversations.
- Soft delete (corbeille), en-têtes de sécurité, pages légales + bandeau cookies.
- Seeders : rôles, Super Admin, réglages, base de connaissances initiale (FAQ du festival).

### Sécurité
- CSRF sur les formulaires, requêtes préparées (Eloquent), CORS strict sur l'API du widget, rate limiting sur le chat et le login.

### À venir (roadmap)
- 2FA TOTP obligatoire Super Admin/Admin (champs déjà présents).
- CI/CD GitHub Actions, suite de tests (objectif 70 %), module de migrations BDD UI, API OpenAPI/Swagger, intégration Hub (SSO + webhooks).
