# E-Compte Rendu

Application web responsive pour enregistrer des réunions et entretiens, relire les propos, préparer un compte rendu et exporter en Word, PDF ou TXT. Le dossier contient un socle PHP/MySQL adapté à un hébergement web classique avec `phpMyAdmin` pour importer le schéma.

## État fonctionnel

| Fonction | État |
| --- | --- |
| Connexion, utilisateurs séparés, historique, modèles | Implémenté |
| Enregistrement micro, pause, reprise, blocs locaux et synchronisation | Implémenté pour navigateurs compatibles en HTTPS |
| Stockage audio, transcription et rapport chiffrés | Implémenté avec une clé d'application |
| Correction des passages, interlocuteurs et incertitudes | Implémenté |
| Rédaction et validation manuelles | Implémenté |
| Export DOCX, PDF, TXT | Implémenté |
| Transcription avec diarisation et rédaction automatiques | Connecteur prêt, moteur institutionnel à fournir |
| Application native iOS/Android, enregistrement en arrière-plan garanti | Non implémenté : l'interface web s'installe comme raccourci, mais le navigateur peut suspendre le micro |

**N'utilisez pas de données réelles sensibles pour les premiers essais.** La conformité de l'ensemble hébergement web + base + moteur + sauvegardes + contrats doit être validée par l'établissement avant utilisation opérationnelle. La présence de phpMyAdmin ne suffit pas à qualifier l'hébergement des données. Voir [les conditions HDS de l'ANS](https://esante.gouv.fr/labels-certifications/hebergement-des-donnees-de-sante), [la liste OVHcloud des produits certifiés](https://docs.ovhcloud.com/fr/guides/account-and-service-management/account-information/hds-certification) et [les prérequis contractuels OVHcloud](https://www.ovhcloud.com/fr/compliance/hds/). La CNIL indique qu'une AIPD est requise pour les traitements susceptibles de présenter un risque élevé ; l'établissement doit déterminer son application à ce projet : [guide AIPD](https://www.cnil.fr/fr/RGPD-analyse-impact-protection-des-donnees-aipd).

## Arborescence

```text
app/                    logique PHP : base, accès, chiffrement, stockage, moteur, exports
bin/purge.php           suppression programmée des dossiers expirés
database/schema.sql     tables MySQL à importer dans phpMyAdmin
docs/                   contrat du moteur institutionnel
public/                 seule racine accessible depuis le web
  assets/               interface JavaScript, CSS et icône
  views/                page HTML
  index.php             API et interface
  install.php           création unique du premier administrateur
storage/                audio chiffré, hors racine web
.env.example            exemple de configuration
```

## Installation sur OVH

1. Vérifier que l'offre et ses extensions permettent PHP **8.2 ou plus**, `pdo_mysql`, `sodium`, `mbstring`, `iconv`, `curl`, `zip` (`ZipArchive`) et HTTPS. Vérifier la taille des transferts et la durée d'exécution PHP pour les enregistrements prévus.
2. Créer la base MySQL dans OVH, ouvrir phpMyAdmin et importer `database/schema.sql`.
3. Copier `.env.example` en `.env`, hors de `public/`. Renseigner la base, l'URL, `APP_KEY` (32 octets sous forme de 64 caractères hexadécimaux) et un `INSTALL_TOKEN` aléatoire d'au moins 24 caractères. Garder ce fichier privé. La perte d'`APP_KEY` rend les données chiffrées illisibles ; prévoir sa sauvegarde sécurisée.
4. Transférer le projet. Configurer la racine du site ou sous-domaine sur `public/`. `app/`, `storage/`, `database/`, `.env` et `docs/` doivent rester hors de la racine web. Donner au processus PHP l'écriture dans `storage/`.
5. Activer HTTPS et ouvrir `/install.php` pour créer le premier administrateur. Supprimer `public/install.php` du serveur après installation.
6. Configurer une tâche planifiée quotidienne qui exécute `bin/purge.php` avec PHP CLI. Contrôler également la politique de rétention des sauvegardes OVH et de l'établissement.
7. Faire un essai avec une réunion fictive : enregistrer, couper le réseau pendant l'enregistrement, resynchroniser, ajouter une transcription, éditer le compte rendu et vérifier les trois exports.

Exemple de génération des secrets depuis un poste doté de Python :

```sh
python3 -c 'import secrets; print(secrets.token_hex(32)); print(secrets.token_urlsafe(36))'
```

Le premier résultat est `APP_KEY`, le second `INSTALL_TOKEN`. Ne les commitez pas.

Pour cet hébergement précis, voir [l'état du déploiement OVH](docs/deploiement-ovh.md). L'application et sa base de démonstration sont installées ; le sous-domaine HTTPS et la redirection `/pv/` fonctionnent. La propagation du certificat sur les serveurs OVH et la première exécution de la purge planifiée restent à surveiller.

Les tables MySQL de l'application utilisent le préfixe `ecr_`.

## Moteur institutionnel

Avec l'hébergement mutualisé, la reconnaissance vocale et la rédaction sont confiées à un service HTTPS distinct approuvé par l'établissement. Elles ne sont pas disponibles tant que ce service n'est pas défini. Le format des deux points d'entrée est décrit dans [docs/moteur-institutionnel.md](docs/moteur-institutionnel.md). Le connecteur reste désactivé dans `.env.example` et aucune donnée n'est transmise automatiquement à un service d'IA externe.

## Limites à traiter avant une mise en production hospitalière

- Le navigateur peut suspendre un enregistrement lorsque l'application passe en arrière-plan, surtout sur téléphone ; tester les appareils cibles. Les blocs déjà reçus sont conservés dans IndexedDB et récupérables après coupure, mais les dernières secondes non émises peuvent manquer.
- Les blocs en attente sur l'appareil sont chiffrés avec une clé locale non exportable conservée par le navigateur. Effacer les données du site avant synchronisation détruit cette clé et les blocs non envoyés.
- La lecture audio actuelle charge l'enregistrement complet dans le navigateur pour permettre la navigation depuis un passage. Une lecture par plages serait préférable pour des fichiers très longs.
- La recherche couvre le titre, le service et des mots exacts des participants, transcriptions et comptes rendus via un index de hachages. Les expressions complètes et les fautes de frappe ne sont pas prises en charge.
- Les exports PDF sont simples ; le Word contient une table de métadonnées et une table d'actions vierge à compléter. Une maquette documentaire propre à l'établissement pourra remplacer ces modèles.
- Le chiffrement applicatif des contenus ne remplace pas le chiffrement des sauvegardes, la gestion des clés, les contrôles d'accès et l'audit de l'infrastructure.
- Les titres, services, dates, lieux et états des dossiers restent en clair dans MySQL pour le classement et la recherche. Éviter d'y saisir des noms de patients ou des informations médicales ; confirmer la protection de la base et des sauvegardes avec l'établissement. La liste des participants, la transcription et le compte rendu sont chiffrés dans la base.
- Le traitement automatique via le pont institutionnel est synchrone. Pour les réunions longues, il faudra intégrer la file de traitements et les limites du service retenu.
- L'application ne capture que le microphone autorisé par le navigateur. L'enregistrement du son système d'une visioconférence dépend du navigateur, de l'appareil et des autorisations de la réunion.

## Développement

Le site ne nécessite pas de compilation JavaScript ni de dépendance Composer. Servir `public/` avec PHP 8.2+ et une base MySQL après configuration de `.env`. Le code JavaScript peut être vérifié avec `node --check public/assets/app.js`. Ne versionnez pas `.env`, les fichiers de `storage/` ou les données de test sensibles.
