---
suivi: 1163
date: 2026-08-03
sujet: Commercial — soft-delete hors annulation, type financement CS vente, notaire saisie libre
chantier: commercialisation
type: fix
statut: poussé
hash: 932d78c5
fichiers:
  - app/Services/ReservationAcquereurUpdateService.php
  - app/Http/Controllers/ReservationController.php
  - app/Http/Requests/UpdateAcquereurFicheRequest.php
  - app/Models/Contact.php
  - app/Http/Controllers/AnnuaireController.php
  - app/Http/Controllers/ContactController.php
  - resources/js/Components/Commercialisation/LotsGrillePanel.vue
  - resources/js/Pages/Programmes/Acquereur/Show.vue
  - resources/js/Components/Commercialisation/ProspectsPanel.vue
  - resources/js/Pages/Annuaire/Create.vue
  - resources/js/Pages/Annuaire/Edit.vue
  - resources/js/Pages/Annuaire/Show.vue
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
  - docs/suivi/SUIVI_1163_commercial_suppr_financement_notaire.md
---

## PROMPT ENVOYÉ

SUIVI #1163 — trois corrections Robin post-#1156→#1162 : (1) soft-delete
réservation sans compter comme annulation + garde AF + audit historique ;
(2) type financement « Condition suspensive de vente… » (clé ≤26) ;
(3) notaire saisie libre (hors fournisseurs) avec exclusion mutuelle FK.
Réf. `SUIVI_1154_diag_commercial.md`. HEAD prod = 44b9b4f7.

## SYNTHÈSE

### Fiches lues
- `SUIVI_1154_diag_commercial.md` — SoftDeletes déjà sur Reservation ;
  motif `erreur_saisie` existant ; type_financement VARCHAR(32) post-migration
  annuaire ; pas de KPI annulation dédié.
- `SUIVI_1156` — notaire texte passé en lecture seule (arbitrage corrigé ici) ;
  whitelist anti-silence.
- `SUIVI_1157` — avait conclu « ne pas ajouter type financement » (#87) ;
  Robin tranche l’inverse.
- `SUIVI_1162` — `compterAppelsFondsBloquants` réutilisé pour le garde-fou
  suppression.

### Objet 1 — Suppression hors annulation
- Case « Supprimer sans compter comme annulation » (grille + fiche acquéreur).
- Flag `supprimer_sans_annulation` sur `PATCH …/annuler` (permission
  `acquereurs.ecriture` inchangée). SoftDeletes uniquement.
- Pas d’écriture `motif_annulation` / `date_annulation` / `statut=annule`.
- Lot remis comme l’annulation commerciale : `en_stock`, `prix_vente_ttc` NULL
  (le prompt disait `en_vente` — le chemin d’annulation existant utilise
  `en_stock` ; on le préserve).
- Garde AF via `assertAucunAppelFondsBloquant` (même compteurs legacy +
  Intacct que #1162), message chiffré.
- Audit bloquant `reservation_historique.action = suppression_hors_annulation`
  + snapshot (lot, contact, prix, dates…).
- Chemin d’annulation normal inchangé (motif + date requis).
- **Ne pas migrer** la réservation à motif `erreur_saisie` (1 occ.) — Robin
  décidera.

### Objet 2 — Type financement (#87)
| Libellé affiché | Valeur postée | Valeur stockée | Libellé back |
|---|---|---|---|
| Comptant | `comptant` | `comptant` | Comptant |
| Prêt bancaire | `pret_bancaire` | `pret_bancaire` | Prêt bancaire |
| PTZ | `ptz` | `ptz` | PTZ |
| Mixte | `mixte` | `mixte` | Mixte |
| Investissement | `investissement` | `investissement` | Investissement |
| Condition suspensive de vente d'un bien immobilier | `condition_suspensive_vente` | `condition_suspensive_vente` | Condition suspensive de vente d'un bien immobilier |
| Autre | `autre` | `autre` | Autre |
| (legacy) Prêt | `pret` | `pret` | Prêt |

- Colonne : migration `2026_05_13_160000` → `VARCHAR(32)` (confirmé code ;
  DB locale inaccessible ici — coller `SHOW COLUMNS` prod).
- Clé retenue : `condition_suspensive_vente` (**26** caractères, max 26).
- Sources alignées : `Contact::TYPES_FINANCEMENT` + Rule::in + miroirs Vue
  (Show, Annuaire, Prospects, FINANCEMENT_OPTIONS grille).

### Objet 3 — Notaire saisie libre
- Case « Saisie libre (hors base fournisseurs) » principal + double minute.
- Décochée → FK search ; cochée → texte `notaire` / `notaire_double_minute`.
- Exclusion mutuelle serveur (`appliquerExclusionMutuelleNotaire`) + front.
- Whitelist rouverte : `notaire`, `notaire_double_minute` (anti-silence intact
  pour le reste).
- Ouverture fiche : case cochée si FK nulle et texte rempli → les 19 résas
  texte-seul s’affichent correctement. **Le data-fix #1156 n’a plus lieu
  d’être.**
- Intacct : aucun chemin commercial / AdF / génération lit
  `reservations.notaire_fournisseur_id`. Seuls Foncier
  (`ActeFoncier` / `PromesseFonciere`) utilisent une colonne homonyme sur
  *leurs* tables — hors périmètre commercial.

### Whitelist top-level après ce lot
`prix_vente_ttc`, `remises_commerciales_ttc`, `tma_montant`, dates (résa,
prévisionnelle, option, SRU, expir réflexion, preuve négligence, envoi
notaire, limites financement, acte), `montant_acompte`, `acompte_encaisse`,
`depot_garantie_recu`, `paiement_comptant`, banque_*, `courtier_id`,
`date_offre_pret`, `odf_recu`, `date_justif_fonds`, `date_sru_envoi`,
`sru_statut`, `responsable_suivi_id`, `agence_fournisseur_id`,
`agence_commission_ttc`, `notaire_fournisseur_id`,
`notaire_double_minute_fournisseur_id`, **`notaire`**,
**`notaire_double_minute`**, `source_decouverte`, `notoriete_hectare`,
`commentaires`, `contact`, `type_financement`, `acquereurs`.

## DÉPLOIEMENT / TEST
1. Soft-delete sans AF → absente grille/KPI, lot en_stock prix NULL, pas
   d’annulation, historique snapshot.
2. Soft-delete avec AF → refus message chiffré.
3. Annulation normale (case décochée) → inchangée.
4. Type financement nouveau → stocké entier + F5.
5. Notaire libre / FK → exclusion mutuelle après F5.
6. Résa texte-seul → case cochée auto.
7. Champ hors whitelist → erreur visible.

OVH : `git pull` + `view:clear` + `journal:sync` (pas de migrate).

## LEÇON
- Soft-delete ≠ annulation filtrée : Robin veut *pas* d’annulation, pas un
  motif exclu des KPI.
- `notaire` texte n’est pas du legacy à corriger : mode voulu pour le notaire
  client hors Sage.
- VARCHAR(32) : clé ≤26 obligatoire ; `condition_suspensive_vente` = 26 pile.
- Réutiliser `compterAppelsFondsBloquants` plutôt que re-coder le garde AF.
