---
suivi: 1655
date: 2026-09-22
sujet: Fiche foncière — colonnes masquées + onglet Faisabilité (assiette infobulle, 5 KPI, journal)
chantier: Foncier / Faisabilité
type: feature
statut: poussé
hash: 5301e0be
fichiers:
  - resources/js/Pages/Foncier/Scenarios/Show.vue
  - resources/js/Pages/Foncier/Dossiers/Show.vue
  - app/Http/Controllers/Foncier/ScenarioFaisabiliteController.php
  - app/Http/Controllers/Foncier/DossierFoncierController.php
  - tests/Unit/ScenarioFicheColonnesOngletFaisabilite1655SourceTest.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
  - docs/suivi/SUIVI_1655_fiche_fonciere_colonnes_et_onglet_faisabilite.md
---

# SUIVI #1655 — fiche foncière colonnes + onglet Faisabilité

## PROMPT ENVOYÉ

Lot d'AFFICHAGE. Fiche foncière : retirer PROPRIÉTAIRE / LIBELLÉ (et
ASSUJETTI seulement si hors calcul). Conserver les champs en base et
dans le PUT. PRIX NUM. → TTC si preuve. Onglet Faisabilité dossier :
assiette en résumé + infobulle défilante ; cinq indicateurs #1654 par
scénario (même fonction, pas de duplication) ; retirer le journal de
cet onglet seulement. Aucun calcul, aucune migration, aucune route.

## FICHES LUES

- **#1645** LEÇON — une ligne de fiche peut n'avoir qu'un libellé libre,
  sans propriétaire. Conservé : `emptyFicheRow.libelle_libre = 'Ligne'`
  pour qu'une nouvelle ligne reste enregistrable ; `assertProprietairesDuDossier`
  ignore déjà `proprietaire_id` null.
- **#1654** LEÇON — `classeSeuilIndicateur` unique dans
  `seuilsIndicateursEtudeFi.js` ; 0 / absent → palier null (fond neutre) ;
  sans `peut_prix` rien n'est coloré. Réutilisé tel quel dans
  `Dossiers/Show.vue` (`classeSeuilScenario`). Barème non recopié.
- **#1650** — graphe moteur : `mode_prix_affiche` = convention
  `assujetti_tva` (L768) ; frais notaire et base PR ignorent ce champ.
  Conservé : Assujetti reste à l'écran parce que le moteur le LIT pour
  le Mode HT/TTC.
- **#1636 / #1647** — tableur fiche : clavier, cellules `registerCell`.
  Colonnes `proprio` / `libelle` retirées du DOM ; les 7 autres inchangées.
- **#1583** — `DossierSuiviColumn` « Journal du dossier ». Non détruit :
  masqué seulement quand `ongletActif === 'faisabilite'`. Reste dans
  Suivi (fil + colonne) et sur les autres onglets.

