# RP3 · Lot 1 : imports du référentiel

Ce lot remplit la base de RP3 à partir de ProEco et des fichiers de la v2 :
attributions des professeurs (fonctions comprises), élèves, coordonnées des parents, locaux et titulaires.
Il ne touche pas à la v2.

## Contenu

| Dossier | Rôle | Accessible par le web ? |
|---|---|---|
| `public/admin/` | Pages d'administration des imports | **Oui** (seul dossier public) |
| `src/` | Code PHP (lecture CSV, regroupement des cours, chiffrement, imports) | Non |
| `config/` | `config.sample.php` à copier en `config.php` | Non |
| `sql/001_schema.sql` | Création des tables | Non |
| `cli/rp3.php` | Mêmes imports en ligne de commande (tests, serveur avec SSH) | Non |
| `tests/fixtures/` | Export ProEco **fictif** (605 élèves inventés) pour essayer | Non |

Idéalement, seul `public/` est placé dans le dossier web, le reste juste à côté.
Si l'hébergement impose tout dans `www/`, les fichiers `.htaccess` fournis bloquent les dossiers non publics.

## Installation (environ 20 minutes)

1. Créer une base MySQL 8 ou MariaDB 10.4+ (`utf8mb4`). Les tables s'installent toutes seules : à la première connexion à `…/admin/`, RP3 propose « Installer la base » (et « Mettre à jour la base » après une nouvelle version).
   Chez OVH (MySQL 8, Web Cloud Databases) : reprendre l'hôte et le port (ex. `35407`) de l'espace client dans le `dsn`,
   et choisir PHP 8.2 ou plus dans `.ovhconfig` (`app.engine.version=8.2`).
2. Copier `config/config.sample.php` en `config/config.php` et remplir :
   - les accès à la base ;
   - **deux clés différentes** pour le chiffrement : `php -r "echo base64_encode(random_bytes(32)), PHP_EOL;"` (deux fois).
     Gardez-les en lieu sûr : sans elles, les adresses des parents sont illisibles ;
   - votre accès provisoire : `php -r "echo password_hash('votre-mot-de-passe', PASSWORD_DEFAULT), PHP_EOL;"`.
     Le rôle `dpo` est nécessaire pour importer les coordonnées des parents.
3. Si `config.php` n'est pas dans `config/`, adapter la constante `RP3_CONFIG_FILE` en tête de `public/admin/_init.php`.
4. Ouvrir `…/admin/`, se connecter, puis **Réunions → Préparer une nouvelle réunion** : l'assistant enchaîne
   configuration, agenda, remise à zéro, importations, vérification et publication (voir `GUIDE-REUNION.md`).

Chaque import montre d'abord un **aperçu** (rien n'est enregistré), puis on l'**applique**.

## Ce que fait chaque import

**Attributions des professeurs** (`Abréviation ; Nom Enseignant ; Numéro Ecole ; AnFF ; Libellé Court de Cours ; … ; Type Attrib ; …`)
- les lignes répétées (une par période ou par groupe) sont fusionnées : 2 645 lignes → 1 195 attributions visibles sur votre fichier ;
- **absences**, comme le tri de la v2 : une ligne est masquée si son « Code Divers » est un code d'absence (`2C 26 07 18 5E 4D 3B 70 71 82 81 9C`, modifiable dans `config.php`), ou si elle porte un code et qu'un remplaçant est déclaré pour ce cours (« Enseignant Origine Emploi » : absence longue, maladie comprise). Un professeur partiellement absent reste proposé pour ses autres cours ; un professeur absent pour tous ses cours est listé dans l'aperçu (21 sur votre fichier). Le code 18 (DPPR type I temps plein) masque les heures sans remplaçant : elles ne sont plus assurées ;
- « ZZZZZ · Professeur à désigner » est ignoré ;
- les libellés d'une même matière sont regroupés en une branche lisible : « LG MODERNE I ANGLAIS », « LG MODERNE II ANGLAIS », « AS ANGLAIS », « A.C. ANGLAIS » → **Anglais**. Vos 184 libellés tombent dans 45 branches, aucun n'est resté inconnu ;
- les fonctions (Directeur, Educateur, Délégué, Secrétaire…) sont séparées des cours. Seules Direction, Éducateurs et Centre PMS sont proposés aux parents ; les autres (référents, missions collectives, secrétariat…) restent internes ;
- le fichier des cours fait foi pour les noms du personnel.

