---
suivi: 1778
date: 2026-10-02
sujet: Une retenue CIE enregistrée ne s'efface plus toute seule
chantier: factures / CIE
type: correctif
statut: poussé
hash:
fichiers:
  - resources/js/Pages/DepotFactures/DepotFactureSaisieForm.vue
  - app/Http/Controllers/DepotFactureController.php
  - app/Http/Controllers/ComptabilisationController.php
  - app/Services/CieService.php
  - tests/Unit/CieCoherenceEnvoiSage1778Test.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - docs/suivi/SUIVI_1778_fix_cie_efface.md
---

# SUIVI #1778 — retenue CIE conservée à l'enregistrement

Fiches lues : #1775 (hypothèse infirmée), #1777 (effacement silencieux, leçon : ne pas traiter un payload vide comme une annulation). #1773 non modifié. #1774 absent du dépôt.

Les factures 1269, 1450 et 1472 ne sont pas réécrites. Sage a déjà le crédit CIE. Ce lot n'ajoute pas de règle qui les reproposerait sur la situation suivante.

## Mapping

| Libellé à l'écran | Valeur postée | Colonne / effet |
|---|---|---|
| Case CIE cochée, ligne cochée avec un montant, après une action de l'utilisateur | `montant_cie` (TTC), `cie_montant_ht` (HT), `cie_lignes[]` `{repartition_id, montant_ht}` (HT) | Met à jour `cie_prelevements.montant_retenu_ht` (HT), statut `retenu` |
| Ouverture puis Enregistrer / Comptabiliser sans toucher la CIE | clés absentes | Saisie et prélèvements inchangés |
| Case décochée, confirmation acceptée | `montant_cie` 0, `cie_montant_ht` 0, `cie_lignes` `[]`, `cie_effacement_confirme` true | Prélèvement `annule` + soft-delete, historique `cie_retenue_supprimee` |
| `cie_lignes` `[]` ou TTC posté à 0, sans `cie_effacement_confirme`, alors qu'une retenue existe | refus 422 | Rien n'est effacé |
| Chargement des dues en échec | clés absentes, lignes affichées en lecture | Rien n'est posté |

## Correctif

Front, tous les hôtes du même formulaire (dépôt, fiche, marché, comptabilisation). Consultation : `refreshCieDues` ne part pas.

- À l'ouverture, `showCIE` est vrai si la saisie a un TTC ou des lignes HT. Ces lignes sont affichées cochées, montant inchangé.
- `refreshCieDues` fusionne : lignes enregistrées conservées, autres dues ajoutées décochées. Plus d'appel à `syncMontantCieTtcDepuisLignes` dans ce cas.
- `cieModifieParUtilisateur` ne passe à vrai que sur coche, décoche ou montant. Sinon les trois clés ne sont pas postées.
- Décocher la case alors qu'une retenue existe demande confirmation. Si oui, `cie_effacement_confirme` true.
- Dues en échec ou timeout : message « Retenues CIE disponibles non chargées », lignes en lecture, rien n'est posté.

Serveur : clé `cie_lignes` absente ou null = ne pas appeler `syncPrelevementsPourDepot`, saisie conservée. Tableau vide ou TTC posté à 0 avec une retenue en base, sans le drapeau : 422 « La retenue CIE enregistrée (X € HT) serait supprimée. Décochez la CIE pour confirmer. » Avec le drapeau : annulation comme avant, plus une entrée `cie_retenue_supprimee` (montant HT, user, impersonator via `logHistorique`).

Avant tout envoi Intacct (comptabiliser, comptabiliser et payer, acompte et avoir inclus dans le même passage) : prélèvements actifs HT contre `cie_montant_ht`, et crédits du compte CIE (rôle `cie` ou numéro configuré, défaut 401600) contre `montant_cie` TTC. Un écart au centime bloque, le corps de l'écriture n'est pas modifié. Le journal « envoyée » n'est écrit qu'après ce contrôle.

## Compte CIE

La ligne automatique est construite avec `comptes_comptables.cie`, repli `401600`, libellé d'écran « CIE » (`DepotFactureSaisieForm.vue`, génération des écritures). MySQL local injoignable (connexion refusée) : les `compte_id` 704 et 616 de la prod du 18/09 n'ont pas pu être lus ici. Ce ne sont pas le compte automatique : deux identifiants distincts, crédit saisi à la main. Le contrôle d'envoi ne les assimile au CIE que si leur numéro est celui configuré (401600) ou si la ligne porte le rôle `cie`.

## Tests manuels

Non exécutés : pas de MySQL local, pas de facture de test joignable. Le test unitaire couvre uniquement la comparaison des quatre montants, sans base.

## LEÇON

Omettre la clé et envoyer un tableau vide ne sont pas la même chose. Le premier dit « je n'ai pas touché ». Le second dit « j'efface », et il faut une confirmation. Le crédit Sage et le prélèvement ERP sont deux stocks : les aligner par un nouvel appel sur la situation suivante doublerait la retenue déjà partie le 18/09.
