---
suivi: 1653
date: 2026-09-22
sujet: Grille de prix — lots ventilés visibles (total du lot, Multi-régimes)
chantier: Foncier / Faisabilité
type: feature
statut: poussé
hash: b96419e2
fichiers:
  - resources/js/Pages/Foncier/Scenarios/Show.vue
  - tests/Unit/ScenarioGrilleLotsVentiles1653SourceTest.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
  - docs/suivi/SUIVI_1653_grille_lots_ventiles_visibles.md
---

# SUIVI #1653 — lots ventilés visibles dans la grille de prix

## PROMPT ENVOYÉ

Lot d’AFFICHAGE. Sur `/foncier/scenarios/{id}`, un lot ventilé (plusieurs
couples mode × taux renseignés) n’affichait que le régime principal dans
SURF. CESSIBLE et PRIX TTC, alors que le pied de grille totalisait les
cinq paires. Option C : MODE = « Multi-régimes », infobulle, selects
non éditables. Option A : surface et prix = somme des régimes, cellules
calculées. « Détail » orange. € / m² inchangé. Aucun calcul moteur.

## FICHES LUES

- **#1635** LEÇON — les cinq paires existent depuis #1145 ; MODE/TAUX
  désignent le couple, ils n’ajoutent pas de colonnes. Conservé.
- **#1642** LEÇON — le pied n’est PAS la somme visible de sa colonne :
  `surface_cessible_hors_agricole` exclut l’agricole ;
  `total_recettes_lots_hectare_ttc` ne somme que les lots Hectare.
  Conservé : le pied n’est pas retouché.
- **#1652** LEÇON — overlay calculé, watch `lotRows` → `planifierRecalcul`.
  Une saisie dans « Détail » rafraîchit déjà. Conservé.
- **#1651** — endpoint à blanc, hors sujet.

Anti-collision : 1652 est le dernier numéro. **1653 est libre.**
Show.vue en série (zones communes).

## SYNTHÈSE

### Asymétrie lignes / pied (constat avant correction)

`detectRegimePrincipal` (`Show.vue:613-619`) prend le **premier** couple
non nul dans l’ordre de `REGIMES_LOT`. `mapLotFromProps` pose
`regime_principal` sur ce couple.

En saisie, SURF. CESSIBLE et PRIX TTC étaient liés à CETTE paire seule :

- `v-model="row[regimeDef(row.regime_principal).surface]"`
- `v-model="row[regimeDef(row.regime_principal).prix]"`

Le pied (`Show.vue:2945` et bande KPI) lit `gTot('surface_cessible_hors_agricole')`
et `gTot('total_recettes_lots_hectare_ttc')`, issus du moteur
`calculerTotauxGrille` : somme des **cinq** surfaces (puis retrait agricole
pour la surface) et des **cinq** prix.

D’où l’écran qui se contredit : lignes = régime principal, pied = tout
le lot. Les calculs étaient déjà justes.

### Traitement d’un lot ventilé

`lotEstVentile` = `countRegimesActifs > 1` (deux paires au moins
renseignées). Pas le checkbox `multi_regimes` (celui-ci ouvre le panneau).

| Colonne | Lot à un régime | Lot ventilé |
|---|---|---|
| Mode TVA | select éditable (`lotMode` / `onModeChange`) | lecture « Multi-régimes », infobulle une ligne par régime |
| Taux | select éditable (`lotTaux` / `onTauxChange`) | lecture « — » (même tiret que Sans TVA : plusieurs taux ne tiennent pas dans la cellule ; le détail est dans l’infobulle Mode) |
| Surf. cessible | InputNumber sur la paire principale | somme des 5 `surface_*`, `CELL_CALC`, infobulle « Calculé (ventilation) » |
| Prix TTC | InputNumber sur la paire principale | somme des 5 `prix_ttc_*`, idem |
| € / m² | `lotCalcule(..., 'prix_m2')` moteur | inchangé |
| TVA / Hon. mont. / Hon. gest. | moteur, tous régimes | inchangé |
| Détail | lien `text-[#1B2B4B]` | lien `text-amber-800` (couleur d’avertissement HF) |

Les cellules devenues calculées ne sont plus `registerCell` : Tabulation
les saute (ordre DOM).

`payloadLotsGrille` envoie les cinq paires si `multi_regimes` **ou**
`lotEstVentile` : un lot affiché ventilé n’est pas réduit au principal
à l’enregistrement. Même PUT, même forme.

### € / m² — non modifié

Moteur `FaisabiliteLotissementMoteur.php` `calculerLotBase` :
`surface_cessible` = somme des 5 surfaces (y compris agricole),
`prix_lot_ttc` = somme des 5 prix, `prix_m2 = Dec::divOrZero($prixLotTtc, $surfaceCessible)`.
La grille affiche `lotCalcule(row, idx, 'prix_m2')`. Lot 1 : 99 900 / 150 = 666.

### TVA / HON. MONT. / HON. GEST.

- TVA : `calculerTvaLot` additionne les 4 seaux (agricole = 0). Tous les
  régimes. Pas un défaut.
- Honoraires : `honorairesLot` assiette = `prix_lot_ttc` (somme des 5).
  Tous les régimes. Pas un défaut.

### Pied inchangé

Toujours `surface_cessible_hors_agricole` (573 m² sur V1) et
`total_recettes_lots_hectare_ttc` (389 600 €). Après correction, la somme
des **prix** de lignes égale le pied. La somme des **surfaces** de lignes
ventilées (lot entier, agricole compris) n’égale pas le pied surface
(hors agricole) : périmètre moteur du #1642, volontairement conservé.

## TABLEAU DE MAPPING

Voir synthèse ci-dessus. Colonnes #, Lot, Type, Tranche, H, ODF, actions
(Dupl./Suppr.) : inchangées dans les deux cas.

## DÉPLOIEMENT-TEST

```
git pull origin main
php artisan optimize:clear
php artisan view:clear
php artisan journal:sync
```

Aucune migration. Pas de route. Pas de `npm` / `composer` sur OVH.

1. Scénario V1 DF-2026-0012 : lot 1 = 150 m² / 99 900 €, lot 4 = 158 m² /
   89 900 €. Somme des prix de lignes = pied 389 600,00 €.
2. MODE = « Multi-régimes », infobulle des deux régimes.
3. Surf. / Prix grisés, infobulle « Calculé (ventilation) ».
4. « Détail » orange sur les lignes ventilées.
5. Lot à un régime : selects et cases blanches inchangés.
6. Ajouter un second régime via Détail : bascule Multi-régimes.
7. Retirer le second : redevient éditable.
8. Tabulation saute les cellules calculées.
9. RECETTES H TTC, TOTAL TVA, PR FONCIER / M² identiques au centime.
10. Modifier une ventilation : recalcul live #1652.
11. Scénario gelé : rien de saisissable.
12. 1366 px et 1920 px : pas d’ascenseur horizontal ajouté.

## LEÇON

Un total de pied juste et des lignes « justes chacune pour un régime »
produisent un écran faux : l’utilisateur additionne ce qu’il voit.
Afficher le total du lot sur la ligne (et interdire de changer le
« principal » d’un multi-régimes) aligne la lecture sans toucher au
moteur. Ne pas « corriger » le pied `hors_agricole` pour coller à la
somme des lignes : ce périmètre est métier (#1642).
