---
suivi: 1236
date: 2026-08-07
sujet: liens_sharepoint_item_id
chantier: sharepoint / suivi-chantier
type: feature
statut: poussé
hash: cf00b9ba
fichiers:
  - tools/diag/diag_liens_sharepoint_1236.php
  - app/Services/SharePointService.php
  - app/Services/SharePointChantierInventaireService.php
  - app/Http/Controllers/MarcheController.php
  - routes/web.php
  - resources/js/Pages/Marches/Show.vue
  - resources/views/errors/sharepoint-link-unavailable.blade.php
  - tests/Unit/SharePointChantierInventaireServiceTest.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - docs/suivi/SUIVI_1236_liens_sharepoint_item_id.md
  - public/build/
---

# SUIVI #1236 — Liens SharePoint par `sharepoint_item_id`

## PROMPT ENVOYÉ

Résoudre les liens « voir dans SharePoint » des documents marché/avenant via
`sharepoint_item_id` (immuable) plutôt que `sharepoint_url` (casse au renommage).
État des lieux lecture seule, option (a) redirection ERP + cache court, corriger
croisement inventaire #1232 (`erp_index.ids`), signaler besoins DCE / dépouillement
AO sans les traiter. Pas de touch arborescence, pas de modification des colonnes SP
en base, pas de Graph en CLI.

## FICHES LUES

- `#1232` — inventaire, `erp_index`, verdicts manuel/ERP, purge web.
- `#1231` — multi-docs marché / `Show.vue` (zone sérialisée).
- `#1228` — stockage local intact (0 manquant).
- `#1108` — échec Graph visible, jamais silence.

## OBJET 1 — État des lieux (avant)

Script : `php tools/diag/diag_liens_sharepoint_1236.php` (OVH uniquement pour volumes prod).

| Mesure | Attendu / méthode |
|--------|-------------------|
| Liens cassés (chemin stale, ex. `env34-002--triton`) | Attendu : documents du **programme 2 (TRITONS)** — coller sortie OVH |
| Sans `item_id` | À coller depuis script — **seuls cas à risque** pour renommage arbo futur |
| Base locale Cursor | MySQL indisponible — **ne pas** présenter comme prod |

Tableau détaillé = sortie script (colonnes table|id|contexte|item_id|stale|verdict).

## OBJET 2 — Option retenue : **(a) route de redirection**

| Critère | (a) Redirection au clic | (b) Rafraîchir URL à l'affichage |
|---------|-------------------------|----------------------------------|
| Appels Graph **rendu fiche 7 docs** | **0** | **7** |
| Appels Graph **par clic** | 1 (cache 5 min) | 0 si déjà rafraîchi |
| Fraîcheur | Toujours le `webUrl` courant | Différée |
| Écriture `sharepoint_url` | Aucune | Oui (interdit ici sans script reprise) |

**Choix (a)** : fiabilité + **0 Graph au rendu**. Routes :
- `GET …/documents/{doc}/sharepoint`
- `GET …/avenants/…/documents/{avenantDocument}/sharepoint`

Échec → vue `errors/sharepoint-link-unavailable` (message explicite).  
« Voir » = **toujours** fichier local (`download` ne redirige plus vers l'URL SP).

## OBJET 3 — Inventaire

- `buildErpIndex` : IDs marché/avenant + AO/devis/réservations si colonnes existent ; refresh **chaque batch**.
- `isKnownByErp` : **item_id d'abord**, URL en repli (test unitaire renommage).
- Avant/après programme 2 : **purge** puis re-run inventaire → viser ~**39** manuels (pas 85). Coller chiffres après run prod.
- Non-régression programme 1 : 68 docs ERP restent `connu_erp`.

## OBJET 4 — Besoins non couverts (signalés, non traités)

1. **DCE** `TRITONS DCE 20 mai 2026.zip` (342 Mo) déposé à la main — champs `dce_*` ERP à 0/3.
2. **38 fichiers dépouillement AO** (04/08, Lahouari) sous marché faute d'emplacement ERP.
   - Doublons `_2` ; **3 fichiers corrompus** (~165 octets, noms mojibake / sans extension).

Lots distincts futurs.

## DÉPLOIEMENT

```text
git pull origin main
php artisan optimize:clear
php artisan view:clear
php artisan route:clear
php artisan journal:sync
# Diag objet 1 :
php tools/diag/diag_liens_sharepoint_1236.php
# Inventaire programme 2 (purge puis run) :
# POST /admin/sharepoint/inventaire-chantier/purge?programme=2
# GET  /admin/sharepoint/inventaire-chantier/2/run?reset=1&batch=25
```

Pas de migrate. `SharePointService.php` touché — sérialiser si autre lot concurrent.

## LEÇON

L'URL SharePoint est un **cache fragile** ; l'`item_id` Graph est la référence. Ne jamais
rediriger le téléchargement local vers une URL stockée. Inventaire : un `erp_index` figé
sans refresh batch laisse `ids` vides → faux « manuels ».
