---
suivi: 1157
date: 2026-08-03
sujet: Commercial — motifs annulation (#84) et type financement (#87)
chantier: commercialisation
type: feature
statut: poussé
hash: f37555e0
fichiers:
  - resources/js/Components/Commercialisation/LotsGrillePanel.vue
  - resources/js/Pages/Programmes/Acquereur/Show.vue
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
  - docs/suivi/SUIVI_1157_commercial_motifs_financement.md
---

## PROMPT ENVOYÉ

SUIVI #1157 — lot 2 commercial. #84 motif « Changement de lot », #87 type
financement « Condition suspensive de vente d'un bien ». Vérifier d’abord
si les valeurs / mécanismes existent déjà (`modification_lot`,
`condition_revente`, écart ENUM/Rule::in). Pas de doublon sémantique.
Réf. `SUIVI_1154_diag_commercial.md`.

## SYNTHÈSE

### Fiches lues

- `SUIVI_1154_diag_commercial.md` — motifs = const PHP + miroir Vue (varchar,
  pas table) ; type_financement = ENUM d’origine + Rule::in étendu ; découpage
  lot C = #84/#87.
- Aucune fiche #856/#914 (hors sujet ici).

---

### Q1 — Const motifs complète + conclusion #84

Colonne `reservations.motif_annulation` : **varchar(255)**, aucune migration
requise pour un ajout de valeur.

| Libellé affiché (grille) | Valeur postée / stockée | Groupe |
|--------------------------|-------------------------|--------|
| Financement refusé | `financement_refuse` | client |
| Financement non obtenu dans les délais | `financement_hors_delai` | client |
| Rétractation dans le délai SRU | `retractation_sru` | client |
| Désistement sans motif | `desistement_client` | client |
| Changement de situation personnelle | `situation_personnelle` | client |
| Prix jugé trop élevé | `prix_eleve` | client |
| A trouvé un autre bien | `autre_bien` | client |
| Non-paiement du dépôt de garantie | `non_paiement_depot` | client |
| Modification du programme | `modification_programme` | projet |
| Retard chantier important | `retard_chantier` | projet |
| Abandon du programme | `abandon_programme` | projet |
| **Modification du lot (surface, prix)** | **`modification_lot`** | projet |
| Problème juridique / administratif | `probleme_juridique` | projet |
| Accord amiable client / promoteur | `accord_amiable` | mutuel |
| **Changement / échange de lot** (ex « Échange contre un autre lot ») | **`echange_lot`** | mutuel |
| Erreur de saisie | `erreur_saisie` | autre |
| Autre motif | `autre` | autre |

Source unique valeurs : `Reservation::MOTIFS_ANNULATION_VALIDES`.
Miroirs UI : `LotsGrillePanel.vue` (groupé) + `Acquereur/Show.vue` (plat).

**Conclusion #84 — NE PAS ajouter `changement_lot`.**

- `modification_lot` ≠ « Changement de lot » : libellé = **modification des
  caractéristiques du même lot** (surface, prix). Déjà utilisé 1× en prod.
- La demande Mélanie correspond à **`echange_lot`** (passer à un autre lot).
- Action retenue : **libellé clarifié** `echange_lot` → « Changement / échange
  de lot » (même valeur stockée → stats inchangées, pas de doublon).
- Miroir fiche acquéreur complété (avant : 5 motifs seulement → validation
  passait / UI tronquée).

---

### Q2 — Écart ENUM MySQL / Rule::in (#87 prérequis)

Création : ENUM
`comptant|pret_bancaire|ptz|mixte|autre`
(`2026_05_13_140200_create_contacts_table`).

Migration ultérieure :
`ALTER … MODIFY type_financement VARCHAR(32) NULL`
(`2026_05_13_160000_annuaire_…`).

| Couche | Valeurs |
|--------|---------|
| ENUM d’origine (create) | comptant, pret_bancaire, ptz, mixte, autre |
| Rule::in fiche / store (variantes) | + `investissement`, parfois `pret` |
| LotsGrillePanel `FINANCEMENT_OPTIONS` | 5 valeurs d’origine seulement |
| Acquereur/Show Select | + `investissement` (pas `pret`) |
| Annuaire Create/Edit | + `investissement` |

Prod diag #1154 (distributions) : seulement
`pret_bancaire` / `comptant` / `autre` / NULL — **aucune** ligne
`investissement` ni `pret` → cohérent avec un ENUM encore strict **ou**
des valeurs étendues jamais saisies.

**À confirmer en prod** : `COLUMN_TYPE` réel (ENUM vs varchar). Si ENUM
persiste, poster `investissement` = risque 500 MySQL malgré validation OK.

---

### Q3 — Bloc `condition_revente` existant + conclusion #87

Colonnes `reservations` (déjà là) :
`condition_revente` (bool), `memo_condition_revente`,
`date_limite_sign_compromis_revente`, `date_reelle_sign_compromis_revente`,
`date_limite_sign_acte_revente`, `date_reelle_sign_acte_revente`.

Écriture : `ReservationController` store + validateReservationUpdate
(whitelist OK).

**Affichage Vue** : **aucun** `condition_revente` dans `resources/js`
(grille, fiche acquéreur, prospects) → back prêt, UI absente
(même pattern que #67 plan).

**Conclusion #87 — NE PAS ajouter un type_financement
`condition_suspensive_vente` sans arbitrage Robin.**

Deux expressions du même besoin métier :
1. Flag + dates sur la **réservation** (`condition_revente`) — modèle déjà
   là, plus riche (échéances compromis/acte).
2. Valeur dans `contacts.type_financement` — demande Mélanie telle que
   formulée.

Les ajouter **tous les deux** = doubles stats / double saisie.
Lot actuel = **pas d’ajout** ; question Robin :
- exposer le bloc revente à l’écran (découvrabilité), **ou**
- ajouter une valeur financement, **ou**
- les deux avec règle d’usage.

---

### Mapping UI ↔ back (inchangé pour valeurs stockées)

#### Motifs (#84)

| Libellé affiché | Valeur postée | Colonne DB | Libellé back |
|-----------------|---------------|------------|--------------|
| Changement / échange de lot | `echange_lot` | `reservations.motif_annulation` | idem code |
| Modification du lot (surface, prix) | `modification_lot` | idem | idem |

#### Financement (#87) — aucune nouvelle valeur

Pas de nouvelle ligne. Les 5 (+ investissement UI fiche) restent.

---

### Code livré (périmètre minimal)

1. Libellé `echange_lot` clarifié dans `LotsGrillePanel.vue`.
2. Miroir complet des motifs dans `Acquereur/Show.vue`.
3. Entrée journal.
4. Rebuild Vite (`public/build/`).
5. **Pas** de nouvelle const motif, **pas** de migration financement,
   **pas** d’UI `condition_revente` (attente Robin).

## DÉPLOIEMENT / TEST

```text
git pull origin main
php artisan view:clear
php artisan journal:sync
```

Pas de migrate.

### Tests

1. Motifs déjà en base (`financement_refuse`, `erreur_saisie`,
   `modification_lot`) : libellés corrects, sélectionnables.
2. `echange_lot` : libellé « Changement / échange de lot », même valeur en DB.
3. Annulation depuis fiche acquéreur : liste complète (dont
   `modification_lot` / `echange_lot` / `erreur_saisie`).
4. Valeur hors liste : refus validation (Rule::in / const PHP).
5. Stats : un seul code `echange_lot` (pas de second motif voisin).
6. #87 : aucun nouveau type financement — confirmer absence en UI.

## LEÇON

Avant d’ajouter une valeur de liste commerciale : lire **tous** les
libellés voisins (`modification_lot` ≠ `echange_lot`) et chercher un
mécanisme parallèle (`condition_revente` hors `type_financement`). Un
miroir Vue incomplet (fiche vs grille) est aussi grave qu’un oubli PHP.
`type_financement` : ne jamais se fier au create ENUM sans vérifier le
ALTER varchar + le `COLUMN_TYPE` prod.
