# EDUOS — Application web (Sprint 1)

Application de gestion des établissements d'enseignement.
**Stack :** PHP 8 · MySQL / MariaDB · Bootstrap (CSS maison à la charte ORELLE / EDUOS).

Ce dépôt correspond au **Sprint 1** du backlog (Livrable 7) : le socle
sécurité multi-établissements + authentification/rôles, et le module
**Administration**.

---

## 1. Périmètre livré (Sprint 1)

| Story | Fonctionnalité | État |
|-------|----------------|------|
| US-0.1 | Authentification (connexion / déconnexion, hash sécurisé) | ✅ |
| US-0.2 | Rôles et **cumul de rôles** (ex. Direction + Administration) | ✅ |
| US-0.3 | **Isolation multi-établissements** (chaque tenant ne voit que ses données) | ✅ |
| US-A.1 | Années scolaires (création, activation — une seule active) | ✅ |
| US-A.2 | Niveaux et **classes** | ✅ |
| US-A.3 | **Matières** et coefficients | ✅ |
| US-A.4 | **Apprenants** (dossier, matricule auto unique, affectation classe) | ✅ |
| US-A.5 | **Responsables légaux** (parents) et rattachement multi-enfants | ✅ |
| US-A.6 | **Enseignants** et **affectations** (enseignant × classe × matière) | ✅ |

Sécurité : mots de passe hachés (`password_hash`), requêtes préparées (PDO),
protection **CSRF** sur tous les formulaires, échappement systématique des
sorties, contrôle d'accès par rôle.

---

## 2. Prérequis

- PHP ≥ 8.1 avec l'extension `pdo_mysql`
- MySQL ≥ 8 ou MariaDB ≥ 10
- (Développement) le serveur web intégré de PHP suffit ; en production :
  Apache ou Nginx pointant sur le dossier `public/`.

---

## 3. Installation

```bash
# 1. Créer la base et un utilisateur
mysql -u root -p <<'SQL'
CREATE DATABASE eduos CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'eduos'@'localhost' IDENTIFIED BY 'eduos';
GRANT ALL PRIVILEGES ON eduos.* TO 'eduos'@'localhost';
FLUSH PRIVILEGES;
SQL

# 2. Charger le schéma et les données de démonstration
mysql -u eduos -peduos eduos < sql/schema.sql
mysql -u eduos -peduos eduos < sql/seed.sql
```

Configurer la connexion dans `config/config.php`, ou via des variables
d'environnement (recommandé) :

```bash
export EDUOS_DB_HOST=127.0.0.1
export EDUOS_DB_USER=eduos
export EDUOS_DB_PASS=eduos
export EDUOS_DB_NAME=eduos
```

---

## 4. Lancer l'application

```bash
# Serveur de développement (depuis la racine du projet)
php -S 127.0.0.1:8080 -t public public/index.php
```

Puis ouvrir <http://127.0.0.1:8080>.

En production, définir la **racine web (DocumentRoot) sur `public/`** — seul ce
dossier doit être exposé ; `src/`, `config/` et `sql/` restent hors du web.

---

## 5. Comptes de démonstration

Mot de passe commun : **`eduos2026`**

| Identifiant | Rôle(s) | Établissement |
|-------------|---------|---------------|
| `admin.alpha` | Direction + Administration | École Alpha |
| `admin.beta`  | Direction + Administration | Lycée Beta |
| `jean.traore` | Enseignant | École Alpha |
| `superadmin`  | Super-administrateur | (choix d'établissement à la connexion) |

> Pour vérifier l'**isolation multi-tenant** : connectez-vous en `admin.alpha`
> puis en `admin.beta` — chaque compte ne voit que les apprenants, classes et
> données de son propre établissement.

---

## 6. Architecture du code

```
eduos-app/
├── config/config.php        Configuration (BD, constantes)
├── public/
│   ├── index.php            Front controller (point d'entrée unique)
│   └── assets/css/app.css   Charte visuelle
├── sql/
│   ├── schema.sql           Schéma de base (Sprint 1)
│   └── seed.sql             Données de démonstration
└── src/
    ├── routes.php           Table de routage
    ├── Core/                Database, Router, Controller, Model, Auth, Csrf, Flash
    ├── Models/              Entités (User, Student, ClassRoom, …)
    ├── Controllers/         Un contrôleur par domaine
    └── Views/               Gabarits Bootstrap
```

**Multi-tenant :** le cœur de l'isolation est la classe `src/Core/Model.php`.
Toutes les requêtes des tables métier sont automatiquement filtrées par
`establishment_id` (issu de la session). Aucune donnée d'un autre établissement
ne peut être lue ou écrite, même en cas d'oubli dans un contrôleur.

> Note : MySQL ne propose pas de *row-level security* natif (contrairement à
> PostgreSQL évoqué dans le Livrable 5). L'isolation est donc garantie au
> niveau applicatif, de façon centralisée et systématique, via cette classe de base.

---

## 7. Suite (sprints suivants)

Conformément au backlog : personnalisation par établissement et service de
notifications (Sprint 2), puis Vie scolaire, Évaluations, Communication,
E-learning, Portail parent et Tableaux de bord.

---

*ORELLE Consulting — Un esprit numérique.*
