- 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>
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 :
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)
# 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)
# 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)
# 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)
# Sur dva-geo, rca-geo ou pra-geo
php php/migrate_from_backup.php --mode=global
Options disponibles
--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
# 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)
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)
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)
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
# 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 :
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) :
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/ :
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_usersavec 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_usersgarde la référence versusers.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 opération active (
active = 1) - 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 :
medias- Médias associés à l'entité ou aux opérationsope_pass_histo- Historique des passagesope_pass- Passagesope_users_sectors- Associations utilisateurs/secteursope_users- Utilisateurs d'opérationssectors_adresses- Adresses de secteursope_sectors- Secteurs d'opérationsoperations- Opérationsusers- 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
- Configuration centralisée : Les paramètres de connexion DB sont récupérés depuis
AppConfig.php- pas de duplication - Chiffrement : ApiService est toujours utilisé pour les mots de passe
- Logique métier : Inchangée (migrateEntites, migrateUsers, etc.)
- Mappings : Secteurs et adresses sont toujours mappés automatiquement
- Backup : Un backup de l'ancien script est disponible dans
migrate_from_backup.php.backup - 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.