---
suivi: 1212
date: 2026-08-05
sujet: Import Excel → étude financière lotissement
chantier: foncier / faisabilite
type: feature
statut: poussé
hash: 947237fe
fichiers:
    - app/Support/Import/EtudeFiLibelleNormalizer.php
    - app/Support/Import/EtudeFiLotissementMapping.php
    - app/Services/Foncier/Import/EtudeFiExcelReader.php
    - app/Services/Foncier/Import/EtudeFiImportService.php
    - app/Http/Controllers/Foncier/ScenarioFaisabiliteController.php
    - routes/web.php
    - resources/js/Pages/Foncier/Scenarios/Show.vue
    - docs/import/DICO_import_etude_fi_lotissement.md
    - tests/Unit/Import/EtudeFiLibelleNormalizerTest.php
    - tests/Unit/Import/EtudeFiExcelReaderUnitTest.php
    - tests/Unit/Import/EtudeFiImportMergeSourceTest.php
    - tests/Feature/Foncier/FoncierEtudeFiImport1212Test.php
    - database/data/journal_mises_a_jour_post_2026_06_12.php
    - docs/suivi/SUIVI_1212_import_excel_etude_fi_lotissement.md
    - public/build/
---

# SUIVI #1212 — Import Excel étude Fi lotissement

## PROMPT ENVOYÉ

Import Excel → étude financière lotissement : lecture + prévisualisation + écriture
validée. Map PHP versionné (pas de table dico, pas de migration, pas de composer).
Pas d’IA. Écrire uniquement `*_force`. Refus si gelé ou retenu. Merge obligatoire
avant `syncSaisies` (26 codes). Hors périmètre : fiche foncière, grille, promotion ENVOL.

## Fiches lues

- #1210 — diag : PhpSpreadsheet présent, schéma scenarios / postes / params, 26+8 codes,
  volumes prod. Acquis réutilisés sans réinstruction.
- #1139 — étude Fi scénario / `syncSaisies` (supprime les codes absents).
- #1142 / #1145 — `Scenarios/Show.vue` zone commune (seul lot front de ce commit).

## SYNTHÈSE

### Correspondance

`EtudeFiLotissementMapping` (`type_etude = lotissement_hectare`) : 26 postes + 8 params,
aliases normalisés, colonne C/D/H, nature. Spec DICO commitée dans
`docs/import/DICO_import_etude_fi_lotissement.md` (reconstruite depuis le prompt #1212
si le fichier Robin n’était pas dans le workspace).

### Flux

1. POST preview (JSON) → lecture `setReadDataOnly`, scan col B, preview lignes + non repris.
2. POST apply → droits `update` + `foncier.prix` + non gelé/retenu → merge 26 →
   `syncSaisies` complet → params `*_force` (NULL si = défaut enseigne).

### UI

Bouton « Importer un Excel » sur l’étude Fi (`Show.vue`) + Dialog preview (#1192 :
`border-t`, bouton bleu). Cases : cochées si vide/0 ; écrasement ambre décoché.

## DÉPLOIEMENT-TEST

OVH : `git pull origin main` ; `php artisan optimize:clear` ; `php artisan view:clear` ;
`php artisan journal:sync`. Pas de migrate. Pas de npm/composer sur le serveur.

## LEÇON

`syncSaisies` est une synchronisation destructive des codes absents : tout import partiel
DOIT merger sur l’existant (26 codes) avant l’appel. Compteurs = 1 libellé → 2 codes (C+D).
