---
suivi: 1243
date: 2026-08-07
sujet: Déplacement dossiers marché vers 4_PRESTATAIRES + intégration migration #1241
chantier: sharepoint / suivi-chantier
type: feature
statut: poussé
hash: d1f51e72
fichiers:
  - app/Services/SharePointChantierArboMigrationService.php
  - app/Http/Controllers/Admin/SharePointChantierArboMigrationController.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - docs/suivi/SUIVI_1243_deplacement_marches_4_prestataires.md
---

# SUIVI #1243 — déplacement marchés → 4_PRESTATAIRES

## PROMPT ENVOYÉ

Déplacer automatiquement les dossiers de marché de `_old_*` / `3_CONCESSIONNAIRES`
vers `4_PRESTATAIRES`, supprimer les `_old_` vidés, normaliser les sous-dossiers
marché, intégrer le tout dans le script #1241 (idempotent, sim/`?apply=1`, web).

## FICHES LUES

- `#1241` — renommage `_old_` sans déplacement marchés (« transfert manuel Lahouari ») ;
  **n’a PAS** renommé les sous-dossiers `00_PIECES` / `01_CONTRAT` / `03_DOCUMENTS` /
  `04_JURIDIQUE` des marchés existants (seulement la cible des *nouveaux* dépôts via
  `structureMarcheVefa()`).
- `#1236` / `#1239` — résolution par `item_id` (liens ERP conservés après move Graph).
- `#1232` — inventaire fichiers (pas sous-dossiers) → faux « VIDE » sur
  `3_CONCESSIONNAIRES` (ENEDIS_SOMALI).
- `#1230` / `#1231` — noms avec `+` (espace encodé) ; normaliseur hors périmètre ici.

## OBJET 4 — ce que #1241 a fait / pas fait des sous-dossiers

| Sous-dossier legacy | #1241 migration | #1243 |
|---|---|---|
| `00_PIECES_ADMINISTRATIVES` | inchangé sous `_old_` | rename → `1_ADMINISTRATIF` |
| `01_CONTRAT_AVENANTS` | inchangé | rename → `2_CONTRATS_ET_AVENANTS` |
| `03_DOCUMENTS` | inchangé | contenu → `4_DOC_LIBRES`, delete si vide |
| `04_JURIDIQUE` | inchangé | contenu → `4_DOC_LIBRES`, delete si vide |
| `3_SUIVI_OPERATIONNEL` enfants | non créés (lazy) | inchangé (pas de création des 6) |
| `02_FACTURES` | delete_if_empty prévu sous classif | idem sous chaque marché après move |

## Ordre du script (plan_version 1243)

1. ensure racines absentes (`1_DCE`…`5_PHOTOS`)
2. move AO / DCE / DOSSIER_MARCHE (héritage #1241)
3. rename `1_PRESTATAIRES` → `_old_1_…`, `2_ENTREPRISES` → `_old_2_…`
4. drain enfants (`_old_*`, `1_`/`2_` encore présents, `3_CONCESSIONNAIRES`) → `4_PRESTATAIRES` **par item_id**
5. normaliser sous-dossiers marché
6. `delete_only_if_empty` sur `_old_*` et `3_CONCESSIONNAIRES` (conservés + signalés si non vides)
7. delete_if_empty legacy AO/DCE/… (+ comités)

## Collisions

Si le nom existe déjà dans `4_PRESTATAIRES` : suffixe `_2`, `_3`… — **pas** d’écrasement
ni fusion silencieuse. Liste dans `state.collisions` + NOTES de la réponse HTTP.

## Programmes

| Programme | État #1241 | Attendu #1243 |
|---|---|---|
| 4 test facture sage | migré, 1 marché sous `_old_2` | rattrapage |
| 6 LOU MARQUES | migré + `3_CONCESSIONNAIRES` non vide | drain ENEDIS + delete |
| 1 ARBOREA | migré, ~27 + 3 noms `+` + 2 fichiers racine | rattrapage item_id |
| 2, 3, 5, 7–12 | non migrés | passe complète #1241+#1243 |

Ordre recommandé restants : **3** (validation une passe) puis 2, 5, 7, 8, 9, 10, 11, 12.

## URLs

- Sim : `/admin/sharepoint/migration-chantier/{id}/run`
- Apply : `/admin/sharepoint/migration-chantier/{id}/run?apply=1`
- Reset : `?apply=1&reset=1`

## Réversibilité

Recréer `_old_1_PRESTATAIRES` si besoin, `moveDriveItem` inverse
`4_PRESTATAIRES/{marché}` → `_old_…`. Les `item_id` ERP restent valides.

## LEÇON

- Inventaire « VIDE » qui ne compte que les fichiers → faux négatif sur sous-dossiers
  (`3_CONCESSIONNAIRES`).
- Dossiers au nom contenant `+` : toujours lister puis adresser par `item_id`, jamais
  `findChildFolderByName` seul.
- Ne jamais fusionner silencieusement deux `{POSTE}_{FOURNISSEUR}` homonymes.
