---
suivi: 1791
date: 2026-10-05
sujet: Prix des parcelles au mètre carré
chantier: foncier / valorisation
type: evolution
statut: poussé
hash:
fichiers:
  - database/migrations/2026_10_05_194500_add_montant_ventile_to_acte_parcelle.php
  - database/migrations/2026_10_05_194600_add_prix_estime_to_parcelles.php
  - app/Services/Foncier/ActeRepartitionService.php
  - app/Services/Foncier/ParcelleValorisationService.php
  - app/Services/Foncier/ParcelleProspectionQuery.php
  - app/Services/Foncier/ParcelleSupervisionQuery.php
  - app/Services/Foncier/PatrimoineFoncierQuery.php
  - app/Services/Foncier/ProspectionListeExportService.php
  - app/Models/Parcelle.php
  - app/Models/ActeFoncier.php
  - app/Http/Controllers/Foncier/ActeFoncierController.php
  - app/Http/Controllers/Foncier/ParcelleController.php
  - app/Http/Controllers/Foncier/ParcelleValorisationController.php
  - app/Http/Controllers/Foncier/ProspectionController.php
  - resources/js/Components/Foncier/ActeRepartitionBloc.vue
  - resources/js/Pages/Foncier/ActesFonciers/Create.vue
  - resources/js/Pages/Foncier/ActesFonciers/Show.vue
  - resources/js/Pages/Foncier/Parcelles/Show.vue
  - resources/js/Pages/Foncier/Prospection/Index.vue
  - resources/js/Components/Foncier/Prospection/ProspectionParcellesSublist.vue
  - routes/web.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - tests/Unit/ActeRepartition1791SourceTest.php
  - docs/suivi/SUIVI_1791_valorisation_prix_m2.md
---

# SUIVI #1791 — prix des parcelles au mètre carré

Fiches lues : #1789 (la valeur historisée est un montant en euros, la cible est déjà un prix au mètre carré, « sans valorisation » a trois états et ne se caste pas, la supervision additionnait encore l’ancienne valeur), #1790 (documents et options déjà sur main : ne pas les défaire), #1734 (cible = prix × surface cadastrale, motif obligatoire), #1770 (rétrocession = sans valorisation automatique). La table des anciennes valorisations est conservée et n’est plus lue par les écrans. Le tri de la dernière valeur est la date puis l’identifiant.

## PROMPT ENVOYÉ

Répartition du prix d’acte par parcelle, prix d’achat / estimé / cible au mètre carré de surface cadastrale, écrans qui lisent la valorisation, et largeur du tableau des parcelles sur 1 920 px. Même commit.

## Mapping

| Libellé affiché | Valeur postée | Libellé relu |
| --- | --- | --- |
| Estimé (€/m²) | prix_m2 | Estimé (€/m²) |
| Motif (estimé) | motif, obligatoire si un prix est saisi | Motif |
| Cible (€/m²) | prix_m2 sur la cible | Cible (€/m²) |
| Motif (cible) | explication, obligatoire si un prix est saisi | Motif |
| Montant réparti | repartition[].montant avec repartition[].parcelle_id | montant ventilé |
| €/m² de la ligne | non posté, montant ÷ surface cadastrale | €/m² |
| Sans valorisation (auto) | sans_valorisation vide | Automatique : Rétrocession |
| Sans valorisation forcé | sans_valorisation = 1 | Sans valorisation |
| Valorisation exigée | sans_valorisation = 0 | Valorisation exigée |

## SYNTHÈSE

Le prix d’achat au mètre carré est le montant ventilé du dernier acte d’achat (les ventes sont écartées) divisé par la surface cadastrale. L’estimé et la cible se saisissent au clic, avec un motif dès qu’un prix est entré. Sans valorisation effectif masque les deux et les exclut des totaux. La liste, l’export, la supervision et le patrimoine utilisent estimé × surface. Le patrimoine prend le montant ventilé du dernier acte d’achat, et non plus le prix entier de l’acte. Le tableau tient dans la largeur : commune raccourcie, nom de famille, cases rouges vides, pagination en français, pied SQL réservé au groupe DSI.

## DÉPLOIEMENT-TEST

git pull origin main
php artisan view:clear
php artisan route:clear
php artisan migrate --force
php artisan journal:sync

Contrôle de reprise, une ligne, sans point d’exclamation :

php artisan tinker --execute="echo DB::table('parcelles')->whereNotNull('prix_estime_eur_m2')->count().' reprises, '.DB::table('parcelle_valorisations as pv')->join('parcelles as p','p.id','=','pv.parcelle_id')->where(function ($q) { $q->whereNull('p.surface_cadastrale_m2')->orWhere('p.surface_cadastrale_m2', '<=', 0); })->distinct()->count('pv.parcelle_id').' sans surface non reprises';"

## LEÇON

Ne jamais caster « sans valorisation » : null reste l’automatisme. Le reste d’un arrondi au centime va sur la plus grande parcelle, pas au prorata une seconde fois. Une parcelle sans surface cadastrale n’est pas reprise en estimé.
