Skip to content

Release v1.1.0 - #309

Merged
horacioskrp merged 12 commits into
mainfrom
develop
Sep 3, 2026
Merged

Release v1.1.0#309
horacioskrp merged 12 commits into
mainfrom
develop

Conversation

@horacioskrp

Copy link
Copy Markdown
Collaborator

Release v1.1.0 vers main.

Jeu de démonstration complet (toutes classes ≥ 20 élèves, données togolaises réelles) + correctifs de bulletin (colonne Composition vide au rendu, logo d'en-tête, catégorie de composition) + colonne « Classe » → « Devoir ».

Voir CHANGELOG.md (1.1.0). CI validée sur la PR #308.

🤖 Generated with Claude Code

horacioskrp and others added 12 commits September 3, 2026 12:25
Les seeders de référence posaient le squelette (classes, matières, barèmes)
mais laissaient l'application vide : 50 élèves sans inscription, aucune note,
aucune facture, aucun bulletin. Impossible de montrer Dalibi sans saisir les
données à la main.

DemoSeeder remplit une année scolaire cohérente sur six classes (un niveau par
cycle) : 183 élèves inscrits avec dossier complet, programme et affectations
des enseignants, évaluations notées selon une distribution en cloche, bulletins
figés du premier trimestre, facturation passée par InvoiceService (reçus et
écritures de caisse compris), présences quotidiennes, emploi du temps et trois
cycles de paie couvrant les états payé / validé / brouillon.

Le niveau de chaque élève est tiré une fois puis réutilisé sur toutes ses
matières : sans cela le classement serait un tirage au sort et les bulletins
n'auraient aucun sens. Les retenues légales (CNSS, ITS) sont activées, sinon
brut et net resteraient égaux sur toute la paie.

Seeder idempotent et déterministe : réexécutable sans doublon, mêmes données
d'une machine à l'autre. Interdit en production comme les autres seeders de
démonstration.

fix(seeders): StudentTestSeeder écrivait un statut d'inscription invalide

Le seeder posait status = 'paid'/'unpaid', valeurs remplacées par
PENDING/ACTIVE/CANCELLED lors du changement de contrainte. La migration
correspondante ignore SQLite, donc les tests passaient alors que toute
inscription échouait sur PostgreSQL — d'où 50 élèves pour 3 inscriptions.
Le balayage des tables après le premier jet en laissait dix vides : la
démonstration s'arrêtait aux gros modules et plusieurs écrans restaient
muets. Sont désormais alimentés :

- calendrier scolaire (22 événements), dates dérivées des périodes réelles
  plutôt qu'écrites en dur, plus les fêtes légales togolaises et les sessions
  d'examens officiels déjà enregistrées ;
- moyennes par matière : l'écran Notes lit la table `grades`, distincte des
  notes d'épreuves, et restait vide alors que les bulletins se calculent
  depuis les évaluations. La moyenne y est consolidée, pondérée par le
  coefficient de l'épreuve comme le fait la saisie manuelle ;
- justificatifs d'absence, réclamations de notes, inscriptions aux examens
  officiels, primes du personnel et documents délivrés ;
- archives et pièces du dossier élève, avec un PDF réellement écrit sur le
  disque « secure » : sans fichier, le premier clic sur « télécharger »
  renverrait un 404.

Ces PDF utilisent une police interne plutôt que DejaVu Sans, embarquée dans
chaque fichier : 1,8 Ko au lieu de 850 Ko, soit 220 Ko au total contre 38 Mo
à sauvegarder pour rien.

fix(seeders): sexe et prénom des enseignants générés indépendamment

Le sexe était tiré après le prénom, ce qui produisait des « Pauline »
déclarées masculines dans la liste des enseignants.
Les élèves étaient tous rattachés à Lomé/Maritime/Golfe avec des adresses
générées par Faker (« 27 rue Roche »), sans rapport avec le Togo. La carte
géographique des statistiques n'affichait qu'un point et la couverture
plafonnait à 72,7 %.

Ajoute un extrait des divisions administratives réelles (database/data/
togo-localites.json), tiré de la base Togonou : 5 régions, 40 préfectures et
un échantillon de localités par préfecture (3 827 au total). L'extraction
répare les doubles encodages UTF-8/CP850 présents dans la source, retire les
précisions cadastrales entre parenthèses et écarte les 47 entrées
irrécupérables.

Le recrutement suit la réalité d'un établissement de Lomé : deux élèves sur
trois viennent du Grand Lomé (Golfe, Agoè-Nyivé), le reste des autres régions
avec un poids décroissant selon l'éloignement — un tirage uniforme aurait
donné un quart d'élèves venus des Savanes. Adresses à la togolaise (quartier
et repère plutôt qu'un numéro de rue).

Couverture géographique portée à 100 %, 20 préfectures représentées.
Les noms venaient de Faker fr_FR (Besson, Levy, Pelletier), sans rapport avec
le Togo. Ajoute trois listes de noms togolais authentiques — prénoms masculins
et féminins (prénoms « jour de naissance » éwé/mina majoritaires, prénoms
courants, quelques prénoms du Nord, musulmans et chrétiens) et patronymes
(noms éwé/mina/guin, noms du Nord, familles afro-brésiliennes de Lomé) — puis
tire tous les noms (élèves, enseignants, parents, contacts d'urgence) dans ces
listes selon le sexe.

Les prénoms restent cohérents avec le sexe enregistré, et le nom de famille du
père suit celui de l'élève (cohérence familiale), la mère gardant son nom de
jeune fille.
L'en-tête ministériel du bulletin est rendu par DocumentRenderer, mais le CSS
du bulletin n'embarquait aucun style `.mh-*` : le logo, sans plafond de taille,
s'affichait à sa dimension naturelle (450×450 px) et écrasait tout l'en-tête.

Inclut `DocumentRenderer::headerCss()` dans le CSS du bulletin — méthode déjà
prévue pour les documents qui ne reprennent pas tout le baseCss. Le logo est
désormais plafonné à 68 px et l'en-tête à trois colonnes (ministère, logo,
république) reprend sa mise en forme (filets, tailles de police).
…ompo)

