---
suivi: 1195
date: 2026-08-05
sujet: Foncier — négociation dossier (modale + montant = ventilation)
chantier: module-foncier
type: feature
statut: poussé
hash: afef9f5b
fichiers:
  - resources/js/Components/Foncier/OffreCreateDialog.vue
  - resources/js/Pages/Foncier/Dossiers/Show.vue
  - app/Http/Controllers/Foncier/OffreFonciereController.php
  - app/Http/Controllers/Foncier/DossierFoncierController.php
  - tools/diag/diag_foncier_offres_ventilation_1195.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
  - docs/suivi/SUIVI_1195_foncier_negociation_modale_ventilation.md
---

## PROMPT ENVOYÉ

SUIVI #1195 — simplification création négociation (modale, structure #1194,
montant dérivé de la ventilation). Complément : inverser hiérarchie Total
calculé / Montant saisi, rien à reconstruire.

## ÉTAPE 0

Dictionnaire foncier régénéré. Local `erp_immo_migrate_1113` : volumes 0 ;
`types_composantes_prix` / `offre_composantes_prix` absents en local.
Diag prod : `php tools/diag/diag_foncier_offres_ventilation_1195.php`
Fiche #1194 lue (structure propriétaire → parcelles réutilisée).

## SYNTHÈSE

### Types de composantes (référentiel seed #1126)
| code | libelle | défaut proposé |
|------|---------|----------------|
| numeraire | Numéraire | **OUI** (ordre 10, cas majoritaire) |
| dation_lots | Dation de lots | |
| odf | ODF | |
| echange_terrain | Échange de terrain | |
| prise_en_charge_vrd | Prise en charge VRD | |
| complement_prix_conditionne | Complément de prix conditionné | |
| rente_viagere | Rente viagère | |
| autre | Autre (+ libellé libre) | |

Volumes d’usage prod : sortie du diag (local = N/A). Défaut = `numeraire`
(seed ordre 10 ; à confirmer si le diag montre un autre type plus utilisé).

Libellé UI : « Source » → **« Nature »** (nature du prix).

### Offres existantes (16 k€ / 100 k€) — traitement retenu
**Aucune écriture de données** dans ce lot.
- Si sans ventilation : montant historique **conservé** ; fiche Offres/Show et
  update restent utilisables (BC montant saisi si composantes vides).
- Création nouvelle : ventilation **obligatoire**, somme > 0.
- Proposition (Robin) : soit laisser historique en l’état, soit lot ultérieur
  pour ajouter une ligne Numéraire = montant à l’ouverture — **pas dans #1195**.

### Lecteurs de `offres_foncieres.montant`
Indicateur écart prix (DossierFoncierController::serializeIndicateurPrix),
liste dossier, fiche offre, alerte expiration, duplication, updateVentilation.
Le store **persiste** toujours la Σ PHP (`resoudreMontantDepuisVentilation`)
→ le passage en dérivé ne casse pas ces lecteurs.

### Implémentation
- Modale `OffreCreateDialog` : structure #1194, cases proprio/parcelle,
  surfaces directes, dirty-close confirm, pas de PJ.
- Montant lecture seule = Σ ventilation ; 1ère ligne Numéraire par défaut.
- Store : composantes required, refuse somme ≤ 0.
- Tableau offres / Dupliquer inchangés.

### Migration
Aucune. Aucune donnée modifiée.

## DÉPLOIEMENT-TEST

1. Déployer #1194 si pas encore fait, puis #1195
2. `git pull` ; `optimize:clear` ; `view:clear` ; `route:clear` ; `journal:sync`
3. `php tools/diag/diag_foncier_offres_ventilation_1195.php`
4. Tests 1–14 du prompt (DF-2026-0001, offres 1/2, Dupliquer)

## LEÇON

- « Total calculé » existait déjà (Vue + PHP) : inverser la hiérarchie, ne pas
  reconstruire.
- Offres historiques sans ventilation : ne pas les mettre à 0 silencieusement.
