---
suivi: 1113
date: 2026-07-31
sujet: Diagnostic — chaîne migrations from scratch / depot_factures.deleted_at
chantier: methode
type: diagnostic
statut: poussé
hash: 16650ad0
fichiers:
  - tools/diag/diag_depot_factures_deleted_at_1113.php
  - tools/diag/diag_migrations_from_scratch_1113.php
  - docs/suivi/SUIVI_1113_diag_migrations_from_scratch.md
---

## PROMPT ENVOYÉ

SUIVI #1113 — PHASE 1 diagnostic : RefreshDatabase échoue (`depot_factures.deleted_at`
manquant). Établir migrations concernées, présence SoftDeletes, migrate from scratch
(toutes erreurs), origine probable. Aucune correction appliquée.

## SYNTHÈSE

### 1. Qui référence `deleted_at` ?
`database/migrations/2026_05_16_180000_add_date_paiement_previsionnel_to_depot_factures_and_situations.php`
lignes 27–44 : `DepotFacture::query()->…->chunkById()`. Le modèle porte
`SoftDeletes` → scope global `where depot_factures.deleted_at is null`.

### 2. Qui devrait créer la colonne ?
`database/migrations/2026_06_05_150000_add_soft_deletes_to_factures_and_depot_factures.php`
lignes 22–30 : `$table->softDeletes()` (+ `deleted_by_user_id`, `deleted_reason`).
Horodatage **postérieur** à l’usage Eloquent (05_16 ≪ 06_05).

### 3. SoftDeletes / présence colonne
- Modèle `DepotFacture` : `use SoftDeletes` (confirmé).
- Base locale `erp_immo` (MariaDB _tmp) : table oui, **`deleted_at` ABSENT** (dump
  partiel, 3 lignes dans `migrations` seulement — pas un miroir fidèle de la prod OVH).
- Prod OVH : non interrogée depuis cette session (pas d’accès réseau prod ici) ;
  la migration 06_05 + SoftDeletes sur le modèle impliquent que la prod ayant
  appliqué 06_05 a la colonne. À confirmer sur OVH via le script diag.

### 4. Migrate from scratch (DB vide `erp_immo_migrate_1113`) — 4 erreurs / 368
1. `2026_05_16_180000_…` — `Unknown column depot_factures.deleted_at` (SoftDeletes)
2. `2026_05_26_152600_upsert_meta_health…` — table `features_permissions` absente
   (création = `2026_05_29_100000_…`, **3 jours après** l’upsert)
3. `2026_06_15_100000_refactor_etapes_modeles_par_enseigne.php` — `no active transaction`
   (DDL `Schema::table` dans `DB::transaction()`)
4. `2026_07_30_140200_create_parcelle_geometries_table.php` — syntaxe `GEOMETRY … SRID 4326`
   refusée par MariaDB 11.4 locale (OK attendu MySQL 8 prod selon #1071)

Après le run partiel : `depot_factures.deleted_at` = **PRESENT** (06_05 a tourné).

### 5. Origine probable
Pas une colonne « ajoutée à la main » ni une migration soft-deletes absente du repo.
**Ordre + Eloquent** : SoftDeletes sur le modèle actuel + migration 05_16 qui utilise
le modèle **avant** que 06_05 n’ajoute la colonne. En prod historique, 05_16 a pu
passer quand le trait n’était pas encore (ou pas) sur le modèle ; from-scratch avec
le code actuel casse.

### Proposition de correction (NON APPLIQUÉE)
| # | Correctif | Risque | Zone |
|---|-----------|--------|------|
| A | 05_16 : remplacer `DepotFacture::query()` par `DB::table('depot_factures')` (pas de scope SoftDeletes) | Faible — migration déjà jouée en prod ; impact = rejeu / tests | Compta (lecture/backfill historique) — **validation compta recommandée** |
| B | 05_26 : `Schema::hasTable('features_permissions')` early-return, ou renommer horodatage ≥ 05_29 | Faible | Admin Meta — hors compta |
| C | 06_15 : sortir le DDL hors `DB::transaction()` | Moyen (refactor migration déjà jouée) | Étapes / enseignes — hors compta |
| D | 07_30 géométries : variante MariaDB / garde driver | Moyen | Foncier — hors compta |

Priorité tests Feature : **A** débloque RefreshDatabase sur la 1ʳᵉ erreur.

## DÉPLOIEMENT / TEST

Sans objet (diagnostic). Scripts :
```
php tools/diag/diag_depot_factures_deleted_at_1113.php
php tools/diag/diag_migrations_from_scratch_1113.php
```

## LEÇON
Une migration ne doit jamais appeler un modèle Eloquent porteur de SoftDeletes /
scopes globaux tant que la colonne n’existe pas encore dans la chaîne — préférer
`DB::table()` pour les backfills historiques.
