Files
geo/api/scripts/migration2/README.md
pierre 2f5946a184 feat: Version 3.5.2 - Configuration Stripe et gestion des immeubles
- Configuration complète Stripe pour les 3 environnements (DEV/REC/PROD)
  * DEV: Clés TEST Pierre (mode test)
  * REC: Clés TEST Client (mode test)
  * PROD: Clés LIVE Client (mode live)
- Ajout de la gestion des bases de données immeubles/bâtiments
  * Configuration buildings_database pour DEV/REC/PROD
  * Service BuildingService pour enrichissement des adresses
- Optimisations pages et améliorations ergonomie
- Mises à jour des dépendances Composer
- Nettoyage des fichiers obsolètes

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 18:26:27 +01:00

411 lines
15 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Migration v2 - Architecture modulaire
## Vue d'ensemble
Cette nouvelle architecture simplifie la migration en utilisant :
- **Source fixe** : `geosector` (synchronisée 2x/jour par PM7 depuis nx4)
- **Multi-environnement** : `--env=dva` (développement), `--env=rca` (recette) ou `--env=pra` (production)
- **Auto-détection** : L'environnement est détecté automatiquement selon le serveur
- **Classes réutilisables** : Configuration, Logger, Connexion
## Structure modulaire
```
migration2/
├── README.md # Ce fichier
├── logs/ # Logs de migration (auto-créé)
│ └── .gitignore
├── php/
│ ├── migrate_from_backup.php # Script principal orchestrateur
│ └── lib/
│ ├── DatabaseConfig.php # Configuration multi-env
│ ├── MigrationLogger.php # Gestion des logs
│ ├── DatabaseConnection.php # Connexions PDO
│ ├── OperationMigrator.php # Migration des opérations
│ ├── UserMigrator.php # Migration des ope_users
│ ├── SectorMigrator.php # Migration des secteurs
│ └── PassageMigrator.php # Migration des passages
```
**Architecture modulaire** : Chaque type de données a son propre migrator spécialisé, orchestré par le script principal.
## ⚠️ AVERTISSEMENT IMPORTANT
**Par défaut, le script SUPPRIME toutes les données de l'entité dans la base cible avant la migration.**
Cela inclut :
- ✅ Toutes les opérations de l'entité
- ✅ Tous les utilisateurs de l'entité
- ✅ Tous les secteurs et passages
- ✅ Tous les médias associés
- L'entité elle-même est conservée (seules les données liées sont supprimées)
Pour **désactiver** la suppression et conserver les données existantes :
```bash
php php/migrate_from_backup.php --mode=entity --entity-id=45 --delete-before=false
```
⚠️ **Attention** : Sans suppression préalable, risque de doublons si les données existent déjà.
---
## Utilisation
### Migration d'une entité spécifique
#### Sur dva-geo (IN3)
```bash
# Auto-détection de l'environnement (recommandé)
php php/migrate_from_backup.php --mode=entity --entity-id=45
# Ou avec environnement explicite
php php/migrate_from_backup.php --env=dva --mode=entity --entity-id=45
```
#### Sur rca-geo (IN3)
```bash
# Auto-détection de l'environnement (recommandé)
php php/migrate_from_backup.php --mode=entity --entity-id=45
# Ou avec environnement explicite
php php/migrate_from_backup.php --env=rca --mode=entity --entity-id=45
```
#### Sur pra-geo (IN4)
```bash
# Auto-détection de l'environnement (recommandé)
php php/migrate_from_backup.php --mode=entity --entity-id=45
# Ou avec environnement explicite
php php/migrate_from_backup.php --env=pra --mode=entity --entity-id=45
```
### Migration globale (toutes les entités)
```bash
# Sur dva-geo, rca-geo ou pra-geo
php php/migrate_from_backup.php --mode=global
```
### Options disponibles
```bash
--env=ENV # 'dva' (développement), 'rca' (recette) ou 'pra' (production)
# Par défaut : auto-détection selon le hostname
--mode=MODE # 'global' ou 'entity' (défaut: global)
--entity-id=ID # ID de l'entité à migrer (requis si mode=entity)
--log=PATH # Fichier de log personnalisé
# Par défaut : logs/migration_YYYYMMDD_HHMMSS.log
--delete-before # Supprimer les données existantes avant migration (défaut: true)
--help # Afficher l'aide complète
```
### Exemples d'utilisation
```bash
# Migration STANDARD (avec suppression des données existantes - recommandé)
php php/migrate_from_backup.php --mode=entity --entity-id=45
# Migration SANS suppression (pour ajout/mise à jour uniquement - risque de doublons)
php php/migrate_from_backup.php --mode=entity --entity-id=45 --delete-before=false
# Migration avec log personnalisé
php php/migrate_from_backup.php --mode=entity --entity-id=45 --log=/custom/path/entity_45.log
# Afficher l'aide complète
php php/migrate_from_backup.php --help
```
## Différences avec l'ancienne version
| Aspect | Ancien | Nouveau |
|--------|--------|---------|
| **Source** | `--source-db=geosector_YYYYMMDD_HH` | Toujours `geosector` (fixe) |
| **Cible** | `--target-db=pra_geo` | Déduite de `--env` ou auto-détectée (dva_geo, rca_geo, pra_geo) |
| **Config** | Constantes hardcodées | Classes configurables |
| **Environnement** | Manuel | Auto-détection par hostname (dva-geo, rca-geo, pra-geo) |
| **Arguments** | 2 arguments DB requis | 1 seul `--env` (optionnel) |
## Avantages
**Plus simple** : Plus besoin de spécifier les noms de bases
**Plus sûr** : Moins de risques d'erreurs de saisie
**Plus flexible** : Fonctionne sur dva-geo, rca-geo et pra-geo sans modification
**Plus maintenable** : Configuration centralisée dans DatabaseConfig
**Meilleurs logs** : Séparateurs, niveaux (info/warning/error/success)
## Déploiement
### Copier vers dva-geo (IN3)
```bash
scp -r migration2 root@195.154.80.116:/tmp/
ssh root@195.154.80.116 "incus file push -r /tmp/migration2 dva-geo/var/www/geosector/api/scripts/"
```
### Copier vers rca-geo (IN3)
```bash
scp -r migration2 root@195.154.80.116:/tmp/
ssh root@195.154.80.116 "incus file push -r /tmp/migration2 rca-geo/var/www/geosector/api/scripts/"
```
### Copier vers pra-geo (IN4)
```bash
scp -r migration2 root@51.159.7.190:/tmp/
ssh root@51.159.7.190 "incus file push -r /tmp/migration2 pra-geo/var/www/geosector/api/scripts/"
```
### Test après déploiement
```bash
# Se connecter au container
incus exec dva-geo -- bash # ou rca-geo, ou pra-geo
# Tester avec une entité
cd /var/www/geosector/api/scripts/migration2
php php/migrate_from_backup.php --mode=entity --entity-id=45
```
## Logs
Les logs sont enregistrés par défaut dans :
```
scripts/migration2/logs/migration_[MODE]_YYYYMMDD_HHMMSS.log
```
**Nommage automatique selon le mode :**
- Migration globale : `migration_global_20251021_143045.log`
- Migration d'une entité : `migration_entite_45_20251021_143045.log`
Format des logs :
- `[INFO]` : Informations générales
- `[SUCCESS]` : Opérations réussies
- `[WARNING]` : Avertissements
- `[ERROR]` : Erreurs
Le dossier `logs/` est créé automatiquement si nécessaire.
**Note :** Vous pouvez toujours spécifier un fichier de log personnalisé avec l'option `--log=PATH`.
## Récapitulatif de migration
À la fin de chaque migration, un **récapitulatif détaillé** est automatiquement affiché et enregistré dans le fichier de log.
### Format du récapitulatif
```
========================================
📊 RÉCAPITULATIF DE LA MIGRATION
========================================
Entité: Nom de l'entité (ID: XX)
Date: YYYY-MM-DD HH:MM:SS
Opérations migrées: 3
Opération #1: "Adhésions 2024" (ID: 850)
├─ Utilisateurs: 12
├─ Secteurs: 5
├─ Passages totaux: 245
└─ Détail par secteur:
├─ Centre-ville (ID: 5400)
│ ├─ Utilisateurs affectés: 3
│ └─ Passages: 67
├─ Quartier Est (ID: 5401)
│ ├─ Utilisateurs affectés: 5
│ └─ Passages: 98
└─ Nord (ID: 5402)
├─ Utilisateurs affectés: 4
└─ Passages: 80
Opération #2: "Collecte Printemps" (ID: 851)
├─ Utilisateurs: 8
├─ Secteurs: 3
├─ Passages totaux: 156
└─ Détail par secteur:
[...]
========================================
```
### Informations fournies
Le récapitulatif inclut pour chaque migration :
**Au niveau de l'entité :**
- Nom et ID de l'entité
- Date et heure de la migration
- Nombre total d'opérations migrées
**Pour chaque opération :**
- Nom et nouvel ID
- Nombre d'utilisateurs migrés
- Nombre de secteurs migrés
- Nombre total de passages migrés
**Pour chaque secteur :**
- Nom et nouvel ID
- Nombre d'utilisateurs affectés au secteur
- Nombre de passages effectués dans le secteur
### Utilisation du récapitulatif
Ce récapitulatif permet de :
- ✅ Vérifier rapidement que toutes les données ont été migrées
- ✅ Comparer avec les données source pour validation
- ✅ Identifier d'éventuelles anomalies (secteurs vides, passages manquants)
- ✅ Documenter précisément ce qui a été migré
- ✅ Tracer les migrations pour audit
Le récapitulatif est présent à la fois :
- **À l'écran** (stdout) en temps réel
- **Dans le fichier de log** pour conservation
## Dépannage
### Erreur "env doit être 'dva', 'rca' ou 'pra'"
L'auto-détection a échoué. Spécifiez manuellement :
```bash
php php/migrate_from_backup.php --env=dva --mode=entity --entity-id=45
```
### Erreur de connexion
Vérifiez que vous êtes bien dans le bon container (dva-geo, rca-geo ou pra-geo).
### Données dupliquées après migration
Si vous avez des doublons, c'est que vous avez utilisé `--delete-before=false` sur des données existantes.
**Solution** : Refaire la migration avec suppression (défaut) :
```bash
php php/migrate_from_backup.php --mode=entity --entity-id=45
```
### Vérifier ce qui sera supprimé avant migration
Consultez la section "Ordre de suppression" ci-dessous pour voir exactement quelles tables seront affectées.
### Logs non créés
Vérifiez les permissions du dossier `logs/` :
```bash
ls -la scripts/migration2/logs/
```
## Détails techniques
### Architecture hiérarchique de migration
La migration fonctionne par **opération** avec une hiérarchie complète :
```
Pour chaque opération de l'entité:
migrateOperation($oldOperationId)
├── Créer operation
├── Migrer ope_users (DISTINCT depuis ope_users_sectors)
│ └── Mapper oldUserId → newOpeUserId
├── Pour chaque secteur DISTINCT de l'opération:
│ └── migrateSector($oldOperationId, $newOperationId, $oldSectorId)
│ ├── Créer ope_sectors
│ ├── Mapper "opId_sectId" → newOpeSectorId
│ ├── Migrer sectors_adresses (fk_sector = newOpeSectorId)
│ ├── Migrer ope_users_sectors (avec mappings users + sector)
│ ├── Migrer ope_pass (avec mappings users + sector)
│ │ └── Pour chaque passage:
│ │ └── migratePassageHisto($oldPassId, $newPassId)
│ └── Migrer médias des passages
└── Migrer médias de l'opération
```
### Changement d'organisation des données : Exemple concret
#### Contexte : Opération de collecte des adhésions 2024
**Ancienne organisation** (base geosector - partagée) :
- 1 opération "Adhésions 2024" avec ID 450
- 3 utilisateurs affectés : Jean (ID 100), Marie (ID 101), Paul (ID 102)
- 2 secteurs utilisés : Centre-ville (ID 1004) et Quartier Est (ID 1005)
- Jean travaille sur Centre-ville, Marie et Paul sur Quartier Est
Dans l'ancienne base :
- Les 3 users existent UNE SEULE FOIS dans la table centrale `users`
- Les 2 secteurs existent UNE SEULE FOIS dans la table centrale `sectors`
- Les liens entre users et secteurs sont dans `ope_users_sectors`
- Les passages font référence directement aux users (ID 100, 101, 102)
**Nouvelle organisation** (base rca_geo/pra_geo - isolée par opération) :
Après migration, **CHAQUE opération devient autonome** :
- L'opération "Adhésions 2024" reçoit un nouvel ID (exemple : 850)
- Les 3 utilisateurs sont **dupliqués** dans `ope_users` avec de nouveaux IDs :
- Jean → ope_users.id = 2500 (avec fk_user = 100 et fk_operation = 850)
- Marie → ope_users.id = 2501 (avec fk_user = 101 et fk_operation = 850)
- Paul → ope_users.id = 2502 (avec fk_user = 102 et fk_operation = 850)
- Les 2 secteurs sont **dupliqués** dans `ope_sectors` :
- Centre-ville → ope_sectors.id = 5400 (avec fk_operation = 850)
- Quartier Est → ope_sectors.id = 5401 (avec fk_operation = 850)
- Tous les passages sont mis à jour pour référencer les NOUVEAUX IDs (2500, 2501, 2502)
**Pourquoi cette duplication ?**
**Isolation complète** : Si l'opération est supprimée, tout part avec (secteurs, users, passages)
**Performance** : Pas de jointures complexes entre opérations
**Historique** : Les données de l'opération restent figées dans le temps
**Simplicité** : Chaque opération est indépendante
**Impact pour un utilisateur qui travaille sur 3 opérations différentes** :
- Il existera 1 seule fois dans la table centrale `users` (ID 100)
- Il existera 3 fois dans `ope_users` (1 enregistrement par opération)
- Chaque enregistrement `ope_users` garde la référence vers `users.id = 100`
Cette architecture permet de **fermer** une opération complètement sans impacter les autres.
### Sélection des opérations à migrer
Pour chaque entité, **maximum 3 opérations** sont migrées :
1. **1 opération active** (`active = 1`)
2. **2 dernières opérations inactives** (`active = 0`) ayant au moins **10 passages effectués** (`fk_type = 1`)
### Ordre de suppression (si --delete-before=true)
Les données sont supprimées dans cet ordre pour respecter les contraintes de clés étrangères :
1. `medias` - Médias associés à l'entité ou aux opérations
2. `ope_pass_histo` - Historique des passages
3. `ope_pass` - Passages
4. `ope_users_sectors` - Associations utilisateurs/secteurs
5. `ope_users` - Utilisateurs d'opérations
6. `sectors_adresses` - Adresses de secteurs
7. `ope_sectors` - Secteurs d'opérations
8. `operations` - Opérations
9. `users` - Utilisateurs de l'entité
⚠️ **L'entité elle-même** (`entites`) **n'est jamais supprimée**.
### Tables de référence non migrées
Les tables suivantes ne sont **pas** migrées car déjà remplies dans la cible :
- `x_*` - Tables de référence (secteurs, adresses, etc.)
## Notes importantes
1. **Configuration centralisée** : Les paramètres de connexion DB sont récupérés depuis `AppConfig.php` - pas de duplication
2. **Chiffrement** : ApiService est toujours utilisé pour les mots de passe
3. **Logique métier** : Inchangée (migrateEntites, migrateUsers, etc.)
4. **Mappings** : Secteurs et adresses sont toujours mappés automatiquement
5. **Backup** : Un backup de l'ancien script est disponible dans `migrate_from_backup.php.backup`
6. **Suppression par défaut** : Activée pour éviter les doublons et garantir une migration propre
## Statut
**Architecture modulaire v2** :
- ✅ DatabaseConfig.php - Configuration multi-environnement
- ✅ MigrationLogger.php - Gestion des logs
- ✅ DatabaseConnection.php - Connexions PDO
- ✅ OperationMigrator.php - Migration hiérarchique des opérations
- ✅ UserMigrator.php - Migration des utilisateurs par opération
- ✅ SectorMigrator.php - Migration des secteurs par opération
- ✅ PassageMigrator.php - Migration des passages et historiques
- ✅ migrate_from_backup.php - Script principal orchestrateur
- ⏳ Tests sur rca-geo
- ⏳ Tests sur pra-geo
## Support
En cas de problème, consulter les logs détaillés ou contacter l'équipe technique.