---
suivi: 1183
date: 2026-08-04
sujet: Fatals runtime — params route int, loadMissing Support\Collection, SIRET varchar(14), IGN instruct
chantier: stabilite
type: fix
statut: poussé
hash: bb75b266
fichiers:
  - app/Support/SiretInput.php
  - app/Rules/SiretFrancais.php
  - app/Support/FournisseurAuditFieldValidator.php
  - app/Support/Commercial/FournisseurPartenaireCommercialService.php
  - app/Http/Controllers/FournisseurController.php
  - app/Http/Controllers/DemandeFournisseurController.php
  - app/Http/Controllers/Admin/DemandeFournisseurAdminController.php
  - tests/Unit/SiretInput1183Test.php
  - tests/Unit/FournisseurAuditFieldValidatorTest.php
  - tests/Unit/FournisseurPartenaireCommercial1180Test.php
  - tests/Feature/FournisseurAuditTest.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - docs/suivi/SUIVI_1183_fatals_siret_route_loadmissing.md
---

## PROMPT ENVOYÉ

SUIVI #1183 — trois 500 prod (31/07) : typage `int` sur segment de route
(JuridiqueRegistreCommentaire), `loadMissing` sur Support\Collection, SIRET trop
long (SQLSTATE 22001). PHP seul. Bug IGN cadastre à instruire sans coder.

## SYNTHÈSE

### Fiches lues
- Aucune fiche `SUIVI_1146` (lot sans fiche ; rattrapé #1147). Commit
  `e4ab4607` déjà sur `main` : bugs 1 et 2 corrigés le 31/07 16:21 (après les
  logs du matin / après-midi).
- `SUIVI_1180` — validation SIRET partenaire : **réutiliser** `SiretInput`, ne
  pas dupliquer.

### BUG 1 — int sur segment de route
**Déjà corrigé (#1146).** `JuridiqueRegistreCommentaireController` :
`index/store/searchMentions(Request, mixed $id, string $registre)` + ordre
positional. Audit rejoué : `RouteScalarParamsIntegritySourceTest` **PASS**
(0 anomalie). Seul `NfHabitatController::indexProps(?int $classeurActifId)`
porte un `int` public — **pas** une action de route (helper props). Aucune
correction supplémentaire dans ce lot.

### BUG 2 — loadMissing sur Support\Collection
**Déjà corrigé (#1146).** Écran : **offre foncière** (dossier) —
`DossierFoncier::parcellesCandidats()` renvoie Eloquent\Collection ;
`OffreFonciereController::serializeParcellesCandidates` eager-load avant map.
Re-audit : 225 appels `loadMissing`/`loadCount` sous `app/` ; heuristique
map/filter/values → loadMissing : **0 risque restant**. Test source
`loadMissing_pas_enchaine_sur_parcellesCandidats_dans_foncier` PASS.

### BUG 3 — SIRET trop long (nouveau code)
Règle unique `App\Support\SiretInput` + `App\Rules\SiretFrancais` :
exactement 14 chiffres après nettoyage séparateurs ; vide → null.
Branchée : audit field validator, partenaire commercial (#1180), demandes
fournisseur (store + admin update). 422 visible ; `applyFieldPatch` non
appelé → **pas de dirty_sage**.

### Fournisseur 2556
Base locale Cursor sans table `fournisseurs` — **non vérifiable ici**. À
contrôler en prod (lecture seule) :
`SELECT id, nom, siret, dirty_sage, champs_modifies_sage, audit_reference_valeurs
 FROM fournisseurs WHERE id = 2556;`
Attendu historique : siret `31854903700022` dans refs audit si rollback
transactionnel ; sinon incohérence si troncature partielle (peu probable sous
InnoDB strict).

### BUG 4 — IGN (instruct, pas de code)
`IgnCadastreParcelleService::variantes()` inclut la section brute `A` après
`0A`. L’API renvoie HTTP 400 sur `A` (« 2 caractères ») ; `0A` peut renvoyer
0 feature. **Instruction futur lot** : n’émettre que la forme paddée en
premier appel ; ne pas proposer la variante non paddée (400 inutile). Tester
en prod via route web (HTTPS CLI OVH bloqué) sur parcelle réelle 34077.

### Mapping UI ↔ back (SIRET)
| Libellé | Posté | DB | Back |
|---------|-------|-----|------|
| SIRET | `siret` / `value` | `fournisseurs.siret` varchar(14) | `SiretInput` → 14 digits ou null |

## DÉPLOIEMENT-TEST

1. `git pull origin main` ; `php artisan optimize:clear` ; `view:clear` ; `journal:sync`
2. Juridique registres → commentaires ligne (chaîne id) sans 500
3. Offre foncière dossier → candidats parcelles sans 500
4. Audit fournisseur : SIRET 19 car. → 422, saisie conservée côté client, pas dirty
5. SIRET `318 549 037 00022` → accepté nettoyé
6. Prod lecture : état siret id 2556

## LEÇON

- `php -l` / Reflection ne voient pas Support vs Eloquent Collection.
- Validation longueur **avant** SQL pour colonnes varchar courtes syncées Sage.
- Une règle SIRET partagée (#1183) avant tout second chemin (#1180 déjà branché).
