# Journal des évolutions — BatiPro33 ODS

Format : SemVer (MAJOR.MINOR.PATCH).

- **MAJOR** — refonte structurelle ou changement cassant (auth, schéma DB).
- **MINOR** — nouveau module ou nouvelle fonctionnalité. Section `### NEW`.
- **PATCH** — correction de bug, hotfix, ajustement. Section `### FIX`.

À chaque livraison : ajouter une entrée en haut, mettre à jour `includes/version.php` (`APP_VERSION` + `APP_VERSION_DATE`). L'affichage se propage automatiquement dans la sidebar admin, la page de connexion et le dashboard.

---

## v2.12.0 — 2026-07-01

### NEW
- **Attestation de fin de formation — génération et envoi automatique** (`templates/documents/attestation_fin.html`, `includes/document-functions.php`, `includes/attestation-fin-sender.php`, `cron/attestation_fin_auto.php`) — nouveau document `attestation_fin` disponible dans l'onglet Documents dès que le parcours est terminé (statut `TERMINE` ou `date_fin_calculee` passée). Contient la formation suivie, la période effective, le motif de fin (fin normale / abandon / exclusion / rupture anticipée), et les durées **réalisées** — total, dont centre (présences signées) et dont entreprise (jours planifiés en stage). Envoi automatique par email au stagiaire :
  - **En direct** à la clôture du parcours par un événement à impact (`abandon` / `exclusion_definitive`) depuis la fiche stagiaire.
  - **Via cron quotidien** (`cron/attestation_fin_auto.sh`) pour les fins naturelles (par défaut fenêtre 7 jours glissants ; flags `--dry-run`, `--all`, `--since-days=N`, `--stagiaire-id=NN`).
  Idempotent : trace la date d'effet dans `documents_generes.chemin_fichier` pour ne pas renvoyer 2× tant que la fin de parcours n'est pas modifiée. Log dans `communications` (`template_code = 'attestation_fin'`) et journal applicatif. Migration `migrations/2026_07_attestation_fin.sql` (ajout de la valeur `attestation_fin` à `documents_generes.type_document`).

---

## v2.11.3 — 2026-06-29

### NEW
- **Absences formateurs — déclaration d'une demi-journée** (`pedagogie/formateur/admin_absences.php`) — la modale « Nouvelle absence » offre désormais un toggle « Absence d'une demi-journée seulement » qui permet de saisir une seule date + un seul créneau (Matin / Après-midi). Le mode plage de jours conserve les sélecteurs matin/après-midi sur les dates de début et de fin (utile pour les absences mixtes type "à partir du jeudi après-midi jusqu'au vendredi matin"). Migration colonnes `periode_debut` / `periode_fin` (ENUM MATIN/APRES_MIDI) sur `formateur_absences` — défaut MATIN/APRES_MIDI = journée complète, donc rétrocompatible. Affichage du tableau enrichi (demi-journée indiquée sous la date, durée affichée en « ½ journée » le cas échéant).

---

## v2.11.2 — 2026-06-23

### FIX
- **Quiz Live — changer sa réponse avant validation** (`pedagogie/quiz/play.php`, `api/state.php`) — pour les questions à une seule bonne réponse, taper une autre tuile **remplace** désormais la sélection précédente (comportement radio) au lieu de l'ajouter en multi-sélection. Les questions à plusieurs bonnes réponses conservent le toggle multi-select. Hint UI explicite selon le cas. Le payload `state.php` expose `nb_bonnes` (uniquement le compte, pas les IDs corrects) pour piloter le mode côté client.

---

## v2.11.1 — 2026-06-19

### FIX
- **Synthèse heures — export XLSX/CSV « tous les centres »** (`emargement/synthese-heures.inc.php`) — le bouton Excel restait sans effet quand `site_id=0` (tous les sites) et qu'aucun formateur n'était sélectionné : la garde historique exigeait `siteId > 0 || formateurFilter > 0`, donc la branche d'export était sautée et la page renvoyait du HTML normal. Remplacée par `$hasFilter` (= formulaire soumis), ce qui couvre aussi l'export année entière / tous sites. Le fichier produit s'appelle `tableau-heures-Tous_les_centres-YYYY-MM.xlsx`.

---

## v2.11.0 — 2026-06-19

