# Changelog — Clair de Paie

Toutes les versions, du plus récent au plus ancien.

## v1.3.0 — 2 mai 2026 — Package & primes 💼

Première grosse release fonctionnelle après les correctifs de sécurité. On s'attaque
maintenant à **tout ce qui se passe avant le brut et autour** : forfait jours, primes,
avantages en nature, tickets restaurant, mutuelle, abondement, RTT…

### 🎯 Détection automatique du package de rémunération

Une nouvelle section **« Votre package de rémunération »** apparaît après l'import.
Elle affiche tous les composants détectés, classés par catégorie :

- **Rémunération de base** — salaire de base, forfait jours, forfait heures, appointements
- **Heures supplémentaires** — HS normales, HS exonérées (TEPA), heures complémentaires, majorations
- **Primes** — 13ᵉ mois, vacances, ancienneté, performance, PPV (prime Macron), bonus, commissions
- **Avantages en nature** — voiture, logement, repas, NTIC
- **Prises en charge employeur** — tickets restaurant, transport, mutuelle
- **Épargne salariale** — intéressement, participation, abondement PEE/PERCO
- **Absences & indemnités** — congés payés, retenue absence, IJSS
- **Compteurs** — jours RTT pris/acquis (en jours, pas en €)
- **Indicateurs de référence** — montant net social

### 📊 Indicateurs sur chaque composant

Chaque ligne affiche des **étiquettes visuelles** pour comprendre d'un coup d'œil :

- 📈 **Compte pour la retraite** ou ⊘ **Hors retraite** — selon que la cotisation
  retraite s'applique
- **CSG** ou **Sans CSG** — soumission à la CSG/CRDS
- **Imposable** ou 💚 **Non imposable** — fiscalité

Avec en plus des **conseils contextuels** quand pertinent. Quelques exemples livrés :

- 🍽 **Tickets restaurant** : « Part employeur exonérée si entre 50 % et 60 % de la valeur
  faciale, dans la limite de 7,26 € (2025) »
- 🎯 **PPV (prime Macron)** : « Exonérée de cotisations et d'impôt jusqu'à 3 000 €
  (6 000 € avec accord d'intéressement) — non comptée pour la retraite »
- 💰 **Abondement PEE** : « Exonéré d'impôt sur le revenu (plafond 8 % du PASS / an) »
- 💡 **Intéressement** : « Exonéré d'impôt si placé dans un PEE/PERCO sous 15 jours »
- 🚆 **Transport** : « Obligatoire à 50 % du titre de transport public, exonérée d'impôt »
- 🏥 **Mutuelle** : « Part employeur ≥ 50 % obligatoire — la part au-delà du minimum est
  imposable »

### 💯 Bloc résumé

En bas de la carte, trois indicateurs synthétiques :

- **Total versé** — somme de tous les composants en €
- **Compte pour retraite** — somme des éléments retraite-compatibles
- **Exonéré d'impôt** — somme des éléments non-fiscalisés (utile pour optimiser sa déclaration)

### 🔧 Sous le capot

- Nouveau dictionnaire `PACKAGE_CLASSIFIERS` (~30 patterns) pour la classification
- Fonction `extractPackageComponents(lines, columns, headerLineIdx)` qui parcourt 3 zones :
  avant `TOTAL BRUT` (rémunération + forfait), section DIVERS (avantages, prises en charge),
  après `TOTAL DES COTISATIONS` (épargne, RTT, montant net social)
- Lecture intelligente du montant : `payer || deduire || montantPat || base`
  (le plan épargne employeur a sa valeur en colonne base, pas en payer)
- Distinction compteur (jours) / référence (montant net social) / composant € — pour ne pas
  agréger des choux et des carottes dans le total
- `package` désormais sauvegardé dans `bulletins[]` (localStorage), pour préparer R2/R4

### 🚧 Reporté

La détection des **évolutions entre bulletins** (« la mutuelle augmente de X € ») demande
d'avoir au moins 2 mois de bulletins comparables et un profil utilisateur stable. Ça arrive
en R2 avec les profils + multi-personnes.

---

## v1.2.2 — 2 mai 2026 — Numéro de version visible

Petite mise à jour de confort. Le numéro de version est désormais affiché à deux endroits :

- **En haut à droite** dans le bandeau d'en-tête, à côté du badge « 100 % local »
- **En bas de page** dans le pied de page, avec un lien vers les notes de version (CHANGELOG.md)
- **Dans la console développeur** (F12) au chargement, pour diagnostic technique facile

Très utile pour vérifier d'un coup d'œil quelle version est chargée — notamment après un
déploiement, le service worker peut mettre un cycle à se rafraîchir et garder l'ancienne version
en cache. Maintenant tu vois immédiatement si tu es à jour.

---

## v1.2.1 — 2 mai 2026 — Anonymisation forte du log + preview anti-fuite

### 🔒 Sécurité — anonymisation renforcée

Refonte complète de l'anonymisation du log de diagnostic. **Le log v1.2.0 laissait fuiter** :
nom et prénom du salarié (« M. RAIMBAULT Loïc »), nom et adresse de l'employeur
(« SARL TELESIO NANTES », « 22 Mail Pablo Picasso »), adresse personnelle
(« 36 T boulevard Rober Schuman »), matricule (« 0000000068 »), numéro URSSAF complet
(« 117000001523913692 URSSAF PARIS ET REGION PARISIENNE »).

**v1.2.1 corrige tout cela** par une stratégie en 3 couches :

1. **Détection des libellés sensibles** (Matricule, N° s.s., Sortie, SIRET, ORG. S.S.,
   IBAN, etc.) et masquage des items à droite sur la même ligne Y, **bornés par le prochain
   libellé** pour ne pas masquer les données utiles voisines (Entrée, APE, etc.).
2. **Patterns de contenu** : civilités+nom, adresses postales, formes d'entreprise (SARL/SAS/
   EURL/etc.), numéros longs (matricule, URSSAF, NIR, SIRET, SIREN), IBAN, e-mails, téléphones,
   dates de naissance probables, codes postaux+ville.
