Files
geo/api/scripts/php/migrate_entites.php
pierre 1018b86537 feat: Gestion des secteurs et migration v3.0.4+304
- Ajout système complet de gestion des secteurs avec contours géographiques
- Import des contours départementaux depuis GeoJSON
- API REST pour la gestion des secteurs (/api/sectors)
- Service de géolocalisation pour déterminer les secteurs
- Migration base de données avec tables x_departements_contours et sectors_adresses
- Interface Flutter pour visualisation et gestion des secteurs
- Ajout thème sombre dans l'application
- Corrections diverses et optimisations

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-07 11:01:45 +02:00

202 lines
8.3 KiB
PHP
Executable File

<?php
/**
* Script de migration pour la table entites (users_entites → entites)
* Transfert les données de la base source (geosector) vers la base cible (geosector_app)
* Gère le chiffrement des données sensibles
*/
require_once dirname(__DIR__) . '/config.php';
require_once __DIR__ . '/MigrationConfig.php';
require_once dirname(dirname(__DIR__)) . '/src/Services/ApiService.php';
try {
// Création du tunnel SSH si nécessaire
createSshTunnel();
// Connexion aux bases de données
$sourceDb = getSourceConnection();
$targetDb = getTargetConnection();
// Utilisation directe de la classe ApiService pour le chiffrement
// Récupération des entités depuis la base source
$stmt = $sourceDb->query("SELECT * FROM users_entites");
$entites = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo "Nombre d'entités à migrer: " . count($entites) . PHP_EOL;
// Préparation de la requête d'insertion
$insertQuery = "INSERT INTO entites (
id,
encrypted_name,
adresse1,
adresse2,
code_postal,
ville,
fk_region,
fk_type,
encrypted_phone,
encrypted_mobile,
encrypted_email,
gps_lat,
gps_lng,
encrypted_iban,
encrypted_bic,
chk_demo,
chk_mdp_manuel,
chk_copie_mail_recu,
chk_accept_sms,
fk_user_creat,
fk_user_modif,
chk_active
) VALUES (
:id,
:encrypted_name,
:adresse1,
:adresse2,
:code_postal,
:ville,
:fk_region,
:fk_type,
:encrypted_phone,
:encrypted_mobile,
:encrypted_email,
:gps_lat,
:gps_lng,
:encrypted_iban,
:encrypted_bic,
:chk_demo,
:chk_mdp_manuel,
:chk_copie_mail_recu,
:chk_accept_sms,
:fk_user_creat,
:fk_user_modif,
:chk_active
) ON DUPLICATE KEY UPDATE
encrypted_name = VALUES(encrypted_name),
adresse1 = VALUES(adresse1),
adresse2 = VALUES(adresse2),
code_postal = VALUES(code_postal),
ville = VALUES(ville),
fk_region = VALUES(fk_region),
fk_type = VALUES(fk_type),
encrypted_phone = VALUES(encrypted_phone),
encrypted_mobile = VALUES(encrypted_mobile),
encrypted_email = VALUES(encrypted_email),
gps_lat = VALUES(gps_lat),
gps_lng = VALUES(gps_lng),
encrypted_iban = VALUES(encrypted_iban),
encrypted_bic = VALUES(encrypted_bic),
chk_demo = VALUES(chk_demo),
chk_mdp_manuel = VALUES(chk_mdp_manuel),
chk_copie_mail_recu = VALUES(chk_copie_mail_recu),
chk_accept_sms = VALUES(chk_accept_sms),
fk_user_modif = VALUES(fk_user_modif),
chk_active = VALUES(chk_active)";
$insertStmt = $targetDb->prepare($insertQuery);
// Compteurs
$successCount = 0;
$errorCount = 0;
// Traitement de chaque entité
foreach ($entites as $entite) {
try {
// Mappage des champs entre les deux structures
$id = isset($entite['rowid']) ? $entite['rowid'] : $entite['id'];
$chkActive = isset($entite['active']) ? $entite['active'] : (isset($entite['chk_active']) ? $entite['chk_active'] : 1);
// Chiffrement des données sensibles (uniquement si non vides)
$libelle = $entite['libelle'] ?? '';
$encryptedName = !empty($libelle) ? ApiService::encryptData($libelle) : '';
// Traitement des numéros de téléphone
$tel1 = $entite['tel1'] ?? '';
$tel2 = $entite['tel2'] ?? '';
// Initialisation des variables
$encryptedPhone = '';
$encryptedMobile = '';
// Vérification si tel1 commence par 06 ou 07 (mobile)
if (preg_match('/^0[67]/', $tel1)) {
$encryptedMobile = ApiService::encryptData($tel1);
} elseif (!empty($tel1)) {
$encryptedPhone = ApiService::encryptData($tel1);
}
// Vérification si tel2 commence par 06 ou 07 (mobile)
if (preg_match('/^0[67]/', $tel2)) {
// Si encryptedMobile est déjà rempli, on garde le premier mobile trouvé
if (empty($encryptedMobile)) {
$encryptedMobile = ApiService::encryptData($tel2);
} elseif (empty($encryptedPhone)) {
// Si on a déjà un mobile mais pas de téléphone fixe, on met le second mobile comme téléphone
$encryptedPhone = ApiService::encryptData($tel2);
}
} elseif (!empty($tel2)) {
// Si encryptedPhone est déjà rempli, on garde le premier fixe trouvé
if (empty($encryptedPhone)) {
$encryptedPhone = ApiService::encryptData($tel2);
}
}
// Chiffrement des autres données sensibles (uniquement si non vides)
$email = $entite['email'] ?? '';
$iban = $entite['iban'] ?? '';
$bic = $entite['bic'] ?? '';
$encryptedEmail = !empty($email) ? ApiService::encryptSearchableData($email) : '';
$encryptedIban = !empty($iban) ? ApiService::encryptData($iban) : '';
$encryptedBic = !empty($bic) ? ApiService::encryptData($bic) : '';
// Préparation des données pour l'insertion
$entiteData = [
'id' => $id,
'encrypted_name' => $encryptedName,
'adresse1' => $entite['adresse1'] ?? '',
'adresse2' => $entite['adresse2'] ?? '',
'code_postal' => $entite['cp'] ?? '',
'ville' => $entite['ville'] ?? '',
'fk_region' => $entite['fk_region'] ?? null,
'fk_type' => $entite['fk_type'] ?? 1,
'encrypted_phone' => $encryptedPhone,
'encrypted_mobile' => $encryptedMobile,
'encrypted_email' => $encryptedEmail,
'gps_lat' => $entite['gps_lat'] ?? '',
'gps_lng' => $entite['gps_lng'] ?? '',
'encrypted_iban' => $encryptedIban,
'encrypted_bic' => $encryptedBic,
'chk_demo' => 0, // Valeur par défaut à 0 comme demandé
'chk_mdp_manuel' => $entite['chk_mdp_manuel'] ?? 1,
'chk_copie_mail_recu' => $entite['chk_copie_mail_recu'] ?? 0,
'chk_accept_sms' => $entite['chk_accept_sms'] ?? 0,
'fk_user_creat' => $entite['fk_user_modif'] ?? null,
'fk_user_modif' => $entite['fk_user_modif'] ?? null,
'chk_active' => $chkActive
];
// Insertion dans la base cible
$insertStmt->execute($entiteData);
$successCount++;
} catch (Exception $e) {
$errorCount++;
echo "Erreur lors de la migration de l'entité ID {$id}: " . $e->getMessage() . PHP_EOL;
}
}
echo "Migration terminée. Succès: $successCount, Erreurs: $errorCount" . PHP_EOL;
// Fermer le tunnel SSH
closeSshTunnel();
} catch (Exception $e) {
echo "Erreur critique: " . $e->getMessage() . PHP_EOL;
// Fermer le tunnel SSH en cas d'erreur
closeSshTunnel();
exit(1);
}