- 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>
202 lines
8.3 KiB
PHP
Executable File
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);
|
|
}
|