3. **Détection contextuelle** : mots-clés type URSSAF, civilités, formes sociales — masqués par
   sécurité même quand ils apparaissent dans des chaînes inattendues.

Le profil professionnel embarqué dans le log est aussi filtré : seuls qualification, niveau,
coefficient, code APE, IDCC et booléen d'ancienneté sont gardés. Plus d'emploi détaillé, plus
de date d'entrée précise.

### 🛡️ Preview obligatoire avant export du log

Le bouton « ⤓ Télécharger le log » ouvre désormais une **modale de prévisualisation** :
- Détection automatique de fuites résiduelles (numéros longs, mots en majuscules inconnus)
- Aperçu des 30 premiers items qui seront dans le fichier
- Confirmation explicite de l'utilisateur avant le téléchargement

Le nom du fichier PDF n'est plus inclus (un nom comme `EMP_LRA_PAYS202501.pdf` peut contenir
matricule + initiales).

### 🔧 Compatibilité

- Le parsing métier est **inchangé**. Tous les chiffres extraits (brut, net, PAS, cotisations,
  profil) restent identiques. L'anonymisation ne s'applique QU'AU LOG exporté.
- Service worker bumpé à `clair-de-paie-v1.2.1` pour invalider le cache.

---

## v1.2.0 — 1er mai 2026 — Profil détecté + tutoriel + zip à plat

### 🎯 Profil détecté automatiquement (zones non-confidentielles)

Extraction automatique depuis le PDF : emploi, qualification, niveau, coefficient, indice,
date d'entrée, début d'ancienneté, code APE, IDCC + libellé convention collective, période.
Affichage dans une carte dédiée avec **introduction narrative** générée
(« Profil : cadre au poste de X. Grille : Position Y, coefficient Z. Entré le DD/MM/AAAA
(soit N mois d'ancienneté). Convention : IDCC W — Y. »).

### 📖 Section tutoriel « pour les nuls »

Bloc dépliable sous la dropzone. Couvre : à quoi sert l'app, comment importer,
que faire en cas d'erreur d'extraction, FAQ.

### 📦 Zip à plat

Plus de sous-dossier `clair-de-paie/` dans l'archive. Tous les fichiers à la racine,
prêts à drag-and-dropper directement dans Cloudflare Pages.

### 🔧 Sous le capot

- Recalibrage des colonnes par clustering des positions X réelles des nombres + frontière médiane
- PAS identifié par relation arithmétique `base × taux/100 = montant` (indépendant des colonnes)
- Fusion automatique des en-têtes multi-niveaux (jusqu'à 4 lignes Y consécutives)

---

## v1.1.0 — 1er mai 2026 — Diagnostic exportable + corrections parsing

### 🐛 Corrections de bugs

1. **Brut affichait `-0,02`** : la cause racine était l'en-tête multi-niveaux non reconstitué,
   `columns = null`, fallback global qui matchait le `-0,02` de la zone « Allègement de
   cotisations » en bas de fiche.
2. **« Sécurité sociale - Maladie » classée à tort en cotisation salariale avec montant 7500 €** :
   conséquence directe du même bug. Désormais correctement classée en patronale (975 €).
3. **Détection élargie** de `Quantité ou base`, `Charges patronales montant` et leurs variantes.

### 🛠️ Bouton de diagnostic

Bouton « ⤓ Télécharger le log de diagnostic » qui apparaît après chaque import. Génère un JSON
anonymisé (NIR, IBAN, e-mails, téléphones, codes postaux + ville masqués) avec items bruts,
lignes reconstituées, résultat du parsing — pour debug.

⚠ **L'anonymisation v1 était insuffisante.** Voir v1.2.1.

### Validation par seuil minimum

Brut ≥ 100 €, net ≥ 100 €, netImp ≥ 100 €, netFinal ≥ 50 €, pas ≥ 1 €. Évite qu'un nombre
parasite (ex : `-0,02`) soit retenu comme valeur principale.

---

## v1.0.0 — Avril 2026 — Première version publique

Application PWA de lecture de bulletins de paie français. Parsing des « bulletins clarifiés »,
calculs de totaux, affichage des cotisations, export PDF et Excel.
