# RP - Migration des dossiers usagers

**Runbook, Juin 2025. Workflow complet de traitement des tickets de migration de dossiers usagers sur Reconnect Pro.**

<p class="callout info"><span style="white-space: pre-wrap;">Cette procédure s'applique à chaque ticket Trello de type </span>****« Migration des dossiers usagers »****. Suivre les étapes dans l'ordre.</p>

---

### La commande

La commande Symfony utilisée pour migrer les dossiers est :

`<span class="editor-theme-code">php bin/console app:migrate-individuals-to-other-organization -o {ORIGINE_ID} -d {DESTINATION_ID} -f {CHAMP_MIGRATION} -t "{VALEUR_CIBLE}"</span>`

#### Options disponibles

<table id="bkmrk-optionnom-longdescri"><colgroup><col></col><col></col><col></col><col></col></colgroup><tbody><tr><th>Option

</th><th>Nom long

</th><th>Description

</th><th>Exemple

</th></tr><tr><td>`<span class="editor-theme-code">-o</span>`

</td><td>`<span class="editor-theme-code">--originOrganization</span>`

</td><td>ID du centre d'origine (celui qui perd des suivis)

</td><td>`<span class="editor-theme-code">-o 4537</span>`

</td></tr><tr><td>`<span class="editor-theme-code">-d</span>`

</td><td>`<span class="editor-theme-code">--destinationOrganization</span>`

</td><td>ID du centre de destination (celui qui reçoit les suivis)

</td><td>`<span class="editor-theme-code">-d 5644</span>`

</td></tr><tr><td>`<span class="editor-theme-code">-f</span>`

</td><td>`<span class="editor-theme-code">--targetFieldSlug</span>`

</td><td>Slug du champ personnalisé utilisé comme critère de migration

</td><td>`<span class="editor-theme-code">-f migration-des-donnees</span>`

</td></tr><tr><td>`<span class="editor-theme-code">-t</span>`

</td><td>`<span class="editor-theme-code">--targetFieldValue</span>`

</td><td>Valeur du champ qui déclenche la migration (doit correspondre exactement à la valeur saisie dans le dossier)

</td><td>`<span class="editor-theme-code">-t "CHU 77"</span>`

</td></tr><tr><td>`<span class="editor-theme-code">--noField</span>`

</td><td>-

</td><td><span style="white-space: pre-wrap;">Migrer </span>

**tous**

<span style="white-space: pre-wrap;"> les individus du centre d'origine, sans condition sur un champ. Incompatible avec </span>

`<span class="editor-theme-code">-f</span>`

<span style="white-space: pre-wrap;"> / </span>

`<span class="editor-theme-code">-t</span>`

.

</td><td>`<span class="editor-theme-code">--noField</span>`

</td></tr><tr><td>`<span class="editor-theme-code">--withDeleted</span>`

</td><td>-

</td><td>Inclure les individus supprimés (soft-deleted) dans la migration

</td><td>`<span class="editor-theme-code">--withDeleted</span>`

</td></tr><tr><td>`<span class="editor-theme-code">--withAccommodations</span>`

</td><td>-

</td><td>Migrer également les hébergements liés aux individus migrés. Voir section dédiée ci-dessous.

</td><td>`<span class="editor-theme-code">--withAccommodations</span>`

</td></tr><tr><td>`<span class="editor-theme-code">--dry-run</span>`

</td><td>-

</td><td><span style="white-space: pre-wrap;">Mode simulation : aucune donnée modifiée. </span>

****Toujours lancer en premier.****

</td><td>`<span class="editor-theme-code">--dry-run</span>`

</td></tr></tbody></table>

<p class="callout warning">****Logique de ciblage :****<span style="white-space: pre-wrap;"> seuls les dossiers du centre d'origine dont le champ </span>`<span class="editor-theme-code">-f</span>`<span style="white-space: pre-wrap;"> contient exactement la valeur </span>`<span class="editor-theme-code">-t</span>`<span style="white-space: pre-wrap;"> sont migrés. Les dossiers avec le champ vide restent dans le centre initial. La valeur est recherchée d'abord sur le membre principal du foyer, puis sur les autres membres si non trouvée.</span></p>

---

### Migration avec hébergements (`<span class="editor-theme-code">--withAccommodations</span>`)

