---
suivi: 1098
date: 2026-07-30
sujet: SharePoint — arborescence marchés lotissement (phase 2)
chantier: sharepoint_ged
type: feature
statut: poussé
hash: 74bc49b1
fichiers:
  - app/Support/SharePointArborescenceStructures.php
  - app/Services/SharePointService.php
  - app/Http/Controllers/MarcheController.php
  - resources/js/Pages/Marches/Show.vue
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - docs/suivi/SUIVI_1098_sharepoint_arborescence_marches_lotissement.md
  - public/build/
---

## PROMPT ENVOYÉ

SUIVI #1098 — réponses Q1→Q4 du #1097 + Phase 2 arborescence SharePoint marchés
lotissement sous TRAVAUX/4_PRESTATAIRES, branchement via metierForEnseigneCode(),
normalisation normalizeDynamicFolderName (VEFA intact), collision suffixe marche.id,
SOUS_TRAITANTS/ vide, nommage {prestataire}__{piece} lotissement seulement.

## SYNTHÈSE

Phase 2 de #1097. `creerDossierMarche()` branche sur
`SharePointArborescenceStructures::metierForEnseigneCode()` :
- VEFA : chemin historique inchangé (`05_SUIVI_CHANTIER`, `normalizeMarcheSegment`,
  noms `{TYPE}.ext`).
- Lotissement : `TRAVAUX/4_PRESTATAIRES/{NOM_LOT}_{NOM_ENTREPRISE}/` + 11 nœuds
  (1_ADMINISTRATIF… SOUS_TRAITANTS vide). Collision métier → suffixe `_{marche.id}`
  si le dossier est déjà rattaché à un autre marché.

Trois points d’entrée couverts (même méthode) : bouton `sharepoint-sync`, `store`
marché, dépôt document si dossier absent. Uploads marché/avenant utilisent
`resolveDriveIdForProgramme` (public). Échec lotissement → `Log::error` + message
détaillé (créés / échoués), pas de faux succès.

Nommage ST futur-proof : `{NOM_ST}__{PIECE}.pdf` — le prestataire reste le
segment avant le premier `__`, migration vers `SOUS_TRAITANTS/{NOM}/1_ADMINISTRATIF/`
sans renommer les fichiers.

## DÉPLOIEMENT / TEST

```bash
git pull origin main
php artisan optimize:clear
php artisan view:clear
php artisan journal:sync
# pas de migrate ; pas de npm sur OVH
# tester création dossier sur un marché HECTARE (web), puis un marché ENVOL
```

## LEÇON

Détecter un métier ERP par la présence d’un dossier SharePoint lie la règle métier
à l’état d’un système externe (renommage manuel = bascule silencieuse + coût Graph).
`metierForEnseigneCode()` centralise la décision ; dette : porter le métier sur une
donnée d’enseigne (colonne / config) plutôt qu’un test de code dans cette méthode.
