# 7. Documents, états RH et fiches de paie

## Trois mécanismes différents

| Mécanisme | Source | Sortie |
|---|---|---|
| Documents historiques | Code/services spécifiques | Brouillon, DOCX ou PDF selon le document |
| Modèles dynamiques | DOCX importé + métadonnées MySQL | DOCX généré, aperçu PDF via LibreOffice |
| États RH | Requête métier + composant frontend | Page imprimable navigateur |

Ne pas mélanger leurs procédures de sauvegarde et de modification.

## Modèles DOCX dynamiques

La racine est `DOCUMENT_TEMPLATES_ROOT`, avec `/data/document-templates` par défaut. Lors d’un import, le fichier est contrôlé : extension DOCX, archive ZIP valide, taille limitée, présence de `word/document.xml`, absence de macro VBA et volume décompressé raisonnable.

Le chemin physique créé est :

```text
<code-modele>/v<numéro-version>/<uuid>.docx
```

MySQL conserve le code, le libellé, la catégorie, l’établissement, la version active, le nom original, le chemin relatif, le SHA-256, la taille et la liste des champs. Une seule version est activée ; les autres sont brouillon ou archive.

Les balises du document sont inspectées et les valeurs viennent d’une source manuelle, salarié, contrat, signataire ou établissement. La génération utilise Docxtemplater. L’aperçu PDF appelle LibreOffice `soffice` en mode headless.

### Déployer les modèles

Compresser le contenu de la racine en conservant tous les sous-dossiers. Sur le serveur, extraire de façon que le premier niveau visible dans `/data/document-templates` soit directement le code du modèle, sans dossier enveloppe supplémentaire.

Contrôle :

```bash
docker compose exec backend sh -lc 'find /data/document-templates -maxdepth 3 -type f | head -50'
```

Sauvegarder MySQL et ce volume au même instant logique.

## États RH

Ils sont dans la page Documents et le composant `EtatsPanel`. Modifier un état implique généralement le service `etats.service.ts`, la route dynamique et le rendu frontend. Tester la date choisie, les scopes d’accès, l’impression, les pages vides et les bornes de contrat.

## Fiches de paie

Le backend voit les paies sous `PAYSLIP_ROOT_PATH`, `/data/paies` par défaut. Docker monte `${PAYSLIP_HOST_PATH}` en lecture seule sur ce chemin.

Arborescence attendue :

```text
/data/paies/
  <Etablissement>/
    <AAAA>/
      AAAA_MM-Paies <libellé>.pdf
```

Exemple : `2026_08-Paies Lesquin.pdf` dans `/data/paies/LESQUIN/2026/`.

Le PDF mensuel contient plusieurs bulletins. Le service extrait le texte page par page, repère le libellé `Matricule`, normalise les zéros initiaux, regroupe les pages appartenant au même matricule puis produit un nouveau PDF avec `pdf-lib`.

Conséquences :

- un PDF image sans couche texte nécessite un OCR ;
- deux fichiers du même établissement pour le même mois sont considérés ambigus ;
- un matricule absent renvoie une erreur métier ;
- les dossiers d’établissement doivent correspondre aux valeurs et scopes de RH Connect ;
- une modification du PDF invalide automatiquement le cache grâce à taille + date de modification.

### Diagnostic paie

```bash
docker compose exec backend sh -lc 'find /data/paies -maxdepth 3 -type f | head -50'
docker compose exec backend npm run diagnose:payslips
docker compose logs --tail=200 backend
```

Les bulletins sont des données personnelles sensibles. Limiter les droits du répertoire, utiliser un montage en lecture seule et ne jamais les ajouter au dépôt Git.