Anti-collision : 1654 est le dernier numéro. **1655 est libre.**
`Dossiers/Show.vue` en série (zones communes). Rebase `origin/main`
(#1654 `9d2d7ed1`) avant Vite.

## SYNTHÈSE

### A1 — `assujetti_tva` entre-t-il dans un calcul ?

Occurrences brutes (grep `assujetti` dans le périmètre demandé) :

- `FaisabiliteLotissementMoteur.php:768` — `$modePrix = $ligne->assujettiTva ? 'HT' : 'TTC';`
- `FaisabiliteLotissementMoteur.php:799` — `'assujetti_tva' => $ligne->assujettiTva`
- `FaisabiliteLotissementMoteur.php:801` — `'mode_prix_affiche' => $modePrix`
- `FicheLigneInput.php:22` et `:40` — DTO, lecture du booléen
- `ScenarioFicheFonciereService.php` — persist + sérialisation affichage
- `ScenarioRecalculABlancService.php:248` — recopie payload
- `ScenarioFaisabiliteController.php:190` — validation PUT
- `ScenarioGrillePrixService` / `ScenarioEtudeFiService` — **0 occurrence**

Ce que ça ne conditionne PAS : régime TVA (`regime_tva`), base PR
(`sum_prix_tva_*` + notaire), frais de notaire
(`sum_prix_achat_numeraire` + recettes ODF TTC).

Ce que ça conditionne : **uniquement** l'étiquette d'affichage
`mode_prix_affiche` (HT si assujetti, TTC sinon), colonne Mode de la
fiche. C'est un calcul d'étiquette, lu par le moteur.

**Décision : CONSERVER ASSUJETTI. Retirer seulement PROPRIÉTAIRE / LIBELLÉ.**

### A2 — affichage seulement, payload intact

Colonnes DB `proprietaire_id`, `libelle_libre`, `assujetti_tva`
intouchées. `payloadLignesFiche()` poste toujours les trois. Nouvelle
ligne : `libelle_libre: 'Ligne'` pour passer la validation #1645.
Largeur libérée répartie (table `w-full`, plus de colonne proprio).

### A3 — PRIX NUM. n'est PAS un TTC

`$coutAchatFoncierHt = $totauxFiche['sum_prix_achat_numeraire']`
(`FaisabiliteLotissementMoteur.php:42`). En-tête **inchangé** (« Prix num. »).
Voisin déjà libellé : « Prix ODF TTC ». Prix total = numéraire + ODF TTC
→ nature mixte, pas d'étiquette inventée.

### B1 — assiette

Cellule = résumé (`Aucune assiette` / `1 parcelle · X m²` /
`N parcelles · X m²`). Détail en infobulle PrimeVue, `max-height: 12rem;
overflow-y: auto; white-space: pre-line`.

### B2 — cinq indicateurs

Le tableau n'avait aucun total étude. Ajout payload
`indicateurs_etude` via `ScenarioEtudeFiService::calculerAffichage`
(mêmes totaux que la fiche scénario). Un run moteur par scénario,
relations eager-loadées. Coût CPU mesuré #1650 : 0,9–12 ms / run.
Sans `peut_prix` : clé à null, colonnes absentes. Scénario vide : 0 →
`classeSeuilIndicateur` null → fond neutre.

Requête max scénarios / dossier (à coller en prod) :

SELECT dossier_foncier_id, COUNT(*) AS nb_scenarios
FROM scenarios
GROUP BY dossier_foncier_id
ORDER BY nb_scenarios DESC
LIMIT 20;

### B3 — journal

`DossierSuiviColumn` masqué si onglet Faisabilité. Composant intact,
toujours monté ailleurs (Suivi + autres onglets, `Programmes/Foncier.vue`).

## DÉPLOIEMENT-TEST

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

Aucune migration. Pas de route.

1. Fiche : plus de propriétaire/libellé ; Assujetti présent ; largeur
   répartie.
2. Modifier une surface, enregistrer, SQL : `proprietaire_id`,
   `libelle_libre`, `assujetti_tva` inchangés.
3. Nouvelle ligne enregistrable (libellé « Ligne » en coulisse).
4. En-tête toujours « Prix num. » (pas TTC — preuve HT ci-dessus).
5. Assiette : une ligne, infobulle 11 parcelles défilante.
6. 1 parcelle / sans assiette : libellés corrects.
7. V1 : 100 583,31 € · 59 207,31 € · 25 145,83 € VERT · 18,01 % VERT
   FONCÉ · 37,33 % VERT FONCÉ.
8. Mêmes couleurs que barre KPI / étude Fi.
9. Sans `peut_prix` : pas de montants ni couleurs.
10. Plus de journal dans Faisabilité ; intact dans Suivi.
11. 1366 / 1920 : pas d'`overflow-x-hidden` ; tableau en
    `overflow-x-auto`.

## LEÇON

`assujetti_tva` n'alimente aucun montant. Il alimente `mode_prix_affiche`.
Masquer une colonne sans la poster = wipe au premier PUT
(`array_key_exists` côté persist). Les cinq KPI du tableau dossier
n'existent pas en base : il faut un run moteur par scénario, pas une
colonne SQL. Journal dossier = sidebar toutes onglets, pas un bloc
dans Faisabilité : le masquer par `ongletActif`, ne pas démonter le
composant.
