Skip to content

Develop - #342

Merged
horacioskrp merged 84 commits into
mainfrom
develop
Nov 13, 2026
Merged

horacioskrp merged 84 commits into
mainfrom
develop

Conversation

@horacioskrp

Copy link
Copy Markdown
Collaborator

📋 Description

🔗 Issue liée

Closes #

🧩 Type de changement

  • ✨ feat — Nouvelle fonctionnalité
  • 🐛 fix — Correction de bug
  • ♻️ refactor — Refactorisation (sans changement de comportement)
  • 🎨 style — Mise en forme / UI (sans logique)
  • 🧪 test — Ajout ou correction de tests
  • 📝 docs — Documentation
  • 🔧 chore — Maintenance, configuration, dépendances

✅ Checklist

  • Mes commits suivent la convention (voir CONTRIBUTING.md)
  • Les commentaires de code documentent le pourquoi, en français, là où c'est utile
  • J'ai ajouté / mis à jour les tests (php artisan test passe au vert)
  • Le build passe (npm run build)
  • J'ai ajouté la route dans resources/js/helpers/route.ts si une route a été créée
  • J'ai ajouté l'entrée de migration et l'ai exécutée (php artisan migrate)
  • La page occupe toute la largeur (w-full) et respecte le design existant
  • Pas de secret ni d'identifiant en clair dans le code

🧪 Tests effectués

📸 Captures d'écran (si UI)

📝 Notes pour la relecture

horacioskrp and others added 30 commits October 21, 2026 10:56
Met en place l'internationalisation :
- Fichiers de langue Laravel (lang/fr, lang/en : menu, common, settings)
  partagés à React via Inertia (langue active + repli FR).
- Hook t() maison (resources/js/helpers/i18n.ts).
- Langue liée au profil (colonne users.locale) + middleware SetLocale.
- Sélecteur de langue dans Paramètres → Apparence (PATCH /settings/language).
- Catalogue des langues (App\Constants\Locales), défaut FR.
- Coquille traduite : menu latéral et fil d'ariane.

Tests : bascule de langue (persistance, langue invalide rejetée, partage).
feat(i18n): support multilingue FR/EN (infra + coquille)
…gin)

- Dropdown utilisateur (Paramètres, Déconnexion) via t().
- Sous-navigation des Paramètres (onglets Profil / Mot de passe / 2FA /
  Apparence + en-tête « Mon compte ») via t().
- Page de connexion (titres, libellés, boutons) via t().
- Ajout des fichiers lang auth (fr/en) et de settings.account_desc.
- Fichiers lang dashboard (fr/en) : en-tête, alertes, cartes KPI,
  sections, graphes, moyens de paiement, tableau impayés, section
  enseignant et état vide.
- dashboard.tsx : tous les libellés via t(), maps de libellés
  (méthodes, statuts, motifs) déplacées dans le composant, fil
  d'Ariane et titre de page traduits.
- Fichiers lang students (fr/en) : liste (stats, recherche, filtres,
  tri, tableau, actions groupées, suppression) et fiche détaillée
  (identité, contact, dossier administratif, parents & médical,
  pièces jointes, documents délivrés, portail, dialogues).
- Students/Index.tsx et Students/Show.tsx : libellés via t(),
  badges genre/statut et libellés d'admission dans le composant,
  dates localisées selon la langue active.
- Réutilise common.actions / common.status pour les actions génériques.
- Groupe lang students.form (fr/en) : titres create/edit, libellés
  d'étapes, sections, champs, placeholders, photo, et récapitulatif.
- student-form-steps.tsx : tous les libellés, étapes, sections,
  boutons et récapitulatif via t() ; genre/admission/statut traduits.
- Create.tsx / Edit.tsx : en-têtes et titres de page via t().
- students.php (fr/en) : groupes history, import_page et stats_page.
- History.tsx : parcours, cartes, tableau et statuts de paiement via t() ;
  dates localisées.
- Import.tsx : étapes, modèle CSV, résultats et erreurs via t().
- Stats.tsx : KPI, graphes (sexe, âge, effectifs par classe), filtres
  cycle/tri et infobulle via t().
…FR/EN)

- Nouveaux fichiers lang roster et promotion (fr/en).
- Roster/Index.tsx : filtres, cartes, tableau, statuts de paiement,
  actions groupées et dialogue de statut via t().
- Promotion/Index.tsx : sélecteurs source/cible, stats, barre d'action
  et tableau via t().
- Nouveau fichier lang scholarships (fr/en) : groupes index, form et show.
- StudentScholarships Index/Create/Edit/Show : liste, filtres, pagination,
  formulaire d'attribution (recherche élève, bourse, année, dates, notes)
  et fiche détaillée via t() ; dates localisées selon la langue.
