---
suivi: 1155
date: 2026-08-03
sujet: Foncier — opérations DIVISION / RÉUNION cadastrales (F2 / D21)
chantier: module-foncier
type: feature
statut: livre
hash: e7fba768
fichiers:
  - app/Services/Foncier/ParcelleOperationCadastraleService.php
  - app/Services/Foncier/ParcelleFiliationService.php
  - app/Services/Foncier/ParcelleProspectionQuery.php
  - app/Http/Controllers/Foncier/ParcelleController.php
  - app/Models/Parcelle.php
  - routes/web.php
  - resources/js/Pages/Foncier/Parcelles/Show.vue
  - resources/js/Pages/Foncier/Parcelles/Index.vue
  - tests/Feature/Foncier/FoncierParcelleOperationCadastraleTest.php
  - tests/Unit/Foncier/ParcelleOperationCadastraleSourceTest.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
---

## PROMPT ENVOYÉ

SUIVI #1155 — écriture filiation cadastrale (DIVISION / RÉUNION), préalable Phase 1 bis.

## ÉTAPE 0 — AUDIT SOCLE #1132

Structure réelle `parcelle_filiations` (migration `2026_07_31_190000`) :
- `parcelle_source_id`, `parcelle_issue_id`, `type`, `date_operation`, `reference_da`,
  **`geometre_fournisseur_id`** (CDC disait `geometre_id` → alignement sur la colonne réelle),
  `commentaire`, `createur_id`, timestamps.
- Unique `(parcelle_source_id, parcelle_issue_id)` ; FK restrict sur parcelles.
- **Pas** de `parcelle_mere_id`.
- Types : division · reunion · remembrement · alignement.
- `parcelles.statut_cadastral` : `active` | `remplacee` (déjà en place).
- Lecture : `ParcelleFiliationService::synthetiserPourParcelle`, fiche Show (Issue de / A donné).
- #1132 n’écrivait PAS `remplacee` (réservé F2).
- Prod : lignes filiation attendues = 0 (à confirmer au déploiement).

## SYNTHÈSE

- Service `ParcelleOperationCadastraleService` : `diviser` / `reunir` en transaction atomique.
- Sources déjà `remplacee` → refus explicite (seul vrai blocage).
- Doublon cadastral (commune, section, numéro) → refus, pas de création silencieuse.
- D22 : écart m² + % affiché, alerte ≥ 10 %, jamais bloquant.
- D23 : aucun prorata de prix.
- Filles : surface cadastrale seule, arpentée vide, **sans propriétaire**, **sans géométrie** (limites assumées F3/F4).
- Audit : `statut_cadastral` ajouté aux `auditedFields` Parcelle ; arcs avec `createur_id`.
- UI : boutons Diviser / Réunir sur fiche ; filtre « Inclure les remplacées » en liste.
- Ascendance / descendance multi-niveaux sur la fiche.
- Consultation #1132 préservée et enrichie.

## Mapping UI ↔ back (actions)

| Libellé UI | Valeur postée | Colonne / effet | Libellé back |
|---|---|---|---|
| Diviser | POST `/diviser` + `filles[]` | crée issues + arcs `type=division` ; source → `remplacee` | Division |
| Réunir | POST `/reunir` + `sources_ids` + `issue` | crée issue + arcs `type=reunion` ; sources → `remplacee` | Réunion |
| Inclure remplacées | `inclure_remplacees=1` | lève filtre `statut_cadastral=active` | Option liste |
| Réf. DA | `reference_da` | `parcelle_filiations.reference_da` | Facultatif, signalé manquant |
| Géomètre | `geometre_fournisseur_id` | FK fournisseurs | Optionnel |

## DÉPLOIEMENT OVH

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

Pas de migration nouvelle (table #1132 déjà en place).

## LEÇON

- Colonne réelle = `geometre_fournisseur_id`, pas `geometre_id` du CDC.
- Limites assumées du lot : pas de détention (F3), pas de géométrie (F4) — à signaler en UI sinon « perte de donnée ».
- Écriture `remplacee` uniquement via le service d’opération, pas via le service de lecture d’arcs.
