---
suivi: 1261
date: 2026-08-11
sujet: DIAG reconstitution CIE absente du calcul (PHASE 1)
chantier: depot-factures / retenues / CIE / compta
type: diagnostic
statut: poussé
hash: 378b2a93
fichiers:
  - tools/diag/diag_cie_reconstitution_1261.php
  - docs/suivi/SUIVI_1261_diag_cie_reconstitution.md
---

# SUIVI #1261 — DIAG reconstitution CIE (PHASE 1)

## PROMPT ENVOYÉ

Diagnostic lecture seule : CIE associé sur dépôt ACP CLOISON situation 6
n’intervient dans aucun montant reconstitué. Formule corrigée proposée
(TTC brut = (TTC à régler + finitions + CIE) / (1 − RG% − CP% − OPC%)).
Fix = #1262 après validation Robin. Sujet COMPTA (RG cumulée / Sage).

## FICHES LUES

- `#1224` — CIE via `applicable_cie` poste ; **pas de case UI dédiée** pour
  `montant_cie` (saisie/OCR) ; distinct de « Associer à un CIE ».
- `#1223` — flags poste ; `applicable_cie` rare (2/108 évoqué dans le prompt).
- `#890` (commentaire code) — finitions au numérateur ; CIE « montant fixe »
  mentionné mais **non ajouté** au numérateur.
- `#304` — cagnotte CP (`deduire_cagnotte_cp`) ≠ association CIE.

## OBJET 1 — Point de calcul + consommateurs

### Point unique de reconstitution

| Couche | Fichier | Méthode / computed | Formule littérale |
|---|---|---|---|
| PHP (écritures / KPI / historique) | `app/Services/DepotFacture/EcrituresComptablesCalculator.php` | `computeRetenuesGlobales` L280–324 | `$numerateur = $sommeTtcNotionnel + $finitions` ; `$base = $numerateur / (1 - (RG+CP+OPC)/100)` ; `$cie = max(0, $montantCie)` **après** |
| JS miroir | `resources/js/lib/depotFactureEcrituresCalculator.js` | `computeRetenuesGlobales` L229–268 | `numerateur = sommeTtcNotionnel + finitions` — **CIE absent** |
| Vue affichage | `DepotFactureSaisieForm.vue` | `totalTtcBrutCompta` L3121–3122 | `(ttcARegler + finitionsSignées) / (1 − RG% − CP% − OPC%)` — libellé L8225 |

Retenues prises en compte dans la **base** : RG %, CP %, OPC % (dénominateur) ;
finitions = **montant** au numérateur. CIE = montant fixe **hors** numérateur
(seulement soustrait dans le total retenues / ligne crédit si `montant_cie` > 0).

**Verdict absence** : le CIE est **ABSENT** du calcul de base (pas « présent mais
neutralisé » par un flag). En parallèle, l’association
`cie_operations.depot_facture_id` **n’écrit pas** `ocr_raw.saisie.montant_cie`
→ même la retenue fixe reste à 0 après « Associer à un CIE ».

### Consommateurs de l’association / du montant CIE

| fichier:ligne | consommateur | ce qu’il fait du CIE | montant ? | écriture Sage ? |
|---|---|---|---|---|
| `CieService.php:467–510` `associerDepotFacture` | association | pose `depot_facture_id` | non | non |
| `CieService.php:444–465` `associationPourDepot` | payload Inertia | libellé + HT/TTC pour Tag | non (affichage) | non |
| `DepotFactureController.php:569+` `associerCie` | route axios | délègue CieService | non | non |
| `DepotFactureSaisieForm.vue:8568–8579` | UI « Associer » | Tag « … 408,60 € TTC » | non | non |
| `DepotFactureSaisieForm.vue:3136–3144` | `montantCieHt` / total retenues | lit `form.montant_cie` | oui si >0 | via générateur |
| `DepotFactureSaisieForm.vue:3121` | reconstitution UI | **n’inclut pas** CIE | non | n/a |
| `EcrituresComptablesCalculator.php:280` | base + retenues | CIE hors numérateur | oui si montant_cie | oui (ligne crédit CIE) |
| `depotFactureEcrituresCalculator.js:229` | miroir front | idem | oui si >0 | oui (lignes générées) |
| `MarcheCouvertureKpiService.php:109–125` | frise / KPI marché | `montant_cie` saisie → cumul « capté » | oui si saisie | non |
| `RetenueGarantieService.php:331–345` | cumul RG historique | `computeRetenuesGlobales` | oui (RG sous-estimée si CIE manquant au num.) | non direct |
| `RetenueHistoriqueCollecteService.php:246+` | historique retenues | idem | oui | non |
| `FactureVentilationAffichagePresenter.php:277` | affichage ventilation | `resolveMontantCie(saisie)` | affichage | non |
| `FactureController.php:654–665` | `montant_cie_affiche` | saisie dépôt lié | affichage | non |
| `CompteProrataSortieService.php:100+` | cagnotte CP | `deduire_cagnotte_cp` seulement | CP uniquement | sortie CP |
| `BilanFinancierService` | bilan | **aucun** usage CIE / montant_cie | non | non |
| `CieService` soldes/KPI programme | module CIE | HT avances/répartitions | hors facture | non |

