---
suivi: 1202
date: 2026-08-05
sujet: Foncier — négociations, tous les sauts de statut depuis la liste
chantier: foncier
type: evolution
statut: poussé
hash: 27e19dff
fichiers:
  - app/Support/Foncier/OffreStatutTransitions.php
  - app/Http/Controllers/Foncier/OffreFonciereController.php
  - app/Services/Foncier/FoncierAlerteSortieService.php
  - resources/js/Components/Foncier/OffreStatutInline.vue
  - tests/Feature/Foncier/FoncierOffreStatutInline1198SourceTest.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - docs/suivi/SUIVI_1202_foncier_negociation_statut_sauts_ouverts.md
  - public/build/
---

# SUIVI #1202 — Statuts négociation : tous les sauts depuis la liste

## PROMPT ENVOYÉ

Suite #1198 : la liste ne proposait que les transitions machine. Décision Robin :
tous les 7 statuts accessibles (sauts inclus). Cumul des données des étapes
traversées dans la même boîte. Retours autorisés avec avertissement +
effacement tracé. Jamais de statut sans ses dates. date_reponse < date_offre
signalé, pas bloqué. Clôture alerte sur tout chemin vers réponse ; réactivation
si retour vers envoyée + validité future.

## SYNTHÈSE

### Données réclamées par saut (calcul `OffreStatutTransitions::exigencesSaut`)

| De → Vers | date_offre | date_reponse | montant_contre | date_validite si absente | Efface | Alerte |
|-----------|------------|--------------|----------------|-------------------------|--------|--------|
| a_envoyer → envoyee | oui | — | — | — | — | — |
| a_envoyer → acceptee / refusee / sans_reponse | oui | oui | — | — | — | clôture |
| a_envoyer → contre_offre | oui | oui | oui | — | — | clôture |
| a_envoyer → expiree | oui | — | — | oui | — | clôture |
| envoyee → réponse (sauf expiree) | — | oui | si contre | — | — | clôture |
| envoyee → expiree | — | — | — | si absente | — | clôture |
| réponse → envoyee | — | — | — | — | réponse | réactive |
| * → a_envoyer | — | — | — | — | envoi+réponse | — |

### Retours / alerte

- Retour : avertissement UI ; nullification `date_reponse` / `montant_contre_offre` /
  `commentaire_reponse` (+ `date_offre` si vers a_envoyer). Audit via
  `AuditsFieldChanges`.
- Réactivation (#1202) : purge `foncier_alertes_emises` paliers `%.o{id}` ;
  réouvre tâche `cause_resolue` non touchée ; sinon commentaire système.
  Validité passée ou absente → pas de réarmement.

### Serveur

- Plus d’interdit de transition. POST sans date exigée → **422**.
- Fiche `Offres/Show.vue` inchangée (Envoyer / Réponse).

## DÉPLOIEMENT-TEST

1. `git pull` · `php artisan optimize:clear` · `view:clear` · `journal:sync`
2. Tests manuels 1–10 du prompt (select 7, sauts, 422, retour, alerte, dates, fiche, audit)

## LEÇON

La machine de transitions ne doit pas être plus rigide que le métier (#1134).
Transformer `OffreStatutTransitions` en **calculateur d’exigences** (chemin
cumulé), pas en interdit. TaskSync ne ressuscite pas les tâches fermées :
réactivation = purge dédup cloche + réouverture conditionnelle `cause_resolue`.