### NEW
- **Module Tickets Resto — remises multiples par mois** — refonte du sous-module logistique TR. Plusieurs distributions (« lots ») peuvent désormais être enregistrées pour un même mois, regroupées par `lot_uuid`. Nouvelle table `tr_remises` (1 ligne = 1 stagiaire servi à 1 date) découplée de `tr_distributions` (qui devient le calcul d'éligibilité du mois). Vendeur (utilisateur connecté), date, mode de paiement, notes et snapshot du tarif stockés ligne par ligne. Migration `migrations/2026_06_tr_remises_multi.sql`.
- **Page « À distribuer » revue** (`logistique/tickets-resto.php`) — TR à remettre = **0 par défaut** (plus de pré-remplissage au max). Toggle « Inclure stagiaires déjà servis » (par défaut OFF → stagiaires ayant ≥ 1 remise cachés). Plafond non bloquant : input déplafonné avec alerte visuelle inline si dépassement + récap dans la modale ; les lignes en dépassement sont marquées `depassement=1` pour traçabilité, mais l'enregistrement reste autorisé. Saisie groupée en lot via la modale « Enregistrer la remise ».
- **Mode de paiement par ligne** — nouvelle colonne « Mode » dans le tableau de distribution : chaque stagiaire peut avoir son propre mode (Espèces / Chèque / Virement / CB) au sein d'un même lot. Mode du lot = défaut appliqué aux lignes laissées sur « — défaut — ».
- **Page Historique des remises** (`logistique/historique-tr.php`) — récap mensuel : lots groupés par date DESC, détail expandable des stagiaires servis, cumul mois (TR distribués, encaissé, coût OF, dépassements). Bordereau PDF généré par lot et suppression d'un lot (réversion) accessibles depuis cette vue.
- **Dashboard annuel TR** (`logistique/dashboard-tr.php`, admin / coord / service administratif) — KPIs mois courant + cumul YTD, saisie inline du budget annuel (`parametres.tr_budget_annuel_YYYY`), barre de progression colorée, projection de la date d'atteinte 100 % au rythme YTD (pattern module heures). Table 12 mois avec ventilation par mode de paiement (Espèces / Chèque / Virement / CB) en sous-colonnes + totaux annuels.
- **Bordereau PDF par lot** — `api/logistique/bordereau.php` revu : prend désormais un `lot_uuid` et génère le bordereau de la remise précise (date, mode, vendeur). Colonne `lot_uuid` ajoutée à `tr_bordereaux` pour traçage. CSV récap aligné.
- **Export CSV enrichi** — colonnes « Nb remises / TR déjà remis / Restant / Encaissé / Dernière remise » sur l'export des distributions.

### FIX
- **`api/logistique/save-remise.php`** — simplifié : ne touche plus aux colonnes legacy `tr_remis` / `date_remise` / `mode_paiement` / `montant_paye` (devenues obsolètes après refonte) ; ne sert plus qu'à ajuster `nb_jours_entreprise` (et donc le max attribuable du mois).
- **`logistique/ventes.php`** — réécriture sur `tr_remises` (l'ancienne vue lisait `tr_distributions.tr_remis` qui n'est plus alimenté). Recherche multi-période / mode / stagiaire conservée.
- **`api/logistique/bulk-remise.php`** retiré (remplacé par `save-lot-remise.php`).

---

## v2.10.0 — 2026-06-17

### NEW
- **Module Notification d'exclusion temporaire** — courrier PDF officiel pour les événements stagiaire de type `exclusion_temporaire` (motif + période + date de retour), envoyable par email (PDF en PJ) ou par SMS (lien court). Boutons disponibles côté admin / coord / ASP (`fiche-stagiaire.php`) ET côté formateur (`pedagogie/detail_stagiaire.php`). Référence `EXT-{id}-{annee}`.
- **Overlay "exc.t." sur feuilles d'émargement** — les demi-journées couvertes par un événement `exclusion_temporaire` s'affichent automatiquement, sans matérialisation en base (réversible, pas d'impact parcours).
- **Onglet Événements côté formateur** — parité avec les ASP / admin : boutons Avenant contrat / Lettre d'avertissement / Email / SMS dans l'interface formateur (`pedagogie/detail_stagiaire.php`).
- **Versionning + CHANGELOG** — affichage de la version (sidebar / login / dashboard) avec lien vers ce journal.

---

## v2.9.0 — 2026-06-16

### NEW
- **Module Dossier rémunération Région** — bouton sur la fiche stagiaire qui télécharge un ZIP des 6 pièces administratives (CNI, RIB, CPAM, France Travail, attestation non-droit, BL) avec conversion automatique image → PDF.

### FIX
- **Repair backfill événements / parcours** — restauration de 8 parcours actifs écrasés à tort en `TERMINE` par le backfill de la veille (re-inscriptions post-abandon). Scripts dédiés + archivage des entrées legacy.
- **Filtre `non_retenu` uniformisé** — ajout du filtre `non_retenu = 0` dans index stagiaires, synthèse heures, PDF, dashboard formateur, cron SMS (cas ISSA ABDALLAH 838 chez Brisotto).

---

## v2.8.0 — 2026-06-15

### FIX
- **Audit événements / parcours / émargement** — 4 fixes consolidés :
  - Date d'effet abandon prend en compte `nouvelle_date_fin` (cas DUVILLIER 483).
  - Synchronisation miroir `parcours_formation` → `stagiaires` lors des suspensions / prolongations / arrêts.
  - Blocage de la suppression d'un événement impactant (rollback via "Réintégrer").
  - Filet de sécurité `date_sortie_reelle` dans 4 filtres d'émargement (`tablette.php`, `cron/emargement_sms.php`, `feuille-emargement-pdf.php`, `api/dashboard-emargement/data.php`).
- **Backfill 8 fiches legacy** désynchronisées entre `stagiaires.date_sortie_reelle` et `parcours_formation.statut` (ODP : ARENAS, CHEVALOBRE, ZIANI, CAZAUX, PEREZ, SANCHEZ ; ODS : MORSE).

---

## v2.7.2 — 2026-06-11

### FIX
- **Doublons demi-journées émargement** — dédup massive : 155 doublons `PRESENT` éliminés (≈ 590 h fantômes), 31 signatures formateur résolues, réconciliation dashboard ↔ synthèse heures (entreprise / fériés / fermetures).
- **Signature de retard → création émargement** — signer un retard depuis `retards.php` crée désormais l'émargement de la demi-journée correspondante (sinon « non signé » sur tablette).
- **Import ODP Belin-Béliet** — script d'import ciblé manuel (delta complet trop risqué — recrée des doublons), signatures incluses.

---

## v2.7.1 — 2026-06-10

### FIX
- **`SMS::send()` shape de retour** — bug historique sur `retards.php`, `send-signature-link.php`, `avertissement-send.php` : le code attendait `['ok' / 'error']` alors que la méthode renvoie `['success' / 'message']`.
- **Unification ID formateur SOEN** — migration des références legacy `ancien_formateur_id` 19 → 5 dans 4 tables. Règle : `formateurs.id == utilisateurs.id` partout.

### NEW
- **Flag `est_formateur` (Aussi formateur)** — colonne `utilisateurs.est_formateur` + reconstruction vue `formateurs`. Admins / coord peuvent devenir formateurs via toggle dans `gestion-utilisateurs.php`.

---

## v2.7.0 — 2026-06-08

### NEW
- **Dashboard émargement live** — matrice site × demi-journée + comparaison ODP saisie manuelle + auto-refresh 30 s. Jour de bascule ODP → ODS pour tous les sites sauf Belin-Béliet (branché le 2026-06-11).
- **Statut `EN_ATTENTE` stagiaire** — un parcours `EN_ATTENTE` masque le stagiaire de l'émargement et de la file active formateur. Accessible coord / admin / administratif ; boutons fiche + réintégration recalcul planning.
- **Rôle tablette borne** — compte dédié par tablette, accès restreint à 3 pages (émargement / QR / retards), site verrouillé, signature overlay plein écran.
- **Tablette émargement** — proxy QR local `api/qrcode.php` (fix Samsung), bouton envoi SMS, poubelle suppression émargement tracée. Allowlist `tabletteAllowedScripts()` pour tout endpoint tablette.

### FIX
- **Événement → impact parcours** — la case "impact" clôture ou décale vraiment le parcours (abandon / exclusion → `TERMINE`, suspension → `SUSPENDU`).
- **Corrections émargement** — la tablette exclut désormais les stages en entreprise ; abandon / exclusion pose `date_sortie_reelle` et purge les absences fantômes (jamais les présences signées).
- **Credentials formateurs** — envoi des accès à 12 formateurs, nouvelle colonne `mot_de_passe_provisoire` + page de changement forcée.
- **`requireLogin()` chemin absolu** — `/login.php` (chemin absolu) ; depuis `/emargement/`, un chemin relatif donnait 404.

---

## v2.6.0 — 2026-06-05

### NEW
- **Module Logistique — Tickets Resto HSP** — sous-module TR (centre + entreprise), tarif historisé, distribution mensuelle, off par défaut. Placeholder Achat matériaux.

### FIX
- **PHPMailer / Guzzle déclarés dans `composer.json`** — historiquement posés à la main dans `vendor/`, un `composer install` propre les supprimait → erreur fatale envoi de mails. Fix : `phpmailer/phpmailer:^6.9` (v6.12.0).

---

## v2.5.0 — 2026-06-04

### NEW
- **Durées alternance dynamiques** — durées centre / entreprise des contrats et annexes calculées à la volée (planning + stages).
- **Module admin de re-signature** — pour les documents signés mais erronés (champ `superseded_at`).

### FIX
- **Nettoyage table prescripteurs** — 533 → 55 entrées (471 "Contact" parasites supprimés + fusions). Édition référent depuis `modifier-stagiaire.php`. Convention `MAJUSCULES_UNDERSCORE`.

---

## v2.4.0 — 2026-05-28

### MAJOR
- **Migration ODP → ODS** — 261 stagiaires + 11 020 émargements + signatures historisées importés depuis l'ancien outil ODP. Patch `nbh` ODP → `emargements.heures_reelles`, cumul OF aligné à ±0,3 h sur ODP page 951.

### NEW
- **Module Dossiers incomplets** — page matrice GED + endpoints relance email / SMS + actions en bulk.

### FIX
- **Synthèse heures** — XLSX coloré, motifs détaillés, fix lundi formateur.

---

## v2.3.0 — 2026-05-27

### NEW
- **Multi-parcours par stagiaire** — colonne `parcours_formation.archived_at`, onglet "Sessions antérieures" sur la fiche stagiaire, filtre `archived_at IS NULL` partout.
- **Fusion doublons** — `admin-fusion-stagiaires.php` + journal `stagiaire_create`.

### FIX
- **Dédup import "née / né / épouse"** — normalisation `strip` dans `importer-fiche.php`.
- **Import dédup + rattachement** — détection doublons (nom + prenom + date_naissance normalisés) avant `INSERT`, écran de rattachement qui `UPDATE` la fiche existante + lève `non_retenu`.

---

## v2.2.0 — 2026-05-20

### NEW
- **Module Fiches temps ASP** — suivi temps réglementaire Région (4 catégories), saisie hebdo + alerte dashboard + cron mail + export PDF / CSV.
- **Module Ateliers collectifs** — séances datées + filtre éligibles + QR signature + CR Quill / IA + observation par stagiaire dans dossier pédagogie (distinct du module Atelier IA individuel).

---

## v2.1.0 — 2026-05-16

### NEW
- **Module IA Usage Tracking** — `admin-ia-usage.php` : tracking tokens / coûts par feature / stagiaire, fetch rétroactif via API admin OpenAI / Anthropic.
- **Module Espace Mobile stagiaire** — hub `/m/` + auth magic link SMS, planning / docs / messages / émargement direct / profil, bouton admin "Accès mobile" sur la fiche stagiaire.

---

## v2.0.0 — 2026-05-15

### MAJOR (breaking)
- **Refonte sidebar role-aware + auth multi-rôles** — 7 rôles (`tuteur_entreprise`, `assistant`, `accompagnateur_socio`, `formateur`, `service_administratif`, `coordinateur`, `administrateur`) + registre modules activables (`config/modules.php`, `config/roles.php`). Helper `getMenuForRole()`.
- **Tableau de bord formateur unifié** — `pedagogie/index.php` remplace `pedagogie/formateur/dashboard_formateur.php` (qui devient un stub-redirect).

### NEW
- **Module Atelier (pédagogie active IA)** — REAC injectés ciblés, matrice 7 sections + PDF dompdf, carte sur `pedagogie/bibliotheque.php`.

---

## v1.6.0 — 2026-05-14

### NEW
- **Module ECF (Évaluations en Cours de Formation) — Phases 1 → 4** — catalogue (18 TP), saisie autosave, signatures tactiles, clôture conditionnée (6 critères), PDF dompdf.

---

## v1.5.0 — 2026-05-13

### NEW
- **Import Word IA** — `DocxImporter` (extraction OOXML + OpenAI gpt-4.1) → 14 templates de positionnement / pré-positionnement en prod.
- **Module Quiz Live (Kahoot-like)** — `pedagogie/quiz/` : QR + lobby live + scoring Kahoot, polling 1,5 s. Module activable, désactivé par défaut.
- **Module Stages en entreprise — Phase 1** — périodes + accordéon + plannings (Phase 2 conventions PDF + signature à venir).
- **Providers IA branchés** — OpenAI + Anthropic + Alter-Go (Ollama self-hosted, IP whitelist 185.31.41.85 requise), choix du modèle par app dans `parametres.php`.
- **Preview QR positionnement** — bouton "Tester avec QR" + wizard mobile + auto-correct numérique étendu.

### FIX
- **Extraction prescripteur** — fix scan (Structure de suivi + Référent), script `retraiter-prescripteurs-recents.php`.

---

## v1.4.0 — 2026-05-11

### NEW
- **Module Positionnement** — tests pré-positionnement / positionnement métier + admin builder (sections / groupes / questions, drag & drop, modals) + page stagiaire + correction.
- **Pédagogie SMS via Keyyo** — `pedagogie/index.php` branché. Cron `envoi_quotidien.php` toujours sur `NullProvider` (à brancher).

---

## v1.3.0 — 2026-05-04

### NEW
- **Module ASP (Accompagnement Socio-Professionnel)** — entretiens 1-1 + CR manuel ou IA (Whisper → OpenAI / Anthropic) + signature stagiaire via QR code. Configuration IA dans `asp-parametres.php` (provider, modèle, prompts).
- **Événements stagiaire + avenant contrat** — 7 types ENUM (incl. `suspension_parcours`, `prolongation_parcours`), génération PDF "avenant" via `generate-avenant-contrat.php` (renommé depuis "annexe").
- **Communication email + log unifié** — `send-email.php` + modale dans la fiche stagiaire ; les emails ASP loguent dans `communications`.
- **Pack signature auto + convocation** — 5ᵉ document `convocation_formation` + auto-mail des 6 PJ post-signature.
- **Invitations + reset mot de passe** — création utilisateur envoie un mail d'invitation (token), login a un lien "mot de passe oublié", helpers `includes/mailer.php`.

---

## v1.2.0 — 2026-04 (mise en production)

### NEW
- Mise en production sur AlwaysData (compte `benech`, MariaDB mutualisée), domaine `https://ods.batipro33.fr`. Migration de l'environnement de dev vers la prod.
- Sous-applications branchées : `pedagogie/` (autoévaluations stagiaires), `emargement/` (émargement QR), `batistat/` (tableaux de bord), `chatbot.php`.

---

## Legacy (pré-prod) — héritage des entrées initiales du repo

### [1.1.0] — 2024-11-16

#### Ajouté
- 📝 Documentation complète du projet avec README amélioré
- 📋 Guide de contribution (CONTRIBUTING.md)
- 📜 Changelog pour suivre les versions
- 🔧 Fichier ENV-EXEMPLE.txt avec configuration complète
- 🐙 Initialisation du dépôt GitHub avec historique propre
- 📊 Badges de version et compatibilité dans le README

#### Corrigé
- 🐛 Corrections mineures dans la documentation de la GED
- 🔒 Mise à jour du .gitignore pour exclure les fichiers sensibles

### [1.0.0] — 2024-11-09

#### Ajouté
- ✨ Système complet de gestion des stagiaires
- 📁 Gestion Électronique de Documents (GED) — dépôt sécurisé, liens temporaires, visualisation, inventaire automatique.
- ✍️ Système de signature électronique — portail multi-documents, SignaturePad.js, PDFs signés, traçabilité.
- 📅 Module Planning — vue globale par stagiaire et par jour, codes couleur formation, synchronisation jours fériés français.
- 🏢 Référentiels — sites, formations, financeurs, prescripteurs.
- 📧 Automatisation des emails — réception IMAP/POP3 (depuis abandonnée pour upload manuel), extraction PDF, génération auto, notifications.
- 🔐 Sécurité — auth par tokens, CSRF, PDO préparé, validation uploads.
- 🎨 UI — Bootstrap 5, responsive, modals.

### [0.9.0] — 2024-10-27

#### Ajouté
- 🏗️ Architecture de base.
- 📊 Dashboard principal.
- 👤 Gestion basique des stagiaires.
- 📄 Templates de documents HTML.
- 🗄️ Schéma de base de données initial.