**Personnel ajouté à la main** (assistant, étape 4) : pour les personnes absentes de l'export ProEco. Le `ncc.csv` de la v2 était tiré du même export que les cours : il n'est plus nécessaire. L'import « fonctions » reste disponible en ligne de commande pour un ancien fichier.

**Élèves** : export ProEco tel quel (`Matric Info ; Nom Elève ; Prénom Elève ; … ; Ecole ; Année ; Forme ; Filière ; Classe ; …`), colonnes reconnues quel que soit leur ordre.
L'année-forme est reconstruite à partir de « Année · Forme · Filière » en choisissant l'écriture qui existe dans les attributions de l'école (4 · G · T → `4GT`, 3 · P · Q → `3P`, 1 · C → `1C`) ; l'aperçu affiche chaque correspondance. La classe = année-forme + lettre (`4GTF`), même écriture que la colonne TITU des locaux.
Le **numéro national, l'adresse et la date de naissance ne sont jamais enregistrés**. Un contrôle signale toute année-forme d'élèves sans aucun professeur.

**Coordonnées des parents** (rôle DPO) : un compte famille par adresse email, qui relie tous les enfants dans les trois écoles (jusqu'à quatre adresses par élève : responsable, père, mère, et l'« adresse libre » pour un tuteur légal ou la famille d'accueil d'un élève étranger). « EMail Elève 2 » est ignoré.

> Minimisation : RP3 n'a besoin ni du numéro national, ni de l'adresse postale. Si le modèle d'export ProEco le permet, retirez les colonnes `NumRegNat BE`, `Adresse Responsable`, `CPost AdResp`, `Localité AdResp` : le fichier qui transite est alors moins sensible.
Emails et GSM sont **chiffrés** dans la base ; la recherche se fait par empreinte. Les familles sans email sont comptées pour prévoir le code SMS ou le secrétariat.

**Locaux** (par réunion) : une colonne par implantation, « abs » = absent, colonne TITU = titulaire de classe.

## Règles communes

- Un import **ne supprime rien** : ce qui disparaît du fichier est désactivé. Les rendez-vous déjà pris restent cohérents.
- Réimporter le même fichier ne change rien (vérifié sur vos fichiers).
- Encodage (UTF-8 ou Windows-1252) et séparateur (`;` `,` tabulation) détectés automatiquement.
- Le fichier envoyé est effacé du serveur dès l'application, et au plus tard après 24 h s'il reste en aperçu.
- Page **Branches** : corriger un regroupement, créer une branche, masquer un libellé, choisir ce qui est proposé aux parents. Un choix validé n'est plus jamais écrasé par un import.

## En ligne de commande

```
RP3_CONFIG=/chemin/config.php php cli/rp3.php installer
RP3_CONFIG=… php cli/rp3.php reunion TE26 "Réunion de novembre" 2026-11-27
RP3_CONFIG=… php cli/rp3.php import auto fichier.csv [--reunion=TE26] [--appliquer]
RP3_CONFIG=… php cli/rp3.php branches > regroupement.csv
RP3_CONFIG=… php cli/rp3.php export-v2 dossier/   # cours1..7.csv + ncc.csv au format de la v2
```

## Prérequis

PHP 8.1 ou plus (extensions PDO MySQL, mbstring, sodium, intl conseillée), MySQL 8 ou MariaDB 10.4+. Aucune dépendance à installer.
Testé sur MySQL 8.0 (mode SQL strict par défaut, port 35407) et MariaDB 10.11.
