# Migration des données RACA

La commande `php artisan raca:migrate-legacy` importe la base Nova depuis une connexion Laravel nommée `legacy`. Les identifiants historiques sont conservés et chaque écriture est idempotente : une seconde exécution met à jour les mêmes clés.

## Configuration

Configurer `database.connections.legacy` avec `LEGACY_DB_HOST`, `LEGACY_DB_PORT`, `LEGACY_DB_DATABASE`, `LEGACY_DB_USERNAME` et `LEGACY_DB_PASSWORD`. Le compte utilisé pendant les essais doit être en lecture seule. Ne jamais versionner les secrets de production.

## Procédure

1. Sauvegarder la base Nova et exécuter les migrations de la nouvelle application.
2. Compter les lignes sans écrire : `php artisan raca:migrate-legacy --dry-run`.
3. Importer : `php artisan raca:migrate-legacy --chunk=500`.
4. Vérifier les compteurs : `php artisan raca:migrate-legacy --validate-only`.

## Bascule de production

1. Répéter la procédure sur une copie récente et comparer les compteurs de chaque table.
2. Vérifier les orphelins, doublons de pivots, valeurs JSON et algorithmes de mots de passe.
3. Tester un compte de chaque rôle (`admin`, `mrc`, `entreprise`) et les exports/PDF/courriels.
4. Mettre l’ancienne application en lecture seule pendant la fenêtre de bascule.
5. Faire un dernier dump, rejouer l’import idempotent, puis `--validate-only`.
6. Basculer le trafic, surveiller les erreurs et conserver le dump source pour retour arrière.

Ne jamais exécuter l’import avec la source et la cible pointant vers la même base.

L'option `--only=entreprises --only=contacts` permet de rejouer une table. La commande détecte aussi les pivots RBAC historiques `user_role`, `role_users` et `permission_role`, puis les copie vers `role_user` et `role_permission`.

## Périmètre et hypothèses

Sont importés : référentiels, utilisateurs, rôles, permissions, géographie, entreprises, contacts, marques, produits d'entreprise, pivots métier, codes postaux et recherches. Les caches, jobs, passkeys et tokens Sanctum ne sont pas repris.

- Les mots de passe sont copies tels quels. Auditer leur algorithme et imposer une reinitialisation pour les valeurs non bcrypt/argon.
- `recherches.filtres` et `entreprises.visibilite_liens` deviennent du JSON. Une chaine invalide est preservee sous la cle `legacy_raw`.
- Les identifiants des pivots métier sont préservés, y compris lorsque l'historique contient des doublons. Les pivots RBAC sans identifiant sont repris par leur clé logique.
- Les IDs sont préservés. Corriger les lignes orphelines dans la source avant la bascule, car le schéma cible applique les clés étrangères.
- `role_permission` est importé et les policies reconnaissent les slugs Nova historiques en plus des trois rôles standards.
