---
suivi: 1772
date: 2026-10-02
sujet: Diagnostic du module CIE existant
chantier: factures / CIE
type: diagnostic
statut: poussé
hash:
fichiers:
  - docs/suivi/SUIVI_1772_diag_cie_existant.md
---

# SUIVI #1772 — diagnostic CIE existant

Phase 1. Aucun code modifié. Aucune écriture SQL.

Base lue pour les données : `DB_CONNECTION=mysql`, `DB_HOST=127.0.0.1`, `DB_PORT=3306`, `DB_DATABASE=erp_immo`. Connexion refusée (sortie en section 6). Les chiffres Louis Pasteur / SNP cités dans le prompt ne sont pas relus ici.

## 1. Cartographie technique

### 1.a Tables (migrations ; schéma vivant non lu)

`cie_operations` — `database/migrations/2026_05_23_100000_create_cie_operations_table.php`

Colonnes à la création : `id`, `programme_id` FK `programmes` cascadeOnDelete, `date_operation`, `libelle` string 255, `montant_total_ht` decimal(15,2), `montant_total_ttc` decimal(15,2), `taux_tva` decimal(5,2) default 20, `fournisseur_avance_id` FK `fournisseurs` restrictOnDelete, `depot_facture_id` nullable FK `depot_factures` nullOnDelete, `commentaire` text nullable, `created_by` nullable FK `users` nullOnDelete, `timestamps`, `softDeletes`.

Ajouts :