feat(i18n): coquille, tableau de bord et module Élèves (FR/EN)
- Nouveau fichier lang calendar (fr/en).
- Calendar/Index.tsx : en-tête, barre d'outils (navigation, vues, filtres),
  astuce drag & drop, dialogue création/édition et dialogue de suppression via t().
- Composants agenda/month/time-grid : libellés (jours, « journée »,
  poignée de redimensionnement, état vide) via t().
- Dates et noms de jours/mois localisés selon la langue active
  (date-fns fr/enUS, toLocaleDateString fr-FR/en-GB).
feat(i18n): module calendrier (FR/EN)
… création (FR/EN)

- Nouveau fichier lang enrollments (fr/en) : groupes index, form, edit,
  show et create.
- Index : cartes financières, filtres, tableau, badges statut/paiement,
  pagination et suppression via t().
- Edit / Show : formulaire et fiche détaillée (dont résumé facture) via t().
- Create : assistant 3 étapes (inscription, récapitulatif des frais,
  premier paiement) — recherche élève, modes de paiement, libellés et
  boutons via t().
- Dates localisées selon la langue active.
- enrollments.php (fr/en) : groupes invoice, invoice_doc et receipt.
- Invoice.tsx : suivi financier (récap, progression, détail, historique
  des paiements, formulaire d'ajout de paiement) via t().
- InvoicePrint.tsx : facture imprimable (en-tête officielle, lignes,
  totaux, montant en lettres, paiements reçus, signatures) via t().
- Receipt.tsx : confirmation d'inscription (mention conditionnelle de
  règlement, signatures) via t().
- Dates localisées selon la langue active.
feat(i18n): module inscriptions & paiements (FR/EN)
…sses (FR/EN)

- Nouveau fichier lang comptabilite (fr/en) : groupes verify, expense,
  receipt_doc, cash.
- Payments/Verify : vérification d'authenticité de reçu via t().
- Expenses/Create : formulaire de dépense, aperçu du solde, dernières
  dépenses via t().
- Payments/Receipt : reçu de paiement officiel (2 volets, montant en
  lettres, code de vérification) via t().
- Accounting/CashAccounts : gestion des caisses (formulaire, cartes,
  suppression) via t().
- Dates localisées selon la langue active.
…FR/EN)

- comptabilite.php (fr/en) : groupes dashboard, situation, tx.
- Accounting/Dashboard : KPI, graphe mensuel, situation par classe,
  élèves impayés, alerte renvoi via t().
- Accounting/Situation : filtres, résumé par classe, détail élèves,
  exports via t().
- Accounting/Transactions : journal, filtres, dates rapides, tableau,
  pagination, suppression de dépense via t().
- Dates localisées selon la langue active.

Module Comptabilité désormais entièrement traduit (7 écrans).
… détail) (FR/EN)

- Nouveau fichier lang examens (fr/en) : groupe templates (index, form,
  create, edit, show).
- EvaluationTemplates Index/Create/Edit/Show : liste filtrable, formulaire
  (période, type, coeff, barème), détail + déploiement par classe/matière,
  liste des évaluations générées via t().
- Dates localisées selon la langue active.
feat(i18n): comptabilité + examens (modèles) (FR/EN)
- examens.php (fr/en) : groupe evaluations (index, show).
- Evaluations/Index : filtres, tableau, clôture, progression via t().
- Evaluations/Show : stats, min/max/moyenne, tableau des notes via t().
- examens.php (fr/en) : groupe marks.
- Marks/Index : en-tête, stats, bannière de clôture, grille de saisie,
  absences, réclamations et pied récap via t() ; dates localisées.
- examens.php (fr/en) : groupes official (index, show) et planning.
- OfficialExams Index/Show : liste filtrable, création, inscriptions,
  saisie des résultats via t().
- Planning/Index : filtres classe/période, grille de planification des
  dates, édition inline, suppression via t().
- Dates localisées. Module Examens entièrement traduit (10 écrans).
- Nouveau fichier lang notes (fr/en) : groupe bulletins (index, edit).
- Bulletins/Index : filtres, validation/dévalidation, dialogues, tableau via t().
- Bulletins/Edit : appréciations par matière, discipline, décision via t().
horacioskrp and others added 29 commits November 13, 2026 10:01
feat(i18n): paramètres — vagues 2 à 4 (matières → structures de frais) (FR/EN)
feat(i18n): composants partagés — éditeur de texte riche & illustrati…
chore(phpstan): analyse statique Larastan (niveau 5 + baseline + CI)
- CashAccountController: la contrainte INCOME du withSum était ignorée
  (closure passée en 3e arg positionnel) → syntaxe tableau, total_income
  ne compte plus que les transactions INCOME.