## OBJET 2 — Nature de la valeur stockée

| Source | HT | TTC | taux |
|---|---|---|---|
| `cie_operations` | `montant_total_ht` | `montant_total_ttc` | `taux_tva` (défaut 20) |
| Affichage association | — | `montant_total_ttc` (« … € TTC ») | — |
| Calcul retenues | — | `ocr_raw.saisie.montant_cie` (unités TTC, malgré le nom `montantCieHt` en Vue) | — |
| Facture PDF | 340,50 | 408,60 (= ×1,20) | 20 % |

Mono-TVA : marchés « à retenues » forcés mono-TVA (`MarcheController::tauxTvaAvenantPourMarche`
L3016–3022). Preuve cas : script section 2 (taux lignes + `marches.taux_tva`) — à coller
depuis la sortie **prod**.

Valeurs brutes CIE/dépôt : **sortie script OVH section 2** (id, montants, dates, lien dépôt).

## OBJET 3 — Sens de l’opération

| Étape | Sens | Preuve |
|---|---|---|
| (a) reconstitution brut | CIE **s’ajoute** au numérateur | arithmétique prompt + absence L302 PHP |
| (b) ligne retenue | CIE **se déduit** du brut, montant fixe | `$cie = max(0, $montantCie)` puis crédit ROLE_CIE |
| (c) cagnotte programme | association **ne crédite pas** une cagnotte CIE ; case « Déduire cagnotte CP » = `CompteProrataSortieService` uniquement | `associerDepotFacture` = update FK ; pas d’insert cagnotte |

**Conclusion (c)** : l’association a été conçue comme **lien documentaire**
opération↔facture (module CIE programme), **pas** comme alimentation automatique
de `montant_cie` ni comme mouvement de cagnotte. Le lot #1262 doit donc (1) brancher
le montant TTC de l’opération (ou la saisie) dans la reconstitution, (2) ajouter le
terme au numérateur — pas « corriger une cagnotte ».

## OBJET 4 — Périmètre prod

Exécuter sur OVH :

```bash
php -d display_errors=1 tools/diag/diag_cie_reconstitution_1261.php
```

Section 6 du script : nb dépôts liés, écarts RG/CP, déjà comptabilisés vs modifiables.
**0 dépôt ne valide rien.**

## OBJET 5 — Script

`tools/diag/diag_cie_reconstitution_1261.php` — bootstrap absolu `__DIR__`, lecture
seule, appelle `EcrituresComptablesCalculator::computeRetenuesGlobales` réel.
Preuve locale (stub sans tables CIE) : base/RG/CP **CONCORDE** avec l’écran
(58622.94 / 2931.15 / 1465.57) ; formule corrigée **CONCORDE** PDF
(59064.67 / 2953.23 / 1476.62) ; net **INCHANGE**.

## OBJET 6 — Fix proposé (#1262, NON appliqué)

Voir synthèse livrable. Ne pas rejouer les dépôts déjà comptabilisés sans décision Robin.

## LEÇON

Deux canaux CIE disjoints : association FK (`cie_operations`) vs `montant_cie`
saisie. L’UI regroupe « Cagnotte CP et CIE » mais seul CP a une cagnotte réelle.
Un montant fixe n’est **pas** un % : il va au numérateur, comme les finitions.

## DÉPLOIEMENT

Aucun code applicatif. Après pull : rien à migrer. Script dispo pour exécution
prod lecture seule.
