EDU-SCHOOL EDU-SCHOOL Documentation

Stack technique

CoucheTechnologie
LangagePHP 8.1 ou supérieur
FrameworkSymfony 6.4 LTS
ORMDoctrine ORM 3 + Doctrine Migrations
Base de donnéesMySQL / MariaDB
VuesTwig, Bootstrap 5.3, Font Awesome 6
AssetsSymfony AssetMapper (pas de build Node requis), Stimulus, Turbo
PDFDompdf — bulletins, reçus, états
ExcelPhpSpreadsheet — imports et exports
PaginationKnpPaginatorBundle — 50 lignes par page sur toutes les listes
FichiersVichUploaderBundle, elFinder (gestionnaire de fichiers), CKEditor
DiversQR codes (endroid), PHPMailer, Guzzle

Organisation du code

src/
 ├── Controller/          Contrôleurs HTTP (un par module)
 │    ├── Api/            API mobile REST (ed_photo)
 │    ├── Portal/         Portails parent et élève
 │    └── Concern/        Traits partagés entre contrôleurs
 ├── Entity/              Entités Doctrine (modèle de données)
 ├── Repository/          Requêtes métier
 ├── Form/                Types de formulaires
 ├── Service/             Logique métier réutilisable
 ├── Security/            Authentificateurs et voteurs
 └── Twig/                Extensions Twig

templates/                Vues, une arborescence par module
 ├── base.html.twig       Layout principal (sidebar, topbar, footer)
 ├── components/          Composants réutilisables (page_header, macros…)
 └── documentation/       Cette documentation

config/                   Configuration (packages, routes, services)
migrations/               Migrations Doctrine
public/                   Racine web
docs/                     Notes techniques détaillées par module

Modèle de données — les entités centrales

EntitéRôle
School, SchoolGroupÉtablissement et regroupement d'établissements.
SchoolYearAnnée scolaire ; borne la quasi-totalité des données.
StudentRéférentiel d'identité de l'élève. Ne porte aucune donnée de scolarité.
RegistrationInscription : élève × année. Porte classe, niveau, statut, bourse, frais.
PreRegistrationDemande d'admission, avec ses PreRegistrationDocument.
Cycle, Level, Faculty, Round, ClassroomStructure pédagogique.
Subject, SubjectType, Course, TimeSlot, RoomMatières et emplois du temps.
Period, Evaluation, GradePériodes, évaluations et notes.
Bulletin, BulletinLineBulletins scolaires.
Absence, AbsenceTypeAbsences et assiduité.
Fee, StudentFee, FeeScheduleFrais du niveau, frais dus par l'élève, échéanciers.
Payment, CashRegister, CashDeposit, DepenseEncaissements, caisses, versements bancaires, dépenses.
AccountingAccount, AccountingEntry, AccountingPeriodClosure, BankReconciliationComptabilité.
Employee, Contract, SalaryComponent, PayrollPeriod, PayslipRH et paie.
UserCompte de connexion et rôles.
Notification, ActivityLogNotifications internes et journal d'activité.

Les entités rattachées à un établissement implémentent SchoolOwnedInterface (ou MultiSchoolOwnedInterface quand elles en concernent plusieurs) : c'est ce marqueur qui pilote le filtrage par contexte.

Services métier

La logique non triviale est extraite des contrôleurs dans src/Service/ :

ServiceResponsabilité
SchoolContextServiceÉtablissement et année courants ; socle du filtrage.
EnrollmentService, RegistrationManagerTransformation d'une préinscription validée en inscription, sans duplication d'élève.
FeeAssignmentServiceRattachement automatique des frais du niveau à l'élève inscrit.
GradeCalculationServiceMoyennes pondérées, rangs, données des bulletins.
AttendanceServiceTaux d'assiduité et détection des élèves à risque.
AccountingServiceGénération automatique des écritures comptables.
PayrollServiceCalcul des bulletins de salaire (CNPS, ITS, rubriques).
RecouvrementService, ArriereManager, ArriereImporterSoldes, relances, arriérés et leur import.
PaymentReceiptServiceGénération des reçus PDF.
MatriculeGenerator, CodeGeneratorMatricules élèves et codes de référence.
NotificationService, ActivityLoggerNotifications internes et traçabilité des actions.
ParentPortalService, ParentContextServiceDonnées et contexte de l'espace parent.
StudentAccountManager, UserEmployeeServiceComptes élèves ; liaison compte utilisateur ↔ employé.

Sécurité

  • Pare-feu main — deux authentificateurs : MainAuthenticator (personnel et parents, par identifiant ou e-mail) et StudentAuthenticator (élèves, par matricule).
  • Pare-feu api — sans état, ApiTokenAuthenticator sur jeton porteur.
  • Limitation — 3 tentatives de connexion par 2 minutes.
  • Rôles hiérarchisés — voir la rubrique Rôles et permissions.
  • CSRF — jeton exigé sur les formulaires et les actions sensibles.

Conventions de développement

  • Les listes paginent à 50 éléments via KnpPaginator, avec le partial _pagination.html.twig.
  • Les en-têtes de page utilisent le composant components/page_header.html.twig.
  • Les suppressions passent par le trait HandlesEntityDeletion, qui intercepte les contraintes de clé étrangère et affiche un message clair.
  • Les confirmations de suppression s'appuient sur SweetAlert2 via l'attribut data-confirm.
  • Charte graphique : navy #1e3a5f et émeraude #10b981, thèmes clair et sombre.