---
suivi: 1225
date: 2026-08-05
sujet: Promesse signée → parcelle sous_compromis + retrait en_cours écriture
chantier: foncier / promesses / parcelles
type: feature
statut: poussé
hash: f4b22795
fichiers:
  - app/Support/Foncier/ParcelleEtatAvancement.php
  - app/Services/Foncier/ParcelleEtatTransitionService.php
  - app/Services/Foncier/PromesseFonciereService.php
  - app/Support/Foncier/FoncierReferentiels.php
  - app/Http/Controllers/Foncier/PromesseFonciereController.php
  - app/Http/Controllers/Foncier/ParcelleController.php
  - app/Models/Parcelle.php
  - app/Support/Foncier/Alertes/Types/PromesseParcelleCoherenceType.php
  - app/Support/Foncier/Alertes/FoncierAlerteTypeRegistry.php
  - resources/js/Pages/Foncier/Parcelles/Show.vue
  - resources/js/Pages/Foncier/Promesses/Show.vue
  - tools/diag/reprise_promesses_en_cours_1225.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
  - docs/suivi/SUIVI_1225_promesse_signee_etat_parcelle.md
---

# SUIVI #1225 — Promesse signée → parcelle « sous compromis »

## PROMPT ENVOYÉ

Règle métier : une promesse n’existe que signée. À la création (et à l’attach
pivot), les parcelles passent en `sous_compromis` en avant seulement.
`en_cours` retiré des sélecteurs (toléré en lecture). Alerte cohérence (a)/(b).
Reprise des 2 promesses prod via script `--apply` (pas migration). Aucune
migration / nouveau champ. Ne pas toucher R5, détentions, Prospection Index.

## FICHES LUES

- `#1213` — diag prod : 2 promesses `en_cours` avec `date_signature` réelle ;
  0 `signe` ; pivot `promesse_parcelle` ; aucune incohérence orpheline.
- `#1182` — audit explicite sur attach / transitions (pas d’Eloquent silencieux).
- `#1125` / `#1118` — pipeline alertes `DeclencheFoncierAlertes` + expiration
  déjà sur `en_cours` **et** `signe` (conservé).
- `#1128` R5 acte → `acquise` : **non touché**.
- `#1191` — reprise = décision Robin, script explicite (pas data-fix silencieux).

## SYNTHÈSE

### Déclencheur
Existence / sync d’une promesse au statut déclencheur (`signe`, ou résidu
`en_cours`) → `ParcelleEtatTransitionService::appliquerSousCompromisDepuisPromesse`
après `PromesseFonciereService::syncParcelles` (création + mise à jour).

### Points d’écriture du pivot `promesse_parcelle`
| Point | Couvert |
|-------|---------|
| `PromesseFonciereService::creer` → `syncParcelles` → `sync()` | oui + transition |
| `PromesseFonciereService::mettreAJour` → `syncParcelles` si `parcelle_ids` | oui + transition |
| Autre attach / detach direct | **aucun** autre writer inventorié |

### Ordre d’avancement (un seul endroit)
`App\Support\Foncier\ParcelleEtatAvancement` :
`reperee < en_negociation < sous_compromis < acquise < affectee`.
Hors axe : `pas_d_action`, `projet_abandonne`.

### Hors axe (décision documentée)
Signer contredit la sortie → **avancer** vers `sous_compromis` (même règle que
l’amont d’axe). Pas de laisser + alerter seul : l’alerte (a) reste filet si un
résidu hors axe + promesse `signe` existait encore.

### Mapping des 5 statuts promesse

| Libellé affiché | Valeur postée | Libellé back | Création / saisie |
|-----------------|---------------|--------------|-------------------|
| En cours | `en_cours` | En cours | **non** (lecture / résidu ; option « à corriger » si déjà courant) |
| Signée | `signe` | Signée | **oui** (défaut création) |
| Caduc | `caduc` | Caduc | oui |
| Actée | `acte` | Actée | oui |
| Abandonnée | `abandonne` | Abandonnée | oui |

### Recensement filtres `en_cours` (promesses)
| Endroit | Changement |
|---------|------------|
| `STATUTS_PROMESSE_SAISIE` / options formulaire | `en_cours` exclu |
| `PromesseFonciereService::creer` défaut | `signe` (était `en_cours`) |
| Validation update | `en_cours` interdit sauf statut courant résiduel |
| `PromesseExpirationType` | inchangé : `en_cours` **et** `signe` |
| Listes / KPI promesse | pas de filtre exclusif `en_cours` inventorié — `signe` reste visible |
| Affichage `statut_libelle` | libellé `En cours` conservé pour résidus |

### Alertes cohérence
Type `promesse_parcelle_coherence` dans le registry existant :
- (a) promesse `signe` + parcelle amont **ou hors axe**
- (b) `sous_compromis` sans promesse `signe` vivante
Affichage UI **unique** : bandeau ambre fiche parcelle (`promesse_coherence_alerte`).
Pas de badge grille Prospection (#1225 ne touche pas Index Prospection).

### Script reprise
`tools/diag/reprise_promesses_en_cours_1225.php` — simulation par défaut ;
`--apply` pour écrire. Idempotent.

### D27
`caduc` / `abandonne` : **aucune** régression d’état parcelle.

## DÉPLOIEMENT / TEST

OVH : `git pull` ; `php artisan view:clear` ; `php artisan journal:sync` ;
**pas de migrate**. Puis script simulation puis `--apply` (Robin).

## LEÇON

Une promesse ERP = déjà signée : le défaut `en_cours` était un faux état qui
bloquait la maîtrise foncière dérivée de `etat_foncier`. Transition au sync
pivot (pas au seul flip de statut), ordre centralisé, reprise manuelle explicite.