- BackupService: garde l'échec de tempnam() (string|false) et retire le
  `! empty($chunk)` mort sur array_chunk.
- BulletinRenderer / PayrollService: retire le `!== null` redondant après
  isset().
- FrenchNumberSpeller: remplace le fallback hors-plage UNITS[$n] par une
  LogicException explicite.
- StudentTestSeeder: resolveAcademicYear() ne retourne jamais null, type
  de retour non-nullable + condition d'inscription simplifiée.
- HasMatricule / ArchiveController: type `self` sur la closure creating,
  retrait de la constante TYPES morte.
- Baseline régénérée : 47 faux positifs résiduels (alias de requêtes
  selectRaw/withCount, relations Spatie, auth multi-modèle Sanctum).
…line (47 → 0)

Niveau 5 désormais vert SANS baseline : le fichier phpstan-baseline.neon est
supprimé et son include retiré de phpstan.neon.

Typage honnête (pas de suppression) :
- Portail API (ApiController, AuthController, ChildrenController) : le principal
  authentifié est Student|Guardian (gardes Sanctum), annoté comme tel → instanceof,
  collect() et currentAccessToken() se résolvent.
- Lignes d'agrégat (Enrollment/StudentStats/Dashboard/Payroll) : résultats
  selectRaw/jointures typés via variables intermédiaires (object{...}).
- OfficialExam : @property-read pour les alias withCount.
- User / Student : relation Spatie roles et pivot guardian_student typés.
- TimetableController : closure $range et forme de la grille typées.

Vrais bugs corrigés au passage :
- ArchiveController : le libellé d'archive d'un élève affichait un nom vide
  (Student n'a pas de colonne « name ») → compose prénom + nom.
- Migration evaluations : ->after() était chaîné sur la définition de clé
  étrangère (ignoré) → réordonné pour positionner la colonne.
- Migration matricules : retrait d'un ->unique()->index() sans effet.

Code mort retiré (enums/colonnes NOT NULL → arms inatteignables) :
CashAccount::typeLabel, HasMatricule::method_exists.

DocumentRenderer : genre/date de naissance lus via getAttribute() (mixed) car
$student peut être un modèle NON persisté (aperçu/test) dont les colonnes NOT
NULL sont nulles — les gardes défensives sont conservées.

StatisticsService : unique suppression inline documentée (count() sur GROUP BY
+ HAVING ; un count() SQL compterait par groupe, pas les groupes).
…ederHardeningTest)

Un commit précédent avait retiré les `?->` sur $this->command, jugés superflus
par PHPStan (Seeder::$command est typé non-nul par le framework). Mais la
propriété vaut null quand run() est appelé directement, hors `db:seed` — ce que
font les seeders invoqués programmatiquement et SeederHardeningTest, d'où un
« Call to a member function warn()/info() on null » en CI.

- Rétablit `$this->command?->` dans les 5 seeders (comportement identique quand
  la commande console est présente, sûr quand elle est absente).
- phpstan.neon : règle ignoreErrors ciblée et documentée pour le faux positif
  nullsafe.neverNull sur Illuminate\Console\Command dans database/seeders.

Suite complète : 505 passants, 0 échec. PHPStan niveau 5 : vert.
chore(phpstan): analyse statique niveau 5 sans baseline (463 → 0)
…rité

`composer update` : résorbe l'intégralité des avis `composer audit`
(1 critique + ~10 high), désormais « No security vulnerability advisories found ».

Mises à jour notables :
- laravel/framework v12.54.1 → v12.72.0 (corrige CVE-2026-114509, bypass d'auth
  TokenGuard — critique pour le portail Sanctum)
- symfony/* 7.4.7 → 7.4.23, guzzle 7.10 → 7.16.1, commonmark 2.8.1 → 2.10.7,
  dompdf 3.1.5 → 3.1.6
- maatwebsite/excel 3.1.69 → 4.0.6 (majeur) et phpoffice/phpspreadsheet
  1.30.5 → 5.11.0 (majeur)

Adaptation à Excel 4 : StatisticsExport implémente désormais l'interface
marqueur Export (requise par Excel::download()).

Validation : composer audit vierge, PHPStan niveau 5 vert, suite complète
505 passants / 0 échec (dont l'I/O Excel).
Évite un futur saut de version majeur involontaire (la contrainte « * »
avait permis le passage silencieux de 3.x à 4.x). Versions inchangées
(4.0.6 satisfait ^4.0), composer audit toujours vierge.
chore(deps): mise à jour sécurité — résout 67 avis (dont CVE-2026-114509 critique)
@horacioskrp
horacioskrp merged commit ee9fd2c into main Nov 13, 2026
6 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