---
name: project_cerfa_fiscal
description: "Architecture complète des 3 onglets fiscaux TaxReport : CERFA 2042, CERFA 2561 (IFU), CERFA 2778-SD — composants, données, vues"
metadata: 
  node_type: memory
  type: project
  originSessionId: cd6fedee-a8a5-422b-912c-bf927e5e7fdd
---

## Onglets TaxReport (TaxReport.jsx)

Ordre : **CERFA 2042** | **CERFA 2561 (IFU)** | **CERFA 2778-SD** (si pfoAssujetti)

`activeTab` par défaut : `'2042'` — les onglets Récapitulatif et Détail par projet ont été supprimés.

**KPI synthèse** : bloc "Cases fiscales 2042 — synthèse {annee}" affiché en haut de page (avant les onglets), calculé en fetchant `/taxreport/cerfa2561` + `/taxreport/2778` dans `TaxReport.jsx` (state `data2042`). Cases affichées : 2TT (si > 0), 2TR (si > 0), 2BH, 2CK (vert), 2TY (rouge, si > 0). Le fetch exclut les plateformes étrangères via `cl_2778_excluded_plats` localStorage.

---

## CERFA 2561 (IFU) — `Cerfa2561Preview.jsx`

Sidebar 3 vues :
- **Suivi mensuel** : tableau plateformes françaises × 12 mois (interets_bruts), avec Total intérêt brut / Taux prélevé / Total intérêt net en bas
- **Données 2561** : sélecteur plateforme+détenteur (FR uniquement, sans doublon prénom) + formulaire CERFA 2561Form
- **Report 2042** : `Report2042Block2561` — cases 2TT/2TR/2BH/2CK/2TY agrégées, breakdown par plateforme, badge BADGE_AUTO

**Données** : `GET /taxreport/cerfa2561` retourne `lignes[]` avec `mois[mm] = { interets_bruts, prelev_sociaux, prelev_forfaitaire }` (breakdown mensuel ajouté cette session)

**Helper nom** : `fullName(l)` — évite doublon si `nom` commence déjà par `prenom`

---

## CERFA 2778-SD — `Cerfa2778Preview.jsx`

Sidebar 3 vues :
- **Suivi mensuel** : tableau plateformes étrangères × 12 mois, avec checkboxes inclusion/exclusion persistées `cl_2778_excluded_plats`
- **Données 2778-SD** : sélecteur mois → `CerfaBlock` avec cases BA/IA/PQ/PV/PF1/PG1/PK/QR
- **Report 2042** : `Report2042Block` — cases 2TR/2BH/2CK pour plateformes étrangères

**Données** : `GET /taxreport/2778` retourne `plateformes[] = { id, nom, mois: { mm: number } }` (route reconstruite cette session après troncature)

**CerfaBlock** : grille 6 col `1fr 90px 90px 90px 90px 90px` — Libellé | Base imposable (BA) | Taux | Case | Montant | (sans titre). Sections : Page de garde (page 1) / PFO (page 2) / PS (page 3) / Totaux (page 4). Props `mois`, `annee` passées pour afficher "Mai 2026" dans Montant sans unité (`noUnit`).

**Wrapper** : le composant retourne un `<div className="card">` depuis cette session.

---

## CERFA 2042 — `Cerfa2042Preview.jsx` (nouveau cette session)

Sidebar 2 vues :
- **Suivi mensuel** : tableau combiné FR (vert, déclaration automatique) + étranger (rouge, à déclarer) ; Total Plateformes françaises dans tbody avant groupe étranger ; Total Plateformes étrangères + Total général + Taux prélevé + Total intérêt net dans tfoot
- **Données 2042** : cases mixtes groupées par code (2TT/2TR/2BH/2CK/2TY) ; chaque ligne de breakdown porte son badge `BADGE_AUTO` ou `BADGE_DECL` ; sélecteur filtre "Tout / Automatique / À déclarer" en haut à droite

**Données** : fetche **toujours** les deux endpoints `/taxreport/cerfa2561` + `/taxreport/2778` (inconditionnellement, indépendant de `pfoAssujetti`) ; lit `cl_2778_excluded_plats` depuis localStorage

**Badges** :
- `BADGE_AUTO` = { text: 'déclaration automatique', bg: rgba(22,163,74,0.1), color: #16a34a }
- `BADGE_DECL` = { text: 'à déclarer', bg: rgba(239,68,68,0.1), color: #dc2626 }

**Calcul net étranger** : `brut × (1 − totalTaxRate)` (estimation depuis taux PFU de l'année)

**Noms de mois** : `MOIS_LABELS` utilise les noms complets ('Janvier'…'Décembre') dans les 3 composants.

**Why:** Vue de synthèse pour la déclaration 2042, fusionnant automatique (IFU FR) et manuel (2778-SD étranger).
**How to apply:** `pfoAssujetti` est passé en prop mais n'influe plus sur le fetch (toujours chargé). La prop reste utile pour d'autres contextes. Fichiers sensibles aux troncatures : Cerfa2778Preview.jsx, Cerfa2561Preview.jsx, Cerfa2042Preview.jsx — toujours reconstruire la fin par index de lignes Python.