Le calcul Classe/Compo du bulletin distingue les évaluations par la catégorie
de leur type : « continu » (note de classe) contre « composition » (examen).
Dans la base de dev, le type « Composition » avait dérivé en catégorie
« continu » — résultat : la colonne Compo du bulletin restait vide, la
composition était diluée dans la note de classe, et la moyenne contournait la
pondération Classe/Compo du barème (compo null → repli sur classe seul).

Le seeder de référence (ExamenTypeSeeder) est correct ; c'est la donnée qui
avait divergé. DemoSeeder rétablit désormais les catégories avant de créer les
évaluations (ensureEvaluationTypeCategories), pour que la démo reste cohérente
quelle que soit la dérive des données de référence.
Le libellé par défaut de la colonne de contrôle continu passe de « Classe » à
« Devoir », convention plus parlante sur les bulletins. Seul l'affichage change :
la clé et la source restent « classe », donc la colonne agrège toujours le
contrôle continu (interro + devoir) et la moyenne continue de combiner ce total
avec la composition.

Les modèles existants portant encore le libellé par défaut sont réalignés ; un
libellé déjà personnalisé par une école n'est pas écrasé.
Le jeu de démo ne remplissait que six classes ; les quinze autres restaient
vides. DemoSeeder couvre désormais toutes les classes actives, avec un effectif
plancher de 20 élèves (variation déterministe 20–24 pour les classes sans
effectif dédié) et les effectifs spécifiques conservés pour la variété.

Toutes les étapes en aval itèrent déjà sur l'ensemble des classes : programme,
affectations, évaluations, notes, moyennes, factures, présences, emploi du temps
et bulletins suivent automatiquement. Résultat : 21 classes peuplées, 507 élèves,
507 bulletins, contre 183 auparavant. Seeder toujours idempotent (complément
jusqu'à l'effectif cible, sans doublon).
La colonne « note » de source « composition » était résolue par
`$line['composition']`, mais le snapshot du bulletin stocke cette valeur sous la
clé « compo » (comme le renvoie subjectClasseCompo). Résultat : la colonne Compo
restait vide au rendu, y compris quand la note existait — indépendamment de la
période et du barème.

Le rendu fait désormais correspondre la source « composition » à la clé « compo »
du snapshot. Correctif purement d'affichage : aucun bulletin à régénérer, la
donnée était déjà présente dans le snapshot.
Le calendrier s'ouvre sur le mois d'aujourd'hui, or le jeu de démo groupait ses
événements en début et fin de période — laissant le mois courant vide. À
l'ouverture, la démo paraissait donc « sans marquage » alors que l'année en
comptait partout ailleurs, et que le rendu colore bien par type.

Ajoute cinq événements ancrés sur la date du jour (réunion de coordination,
journée sportive, semaine de devoirs surveillés, sortie pédagogique, réunion
parents-professeurs), de types et couleurs variés, pour que le calendrier
s'affiche peuplé et coloré dès l'ouverture.
Release v1.1.0 — jeu de démo complet + correctifs bulletin
@horacioskrp
horacioskrp merged commit 127d3fc into main Sep 3, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant