# Nexus — plateforme de vie scolaire

Plateforme sur mesure pour l'ISND : élèves, personnel, classes, cours, horaires, et des modules à
ajouter au fil du temps (journal de classe, carnet de cotes et bulletins, messagerie…).

- **Laravel 12 + Livewire 4**, Tailwind CSS 4, MySQL (SQLite en local)
- Responsive : ordinateur, tablette, smartphone
- Connexion par comptes locaux + **double authentification (TOTP) obligatoire**
- Droits très fins : rôles, permissions individuelles et périmètres (classes, niveaux, sections)
- Imports **ProEco** (CSV) et **EDT** (export texte)

---

## 1. Installation locale

Prérequis : PHP 8.3+, Composer, Node 20+.

```bash
composer install
npm install && npm run build
cp .env.example .env && php artisan key:generate
touch database/database.sqlite
php artisan nexus:installer      # migrations, permissions, rôles, année scolaire
php artisan nexus:admin          # crée le premier administrateur
php artisan serve
```

Pour un compte administrateur de test en local : `php artisan db:seed --class=DevSeeder`
(identifiants dans `database/seeders/DevSeeder.php`, refusé hors environnement local).

Tests : `php artisan test`

## 2. Déploiement chez OVH

### Hébergement mutualisé (Pro / Performance)

1. **Base MySQL** : créez-la dans l'espace client et notez hôte, nom, utilisateur et mot de passe.
2. **Préparer localement** :
   ```bash
   composer install --no-dev --optimize-autoloader
   npm ci && npm run build
   ```
3. **Envoyer** le projet (SFTP ou `rsync` via SSH) dans `~/nexus/`, **sans** le dossier `CSV/`, `node_modules/`
   ni `database/database.sqlite`.
4. **Dossier racine** : dans *Multisite*, faites pointer le domaine (ex. `nexus.isnd.be`) vers `nexus/public`.
   C'est essentiel : le reste du projet (`.env`, code, données) ne doit jamais être accessible depuis le web.
5. **SSL** : activez le certificat Let's Encrypt du domaine.
6. **`.env`** de production (à partir de `.env.example`) :
   ```dotenv
   APP_ENV=production
   APP_DEBUG=false
   APP_URL=https://nexus.isnd.be
   DB_CONNECTION=mysql
   DB_HOST=…  DB_DATABASE=…  DB_USERNAME=…  DB_PASSWORD=…
   SESSION_SECURE_COOKIE=true
   MAIL_MAILER=smtp   # + MAIL_HOST, MAIL_USERNAME, MAIL_PASSWORD, MAIL_FROM_ADDRESS
   ```
   puis `php artisan key:generate` (une seule fois, **et sauvegardez la clé** : elle chiffre les
   coordonnées des élèves, et sans elle ces données sont perdues).
7. **En SSH** :
   ```bash
   php artisan nexus:installer
   php artisan nexus:admin
   php artisan config:cache && php artisan route:cache && php artisan view:cache
   ```
8. **Tâche planifiée** (espace client › Tâches planifiées, toutes les heures) :
   `php ~/nexus/artisan schedule:run`

Le fichier `.ovhconfig` sélectionne PHP 8.3.

### Mise à jour

```bash
# après envoi des nouveaux fichiers
php artisan down
php artisan nexus:installer          # applique les nouvelles migrations / permissions
php artisan optimize:clear && php artisan config:cache && php artisan route:cache && php artisan view:cache
php artisan up
```

### Passer sur un VPS plus tard

Rien n'est spécifique au mutualisé : copiez les fichiers et le `.env` (avec la même `APP_KEY`), exportez
puis importez la base MySQL. Sur un VPS, vous pourrez ajouter Redis (cache et sessions) et une file
d'attente (`QUEUE_CONNECTION=database` + `php artisan queue:work`) pour l'envoi des e-mails.

## 3. Premiers pas

1. **Imports › ProEco** : déposez les 5 CSV (`profs`, `eleves`, `cours`, `profscours`, `elevescours`).
   Le type de chaque fichier est reconnu automatiquement et l'ordre est géré. **Simulez d'abord.**
2. **Administration › Paramètres** : vérifiez la correspondance *fonctions ProEco → rôles*
   (DIRE/DIAD → Direction, SUED/SEHC/EDEC → Éducateur, SEDI/REDA → Secrétariat).
3. **Administration › Utilisateurs › Comptes depuis le personnel** : crée un compte pour chaque membre
   du personnel ayant une adresse e-mail, avec les bons rôles (Professeur s'il donne cours).
4. **Inviter** : chacun reçoit un lien (valable 24 h) pour choisir son mot de passe, puis configure sa 2FA.
5. **Classes** : désignez les titulaires (ProEco ne les exporte pas).
6. **Modules** : activez *Horaires*, puis importez les emplois du temps (*Imports › Horaires EDT*) :
   exportez depuis EDT l'emploi du temps **de chaque classe au format iCal (.ics)** sur une semaine type,
   et déposez les fichiers (ou un **.zip** qui les contient : les hébergeurs limitent souvent un envoi à
   20 fichiers). Les noms de classes EDT sont associés aux classes ProEco (« 1A » → S11, « 2C A » → 2CA,
   « 3 GTA » et « 3 TTA » → 3A, …). Corrigez au besoin : les correspondances sont mémorisées.
   Les cours communs à plusieurs classes sont fusionnés, et chaque séance est reliée au groupe-cours
   ProEco correspondant (même professeur, même code de matière).

Les réimports sont sans risque : ce qui n'a pas changé n'est pas touché, et les élèves ou membres du
personnel absents du fichier sont marqués *inactifs* (jamais supprimés).

**Changement d'année** : *Paramètres › Années scolaires* → créer l'année, la rendre courante, puis
réimporter ProEco. Les classes, cours et inscriptions des années précédentes sont conservés.

## 4. Droits d'accès

Un utilisateur cumule :

- les permissions de **ses rôles** (Administrateur, Direction, Secrétariat, Éducateur, Professeur, ou
  des rôles créés librement) ;
- ses **permissions individuelles** (exceptions) ;
- son **périmètre** (classes, niveaux ou sections), utilisé par la permission *Voir les élèves de son périmètre*.

La visibilité des élèves est cumulative : *tous*, *périmètre*, *classes de titulariat*, *élèves de ses cours*.
Les coordonnées (adresse, téléphones, responsables) demandent une permission à part, et chaque
consultation est journalisée.

*Administration › Rôles et permissions* affiche la **matrice complète** : qui peut faire quoi.

**Anti-escalade** : un gestionnaire non administrateur ne peut accorder que des droits qu'il possède
lui-même, et ne peut ni créer ni modifier un administrateur.

Pour les développeurs : toute liste d'élèves **doit** passer par
`app(\App\Nexus\Acces\AccesEleves::class)->requete($user)`.

## 5. Créer un module

```bash
php artisan nexus:module JournalDeClasse
php artisan migrate
```

puis activez-le dans *Administration › Modules*. Structure générée :

```
modules/JournalDeClasse/
  Module.php              nom, description, permissions, rôles par défaut, menu, imports
  routes.php              routes (préfixe /journal-de-classe, auth + 2FA + module actif automatiques)
  Livewire/               composants  → nommés "journal-de-classe::nom-du-composant"
  views/                  vues        → "journal-de-classe::livewire.accueil"
  database/migrations/    tables du module (préfixez-les par le nom du module)
```

Un module déclare ses permissions dans `permissions()` : elles apparaissent automatiquement dans la
gestion des rôles et dans la matrice. `permissionsParDefaut()` les attribue aux rôles à l'activation.
`importateurs()` ajoute un onglet à la page *Imports* (voir le module `Horaires`).

Données disponibles pour les modules : `AnneeScolaire::courante()`, `Eleve`, `Classe`, `Cours`,
`CoursGroupe` (groupe-classe ProEco = unité d'enseignement), `Personnel`, `AccesEleves`, `Audit::log()`.

## 6. Sécurité

- Double authentification TOTP obligatoire (paramétrable), codes de récupération
- Mots de passe : 12 caractères minimum, avec majuscules, minuscules et chiffres ; en production, rejet des mots de passe ayant fuité (vérification anonyme par k-anonymat)
- Limitation des tentatives de connexion (5/min par compte, 20/min par IP)
- Comptes désactivables (déconnexion immédiate), sessions chiffrées, liste des appareils connectés
- Coordonnées des élèves et des responsables **chiffrées en base** (AES-256)
- Content-Security-Policy stricte à nonce (Alpine en mode CSP), HSTS, anti-iframe, `no-store` sur les pages authentifiées
- Polices hébergées localement (aucune requête vers Google : conforme RGPD)
- Journal d'audit : connexions, échecs, 2FA, consultation de coordonnées, droits, imports, modules
  (purgé après 400 jours, paramètre `audit.retention_jours`)
- Pas d'inscription publique : seuls les gestionnaires créent des comptes

## 7. Arborescence

```
app/Nexus/          noyau : modules, permissions, accès aux élèves, imports, audit, menu
app/Livewire/       écrans du noyau
app/Models/         modèles (référentiel scolaire)
modules/            modules enfichables (Horaires, …)
resources/views/    vues et composants Blade
CSV/                exemples d'exports ProEco (ignorés par git : données personnelles)
```
