# LOT 18 - OVH : Fil de Course Direction certifiée et double authentification web

## Objectif

Ce lot renforce le Fil de Course en ajoutant un rôle `DIRECTION` / Organisation certifié par TRAIL DPS PLACE. L'objectif est d'éviter qu'un utilisateur terrain puisse s'auto-déclarer Direction depuis la page web.

## Modifications OVH

### Activation device

Fichiers :

- `public/api/tracking/create_device_activation.php`
- `SRC/Tracking/DeviceActivationRepository.php`

Ajouts :

- lecture des champs transmis par PLACE :
  - `course_feed_role`
  - `course_feed_role_source`
  - `certified_phone`
  - `certified_label`
  - `organization_certified`
  - `direction_2fa_required`
- normalisation du numéro portable certifié ;
- chiffrement du numéro certifié ;
- stockage du hash SHA-256 et des 4 derniers chiffres ;
- refus d'une activation `DIRECTION` si le numéro certifié ou le marqueur organisation certifiée est absent.

### Stockage base tracking

Migration indicative : `sql/2026_06_29_course_feed_direction_certification.sql`

Colonnes ajoutées dans :

- `tracking_devices`
- `tracking_bindings`
- `tracking_device_activation_tokens`

Colonnes :

- `course_feed_role`
- `course_feed_role_source`
- `organization_certified`
- `certified_phone_cipher`
- `certified_phone_hash`
- `certified_phone_last4`
- `certified_label`
- `direction_2fa_required`

Le repository ajoute également ces colonnes automatiquement si elles sont absentes, afin de faciliter un déploiement progressif.

### Connexion mobile au Fil de Course

Fichiers :

- `public/api/course_feed/device_login.php`
- `SRC/Tracking/CourseFeedRepository.php`

Règle :

- si le binding actif du device contient `course_feed_role=DIRECTION`, `organization_certified=1` et un téléphone certifié, alors la session mobile est créée en rôle `DIRECTION` ;
- l'application mobile n'a pas besoin du PIN terrain pour ce rôle, car elle s'appuie sur le device activé depuis PLACE.

### Connexion web Direction

Fichiers :

- `public/api/course_feed/request_direction_sms.php`
- `public/api/course_feed/login.php`
- `public/course_feed/index.php`
- `SRC/Tracking/CourseFeedRepository.php`

Règles :

1. l'utilisateur sélectionne le rôle `DIRECTION` sur la page web terrain ;
2. il saisit le PIN terrain et le numéro portable certifié ;
3. OVH vérifie que ce numéro correspond à un binding Direction certifié pour le canal événement ;
4. un code SMS est envoyé uniquement si le numéro est certifié ;
5. la connexion web `DIRECTION` est acceptée uniquement si le code SMS est valide.

### Symbole Certifié ++

Fichier : `public/course_feed/index.php`

- Ajout du rôle `DIRECTION` dans la liste web.
- Ajout d'un affichage `Certifié ++` dans l'identité des messages Direction.
- Ajout d'un style visuel spécifique pour les messages Direction.

## Sécurité et traçabilité

- Le numéro portable clair n'est pas conservé en base : il est chiffré et son hash est utilisé pour la vérification.
- Les demandes de code Direction et les refus de numéros non certifiés sont audités.
- Le rôle `DIRECTION` ne peut pas être obtenu par simple saisie web sans certification PLACE préalable.

## Points de vigilance déploiement

- Exécuter la migration SQL avant usage si l'environnement ne permet pas l'ajout automatique de colonnes par le repository.
- Vérifier que le service SMS OVH est opérationnel pour la double authentification web.
- Les anciens devices restent compatibles : sans `course_feed_role`, ils continuent à utiliser les rôles classiques Secours/Sécurité/Ouvreur/Fermeur.