- `2026_07_27_180000_add_marche_id_to_cie_operations_table.php` (#987) : `marche_id` nullable, FK `cie_ops_marche_fk` → `marches` nullOnDelete, index `cie_ops_marche_idx`.
- `2026_08_11_140000_add_depot_facture_cout_id_to_cie_operations_table.php` (#1266) : `depot_facture_cout_id` nullable, FK `cie_ops_depot_cout_fk` → `depot_factures` nullOnDelete, index `cie_ops_depot_cout_idx`. Commentaire migration : distinct de `depot_facture_id` (legacy), aucune reprise, reste NULL.

`cie_repartitions` — `database/migrations/2026_05_23_100100_create_cie_repartitions_table.php`

Colonnes à la création : `id`, `cie_operation_id` FK `cie_operations` cascadeOnDelete, `fournisseur_id` FK `fournisseurs` restrictOnDelete, `pourcentage` decimal(5,2), `montant_calcule_ht` decimal(15,2), `timestamps`. Pas de SoftDeletes à la création.

Ajouts :

- `2026_07_28_100000_add_marche_id_to_cie_repartitions_table.php` (#990) : `marche_id` nullable, FK `cie_reps_marche_fk` → `marches` nullOnDelete, index `cie_reps_marche_idx`.
- `2026_08_11_140200_add_cumul_retenu_ht_to_cie_repartitions_table.php` (#1266) : `cumul_retenu_ht` decimal(15,2) default 0. Commentaire : cache ; source déclarée = `cie_prelevements`.
- `2026_08_11_140300_add_soft_deletes_to_cie_repartitions_table.php` (#1266) : `deleted_at`. UPDATE lié : aligne `deleted_at` des répartitions sur l’opération parente déjà soft-supprimée.

`cie_prelevements` — `database/migrations/2026_08_11_140100_create_cie_prelevements_table.php` (#1266)

Colonnes : `id`, `cie_repartition_id` FK `cie_prev_rep_fk` cascadeOnDelete, `depot_facture_id` FK `cie_prev_depot_fk` restrictOnDelete, `montant_retenu_ht` decimal(15,2), `date_retenue`, `statut` string 32 default `retenu`, `created_by` nullable FK `cie_prev_user_fk` nullOnDelete, `timestamps`, `softDeletes`. Index : `cie_prev_rep_idx`, `cie_prev_depot_idx`, `cie_prev_statut_idx`. Commentaire migration : statut `retenu | encaisse | annule`. Pas de contrainte unique SQL sur (répartition, dépôt).

`marche_reprise_lignes.montant_cie_reprise_ht` — `database/migrations/2026_08_13_150200_add_retenues_reprise_ht_to_marche_reprise_lignes_table.php` : decimal(14,2) nullable. Table de reprise, pas une table CIE.

Index FK Laravel des `foreignId()->constrained()` de création : non relus sur `information_schema` (connexion refusée).

### 1.b Fichiers

Modèles :

- `app/Models/CieOperation.php` — SoftDeletes ; `deleting` soft-delete les répartitions ; `restoring` restaure les répartitions trashed (l.33-47).
- `app/Models/CieRepartition.php` — SoftDeletes ; `resteDuHt()` = `montant_calcule_ht - cumul_retenu_ht` (l.69-72).
- `app/Models/CiePrelevement.php` — table `cie_prelevements` ; constantes `retenu`, `encaisse`, `annule` (l.23-27).
- `app/Models/MarcheRepriseLigne.php` — colonne `montant_cie_reprise_ht`.

Contrôleurs / trait :

- `app/Http/Controllers/CieController.php`
- `app/Http/Controllers/Concerns/AuthorizesCieAccess.php`
- `app/Http/Controllers/SuiviChantierController.php` — prop `cie_tab_visible` (l.47-48, l.67)
- `app/Http/Controllers/DepotFactureController.php` — `cieRetenueDues` l.5970, `associerCie` l.843, `assertCieRetenueServeur` l.5834, `synchroniserPrelevementsCieDepuisValidated` l.5935
- `app/Http/Controllers/ComptabilisationController.php` — ligne APBILL CIE l.3052-3059 ; somme l.1589 et l.2879-2932
- `app/Http/Controllers/MarcheRepriseLigneController.php` — `montant_cie_reprise_ht`
- `app/Http/Controllers/FactureController.php` l.784-789 — attribut `montant_cie_affiche`

Services :

- `app/Services/CieService.php`
- `app/Services/MarcheRetenuesEtatsService.php` — `cieTheoriqueHt` l.544, `ventilerCle` l.561, reprise l.261-269
- `app/Services/MarcheRepriseMontantsService.php` — `SUM(montant_cie_reprise_ht)`
- `app/Services/MarcheSyntheseFinanciereService.php`, `app/Services/MarcheCouvertureKpiService.php`
- `app/Services/ErpComptesComptablesService.php` l.32 — clé `cie`, repli `401600`
- `config/erp.php` l.57 — `'cie' => '401600'`

Commandes :

- `app/Console/Commands/CieRattacherMarchesCommand.php`
- `app/Console/Commands/ComptaDiagCieCommand.php` — lecture seule `compta:diag-cie {uuid}` (#622)

Routes `routes/web.php` :

- l.2437-2452 : `GET/POST /programmes/{programme}/cie`, `GET/PUT/DELETE .../cie/{cie_operation}`, plus `matrice`, `reglements`, `soldes`
- l.469-474 : `cie-operations-candidates`, `cie-retenue-dues`, `associer-cie`

Pages / composants Vue :

- `resources/js/Pages/Cie/Index.vue`
- `resources/js/Pages/Cie/Show.vue`
- `resources/js/Pages/Cie/CieOperationForm.vue`
- `resources/js/Pages/SuiviChantier/Index.vue` — onglet `cie`
- `resources/js/Pages/DepotFactures/DepotFactureSaisieForm.vue` — case CIE et ligne « CIE dues »
- `resources/js/Components/Marches/MarcheSyntheseFinanciere.vue` — colonne CIE
- `resources/js/Components/Marches/MarcheKpiHeader.vue` — « dont CIE »
- `resources/js/Components/Marches/MarcheResumeWidgets.vue` — « CIE (montant fixe) »
- `resources/js/Components/Programmes/ProgrammeSyntheseFinanciere.vue` — colonne CIE
- `resources/js/Layouts/AppShell.vue` l.2236-2251 — fil d’Ariane fiche opération

Module enseigne : `app/Support/EnseignesSetup.php` `MODULE_CIE`. `MODULES_ENVOL` l.38 `true`. `modulesHectare()` l.53 `false`. `modulesGemme()` l.78 `false`.

Recherche `tests/` sur `CieOperation`, `cie-retenue-dues`, `AuthorizesCieAccess`, `repartitionsDuePourFournisseurMarche`, `cie_prelevements`, `CieOperationForm` : aucun fichier.

### 1.c git log --oneline --all (fichiers CIE listés dans la commande)

```
bdf65c5e feat(compta): afficher le SIRET et un IBAN masque dans la liste des fournisseurs (#1749)
ce44ce7c feat(depot): liens applicatifs vers ecran complet ?depot= (#1617)
94c06eb9 fix(marches): deux etats retenues + Synthese alignee (#1287)
e15f7459 feat(cie): synthese en matrice entreprises x operations (#1282)
b2ea8f58 feat(cie): onglet Synthèse par entreprise (programme) (#1280)
b66be7fa feat(cie): affectation retenue par operation — lignes cochees, suppression FIFO (#1268)
16430160 feat(cie): retenue sur situation — case RETENUES, numerateur, prelevements (#1267)
8c8e5eaf feat(cie): modele structurel cout/prelevements + soft-delete + masque pair-a-pair (#1266)
5bc15413 feat(enseignes): modules compte prorata, CIE et NF Habitat (#1061)
faef9242 feat(cie): rattachement marche par ligne de repartition + dont CIE (#990)
6fd5a60b fix(cie): colonnes programmes.libelle sur cie:rattacher-marches (#988)
489caa7e feat(cie): rattacher les opérations CIE à un marché et afficher dont CIE (#987)
345ba5c7 fix(compta): association facture a operation CIE programme (#622)
d83a94ce docs(comments): commentaires métier commercialisation/lots/CIE (#563)
5c237e91 feat(cie): opération CIE — retrait lien facture, label fournisseur qui facture, liste fournisseurs complète, répartition en montants bloquée sur HT (#560)
0ce68cf7 Exclure les fournisseurs inactifs des listes de selection tout en conservant l affichage des rattachements existants.
5ccd9633 feat(#304): dépôt facture — déduire CP + associer CIE, retrait types CP/CIE
1ec34b82 fix(ux): InputNumber fr-FR via enregistrement global ErpInputNumber.
6981623a refonte: Factures déplacé en sous-onglet de Suivi Chantier
1b6c4360 ux(suivi-chantier): regrouper marches, AO et CIE en onglets internes
c41c79e5 feat(cie): module Compte InterEntreprises V1 par programme
```

### 1.d Fiches `docs/suivi`

- `SUIVI_1261_diag_cie_reconstitution.md`
- `SUIVI_1263_diag_impact_cie.md`
- `SUIVI_1265_modelisation_cie.md`
- `SUIVI_1266_modele_cie.md`
- `SUIVI_1267_retenue_cie.md`
- `SUIVI_1268_affectation_cie.md`
- `SUIVI_1277_cie_chargement_dues.md`
- `SUIVI_1279_cie_lignes_non_postees.md`
- `SUIVI_1280_cie_synthese_programme.md`
- `SUIVI_1282_cie_matrice.md`
- `SUIVI_1297_diag_reinterpretation_depot_cie.md`
- `SUIVI_1301_depot_cie_pas_precoche_nv1.md`
- `SUIVI_1061_modules_enseigne_cp_cie_nf.md`
- `SUIVI_1287_etats_retenues.md`
- `SUIVI_1306_retenues_presentation.md`
- `SUIVI_1344_fix_reprise_retenues_bilan.md`

## 2. Cycle de vie d’une opération

### 2.a Droits

`AuthorizesCieAccess.php` l.12-18 lecture : `GS_ENVOL`, `GS_DSI`, `GS_ADMIN_ERP`, `GS_DIRECTION_GENERALE`, `GS_COMPTABILITE`.

l.23-27 écriture (créer / modifier / supprimer) : `GS_ENVOL`, `GS_DSI`, `GS_ADMIN_ERP`.

l.29-37 et l.40-48 : `hasAnyM365Group`, pas `m365GroupNames()` direct, pas `Gate::`.

`User::hasAnyM365Group` l.152-158 : si `isAdminERP()` retourne true, la méthode retourne true avant l’intersection des groupes.

Onglet : `SuiviChantierController` l.47-48 — `userCanReadCie()` et `enseigneAModule(MODULE_CIE)`.

`CieController::store` l.96, `update` l.140, `destroy` l.160 : `authorizeCieWrite()`.

`CieController::index` l.28-33 redirige vers `/programmes/{id}/marches?tab=cie`.

### 2.b Statuts, validation, historique

Aucune colonne statut sur `cie_operations` ni `cie_repartitions`.

`cie_prelevements.statut` : défaut `retenu` ; constantes `retenu`, `encaisse`, `annule` (`CiePrelevement.php` l.23-27). `synchroniserPrelevementsCieDepuisValidated` l.5931 : « statut = retenu (jamais « encaisse » écrit ici) ».

Pas de table d’historique des modifications d’opération. Colonnes présentes : `created_by`, `timestamps`. `update` l.147-150 : `$cieOperation->update` puis `repartitions()->delete()` puis recréation. `destroy` l.164 : `$cieOperation->delete()` (soft, et soft des répartitions via le modèle l.35-42).

### 2.c Facture liée et badge « Lié »

`resources/js/Pages/Cie/Index.vue` l.552-557 : Tag `Lié` si `data.depot_facture_id || data.depot_facture`.

l.567-576 : colonne « Facture liée » : lien si `data.depot_facture`, texte `data.depot_facture.numero_facture ?? 'Facture'`, sinon « — ».

`CieService::transformOperation` l.1343-1351 : `depot_facture` est la relation `depot_facture_id` (legacy), champ affiché `numero_facture`. `depot_facture_cout_id` est une clé séparée (l.1352-1354), non utilisée par ce Tag ni par cette colonne.

Formulaire : `CieOperationForm.vue` l.291 label « Fournisseur qui facture ». Le commit `5c237e91` (#560) a pour message « retrait lien facture ».

Cas d’affichage que ce code produit, sans lecture des lignes Louis Pasteur :

- `depot_facture_id` renseigné et relation `depotFacture` nulle : badge « Lié », colonne « — ».
- `numero_facture` stocké égal à `6` : la colonne affiche `6`.

### 2.d Bandeau « Signalements »

`CieService::syntheseParProgramme` l.457-464 : tout `commentaire` non vide après trim entre dans `anomalies.operations_commentees`.

`Index.vue` l.188-220 : bandeau si au moins une anomalie. Titre l.193 : « Signalements (lecture seule — aucune correction automatique) ». Ligne commentaire l.215-219 : `Opération « {libelle} » — commentaire : {commentaire}`.

Autres lignes du même bandeau : écart somme répartitions / montant (l.195-203), répartitions sans marché (l.204-214), écart cache `cumul_retenu_ht` / prélèvements (l.221-229).

Visible pour qui ouvre l’onglet CIE (lecture section 2.a + module enseigne). Aucun bouton de levée dans ce bandeau. Le commentaire est un champ du formulaire (`CieController::validateOperationPayload` l.204, nullable string), écrit par `authorizeCieWrite`.

### 2.e Avanceur « ENVOL »

`fournisseur_avance_id` : NOT NULL à la création de table, validation `required|exists:fournisseurs` (`CieController` l.195-202). Le formulaire n’a pas de valeur vide autorisée (l.291-300).

KPI `Index.vue` l.63-68 : libellé fixe « Avancé par ENVOL », valeur `kpis.avance_envol_ht`, hint `HT`.

`CieService` l.626-630 : `avance_envol_ht` = `$totDu`, somme des `montant_calcule_ht` des répartitions vivantes du programme. Pas un filtre sur un fournisseur nommé ENVOL.

Colonne « Avanceur » `Index.vue` l.561-562 : `data.fournisseur_avance?.nom`.

`CieService` l.18 : commentaire de classe « coût mutualisé payé par ENVOL ». l.31 : « Modèle mono-créancier ENVOL. »

## 3. Retenue sur les factures

### 3.a Case « CIE » et requête « dues »

Affichage case : `DepotFactureSaisieForm.vue` l.10286-10301. Checkbox `showCIE`, `:disabled="readonly || isCieHistorique || !cieCaseActivatable"`. Ligne diagnostic l.10319-10329, `v-if="peutSaisirRetenuesMarche && !programmeEstHorsErp && !depotFranchiNv1"`, texte :

`CIE dues : {{ cieDuesDiag.phase }} · HTTP {{ cieDuesDiag.http }} · {{ cieDuesDiag.n }} ligne(s)`

`cieCaseActivatable` l.4418-4432 : faux si programme hors ERP ou si `!peutSaisirRetenuesMarche` ; faux pendant le chargement ; faux si `phase !== 'ok'` ou `cieServerModifiable !== true` ; vrai si `cieResteTotalHt > 0.009` ou `form.montant_cie > 0.009` ou `cieLignes.length > 0`.

`depotFranchiNv1` l.4264-4268 : statuts listés l.4199-4206 (`en_validation_nv1` … `paiement_confirme`).

Endpoint : `GET /depot-factures/{uuid}/cie-retenue-dues` — `DepotFactureController::cieRetenueDues` l.5970-5994. Droit `authorizeCieRead` l.5976. Appel :

`repartitionsDuePourFournisseurMarche($fournisseurId, $marcheId, $depot->id)` si les deux ids > 0, sinon tableau vide.

Requête `CieService` l.1003-1057 :

```
CieRepartition::query()
    ->where('fournisseur_id', $fournisseurId)
    ->where('marche_id', $marcheId)
    ->whereHas('operation')
```

Eloquent : répartitions et opérations soft-supprimées exclues. Pour chaque ligne, `resteBrut = montant_calcule_ht - cumul_retenu_ht`. Si un prélèvement actif existe sur ce dépôt, il est ajouté au reste affiché. Ligne omise si `resteAffiche <= 0.009` et `dejaCeDepot <= 0.009`. Pas de filtre `depot_facture_cout_id` (commentaire l.985).

`modifiable` renvoyé l.5993 = `canEditDepot` (`DepotFactureController` l.4903). Comptabilisée ou au-delà : faux, sauf saisie historique autorisée ou `FactureAdminErpEditOverride::userIsAdminErp` (l.4915-4927). `isAdminERP()` l.4929 retourne vrai avant le statut.

### 3.b Montant proposé

`refreshCieDues` l.4664-4682 : une seule due et `mayPrecheck` → cochée, `montant_ht = reste_du_ht`. Deux dues ou plus → aucune cochée. `mayPrecheck` l.4666 : `!depotFranchiNv1 && !cieUserUnchecked`.

Si `cie_lignes` déjà enregistrées avec `montant_ht > 0.009` : reprise de ce montant, plafonné par `Math.min(..., reste)` l.4673-4675. Si `preleve_sur_depot_ht > 0` : coché à ce montant plafonné au reste l.4676-4678.

`syncMontantCieTtcDepuisLignes` l.4469-4480 : `form.montant_cie = ht * (1 + taux/100)`. Commentaire l.3556-3557 : `form.montant_cie` est stocké en TTC. `cie_montant_ht` = somme HT des lignes cochées (`cieMontantHtTotal` l.4353-4359).

Serveur `syncPrelevementsPourDepot` l.1143-1150 : refuse si le montant HT dépasse `montant_calcule_ht - cumul_retenu_ht + déjà ce dépôt`.

### 3.c Enregistrement et « Déjà retenu »

`synchroniserPrelevementsCieDepuisValidated` l.5935-5959 appelle `CieService::syncPrelevementsPourDepot`.

Écrit `cie_prelevements` : `montant_retenu_ht`, `date_retenue` = date du jour, `statut` = `retenu`, `created_by` (l.1160-1187). Lignes retirées : `statut = annule` puis `delete()` soft (l.1115-1119 et l.1200-1204).

Puis `recalculerCumulRetenuHt` l.972-978 : `cumul_retenu_ht` = somme des prélèvements de la répartition dont `statut != annule` (SoftDeletes Eloquent exclut les soft-deleted).

Carte « Déjà retenu » : `Index.vue` l.69-72, hint `HT`. Valeur `kpis.deja_retenu_ht`. `CieService` l.626-629 : `$totRet`, somme des `montant_retenu_ht` des prélèvements chargés avec `statut != annule` (l.422-424 et l.515-518). Unité HT.

### 3.d Sage

`ComptabilisationController::sommesRetenuesApbillDepuisLignesComptables` l.2879-2905 : `cie_ht` = somme des montants des lignes comptables dont le compte égale `comptesAp['cie']`.

`appendApbillRetenueLigneSpecs` l.3052-3059 : si `cieHt > 0.0001`, ligne `accountno` = `comptesAp['cie']`, `trx_amount` = négatif du HT formaté `number_format(-$cieHt, 2, '.', '')`, fusion `IntacctService::apbillTaxEntryExonereeZero()`.

Compte : `ErpComptesComptablesService` l.32, réglage `comptes_comptables.cie`, repli config `erp.comptes_comptables.cie` = `401600` (`config/erp.php` l.57). La valeur en base du réglage n’a pas été lue (connexion refusée).

### 3.e Cochée ou non par défaut

Avant NV1, une seule ligne due, utilisateur n’ayant pas décoché : `showCIE = true` et ligne pré-cochée au reste HT (`refreshCieDues` l.4713-4721 et l.4679-4682). Commentaire l.4665 : « pré-coche #1268 uniquement AVANT NV1 ».

Deux lignes ou plus : aucune pré-cochée (l.4664, l.4680).

Zéro ligne et `montant_cie <= 0.009` : `showCIE = false` (l.4706-4708) et `cieCaseActivatable` faux si le reste est 0 (l.4430-4432).

Après NV1 : pas de pré-coche automatique ; restitution si un montant est déjà enregistré (l.4709-4712).

### 3.f Factures Louis Pasteur depuis le 07/07/2026

Non exécuté. Voir section 6.

### 3.g Reprise historique

Colonne `marche_reprise_lignes.montant_cie_reprise_ht` (migration `2026_08_13_150200`). Saisie : `MarcheRepriseLigneController` l.171 `nullable|numeric|min:0`.

`MarcheRetenuesEtatsService` l.261-269 : `$cieRepriseHt = $reprise['cie_ht']` puis `$cieRetenu = round($cieRetenu + $cieRepriseHt, 2)`. Commentaire l.261 : addition après conversion TTC→HT. Source du cumul marché avant reprise : `ventilerCle(..., 'cie')` l.223, montants issus de `montant_cie` TTC de la saisie (`montantsSaisiePourDepot` l.508) convertis en HT (l.250).

`CieService` carte « Déjà retenu » : somme des prélèvements (section 3.c). `marche_reprise_lignes` n’apparaît pas dans `syntheseParProgramme`.

Théorique marché : `cieTheoriqueHt` l.544-554 = `SUM(cie_repartitions.montant_calcule_ht)` pour `marche_id` du marché et `fournisseur_id` du marché, opération vivante.

## 4. Vues de suivi

### 4.a Tous programmes

Recherche d’une route ou page CIE hors `programmes/{programme}/cie` : les routes CIE sont sous le programme (`routes/web.php` l.2437-2452). `CieController::matrice`, `reglements`, `soldes` répondent 403 (`CieService::MSG_PAIR_A_PAIR_DESACTIVE` l.31, `MSG_SOLDES_DESACTIVE` l.34).

`WidgetDataService` : aucune occurrence de `cie`.

Vues par programme ou par marché trouvées : onglet Chantier CIE ; synthèse financière programme (colonne CIE) ; synthèse / KPI / widget du marché.

### 4.b Alerte

`app/Notifications` : aucune occurrence `Cie` / `CIE`. `AlerteService` : pas de scénario CIE (les correspondances lues sont foncières ou appels d’associés).

### 4.c PDF

`CieController` : pas de méthode export PDF. Pas de page « justificatif CIE » dans `resources/js/Pages/Cie`.

### 4.d Autres écrans

- Marché : `MarcheKpiHeader.vue` l.193 `dont CIE`, l.251 `CIE` ; `MarcheResumeWidgets.vue` l.152-153 ; `MarcheSyntheseFinanciere.vue` colonne CIE.
- Programme : `ProgrammeSyntheseFinanciere.vue` l.158 et colonne CIE.
- Fiche facture `resources/js/Pages/Factures/Show.vue` : aucune occurrence `CIE` / `montant_cie`.
- `resources/js/Components/Facture/` : aucune occurrence `CIE`.
- `resources/js/Pages/Fournisseurs` : aucune occurrence `CIE` / `cie_`.
- `app/Services/Assistant` : aucune occurrence `Cie`.

## 5. Textes techniques visibles

| Libellé | Fichier:ligne |
|---|---|
| `CIE dues :` + phase + `HTTP` + `ligne(s)` | `resources/js/Pages/DepotFactures/DepotFactureSaisieForm.vue` l.10322-10328. `title` l.10323 : `Diagnostic CIE (permanent) — phase · HTTP · lignes`. Affiché si retenue marché possible, pas hors ERP, et dépôt pas encore dans `DEPOT_STATUTS_NV1_PLUS`. |
| `Les opérations soft-supprimées n’apparaissent pas.` | `resources/js/Pages/Cie/Index.vue` l.271, dans `description` de l’empty state « Aucune dette CIE ». |
| `Lot / poste : l’ERP ne porte pas de numéro de lot ni de poste budgétaire sur les marchés liés — colonne laissée vide (aucune déduction depuis l’intitulé).` | `Index.vue` l.233-237, si `!synthese.lot_poste_disponible`. |
| `Aucune répartition vivante sur ce programme.` | `Index.vue` l.271 (même `description`). |
| `Signalements (lecture seule — aucune correction automatique)` | `Index.vue` l.193. |
| `Répartition #{{ id }} : cache cumul_retenu_ht` | `Index.vue` l.225-227. |
| `aucune retenue prélevée` | `Index.vue` l.483. |
| Messages 403 `Accès CIE réservé (GS_ENVOL, …)` et `Modification CIE réservée (…)` | `AuthorizesCieAccess.php` l.36 et l.47. |
| `CIE : matrice et règlements pair-à-pair désactivés (#1266). Modèle mono-créancier ENVOL.` | `CieService.php` l.31, abort 403 routes matrice/règlements. |
| `CIE : onglet Soldes désactivé (#1280).` | `CieService.php` l.34. |

## 6. État des données

Commande : PHP `DB::select` sur `information_schema.COLUMNS` de `cie_operations`.

Sortie :

```
DB erp_immo host 127.0.0.1

Illuminate\Database\QueryException
SQLSTATE[HY000] [2002] Aucune connexion n’a pu être établie car l’ordinateur cible l’a expressément refusée
(Connection: mysql, Host: 127.0.0.1, Port: 3306, Database: erp_immo,
SQL: SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_DEFAULT, COLUMN_KEY, EXTRA
FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = cie_operations ...)
```

Aucun `SELECT` de comptage n’a abouti. Pas de nombre d’opérations, pas de totaux HT, pas de soft-deletes, pas de liste Louis Pasteur / MCH-2026-111.

`Get-Service *mysql*/*maria*` et ports 3306/3307/33060 en écoute : aucune sortie.

## Manques constatés

- La section 6 n’a aucune ligne de données : MySQL `127.0.0.1:3306` / `erp_immo` a refusé la connexion. Les montants 3 126,00 € HT et 592,50 € du prompt ne sont pas vérifiés ici.
- Aucune page ni route CIE hors d’un programme. Aucun widget tableau de bord dont le code contient `cie`.
- Aucune classe dans `app/Notifications` et aucun scénario `AlerteService` dont le nom contient CIE.
- Aucun export PDF dans `CieController` ni dans `resources/js/Pages/Cie`.
- `Factures/Show.vue`, `Components/Facture/` et `Pages/Fournisseurs` ne contiennent pas le libellé CIE. `app/Services/Assistant` non plus.
- `cie_operations` n’a pas de colonne de statut. Pas de table d’historique des changements d’opération : `update` écrase et supprime/recrée les répartitions.
- Le bandeau Signalements affiche le `commentaire` dès qu’il est non vide. Le template n’a pas d’action qui vide ce champ.
- Le badge « Lié » et la colonne « Facture liée » lisent `depot_facture_id` / `numero_facture`, pas `depot_facture_cout_id`.
- `cieCaseActivatable` est faux quand la requête dues retourne 0 ligne et que `montant_cie` est à 0. La pré-coche n’a lieu qu’avant NV1 et seulement s’il y a exactement une ligne due.
- La carte « Déjà retenu » (HT) somme `cie_prelevements`. `montant_cie_reprise_ht` est ajouté au retenu de l’onglet Retenues du marché (`MarcheRetenuesEtatsService` l.261-269), pas dans `syntheseParProgramme`.
- Écriture CIE : `GS_COMPTABILITE` et `GS_DIRECTION_GENERALE` sont dans `GROUPES_LECTURE` et absents de `GROUPES_ECRITURE`.
- Le contrôle d’accès appelle `hasAnyM365Group`, qui retourne vrai si `isAdminERP()` avant de lire les groupes.
- Textes de section 5 affichés sur l’onglet CIE et, avant NV1, sur la saisie de facture (`CIE dues : … HTTP … ligne(s)`).
