---
suivi: 1187
date: 2026-08-04
sujet: Commercial — statut dation (sortie de stock)
chantier: commercialisation
type: feature
statut: poussé
hash: cb896f1d
fichiers:
  - database/migrations/2026_08_04_163000_add_dation_to_lots_commerciaux_statut_enum.php
  - app/Models/LotCommercial.php
  - app/Http/Controllers/LotCommercialController.php
  - app/Http/Controllers/Concerns/ManagesCommercialLotPayload.php
  - app/Http/Controllers/ProgrammeDashboardController.php
  - app/Http/Controllers/CommercialisationController.php
  - app/Support/Commercial/ProgrammeResumeCommercialBuilder.php
  - app/Support/Commercial/RemisesAccordeesCalculator.php
  - app/Support/LotCommercialHistoriquePresenter.php
  - routes/web.php
  - resources/js/Components/Commercialisation/LotsGrillePanel.vue
  - resources/js/Components/Commercialisation/SynthesePanel.vue
  - resources/js/Components/Programmes/AcquereursGrillePanel.vue
  - resources/js/Pages/Commercial/Index.vue
  - tests/Unit/LotCommercialDation1187Test.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
  - docs/suivi/SUIVI_1187_commercial_statut_dation.md
---

## PROMPT ENVOYÉ

SUIVI #1187 PHASE 2 — statut `dation` sur lots_commerciaux (ENUM), exclu
du stock comme `annule`. Décision : statut (pas mode_vente). Sync
mode_vente→dation à la transition. Neutre bilan (Q13b). HEAD annoncé b01949cc.

## SYNTHÈSE

### Fiches lues
- `SUIVI_1186` — cartographie ; reco mode_vente **non retenue** (Robin :
  dation = état, pas modalité). Approche changée : ENUM + machine `peut*`.
- `SUIVI_1185` / `#1177` / `#1164` — grille, résumé, historique.
- Zone commune LotsGrillePanel + AcquereursGrillePanel — rebase origin/main.

### Mapping UI ↔ back (statut)

| Libellé affiché | Valeur postée / ENUM | Stockée | Libellé back |
|-----------------|----------------------|---------|--------------|
| En stock | en_stock | en_stock | En stock |
| En vente | en_vente | en_vente | En vente |
| Réservé | reserve | reserve | Réservé |
| Acté | acte | acte | Acté |
| Annulé | annule | annule | Annulé |
| Dation | dation | dation | Dation |

### Transitions

| Depuis → vers | Autorisé | Garde |
|---------------|----------|-------|
| en_stock \| en_vente → dation | oui | pas de résa en_cours/acte ; pas d’AF ; pose `mode_vente=dation` |
| dation → en_stock | oui (`peutRemettreEnStock`) | pas de résa active |
| reserve \| acte → dation | **non** (message explicite) | — |
| dation → en_vente / réserve | **non** (repasser par stock) | — |

Cohérence `mode_vente` : statut=dation **force** mode_vente=dation (grille
refuse un autre mode). L’inverse n’est pas vrai (mode_vente=dation sans
statut dation reste possible — anticipation).

### Audit exhaustif — comportement `dation` (comme annule où pertinent)

| Endroit | Comportement retenu |
|---------|---------------------|
| `LotCommercial::STATUTS_HORS_STOCK` | annule + dation |
| `ProgrammeDashboardController` taux | exclus du dénominateur |
| `CommercialisationController` stock_synthese | exclus des lotsActifs / En vente |
| `ProgrammeResumeCommercialBuilder` CA potentiel | exclus |
| CA réservé+acté / remises | déjà ∉ R\|A → hors KPI |
| `RemisesAccordeesCalculator` | commentaire Q13b ; formule inchangée |
| `BilanFinancierService` | **non touché** (Q13b) |
| WidgetDataService | déjà stock\|vente seulement |
| Filtres LotsGrille / Acquéreurs / Index | + option Dation |
| Rattachement multi-lots | déjà stock\|vente → dation non proposé |
| Offre / TMA / AF génération | déjà whitelist → dation hors |
| Import Pegao `bloque` | reste → annule (pas de mapping dation) |
| Suppression lot | inchangé (AF bloque) |

### Exclusion financière — PROVISOIRE (Q13b)

Un lot `dation` est exclu de :
1. KPI Remises accordées (∉ reserve/acte)
2. CA réservé+acté résumé (#1177)
3. CA potentiel résumé
4. Génération AF (lot ≠ acte)

**À revoir** quand la comptable tranche Q13b (CA prévisionnel /
neutralisation trésorerie / coût d’acquisition). Point d’entrée :
`STATUTS_HORS_STOCK` + `ProgrammeResumeCommercialBuilder` +
`RemisesAccordeesCalculator` (commentaire).

### Données
Aucune écriture : le lot `mode_vente=dation` encore `en_stock` n’est **pas**
basculé automatiquement.

### KPI remises
Avant = après (0 lot en statut dation) : à vérifier en prod avec
`diag_remises_kpi_1168.php` (réf. annoncée 151 454,48 € / 73 lots).

## DÉPLOIEMENT-TEST

1. `git pull` ; `php artisan migrate --force` ; `optimize:clear` ; `route:clear` ; `view:clear` ; `journal:sync`
2. `php tools/diag/diag_remises_kpi_1168.php` → identique avant
3. `php artisan commercial:coherence-reservation-lots` → 0
4. Smoke tests 1–13 du prompt (dation depuis vente, refus réservé/AF, filtre, historique)

## LEÇON

`mode_vente` = modalité ; `statut` = cycle de vie. Les confondre crée une
neuvième notion (#1181). Un état hors machine `peut*` = pas de contrôle ni
réversibilité. Exclusion financière documentée **provisoire** dès le premier
lot évite de préempter Q13b en silence.
