---
suivi: 1240
date: 2026-08-07
sujet: hotfix_undefined_programme_marches
chantier: marches / sharepoint
type: hotfix
statut: poussé
hash: 984dd5c8
fichiers:
  - app/Http/Controllers/MarcheController.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - docs/suivi/SUIVI_1240_hotfix_undefined_programme.md
---

# SUIVI #1240 — HOTFIX `$programme` undefined (MarcheController:734)

## PROMPT ENVOYÉ

500 prod `Undefined variable $programme` à MarcheController:734 après #1236/#1239.
Corriger au plus juste ; chercher récidives ; signaler `facture_id` ambigu sans le corriger.

## FICHES LUES

- `#1037` / motif connu : variable hors portée de closure — `php -l` et Reflection ne voient rien.
- `#1236` — a introduit `sharepoint_open_url` dans le `map` interne sans `use ($programme, $marche)`.

## CAUSE RACINE

Lot d'origine : **#1236** (`cf00b9ba`).

Dans `show()`, la closure externe capture bien `$programme` :
`use ($marche, $programme, $documentLabels)`.

Le `->map(function … use ($documentLabels, $pathCounts)` **interne** utilise
`$programme` et `$marche` pour `route('marches.documents.sharepoint', …)` sans les
passer dans `use` → ErrorException à l'exécution dès qu'un document a un `item_id`
(après #1239 : la plupart en ont).

#1239 n'a pas modifié MarcheController ; il a rendu le bug **visible** en peuplant
`sharepoint_item_id` (branche `sharepoint_open_url` désormais prise).

## CORRECTION

`use ($documentLabels, $pathCounts, $programme, $marche)` sur le map interne.

## OBJET 2 — Méthodes relues

| Méthode / zone | Verdict |
|----------------|---------|
| `MarcheController::show` documents IIFE + map | **bug #1236**, corrigé |
| `MarcheController::transformMarcheForShow` avenants `fn` | OK (arrow fn capture `$m`/`$av`) |
| `redirectDocumentSharePoint` / `redirectAvenantDocumentSharePoint` / `redirectSharePointByItemId` | OK |
| `SharePointService::uploadFichierApp` / `uploadAoDevis` / `uploadAoDocument` (#1239) | OK, pas de closure orpheline |
| `CreateSharePointAoFolder` | OK |
| `SharePointItemIdRattrapageService` | OK |

## OBJET 3 — Signalement (non corrigé)

`SQLSTATE[23000]: 1052 Column 'facture_id' is ambiguous` sur
`select id, facture_id, uuid from depot_factures` + `latestOfMany`.

Fichier : `app/Http/Controllers/ValidationController.php` (~221, ~243) —
eager load `'depotFacture:id,facture_id,uuid'`.

Relation : `Facture::depotFacture()` → `latestOfMany()`.

Correctif attendu (lot ultérieur) : qualifier
`depot_factures.id`, `depot_factures.facture_id`, `depot_factures.uuid`
(comme #864 / ApplicationAvoirDepotService).

## LEÇON

Après ajout d'une variable dans une closure **imbriquée**, vérifier chaque niveau
`use (...)`. Un lot qui peuple des données (`item_id`) peut faire exploser un bug
latent du lot précédent.