<span style="white-space: pre-wrap;">Lorsque l'option </span>`<span class="editor-theme-code">--withAccommodations</span>`<span style="white-space: pre-wrap;"> est activée, la commande migre également les hébergements (</span>`<span class="editor-theme-code">Accommodation</span>`) liés aux individus migrés : l'hébergement est réaffecté au centre de destination.

<p class="callout danger">****Cas problématique - hébergement partagé :****<span style="white-space: pre-wrap;"> si un hébergement contient à la fois des individus migrés et des individus </span>**non**<span style="white-space: pre-wrap;"> migrés (restant dans le centre d'origine), la commande le détecte et affiche un tableau d'alerte en dry-run. Ce cas nécessite une décision manuelle avant de lancer la migration réelle.</span></p>

### Output dry-run avec hébergements

Le dry-run affiche, en plus du tableau des suivis, un récapitulatif des hébergements :

- Le nombre total d'hébergements qui seraient migrés
- Si des hébergements problématiques existent : un tableau listant pour chaque hébergement les individus migrés et les individus non migrés encore rattachés

Exemple de sortie en cas de problème :

Hébergements à migrer: 3  
  
Problème: Hébergements avec individus non migrés rattachés  
  
<span style="white-space: pre-wrap;"> ------------ ---------------- ---------------------- ----------------- </span>  
<span style="white-space: pre-wrap;"> Centre ID Hébergement ID Individus non migrés Individus migrés </span>  
<span style="white-space: pre-wrap;"> ------------ ---------------- ---------------------- ----------------- </span>  
<span style="white-space: pre-wrap;"> 4537 892 1042, 1078 1035 </span>  
<span style="white-space: pre-wrap;"> ------------ ---------------- ---------------------- ----------------- </span>

<p class="callout warning"><span style="white-space: pre-wrap;">En présence d'hébergements problématiques, </span>****ne pas lancer la migration réelle****<span style="white-space: pre-wrap;"> sans avoir tranché : soit on accepte de migrer l'hébergement (les individus non migrés se retrouveront sans hébergement dans le centre d'origine), soit on exclut </span>`<span class="editor-theme-code">--withAccommodations</span>`<span style="white-space: pre-wrap;"> et on traite les hébergements manuellement.</span></p>

### <span style="white-space: pre-wrap;">Comportement sans </span>`<span class="editor-theme-code">--withAccommodations</span>`

<span style="white-space: pre-wrap;">Par défaut (sans l'option), les individus migrés sont </span>****décrochés de leur hébergement****<span style="white-space: pre-wrap;"> avant migration, leur spot d'hébergement est réinitialisé. L'hébergement lui-même reste dans le centre d'origine.</span>

---

### ****Procédure****<span style="white-space: pre-wrap;"> </span>  
  
Étape 1 - Lire le ticket et construire les commandes

Le ticket Trello contient la liste des centres d'origine et leurs règles de migration. Pour chaque règle, construire une commande dédiée.

#### Exemple de lecture d'un ticket

<span style="white-space: pre-wrap;">Ticket : </span>**« Centre initial = France Fraternités - CHU 75 (ID 4537) - lorsque le champ = CHU 77 → vers France Fraternités - CHU 77 (ID 5644) »**

→ Commande correspondante (sans hébergements) :

`<span class="editor-theme-code">php bin/console app:migrate-individuals-to-other-organization -o 4537 -d 5644 -f migration-des-donnees -t "CHU 77"</span>`

→ Commande correspondante (avec hébergements) :

`<span class="editor-theme-code">php bin/console app:migrate-individuals-to-other-organization -o 4537 -d 5644 -f migration-des-donnees -t "CHU 77" --withAccommodations</span>`

<p class="callout danger">****Cas de croisement :****<span style="white-space: pre-wrap;"> si deux centres d'origine s'échangent des suivis (ex : CHU 75 → CPH </span>**et**<span style="white-space: pre-wrap;"> CPH → CHU 75), traiter les deux groupes </span>****séparément et séquentiellement,****<span style="white-space: pre-wrap;"> terminer et vérifier le premier groupe avant de lancer le second. Ne jamais les lancer en parallèle.</span></p>

### Étape 2 - Lancer les simulations (dry-run)

<span style="white-space: pre-wrap;">Avant toute migration réelle, lancer </span>****toutes les commandes en mode** `<strong class="editor-theme-bold editor-theme-code">--dry-run</strong>`**<span style="white-space: pre-wrap;"> sur la preprod pour vérifier les volumes. Ajouter </span>`<span class="editor-theme-code">--withAccommodations</span>`<span style="white-space: pre-wrap;"> si le ticket concerne aussi les hébergements.</span>

Exemple :

`<span class="editor-theme-code">php bin/console app:migrate-individuals-to-other-organization -o 4537 -d 5644 -f migration-des-donnees -t "CHU 77" --dry-run</span>`

La commande affiche un tableau récapitulatif des suivis :

<table id="bkmrk-r%C3%B4lecentre-idcentre-"><colgroup><col></col><col></col><col></col><col></col><col></col></colgroup><tbody><tr><th>Rôle

</th><th>Centre ID

</th><th>Centre Nom

</th><th>Nb. suivis

</th><th>Après migration

</th></tr><tr><td>Origine

</td><td>4537

</td><td>France Fraternités - CHU 75

</td><td>160

</td><td>119 (- 41 migrés)

</td></tr><tr><td>Destination

</td><td>5644

</td><td>France Fraternités - CHU 77

</td><td>0

</td><td>41 (+ 41 entrants)

</td></tr></tbody></table>

<span style="white-space: pre-wrap;">Si </span>`<span class="editor-theme-code">--withAccommodations</span>`<span style="white-space: pre-wrap;"> est passé, un second bloc s'affiche avec le nombre d'hébergements impactés et les éventuels conflits. </span>****Résoudre tous les conflits d'hébergement avant de continuer.****

Répéter pour chaque commande du ticket. Copier tous les outputs console.

### Étape 3 - Synthèse et validation PO

Une fois toutes les simulations effectuées (et les éventuels conflits d'hébergement résolus), transmettre les résultats au PO pour validation avant migration réelle. Deux formats possibles :

<details id="bkmrk-synthese-slack"><summary>****Option A — Message Slack directe au PO****</summary>

  
Rédiger un message structuré avec les volumes par migration.  
  
Centre d'origine : France Fraternités - CHU 75 (ID 4537) - 160 suivis au total  
  
→ vers CHU 77 (ID 5644) : 41 migrés | reste 119  
→ vers CPH (ID 4960) : 10 migrés | reste 150  
→ vers DAHAR (ID 5634) : 19 migrés | reste 141  
→ vers TEH (ID 5645) : 7 migrés | reste 153  
  
Centre d'origine : France Fraternités - CPH (ID 4960) - 180 suivis au total  
  
→ vers CHU 75 (ID 4537) : 21 migrés | reste 159  
→ vers CHU 77 (ID 5644) : 37 migrés | reste 143  
→ vers DAHAR (ID 5634) : 35 migrés | reste 145  
→ vers TEH (ID 5645) : 17 migrés | reste 163  
  
Hébergements : \[X hébergements migrés — aucun conflit détecté / ou décrire les conflits et la décision prise\]

</details><details id="bkmrk-synthese-excel"><summary>****Option B - Excel de simulation****</summary>

  
<span style="white-space: pre-wrap;">Générer le fichier Excel de simulation nommé </span>`<span class="editor-theme-code">simulation_migration_{NOM_CENTRE}.xlsx</span>`<span style="white-space: pre-wrap;"> et contient un tableau par centre d'origine avec décompte progressif.</span>

Déposer le fichier dans le Drive à l'emplacement :

****Z-NEW RECONNECT &gt; 4- Technique &gt; Reconnect Pro &gt; Migration des dossiers usagers****

Partager le lien Drive sur le ticket Trello et ping PO.

</details>### Étape 4 - Mise à jour du ticket Trello

<span style="white-space: pre-wrap;">Une fois la validation PO reçue, coller dans le ticket Trello les commandes finales à exécuter </span>****sans****<span style="white-space: pre-wrap;"> </span>`<span class="editor-theme-code">--dry-run</span>`<span style="white-space: pre-wrap;"> pour la preprod et la prod.</span>

Format à utiliser dans le ticket :  
  
Centre initial = \[Nom centre\] (ID XXXX)  
  
Commande 1 :  
php bin/console app:migrate-individuals-to-other-organization -o XXXX -d YYYY -f migration-des-donnees -t "VALEUR"  
  
Commande 2 :  
...

<p class="callout warning"><span style="white-space: pre-wrap;">Toujours exécuter et vérifier sur la </span>****preprod en premier****, puis reproduire sur la prod. Ne jamais lancer directement en prod sans validation preprod.</p>

<p class="callout danger">En cas de croisement entre deux centres, respecter l'ordre défini dans le ticket et attendre la fin du premier groupe avant de lancer le second, même en prod.</p>