Ajout du dossier api avec la géolocalisation automatique des casernes de pompiers

This commit is contained in:
d6soft
2025-05-16 21:03:04 +02:00
parent 69dcff42f8
commit f4f7882963
143 changed files with 24329 additions and 1 deletions

66
api/scripts/README.md Normal file
View File

@@ -0,0 +1,66 @@
# Scripts Utilitaires
Ce dossier contient des scripts utilitaires pour la gestion des bases de données et l'automatisation de tâches.
## Structure
- `php/` : Scripts PHP pour la manipulation des données et l'intégration avec l'API
- `shell/` : Scripts shell pour l'automatisation et les opérations système
- `python/` : Scripts Python pour le traitement des données et l'analyse
- `cron/` : Scripts et configurations pour les tâches programmées
## Migration geosector → geosector_app
Les scripts de migration permettent de transférer des données de la base MySQL geosector (sur un serveur distant) vers la base MariaDB geosector_app (locale).
### Prérequis
- Accès SSH au serveur distant hébergeant la base MySQL geosector
- Accès à la base de données MariaDB geosector_app locale
- Droits suffisants pour lire/écrire dans les deux bases
- Clé SSH pour l'authentification au serveur distant
### Utilisation
1. Configurer les paramètres de connexion dans le fichier `config.php` :
- Paramètres SSH (serveur, port, utilisateur, clé)
- Paramètres de la base de données source (distante)
- Paramètres de la base de données cible (locale)
2. Exécuter le script de migration souhaité :
```
php php/migrate_users.php
```
ou
```
./shell/migrate_table.sh users
```
3. Pour comparer les schémas de tables entre les deux bases :
```
python python/compare_schemas.py users
```
./bash/migrate_table.sh users
```
## Tâches programmées (cron)
Les scripts dans le dossier `cron/` peuvent être configurés pour s'exécuter automatiquement via crontab.
Exemple de configuration crontab pour exécuter la synchronisation quotidienne :
```
# Synchronisation quotidienne à 2h du matin
0 2 * * * php /chemin/vers/api/scripts/cron/sync_databases.php > /dev/null 2>&1
```
## Fonctionnement du tunnel SSH
Les scripts établissent automatiquement un tunnel SSH pour accéder à la base de données distante :
1. Vérification de l'existence d'un tunnel déjà établi
2. Création d'un tunnel SSH si nécessaire
3. Exécution des opérations de base de données via le tunnel
4. Fermeture propre du tunnel à la fin du script
Les tunnels utilisent un port local (par défaut 13306) pour rediriger vers le port MySQL du serveur distant.

168
api/scripts/config.php Normal file
View File

@@ -0,0 +1,168 @@
<?php
/**
* Configuration pour les scripts de migration et utilitaires
*/
// Configuration SSH pour accéder au serveur distant
define('SSH_HOST', '212.83.164.111'); // Adresse du serveur distant
define('SSH_PORT', 52266); // Port SSH (généralement 22)
define('SSH_USER', 'root'); // Nom d'utilisateur SSH - à ajuster selon votre utilisateur
define('SSH_KEY_FILE', '/root/.ssh/id_rsa_db2'); // Chemin vers la clé SSH privée
// Configuration de la base de données source (MySQL geosector) sur le serveur distant
define('REMOTE_DB_HOST', '127.0.0.1'); // Hôte de la base sur le serveur distant (utiliser 127.0.0.1 au lieu de localhost)
define('REMOTE_DB_PORT', 3306); // Port de la base sur le serveur distant
define('SOURCE_DB_HOST', '127.0.0.1'); // Hôte local pour le tunnel SSH (utiliser 127.0.0.1 au lieu de localhost)
define('SOURCE_DB_NAME', 'geosector'); // Nom de la base de données source (utiliser une des bases disponibles listées)
define('SOURCE_DB_USER', 'geo_front_user'); // Utilisateur de la base de données source
define('SOURCE_DB_PASS', 'd66,GeoFront.User'); // Mot de passe de la base de données source
define('SOURCE_DB_PORT', 13306); // Port local pour le tunnel SSH
// Configuration de la base de données cible (MariaDB geo_app)
define('TARGET_DB_HOST', 'localhost');
define('TARGET_DB_NAME', 'geo_app');
define('TARGET_DB_USER', 'geo_app_user');
define('TARGET_DB_PASS', 'QO:96df*?k{4W6m');
define('TARGET_DB_PORT', 3306);
// Chemin vers l'API pour utiliser les services de chiffrement
define('API_ROOT', dirname(__DIR__));
// Inclure les services de l'API pour le chiffrement/déchiffrement
require_once API_ROOT . '/bootstrap.php';
/**
* Fonction utilitaire pour établir un tunnel SSH vers le serveur distant
*/
function createSshTunnel() {
// Vérifier si un tunnel est déjà en cours d'exécution
$checkCommand = "ps aux | grep 'ssh -[vf]* -N -L " . SOURCE_DB_PORT . ":' | grep -v grep";
exec($checkCommand, $output, $return_var);
if (empty($output)) {
// Créer le tunnel SSH avec options de sécurité
$command = "ssh -f -N -o StrictHostKeyChecking=no -L " . SOURCE_DB_PORT . ":" . REMOTE_DB_HOST . ":" . REMOTE_DB_PORT . " -p " . SSH_PORT . " " . SSH_USER . "@" . SSH_HOST . " -i " . SSH_KEY_FILE;
exec($command, $output, $return_var);
if ($return_var !== 0) {
logOperation("Erreur lors de la création du tunnel SSH", "ERROR");
return false;
}
// Attendre que le tunnel soit établi
sleep(2);
logOperation("Tunnel SSH établi sur le port local " . SOURCE_DB_PORT, "INFO");
// Vérification simple du tunnel
$checkTunnel = "netstat -an | grep " . SOURCE_DB_PORT . " | grep LISTEN";
exec($checkTunnel, $tunnelOutput);
if (empty($tunnelOutput)) {
logOperation("Le tunnel semble être créé mais le port n'est pas en écoute", "WARNING");
}
} else {
logOperation("Un tunnel SSH est déjà en cours d'exécution", "INFO");
}
return true;
}
/**
* Fonction utilitaire pour fermer le tunnel SSH
*/
function closeSshTunnel() {
// Utiliser une expression régulière plus large pour capturer tous les processus SSH de tunnel
$command = "ps aux | grep 'ssh -[vf]* -N -L " . SOURCE_DB_PORT . ":' | grep -v grep | awk '{print $2}' | xargs -r kill 2>/dev/null";
exec($command);
logOperation("Tunnel SSH fermé", "INFO");
}
/**
* Fonction utilitaire pour se connecter à la base de données source via SSH
*/
function getSourceConnection() {
try {
// Établir le tunnel SSH
if (!createSshTunnel()) {
throw new PDOException("Impossible d'établir le tunnel SSH");
}
// Options de connexion PDO
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4'
];
// Ajouter l'option pour MySQL 8
if (defined('PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT')) {
$options[PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT] = false;
}
try {
// D'abord vérifier si la base existe
$tempDsn = 'mysql:host=' . SOURCE_DB_HOST . ';port=' . SOURCE_DB_PORT;
$tempPdo = new PDO($tempDsn, SOURCE_DB_USER, SOURCE_DB_PASS, $options);
$stmt = $tempPdo->query("SHOW DATABASES");
$databases = $stmt->fetchAll(PDO::FETCH_COLUMN);
if (!in_array(SOURCE_DB_NAME, $databases)) {
logOperation("Base de données '" . SOURCE_DB_NAME . "' introuvable. Bases disponibles: " . implode(", ", $databases), "ERROR");
throw new PDOException("Base de données '" . SOURCE_DB_NAME . "' introuvable");
}
// Se connecter à la base spécifique
$dsn = 'mysql:host=' . SOURCE_DB_HOST . ';dbname=' . SOURCE_DB_NAME . ';port=' . SOURCE_DB_PORT;
$pdo = new PDO($dsn, SOURCE_DB_USER, SOURCE_DB_PASS, $options);
logOperation("Connexion établie à la base '" . SOURCE_DB_NAME . "'", "INFO");
return $pdo;
} catch (PDOException $e) {
logOperation("Erreur de connexion: " . $e->getMessage(), "ERROR");
throw $e;
}
} catch (PDOException $e) {
closeSshTunnel();
throw new Exception("Erreur de connexion à la base source: " . $e->getMessage());
}
}
/**
* Fonction utilitaire pour se connecter à la base de données cible
*/
function getTargetConnection() {
try {
$dsn = 'mysql:host=' . TARGET_DB_HOST . ';dbname=' . TARGET_DB_NAME . ';port=' . TARGET_DB_PORT;
$pdo = new PDO($dsn, TARGET_DB_USER, TARGET_DB_PASS, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4'
]);
return $pdo;
} catch (PDOException $e) {
die('Erreur de connexion à la base cible: ' . $e->getMessage());
}
}
/**
* Fonction pour journaliser les opérations
*/
function logOperation($message, $level = 'INFO') {
$logFile = __DIR__ . '/logs/migration_' . date('Y-m-d') . '.log';
$logDir = dirname($logFile);
if (!is_dir($logDir)) {
mkdir($logDir, 0755, true);
}
$timestamp = date('Y-m-d H:i:s');
$logMessage = "[$timestamp] [$level] $message" . PHP_EOL;
file_put_contents($logFile, $logMessage, FILE_APPEND);
if (php_sapi_name() === 'cli') {
echo $logMessage;
}
}

View File

@@ -0,0 +1,102 @@
<?php
/**
* Script de synchronisation des bases de données geosector et geosector_app
*
* Ce script est conçu pour être exécuté via cron afin de synchroniser
* régulièrement certaines tables entre les deux bases de données.
*
* Exemple d'utilisation dans crontab:
* 0 2 * * * php /chemin/vers/api/scripts/cron/sync_databases.php > /dev/null 2>&1
*/
// Définir le chemin d'accès au script
define('SCRIPT_PATH', __DIR__);
define('BASE_PATH', dirname(dirname(__DIR__)));
// Inclure le fichier de configuration
require_once dirname(__DIR__) . '/config.php';
// Liste des tables à synchroniser
$tables_to_sync = [
'users' => [
'sync_method' => 'php', // Utilise le script PHP spécifique pour cette table
'script' => dirname(__DIR__) . '/php/migrate_users.php'
],
'settings' => [
'sync_method' => 'shell', // Utilise le script shell générique
'script' => dirname(__DIR__) . '/shell/migrate_table.sh'
],
// Ajouter d'autres tables selon les besoins
];
// Fonction pour exécuter un script PHP
function executePhpScript($script_path) {
logOperation("Exécution du script PHP: $script_path");
include $script_path;
return true;
}
// Fonction pour exécuter un script shell
function executeShellScript($script_path, $table_name) {
logOperation("Exécution du script shell: $script_path $table_name");
$command = "bash $script_path $table_name";
$output = [];
$return_var = 0;
exec($command, $output, $return_var);
foreach ($output as $line) {
logOperation($line);
}
return $return_var === 0;
}
// Démarrage de la synchronisation
logOperation("Démarrage de la synchronisation des bases de données");
logOperation("Date: " . date('Y-m-d H:i:s'));
$success_count = 0;
$error_count = 0;
// Synchroniser chaque table
foreach ($tables_to_sync as $table_name => $config) {
logOperation("Synchronisation de la table: $table_name");
try {
$success = false;
switch ($config['sync_method']) {
case 'php':
$success = executePhpScript($config['script']);
break;
case 'shell':
$success = executeShellScript($config['script'], $table_name);
break;
default:
logOperation("Méthode de synchronisation non prise en charge: {$config['sync_method']}", "ERROR");
$error_count++;
continue;
}
if ($success) {
logOperation("Synchronisation réussie pour la table: $table_name", "SUCCESS");
$success_count++;
} else {
logOperation("Échec de la synchronisation pour la table: $table_name", "ERROR");
$error_count++;
}
} catch (Exception $e) {
logOperation("Erreur lors de la synchronisation de la table $table_name: " . $e->getMessage(), "ERROR");
$error_count++;
}
}
// Résumé de la synchronisation
logOperation("Synchronisation terminée");
logOperation("Succès: $success_count, Erreurs: $error_count");
logOperation("Date de fin: " . date('Y-m-d H:i:s'));
// Sortie avec code d'erreur si nécessaire
exit($error_count > 0 ? 1 : 0);

987
api/scripts/geosector.sql Normal file
View File

@@ -0,0 +1,987 @@
-- Table structure for table `email_counter`
--
DROP TABLE IF EXISTS `email_counter`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `email_counter` (
`id` int NOT NULL DEFAULT '1',
`hour_start` timestamp NULL DEFAULT NULL,
`count` int DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `email_queue`
--
DROP TABLE IF EXISTS `email_queue`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `email_queue` (
`id` int NOT NULL AUTO_INCREMENT,
`rowid` int NOT NULL DEFAULT '0' COMMENT 'ope_pass.rowid',
`to_email` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
`subject` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
`body` text COLLATE utf8mb4_general_ci,
`headers` text COLLATE utf8mb4_general_ci,
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`status` enum('pending','sent','failed') COLLATE utf8mb4_general_ci DEFAULT 'pending',
`attempts` int DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=40956 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `medias`
--
DROP TABLE IF EXISTS `medias`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `medias` (
`rowid` int NOT NULL AUTO_INCREMENT,
`dir0` varchar(75) NOT NULL DEFAULT '',
`dir1` varchar(150) NOT NULL DEFAULT '',
`dir2` varchar(45) NOT NULL DEFAULT '',
`support` varchar(45) NOT NULL DEFAULT '',
`support_rowid` int NOT NULL DEFAULT '0',
`fichier` varchar(250) NOT NULL DEFAULT '',
`type_fichier` varchar(5) NOT NULL DEFAULT 'pdf',
`description` varchar(100) NOT NULL DEFAULT '',
`position` char(1) NOT NULL DEFAULT 'd',
`hauteur` int NOT NULL DEFAULT '0',
`largeur` int NOT NULL DEFAULT '0',
`niveaugris` tinyint(1) NOT NULL DEFAULT '0',
`date_creat` datetime DEFAULT NULL,
`fk_user_creat` int NOT NULL DEFAULT '0',
`date_modif` datetime DEFAULT NULL,
`fk_user_modif` int NOT NULL DEFAULT '0',
PRIMARY KEY (`rowid`),
UNIQUE KEY `rowid_UNIQUE` (`rowid`)
) ENGINE=InnoDB AUTO_INCREMENT=327 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `ope_pass`
--
DROP TABLE IF EXISTS `ope_pass`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `ope_pass` (
`rowid` int NOT NULL AUTO_INCREMENT,
`fk_operation` int NOT NULL DEFAULT '0',
`fk_sector` int DEFAULT '0',
`fk_user` int NOT NULL DEFAULT '0',
`fk_adresse` varchar(25) DEFAULT '' COMMENT 'adresses.cp??.id',
`date_eve` datetime DEFAULT NULL,
`fk_type` int DEFAULT '0',
`numero` varchar(10) NOT NULL DEFAULT '',
`rue` varchar(75) NOT NULL DEFAULT '',
`rue_bis` varchar(1) NOT NULL DEFAULT '',
`ville` varchar(75) NOT NULL DEFAULT '',
`lieudit` varchar(75) DEFAULT '',
`fk_habitat` int DEFAULT '1',
`appt` varchar(5) DEFAULT NULL,
`niveau` varchar(5) DEFAULT NULL,
`chk_habitat_vide` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'habitat vide (refus)',
`gps_lat` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
`gps_lng` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
`libelle` varchar(45) NOT NULL DEFAULT '',
`montant` decimal(7,2) NOT NULL DEFAULT '0.00',
`fk_type_reglement` int DEFAULT '1',
`remarque` text,
`recu` varchar(50) DEFAULT NULL,
`email` varchar(75) DEFAULT '',
`email_erreur` varchar(30) DEFAULT '',
`chk_email_sent` tinyint(1) NOT NULL DEFAULT '0',
`phone` varchar(15) NOT NULL DEFAULT '',
`docremis` tinyint(1) DEFAULT '0',
`date_repasser` datetime DEFAULT NULL,
`nb_passages` int DEFAULT '1' COMMENT 'Nb passages pour les a repasser',
`lot_nb_passages` int DEFAULT '1' COMMENT 'Saisie par lot de passages dans la partie mobile',
`chk_gps_maj` tinyint(1) DEFAULT '0',
`chk_map_create` tinyint(1) DEFAULT '0',
`chk_mobile` tinyint(1) DEFAULT '0',
`chk_synchro` tinyint(1) DEFAULT '1' COMMENT 'chk synchro entre web et appli',
`chk_api_adresse` tinyint(1) DEFAULT '0',
`chk_maj_adresse` tinyint(1) DEFAULT '0',
`anomalie` tinyint(1) DEFAULT '0',
`date_creat` datetime DEFAULT NULL,
`fk_user_creat` int DEFAULT NULL,
`date_modif` datetime DEFAULT NULL,
`fk_user_modif` int DEFAULT NULL,
`active` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`rowid`),
KEY `fk_operation` (`fk_operation`),
KEY `fk_sector` (`fk_sector`),
KEY `fk_user` (`fk_user`),
KEY `fk_type` (`fk_type`),
KEY `fk_type_reglement` (`fk_type_reglement`),
KEY `email` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=8367890 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `ope_pass_histo`
--
DROP TABLE IF EXISTS `ope_pass_histo`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `ope_pass_histo` (
`rowid` int NOT NULL AUTO_INCREMENT,
`fk_pass` int DEFAULT NULL,
`fk_user` int DEFAULT NULL,
`date_histo` datetime DEFAULT NULL,
`sujet` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`remarque` varchar(250) DEFAULT NULL,
PRIMARY KEY (`rowid`),
KEY `ope_pass_histo_fk_pass_IDX` (`fk_pass`) USING BTREE,
KEY `ope_pass_histo_date_histo_IDX` (`date_histo`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=44274 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `ope_pass_recus`
--
DROP TABLE IF EXISTS `ope_pass_recus`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `ope_pass_recus` (
`rowid` int NOT NULL AUTO_INCREMENT,
`fk_pass` int DEFAULT NULL,
`chemin` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL,
`nom_recu` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
`date_recu` datetime DEFAULT NULL,
`date_creat_recu` datetime DEFAULT NULL,
`date_sent_recu` datetime DEFAULT NULL,
PRIMARY KEY (`rowid`),
UNIQUE KEY `rowid_UNIQUE` (`rowid`),
KEY `ope_pass_recus_fk_pass_IDX` (`fk_pass`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=140644 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `ope_users`
--
DROP TABLE IF EXISTS `ope_users`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `ope_users` (
`rowid` int NOT NULL AUTO_INCREMENT,
`fk_operation` int NOT NULL DEFAULT '0',
`fk_user` int NOT NULL DEFAULT '0',
`date_creat` datetime DEFAULT NULL,
`fk_user_creat` int DEFAULT NULL,
`date_modif` datetime DEFAULT NULL,
`fk_user_modif` int DEFAULT NULL,
`active` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`rowid`),
UNIQUE KEY `rowid_UNIQUE` (`rowid`)
) ENGINE=InnoDB AUTO_INCREMENT=199006 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `ope_users_sectors`
--
DROP TABLE IF EXISTS `ope_users_sectors`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `ope_users_sectors` (
`rowid` int NOT NULL AUTO_INCREMENT,
`fk_operation` int DEFAULT NULL,
`fk_user` int DEFAULT NULL,
`fk_sector` int DEFAULT NULL,
`active` tinyint(1) DEFAULT '1',
PRIMARY KEY (`rowid`),
UNIQUE KEY `rowid` (`rowid`),
KEY `fk_operation` (`fk_operation`),
KEY `fk_user` (`fk_user`),
KEY `fk_sector` (`fk_sector`)
) ENGINE=InnoDB AUTO_INCREMENT=174364 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `ope_users_suivis`
--
DROP TABLE IF EXISTS `ope_users_suivis`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `ope_users_suivis` (
`rowid` int NOT NULL AUTO_INCREMENT,
`fk_operation` int DEFAULT NULL,
`fk_user` int DEFAULT NULL,
`date_suivi` datetime DEFAULT NULL,
`latitude` varchar(20) DEFAULT NULL,
`longitude` varchar(20) DEFAULT NULL,
`vitesse` varchar(20) DEFAULT NULL,
PRIMARY KEY (`rowid`),
UNIQUE KEY `rowid_UNIQUE` (`rowid`)
) ENGINE=InnoDB AUTO_INCREMENT=2820230 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `operations`
--
DROP TABLE IF EXISTS `operations`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `operations` (
`rowid` int NOT NULL AUTO_INCREMENT,
`fk_entite` int DEFAULT '1',
`libelle` varchar(75) NOT NULL DEFAULT '',
`date_deb` date DEFAULT NULL,
`date_fin` date DEFAULT NULL,
`chk_api_adresse` tinyint(1) DEFAULT '0',
`chk_distinct_sectors` tinyint(1) DEFAULT '0',
`date_creat` datetime DEFAULT NULL,
`fk_user_creat` int DEFAULT NULL,
`date_modif` datetime DEFAULT NULL,
`fk_user_modif` int DEFAULT NULL,
`active` tinyint(1) DEFAULT '1',
PRIMARY KEY (`rowid`),
KEY `fk_entite` (`fk_entite`),
KEY `date_deb` (`date_deb`)
) ENGINE=InnoDB AUTO_INCREMENT=3121 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `operations_docs`
--
DROP TABLE IF EXISTS `operations_docs`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `operations_docs` (
`rowid` int NOT NULL AUTO_INCREMENT,
`fk_operation` int NOT NULL DEFAULT '0',
`libelle` varchar(75) NOT NULL DEFAULT '',
`comment` text NOT NULL,
`active` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`rowid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `operations_eve_docs`
--
DROP TABLE IF EXISTS `operations_eve_docs`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `operations_eve_docs` (
`rowid` int NOT NULL AUTO_INCREMENT,
`fk_evenement` int NOT NULL DEFAULT '0',
`fk_document` int NOT NULL DEFAULT '0',
`date_creat` datetime DEFAULT NULL,
`fk_user_creat` int DEFAULT NULL,
`date_modif` datetime DEFAULT NULL,
`fk_user_modif` int DEFAULT NULL,
`active` tinyint(1) DEFAULT '1',
PRIMARY KEY (`rowid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `params`
--
DROP TABLE IF EXISTS `params`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `params` (
`rowid` int NOT NULL AUTO_INCREMENT,
`libelle` varchar(35) NOT NULL DEFAULT '',
`valeur` varchar(255) NOT NULL DEFAULT '',
`aide` varchar(150) NOT NULL DEFAULT '',
PRIMARY KEY (`rowid`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `sectors`
--
DROP TABLE IF EXISTS `sectors`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `sectors` (
`rowid` int NOT NULL AUTO_INCREMENT,
`libelle` varchar(75) DEFAULT '',
`sector` text,
`color` varchar(7) DEFAULT '#4B77BE',
`date_creat` datetime DEFAULT NULL,
`fk_user_creat` int DEFAULT NULL,
`date_modif` datetime DEFAULT NULL,
`fk_user_modif` int DEFAULT NULL,
`active` tinyint(1) DEFAULT '1',
PRIMARY KEY (`rowid`),
UNIQUE KEY `rowid_UNIQUE` (`rowid`)
) ENGINE=InnoDB AUTO_INCREMENT=34349 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `sectors_adresses`
--
DROP TABLE IF EXISTS `sectors_adresses`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `sectors_adresses` (
`rowid` int NOT NULL AUTO_INCREMENT,
`fk_adresse` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'adresses.cp??.id',
`fk_sector` int DEFAULT NULL,
`numero` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`rue_bis` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`rue` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`cp` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`ville` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`gps_lat` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`gps_lng` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
PRIMARY KEY (`rowid`),
KEY `sectors_adresses_fk_sector_index` (`fk_sector`),
KEY `sectors_adresses_numero_index` (`numero`),
KEY `sectors_adresses_rue_index` (`rue`),
KEY `sectors_adresses_ville_index` (`ville`)
) ENGINE=InnoDB AUTO_INCREMENT=24697907 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `sectors_streets`
--
DROP TABLE IF EXISTS `sectors_streets`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `sectors_streets` (
`rowid` int NOT NULL AUTO_INCREMENT,
`fk_sector` int DEFAULT NULL,
`fk_adresse` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'adresses.cp??.id',
`osm_id` int DEFAULT NULL,
`osm_lat` varchar(10) DEFAULT NULL,
`osm_lng` varchar(10) DEFAULT NULL,
`osm_name` varchar(50) DEFAULT NULL,
`osm_street` varchar(50) DEFAULT NULL,
`osm_number` varchar(10) DEFAULT NULL,
`osm_city` varchar(50) DEFAULT NULL,
`osm_date_creat` timestamp NULL DEFAULT NULL,
`date_creat` datetime DEFAULT NULL,
PRIMARY KEY (`rowid`),
UNIQUE KEY `rowid_UNIQUE` (`rowid`),
KEY `fk_sector` (`fk_sector`),
KEY `osm_lat` (`osm_lat`),
KEY `osm_lng` (`osm_lng`),
KEY `osm_name` (`osm_name`),
KEY `osm_city` (`osm_city`),
KEY `osm_street` (`osm_street`)
) ENGINE=InnoDB AUTO_INCREMENT=42344357 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `users`
--
DROP TABLE IF EXISTS `users`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `users` (
`rowid` int unsigned NOT NULL AUTO_INCREMENT,
`fk_entite` int DEFAULT '1',
`fk_titre` int DEFAULT '1',
`num_adherent` int NOT NULL DEFAULT '0',
`libelle` varchar(91) DEFAULT NULL,
`libelle_naissance` varchar(90) NOT NULL DEFAULT '',
`prenom` varchar(45) DEFAULT NULL,
`nom_tournee` varchar(60) DEFAULT '',
`username` varchar(50) DEFAULT '',
`userpass` varchar(60) DEFAULT NULL,
`userpswd` varchar(60) DEFAULT NULL,
`josh` tinyint(1) NOT NULL DEFAULT '0',
`telephone` varchar(15) DEFAULT NULL,
`mobile` varchar(15) DEFAULT NULL,
`email` varchar(100) DEFAULT '',
`email_secondaire` varchar(100) NOT NULL DEFAULT '',
`fk_role` int DEFAULT '1',
`infos` varchar(200) NOT NULL DEFAULT '',
`ltt` varchar(10) DEFAULT '48.08',
`lng` varchar(10) DEFAULT '-1.68',
`sector` text,
`alert_email` tinyint(1) DEFAULT '1',
`chk_suivi` tinyint(1) DEFAULT '0',
`date_naissance` date DEFAULT NULL,
`dept_naissance` varchar(2) NOT NULL DEFAULT '',
`commune_naissance` varchar(60) NOT NULL DEFAULT '',
`date_embauche` date DEFAULT NULL,
`anciennete` varchar(20) DEFAULT '-',
`fk_categorie` int NOT NULL DEFAULT '0',
`fk_sous_categorie` int NOT NULL DEFAULT '0',
`adresse_1` varchar(50) NOT NULL DEFAULT '',
`adresse_2` varchar(50) NOT NULL DEFAULT '',
`cp` varchar(5) NOT NULL DEFAULT '',
`ville` varchar(60) NOT NULL DEFAULT '',
`matricule` varchar(10) NOT NULL DEFAULT '',
`fk_grade` int NOT NULL DEFAULT '0',
`chk_adherent_ud` tinyint(1) NOT NULL DEFAULT '0',
`chk_adherent_ur` tinyint(1) NOT NULL DEFAULT '0',
`chk_adherent_fns` tinyint(1) NOT NULL DEFAULT '0',
`chk_archive` tinyint(1) NOT NULL DEFAULT '0',
`chk_double_affectation` tinyint(1) NOT NULL DEFAULT '0',
`fk_user_creat` int DEFAULT NULL,
`date_creat` datetime DEFAULT NULL,
`fk_user_modif` int DEFAULT NULL,
`date_modif` datetime DEFAULT NULL,
`active` tinyint(1) DEFAULT '1',
PRIMARY KEY (`rowid`),
KEY `fk_entite` (`fk_entite`),
KEY `libelle` (`libelle`),
KEY `username` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=10027744 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `users_entites`
--
DROP TABLE IF EXISTS `users_entites`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `users_entites` (
`rowid` int NOT NULL AUTO_INCREMENT,
`appname` varchar(20) NOT NULL DEFAULT 'geo_sector',
`http_host` varchar(255) NOT NULL DEFAULT 'admin.geosector.fr adm.geosector.fr mobile.goesector.fr mob.geosector.fr',
`libelle` varchar(45) DEFAULT '',
`adresse1` varchar(45) DEFAULT '',
`adresse2` varchar(45) DEFAULT '',
`cp` varchar(5) DEFAULT '',
`ville` varchar(45) DEFAULT '',
`fk_region` int DEFAULT NULL,
`fk_type` int DEFAULT '1',
`tva_intra` varchar(15) DEFAULT '',
`rcs` varchar(45) DEFAULT '',
`siret` varchar(17) DEFAULT NULL,
`ape` varchar(5) DEFAULT '',
`tel1` varchar(20) DEFAULT '',
`tel2` varchar(20) DEFAULT '',
`couleur` varchar(10) DEFAULT '',
`prefecture` varchar(45) DEFAULT '',
`fk_titre_gerant` int DEFAULT '1',
`gerant_prenom` varchar(45) DEFAULT '',
`gerant_nom` varchar(45) DEFAULT '',
`email` varchar(45) DEFAULT '',
`gps_lat` varchar(10) NOT NULL DEFAULT '',
`gps_lng` varchar(10) NOT NULL DEFAULT '',
`site_url` varchar(45) DEFAULT '',
`gerant_signature` varchar(45) DEFAULT '',
`tampon_signature` varchar(45) DEFAULT '',
`banque_libelle` varchar(25) DEFAULT '',
`banque_adresse` varchar(45) DEFAULT '',
`banque_cp` varchar(5) DEFAULT '',
`banque_ville` varchar(40) DEFAULT '',
`iban` varchar(30) DEFAULT '',
`bic` varchar(15) DEFAULT '',
`genbase` varchar(45) NOT NULL,
`groupebase` varchar(45) NOT NULL,
`userbase` varchar(45) NOT NULL,
`passbase` varchar(45) NOT NULL,
`demo` tinyint(1) DEFAULT '0',
`lib_vert` varchar(25) DEFAULT 'Effectué',
`lib_verts` varchar(25) DEFAULT 'Effectués',
`lib_orange` varchar(25) DEFAULT 'A repasser',
`lib_oranges` varchar(25) DEFAULT 'A repasser',
`lib_rouge` varchar(25) DEFAULT 'Refusé',
`lib_rouges` varchar(25) DEFAULT 'Refusés',
`lib_bleu` varchar(25) DEFAULT 'Autre (Don)',
`lib_bleus` varchar(25) DEFAULT 'Autres (Dons)',
`icon_siege` varchar(15) DEFAULT 'fire',
`icon_siege_color` varchar(15) DEFAULT 'red',
`btn_width` varchar(3) DEFAULT '100',
`chk_mdp_manuel` tinyint(1) NOT NULL DEFAULT '1' COMMENT 'Gestion des mots de passe manuelle O/N',
`chk_copie_mail_recu` tinyint(1) NOT NULL DEFAULT '0',
`chk_accept_sms` tinyint(1) NOT NULL DEFAULT '0',
`nbmembres` int DEFAULT '0',
`nbconnex` int DEFAULT '0',
`date_modif` datetime DEFAULT NULL,
`fk_user_modif` int DEFAULT NULL,
`active` tinyint(1) DEFAULT '1',
PRIMARY KEY (`rowid`)
) ENGINE=InnoDB AUTO_INCREMENT=1229 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `users_lastpos`
--
DROP TABLE IF EXISTS `users_lastpos`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `users_lastpos` (
`fk_user` int NOT NULL,
`fk_operation` int DEFAULT NULL,
`gps_lat` varchar(20) DEFAULT NULL,
`gps_lng` varchar(20) DEFAULT NULL,
`date_pos` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `x_civilites`
--
DROP TABLE IF EXISTS `x_civilites`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `x_civilites` (
`rowid` int NOT NULL AUTO_INCREMENT,
`libelle` varchar(45) DEFAULT NULL,
`active` tinyint(1) DEFAULT '1',
PRIMARY KEY (`rowid`),
UNIQUE KEY `rowid_UNIQUE` (`rowid`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `x_departements`
--
DROP TABLE IF EXISTS `x_departements`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `x_departements` (
`rowid` int NOT NULL AUTO_INCREMENT,
`code` varchar(3) DEFAULT NULL,
`fk_region` int DEFAULT '1',
`libelle` varchar(45) DEFAULT NULL,
`active` tinyint(1) DEFAULT '1',
PRIMARY KEY (`rowid`),
UNIQUE KEY `rowid_UNIQUE` (`rowid`)
) ENGINE=InnoDB AUTO_INCREMENT=105 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `x_devises`
--
DROP TABLE IF EXISTS `x_devises`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `x_devises` (
`rowid` int NOT NULL AUTO_INCREMENT,
`code` varchar(3) DEFAULT NULL,
`symbole` varchar(6) DEFAULT NULL,
`libelle` varchar(45) DEFAULT NULL,
`active` tinyint(1) DEFAULT '1',
PRIMARY KEY (`rowid`),
UNIQUE KEY `rowid_UNIQUE` (`rowid`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `x_entites_types`
--
DROP TABLE IF EXISTS `x_entites_types`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `x_entites_types` (
`rowid` int NOT NULL AUTO_INCREMENT,
`libelle` varchar(45) DEFAULT NULL,
`active` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`rowid`),
UNIQUE KEY `rowid_UNIQUE` (`rowid`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `x_pays`
--
DROP TABLE IF EXISTS `x_pays`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `x_pays` (
`rowid` int NOT NULL AUTO_INCREMENT,
`code` varchar(3) DEFAULT NULL,
`fk_continent` int DEFAULT NULL,
`fk_devise` int DEFAULT '1',
`libelle` varchar(45) DEFAULT NULL,
`active` tinyint(1) DEFAULT '1',
PRIMARY KEY (`rowid`),
UNIQUE KEY `rowid_UNIQUE` (`rowid`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='Table des pays avec leurs codes';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `x_regions`
--
DROP TABLE IF EXISTS `x_regions`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `x_regions` (
`rowid` int NOT NULL AUTO_INCREMENT,
`fk_pays` int DEFAULT '1',
`libelle` varchar(45) DEFAULT NULL,
`libelle_long` varchar(45) DEFAULT NULL,
`table_osm` varchar(45) DEFAULT NULL,
`departements` varchar(45) DEFAULT NULL,
`active` tinyint(1) DEFAULT '1',
PRIMARY KEY (`rowid`),
UNIQUE KEY `rowid_UNIQUE` (`rowid`)
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `x_types_passages`
--
DROP TABLE IF EXISTS `x_types_passages`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `x_types_passages` (
`rowid` int NOT NULL AUTO_INCREMENT,
`libelle` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`color_button` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`color_mark` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`color_table` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`chk_active` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`rowid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `x_types_reglements`
--
DROP TABLE IF EXISTS `x_types_reglements`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `x_types_reglements` (
`rowid` int NOT NULL AUTO_INCREMENT,
`libelle` varchar(45) DEFAULT NULL,
`active` tinyint(1) DEFAULT '1',
PRIMARY KEY (`rowid`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `x_users_categories`
--
DROP TABLE IF EXISTS `x_users_categories`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `x_users_categories` (
`rowid` int NOT NULL AUTO_INCREMENT,
`libelle` varchar(30) NOT NULL,
`active` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`rowid`),
KEY `x_users_categories__libelle` (`libelle`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `x_users_grades`
--
DROP TABLE IF EXISTS `x_users_grades`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `x_users_grades` (
`rowid` int NOT NULL AUTO_INCREMENT,
`libelle` varchar(90) NOT NULL DEFAULT '',
`active` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`rowid`),
KEY `x_users_grades__libelle` (`libelle`)
) ENGINE=InnoDB AUTO_INCREMENT=84 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `x_users_roles`
--
DROP TABLE IF EXISTS `x_users_roles`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `x_users_roles` (
`rowid` int NOT NULL AUTO_INCREMENT,
`libelle` varchar(45) DEFAULT NULL,
`active` tinyint(1) DEFAULT '1',
PRIMARY KEY (`rowid`),
UNIQUE KEY `rowid_UNIQUE` (`rowid`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='Les différents rôles des utilisateurs';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `x_users_sous_categories`
--
DROP TABLE IF EXISTS `x_users_sous_categories`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `x_users_sous_categories` (
`rowid` int NOT NULL AUTO_INCREMENT,
`fk_user_categorie` int NOT NULL,
`libelle` varchar(40) NOT NULL DEFAULT '',
`active` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`rowid`),
KEY `x_users_sous_categories__libelle` (`libelle`),
KEY `x_users_sous_categories_fk_user_categorie_index` (`fk_user_categorie`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `x_villes`
--
DROP TABLE IF EXISTS `x_villes`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `x_villes` (
`rowid` int NOT NULL AUTO_INCREMENT,
`fk_departement` int DEFAULT '1',
`libelle` varchar(65) DEFAULT NULL,
`cp` varchar(5) DEFAULT NULL,
`code_insee` varchar(5) DEFAULT NULL,
`departement` varchar(65) DEFAULT NULL,
`active` tinyint(1) DEFAULT '1',
PRIMARY KEY (`rowid`),
UNIQUE KEY `rowid_UNIQUE` (`rowid`)
) ENGINE=InnoDB AUTO_INCREMENT=38950 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `y_conf`
--
DROP TABLE IF EXISTS `y_conf`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `y_conf` (
`rowid` int NOT NULL AUTO_INCREMENT,
`admin` tinyint(1) NOT NULL DEFAULT '0',
`appenv` varchar(5) NOT NULL DEFAULT 'dev',
`apptitle` varchar(75) NOT NULL DEFAULT '',
`appversion` varchar(20) NOT NULL DEFAULT '0.5 du 15/01/2016',
`appscript` varchar(25) NOT NULL DEFAULT 'login' COMMENT 'Script à appeler si la session ne reconnaît pas l''utilisateur',
`appicon` varchar(25) NOT NULL DEFAULT 'favicon.png',
`pathimg` varchar(45) NOT NULL DEFAULT '/files/img',
`pathupload` varchar(45) NOT NULL DEFAULT '/files/upload',
`brandgroupe` varchar(45) NOT NULL DEFAULT '',
`brandmulti` tinyint(1) DEFAULT '0',
`date_maintenance` datetime DEFAULT NULL,
`date_renouvellement` date DEFAULT NULL,
`piwikid` varchar(45) DEFAULT '0',
`googlid` varchar(45) DEFAULT '0',
`active` tinyint(1) DEFAULT '1',
PRIMARY KEY (`rowid`),
UNIQUE KEY `rowid_UNIQUE` (`rowid`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `y_menus`
--
DROP TABLE IF EXISTS `y_menus`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `y_menus` (
`rowid` int NOT NULL AUTO_INCREMENT,
`type_menu` varchar(3) NOT NULL DEFAULT 'mnu' COMMENT '"mnu" pour le menu en header, "bar" pour la barre à gauche, "sdb" pour la sidebar à gauche',
`admin` tinyint DEFAULT '0' COMMENT '0 Public, 1 Admin, 2 Mobile',
`only_type_entite` varchar(45) DEFAULT '',
`only_fk_entite` varchar(45) DEFAULT '',
`only_fk_role` varchar(45) DEFAULT '',
`divider_before` tinyint(1) DEFAULT '0',
`ordre` tinyint DEFAULT '0',
`fk_parent` int DEFAULT '0',
`libelle` varchar(45) DEFAULT '',
`icone` varchar(45) DEFAULT '',
`color` varchar(35) DEFAULT '',
`back-color` varchar(35) DEFAULT '',
`title` varchar(75) DEFAULT '',
`script` varchar(45) NOT NULL COMMENT 'Une page php acceuil ou une function javascript js:nomfonction ou l''appel à l''id d''un bouton btn:btnNoteRapide\n',
`script_command` varchar(45) DEFAULT '',
`active` tinyint(1) DEFAULT '1',
PRIMARY KEY (`rowid`),
UNIQUE KEY `rowid_UNIQUE` (`rowid`),
KEY `type_menu` (`type_menu`),
KEY `script` (`script`),
KEY `ordre` (`ordre`),
KEY `fk_parent` (`fk_parent`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `y_modules`
--
DROP TABLE IF EXISTS `y_modules`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `y_modules` (
`rowid` int NOT NULL AUTO_INCREMENT,
`fk_parent` int DEFAULT '0',
`ordre` int DEFAULT '0',
`libelle` varchar(45) NOT NULL,
`tip` varchar(150) DEFAULT '',
`description` text,
`script` varchar(20) DEFAULT '',
`couleur` varchar(7) DEFAULT '#bcbcbc',
`icone` varchar(30) DEFAULT NULL,
`taille_tuile` int DEFAULT '70' COMMENT 'Taille de la tuile dans l''interface admin',
`admin` tinyint(1) DEFAULT '1',
`active` tinyint(1) DEFAULT '0',
PRIMARY KEY (`rowid`),
UNIQUE KEY `rowid_UNIQUE` (`rowid`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `y_modules_rules`
--
DROP TABLE IF EXISTS `y_modules_rules`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `y_modules_rules` (
`rowid` int NOT NULL AUTO_INCREMENT,
`fk_module` int DEFAULT '0',
`libelle` varchar(30) NOT NULL DEFAULT '',
`tip` varchar(250) NOT NULL DEFAULT '',
`val_default` varchar(20) NOT NULL DEFAULT '' COMMENT 'Valeur par défaut prise si la valeur d''un CE n''est pas renseignée',
`ce_apa` varchar(20) DEFAULT '',
`ce_csfouest` varchar(20) DEFAULT '',
`ce_demo` varchar(20) DEFAULT '',
`ce_natixis` varchar(20) DEFAULT '',
`ce_purina` varchar(20) DEFAULT '',
`ce_tfn44` varchar(20) DEFAULT '',
`ce_webasto` varchar(20) DEFAULT '',
`active` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`rowid`),
UNIQUE KEY `y_modules_regles_rowid_uindex` (`rowid`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `y_pages`
--
DROP TABLE IF EXISTS `y_pages`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `y_pages` (
`rowid` int NOT NULL AUTO_INCREMENT,
`libelle` varchar(45) DEFAULT NULL,
`titre` varchar(75) DEFAULT NULL,
`tooltip` varchar(45) DEFAULT NULL,
`description` varchar(200) DEFAULT NULL,
`keywords` varchar(200) DEFAULT NULL,
`script` varchar(45) DEFAULT NULL,
`enmaintenance` tinyint(1) DEFAULT '0' COMMENT '0 libre d''accès, 1 en maintenance mais accès aux données, 2 en maintenance sans accès aux données',
`admin` tinyint(1) DEFAULT '0',
`mail` tinyint(1) DEFAULT '0',
`admtools` tinyint(1) DEFAULT '0',
`magazine` tinyint(1) DEFAULT '0',
`files` tinyint(1) DEFAULT '1',
`maps` tinyint(1) DEFAULT '0',
`editor` tinyint(1) DEFAULT '0',
`jqui` tinyint(1) DEFAULT '0',
`form` tinyint(1) DEFAULT '0',
`sidebar` tinyint(1) DEFAULT '0',
`chart` tinyint(1) DEFAULT '0',
`agenda` tinyint(1) DEFAULT '0',
`scheduler` tinyint(1) DEFAULT '0',
`osm` tinyint(1) DEFAULT '0',
`zz` tinyint(1) DEFAULT '0',
`maintenance` tinyint(1) DEFAULT '0',
`layout` varchar(45) DEFAULT 'default.php',
`active` tinyint(1) DEFAULT '1',
PRIMARY KEY (`rowid`),
UNIQUE KEY `rowid_UNIQUE` (`rowid`),
KEY `script` (`script`),
KEY `admin` (`admin`)
) ENGINE=InnoDB AUTO_INCREMENT=40 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `z_logs`
--
DROP TABLE IF EXISTS `z_logs`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `z_logs` (
`date` datetime NOT NULL,
`ip` varchar(15) NOT NULL,
`host` varchar(50) NOT NULL,
`adrhost` varchar(50) NOT NULL,
`infos` varchar(200) DEFAULT '',
`fk_user` int DEFAULT '0',
`page` varchar(200) NOT NULL,
`commentaire` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='Table des logs';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `z_sessions`
--
DROP TABLE IF EXISTS `z_sessions`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `z_sessions` (
`sid` text NOT NULL,
`fk_user` int NOT NULL,
`role` varchar(10) DEFAULT NULL,
`date_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`ip` varchar(50) NOT NULL,
`browser` varchar(150) NOT NULL,
`data` mediumtext
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `z_stats`
--
DROP TABLE IF EXISTS `z_stats`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `z_stats` (
`rowid` int NOT NULL AUTO_INCREMENT,
`libelle` varchar(75) DEFAULT NULL,
`fk_user` int DEFAULT NULL,
`date` datetime DEFAULT NULL,
`ip` varchar(15) DEFAULT NULL,
`browser` varchar(75) DEFAULT NULL,
`origine` varchar(45) DEFAULT NULL,
`status` varchar(10) DEFAULT NULL,
`active` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`rowid`)
) ENGINE=InnoDB AUTO_INCREMENT=210793 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping routines for database 'geosector'
--
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2025-03-28 9:04:32

View File

@@ -0,0 +1,619 @@
-- Création de la base de données geo_app si elle n'existe pas
DROP DATABASE IF EXISTS `geo_app`;
CREATE DATABASE IF NOT EXISTS `geo_app` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- Création de l'utilisateur et attribution des droits
CREATE USER IF NOT EXISTS 'geo_app_user'@'localhost' IDENTIFIED BY 'QO:96df*?k{4W6m';
GRANT SELECT, INSERT, UPDATE, DELETE ON `geo_app`.* TO 'geo_app_user'@'localhost';
FLUSH PRIVILEGES;
USE geo_app;
--
-- Table structure for table `email_counter`
--
DROP TABLE IF EXISTS `email_counter`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `email_counter` (
`id` int unsigned NOT NULL DEFAULT '1',
`hour_start` timestamp NULL DEFAULT NULL,
`count` int unsigned DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `x_devises`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `x_devises` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`code` varchar(3) DEFAULT NULL,
`symbole` varchar(6) DEFAULT NULL,
`libelle` varchar(45) DEFAULT NULL,
`chk_active` tinyint(1) unsigned DEFAULT '1',
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `x_entites_types`
--
DROP TABLE IF EXISTS `x_entites_types`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `x_entites_types` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`libelle` varchar(45) DEFAULT NULL,
`chk_active` tinyint(1) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `x_types_passages`
--
DROP TABLE IF EXISTS `x_types_passages`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `x_types_passages` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`libelle` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`color_button` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`color_mark` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`color_table` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`chk_active` tinyint(1) unsigned NOT NULL DEFAULT '1',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `x_types_reglements`
--
DROP TABLE IF EXISTS `x_types_reglements`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `x_types_reglements` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`libelle` varchar(45) DEFAULT NULL,
`chk_active` tinyint(1) unsigned DEFAULT '1',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `x_users_roles`
--
DROP TABLE IF EXISTS `x_users_roles`;
CREATE TABLE `x_users_roles` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`libelle` varchar(45) DEFAULT NULL,
`chk_active` tinyint(1) unsigned DEFAULT '1',
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Les différents rôles des utilisateurs';
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `x_users_titres`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `x_users_titres` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`libelle` varchar(45) DEFAULT NULL,
`chk_active` tinyint(1) unsigned DEFAULT '1',
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Les différents titres des utilisateurs';
DROP TABLE IF EXISTS `x_pays`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `x_pays` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`code` varchar(3) DEFAULT NULL,
`fk_continent` int unsigned DEFAULT NULL,
`fk_devise` int unsigned DEFAULT '1',
`libelle` varchar(45) DEFAULT NULL,
`chk_active` tinyint(1) unsigned DEFAULT '1',
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`),
CONSTRAINT `x_pays_ibfk_1` FOREIGN KEY (`fk_devise`) REFERENCES `x_devises` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Table des pays avec leurs codes';
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `x_regions`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `x_regions` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`fk_pays` int unsigned DEFAULT '1',
`libelle` varchar(45) DEFAULT NULL,
`libelle_long` varchar(45) DEFAULT NULL,
`table_osm` varchar(45) DEFAULT NULL,
`departements` varchar(45) DEFAULT NULL,
`chk_active` tinyint(1) unsigned DEFAULT '1',
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`),
CONSTRAINT `x_regions_ibfk_1` FOREIGN KEY (`fk_pays`) REFERENCES `x_pays` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `x_departements`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `x_departements` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`code` varchar(3) DEFAULT NULL,
`fk_region` int unsigned DEFAULT '1',
`libelle` varchar(45) DEFAULT NULL,
`chk_active` tinyint(1) unsigned DEFAULT '1',
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`),
CONSTRAINT `x_departements_ibfk_1` FOREIGN KEY (`fk_region`) REFERENCES `x_regions` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=105 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `entites`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `entites` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`encrypted_name` varchar(255) DEFAULT NULL,
`adresse1` varchar(45) DEFAULT '',
`adresse2` varchar(45) DEFAULT '',
`code_postal` varchar(5) DEFAULT '',
`ville` varchar(45) DEFAULT '',
`fk_region` int unsigned DEFAULT NULL,
`fk_type` int unsigned DEFAULT '1',
`encrypted_phone` varchar(128) DEFAULT '',
`encrypted_mobile` varchar(128) DEFAULT '',
`encrypted_email` varchar(255) DEFAULT '',
`gps_lat` varchar(20) NOT NULL DEFAULT '',
`gps_lng` varchar(20) NOT NULL DEFAULT '',
`encrypted_stripe_id` varchar(255) DEFAULT '',
`encrypted_iban` varchar(255) DEFAULT '',
`encrypted_bic` varchar(128) DEFAULT '',
`chk_demo` tinyint(1) unsigned DEFAULT '1',
`chk_mdp_manuel` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT 'Gestion des mots de passe manuelle O/N',
`chk_copie_mail_recu` tinyint(1) unsigned NOT NULL DEFAULT '0',
`chk_accept_sms` tinyint(1) unsigned NOT NULL DEFAULT '0',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Date de création',
`fk_user_creat` int unsigned DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT 'Date de modification',
`fk_user_modif` int unsigned DEFAULT NULL,
`chk_active` tinyint(1) unsigned DEFAULT '1',
PRIMARY KEY (`id`),
CONSTRAINT `entites_ibfk_1` FOREIGN KEY (`fk_region`) REFERENCES `x_regions` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE,
CONSTRAINT `entites_ibfk_2` FOREIGN KEY (`fk_type`) REFERENCES `x_entites_types` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `x_villes`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `x_villes` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`fk_departement` int unsigned DEFAULT '1',
`libelle` varchar(65) DEFAULT NULL,
`cp` varchar(5) DEFAULT NULL,
`code_insee` varchar(5) DEFAULT NULL,
`departement` varchar(65) DEFAULT NULL,
`chk_active` tinyint(1) unsigned DEFAULT '1',
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`),
CONSTRAINT `x_villes_ibfk_1` FOREIGN KEY (`fk_departement`) REFERENCES `x_departements` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `users`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `users` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`fk_entite` int unsigned DEFAULT '1',
`fk_role` int unsigned DEFAULT '1',
`fk_titre` int unsigned DEFAULT '1',
`encrypted_name` varchar(255) DEFAULT NULL,
`first_name` varchar(45) DEFAULT NULL,
`sect_name` varchar(60) DEFAULT '',
`encrypted_user_name` varchar(128) DEFAULT '',
`user_pass_hash` varchar(60) DEFAULT NULL,
`encrypted_phone` varchar(128) DEFAULT NULL,
`encrypted_mobile` varchar(128) DEFAULT NULL,
`encrypted_email` varchar(255) DEFAULT '',
`chk_alert_email` tinyint(1) unsigned DEFAULT '1',
`chk_suivi` tinyint(1) unsigned DEFAULT '0',
`date_naissance` date DEFAULT NULL,
`date_embauche` date DEFAULT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Date de création',
`fk_user_creat` int unsigned DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT 'Date de modification',
`fk_user_modif` int unsigned DEFAULT NULL,
`chk_active` tinyint(1) unsigned DEFAULT '1',
PRIMARY KEY (`id`),
KEY `fk_entite` (`fk_entite`),
KEY `username` (`encrypted_user_name`),
CONSTRAINT `users_ibfk_1` FOREIGN KEY (`fk_entite`) REFERENCES `entites` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE,
CONSTRAINT `users_ibfk_2` FOREIGN KEY (`fk_role`) REFERENCES `x_users_roles` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE,
CONSTRAINT `users_ibfk_3` FOREIGN KEY (`fk_titre`) REFERENCES `x_users_titres` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `operations`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `operations` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`fk_entite` int unsigned NOT NULL DEFAULT '1',
`libelle` varchar(75) NOT NULL DEFAULT '',
`date_deb` date NOT NULL DEFAULT '0000-00-00',
`date_fin` date NOT NULL DEFAULT '0000-00-00',
`chk_distinct_sectors` tinyint(1) unsigned NOT NULL DEFAULT '0',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Date de création',
`fk_user_creat` int unsigned NOT NULL DEFAULT '0',
`updated_at` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT 'Date de modification',
`fk_user_modif` int unsigned NOT NULL DEFAULT '0',
`chk_active` tinyint(1) unsigned NOT NULL DEFAULT '1',
PRIMARY KEY (`id`),
KEY `fk_entite` (`fk_entite`),
KEY `date_deb` (`date_deb`),
CONSTRAINT `operations_ibfk_1` FOREIGN KEY (`fk_entite`) REFERENCES `entites` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `ope_sectors`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `ope_sectors` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`fk_operation` int unsigned NOT NULL DEFAULT '0',
`fk_old_sector` int unsigned NOT NULL DEFAULT '0',
`libelle` varchar(75) NOT NULL DEFAULT '',
`sector` text NOT NULL DEFAULT '',
`color` varchar(7) NOT NULL DEFAULT '#4B77BE',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Date de création',
`fk_user_creat` int unsigned NOT NULL DEFAULT '0',
`updated_at` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT 'Date de modification',
`fk_user_modif` int unsigned NOT NULL DEFAULT '0',
`chk_active` tinyint(1) unsigned NOT NULL DEFAULT '1',
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`),
KEY `fk_operation` (`fk_operation`),
CONSTRAINT `ope_sectors_ibfk_1` FOREIGN KEY (`fk_operation`) REFERENCES `operations` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `ope_users`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `ope_users` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`fk_operation` int unsigned NOT NULL DEFAULT '0',
`fk_user` int unsigned NOT NULL DEFAULT '0',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Date de création',
`fk_user_creat` int unsigned DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT 'Date de modification',
`fk_user_modif` int unsigned DEFAULT NULL,
`chk_active` tinyint(1) unsigned NOT NULL DEFAULT '1',
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`),
CONSTRAINT `ope_users_ibfk_1` FOREIGN KEY (`fk_operation`) REFERENCES `operations` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE,
CONSTRAINT `ope_users_ibfk_2` FOREIGN KEY (`fk_user`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `email_queue`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `email_queue` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`fk_pass` int unsigned NOT NULL DEFAULT '0',
`to_email` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`subject` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`body` text COLLATE utf8mb4_unicode_ci,
`headers` text COLLATE utf8mb4_unicode_ci,
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`status` enum('pending','sent','failed') COLLATE utf8mb4_unicode_ci DEFAULT 'pending',
`attempts` int unsigned DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `ope_users_sectors`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `ope_users_sectors` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`fk_operation` int unsigned NOT NULL DEFAULT '0',
`fk_user` int unsigned NOT NULL DEFAULT '0',
`fk_sector` int unsigned NOT NULL DEFAULT '0',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Date de création',
`fk_user_creat` int unsigned NOT NULL DEFAULT '0',
`updated_at` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT 'Date de modification',
`fk_user_modif` int unsigned DEFAULT NULL,
`chk_active` tinyint(1) unsigned DEFAULT '1',
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`),
KEY `fk_operation` (`fk_operation`),
KEY `fk_user` (`fk_user`),
KEY `fk_sector` (`fk_sector`),
CONSTRAINT `ope_users_sectors_ibfk_1` FOREIGN KEY (`fk_operation`) REFERENCES `operations` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE,
CONSTRAINT `ope_users_sectors_ibfk_2` FOREIGN KEY (`fk_user`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE,
CONSTRAINT `ope_users_sectors_ibfk_3` FOREIGN KEY (`fk_sector`) REFERENCES `ope_sectors` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `ope_users_suivis`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `ope_users_suivis` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`fk_operation` int unsigned NOT NULL DEFAULT '0',
`fk_user` int unsigned NOT NULL DEFAULT '0',
`date_suivi` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Date du suivi',
`gps_lat` varchar(20) NOT NULL DEFAULT '',
`gps_lng` varchar(20) NOT NULL DEFAULT '',
`vitesse` varchar(20) NOT NULL DEFAULT '',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Date de création',
`fk_user_creat` int unsigned NOT NULL DEFAULT '0',
`updated_at` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT 'Date de modification',
`fk_user_modif` int unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `sectors_adresses`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `sectors_adresses` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`fk_adresse` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'adresses.cp??.id',
`osm_id` int unsigned NOT NULL DEFAULT '0',
`fk_sector` int unsigned NOT NULL DEFAULT '0',
`osm_name` varchar(50) NOT NULL DEFAULT '',
`numero` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
`rue_bis` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
`rue` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
`cp` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
`ville` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
`gps_lat` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
`gps_lng` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
`osm_date_creat` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Date de création',
`updated_at` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT 'Date de modification',
PRIMARY KEY (`id`),
KEY `sectors_adresses_fk_sector_index` (`fk_sector`),
KEY `sectors_adresses_numero_index` (`numero`),
KEY `sectors_adresses_rue_index` (`rue`),
KEY `sectors_adresses_ville_index` (`ville`),
CONSTRAINT `sectors_adresses_ibfk_1` FOREIGN KEY (`fk_sector`) REFERENCES `ope_sectors` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `ope_pass`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `ope_pass` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`fk_operation` int unsigned NOT NULL DEFAULT '0',
`fk_sector` int unsigned DEFAULT '0',
`fk_user` int unsigned NOT NULL DEFAULT '0',
`fk_adresse` varchar(25) DEFAULT '' COMMENT 'adresses.cp??.id',
`passed_at` timestamp NULL DEFAULT NULL COMMENT 'Date du passage',
`fk_type` int unsigned DEFAULT '0',
`numero` varchar(10) NOT NULL DEFAULT '',
`rue` varchar(75) NOT NULL DEFAULT '',
`rue_bis` varchar(1) NOT NULL DEFAULT '',
`ville` varchar(75) NOT NULL DEFAULT '',
`fk_habitat` int unsigned DEFAULT '1',
`appt` varchar(5) DEFAULT '',
`niveau` varchar(5) DEFAULT '',
`residence` varchar(75) DEFAULT '',
`gps_lat` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
`gps_lng` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
`encrypted_name` varchar(255) NOT NULL DEFAULT '',
`montant` decimal(7,2) NOT NULL DEFAULT '0.00',
`fk_type_reglement` int unsigned DEFAULT '1',
`remarque` text DEFAULT '',
`encrypted_email` varchar(255) DEFAULT '',
`nom_recu` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`date_recu` timestamp NULL DEFAULT NULL COMMENT 'Date de réception',
`date_creat_recu` timestamp NULL DEFAULT NULL COMMENT 'Date de création du reçu',
`date_sent_recu` timestamp NULL DEFAULT NULL COMMENT 'Date envoi du reçu',
`email_erreur` varchar(30) DEFAULT '',
`chk_email_sent` tinyint(1) unsigned NOT NULL DEFAULT '0',
`encrypted_phone` varchar(128) NOT NULL DEFAULT '',
`chk_striped` tinyint(1) unsigned DEFAULT '0',
`docremis` tinyint(1) unsigned DEFAULT '0',
`date_repasser` timestamp NULL DEFAULT NULL COMMENT 'Date prévue pour repasser',
`nb_passages` int DEFAULT '1' COMMENT 'Nb passages pour les a repasser',
`chk_gps_maj` tinyint(1) unsigned DEFAULT '0',
`chk_map_create` tinyint(1) unsigned DEFAULT '0',
`chk_mobile` tinyint(1) unsigned DEFAULT '0',
`chk_synchro` tinyint(1) unsigned DEFAULT '1' COMMENT 'chk synchro entre web et appli',
`chk_api_adresse` tinyint(1) unsigned DEFAULT '0',
`chk_maj_adresse` tinyint(1) unsigned DEFAULT '0',
`anomalie` tinyint(1) unsigned DEFAULT '0',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Date de création',
`fk_user_creat` int unsigned DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT 'Date de modification',
`fk_user_modif` int unsigned DEFAULT NULL,
`chk_active` tinyint(1) unsigned NOT NULL DEFAULT '1',
PRIMARY KEY (`id`),
KEY `fk_operation` (`fk_operation`),
KEY `fk_sector` (`fk_sector`),
KEY `fk_user` (`fk_user`),
KEY `fk_type` (`fk_type`),
KEY `fk_type_reglement` (`fk_type_reglement`),
KEY `email` (`email`),
CONSTRAINT `ope_pass_ibfk_1` FOREIGN KEY (`fk_operation`) REFERENCES `operations` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE,
CONSTRAINT `ope_pass_ibfk_2` FOREIGN KEY (`fk_sector`) REFERENCES `ope_sectors` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE,
CONSTRAINT `ope_pass_ibfk_3` FOREIGN KEY (`fk_user`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE,
CONSTRAINT `ope_pass_ibfk_4` FOREIGN KEY (`fk_type_reglement`) REFERENCES `x_types_reglements` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `ope_pass_histo`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `ope_pass_histo` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`fk_pass` int unsigned NOT NULL DEFAULT '0',
`date_histo` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Date historique',
`sujet` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`remarque` varchar(250) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `ope_pass_histo_fk_pass_IDX` (`fk_pass`) USING BTREE,
KEY `ope_pass_histo_date_histo_IDX` (`date_histo`) USING BTREE,
CONSTRAINT `ope_pass_histo_ibfk_1` FOREIGN KEY (`fk_pass`) REFERENCES `ope_pass` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `medias`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `medias` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`support` varchar(45) NOT NULL DEFAULT '',
`support_id` int unsigned NOT NULL DEFAULT '0',
`fichier` varchar(250) NOT NULL DEFAULT '',
`description` varchar(100) NOT NULL DEFAULT '',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`fk_user_creat` int unsigned NOT NULL DEFAULT '0',
`updated_at` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
`fk_user_modif` int unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
-- Création des tables pour le système de chat
DROP TABLE IF EXISTS `chat_rooms`;
-- Table des salles de discussion
CREATE TABLE chat_rooms (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
type ENUM('privee', 'groupe', 'liste_diffusion') NOT NULL,
date_creation timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Date de création',
fk_user INT UNSIGNED NOT NULL,
fk_entite INT UNSIGNED,
statut ENUM('active', 'archive') NOT NULL DEFAULT 'active',
description TEXT,
INDEX idx_user (fk_user),
INDEX idx_entite (fk_entite)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `chat_participants`;
-- Table des participants aux salles de discussion
CREATE TABLE chat_participants (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
id_room INT UNSIGNED NOT NULL,
id_user INT UNSIGNED NOT NULL,
role ENUM('administrateur', 'participant', 'en_lecture_seule') NOT NULL DEFAULT 'participant',
date_ajout timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Date ajout',
notification_activee BOOLEAN NOT NULL DEFAULT TRUE,
INDEX idx_room (id_room),
INDEX idx_user (id_user),
CONSTRAINT uc_room_user UNIQUE (id_room, id_user),
FOREIGN KEY (id_room) REFERENCES chat_rooms(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `chat_messages`;
-- Table des messages
CREATE TABLE chat_messages (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
fk_room INT UNSIGNED NOT NULL,
fk_user INT UNSIGNED NOT NULL,
content TEXT,
date_sent timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Date envoi',
type ENUM('texte', 'media', 'systeme') NOT NULL DEFAULT 'texte',
statut ENUM('envoye', 'livre', 'lu') NOT NULL DEFAULT 'envoye',
INDEX idx_room (fk_room),
INDEX idx_user (fk_user),
INDEX idx_date (date_sent),
FOREIGN KEY (fk_room) REFERENCES chat_rooms(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `chat_listes_diffusion`;
-- Table des listes de diffusion
CREATE TABLE chat_listes_diffusion (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
fk_room INT UNSIGNED NOT NULL,
name VARCHAR(100) NOT NULL,
description TEXT,
fk_user INT UNSIGNED NOT NULL,
date_creation timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Date de création',
INDEX idx_room (fk_room),
INDEX idx_user (fk_user),
FOREIGN KEY (fk_room) REFERENCES chat_rooms(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `chat_read_messages`;
-- Table pour suivre la lecture des messages
CREATE TABLE chat_read_messages (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
fk_message INT UNSIGNED NOT NULL,
fk_user INT UNSIGNED NOT NULL,
date_read timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Date de lecture',
INDEX idx_message (fk_message),
INDEX idx_user (fk_user),
CONSTRAINT uc_message_user UNIQUE (fk_message, fk_user),
FOREIGN KEY (fk_message) REFERENCES chat_messages(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `chat_notifications`;
-- Table des notifications
CREATE TABLE chat_notifications (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
fk_user INT UNSIGNED NOT NULL,
fk_message INT UNSIGNED,
fk_room INT UNSIGNED,
type VARCHAR(50) NOT NULL,
contenu TEXT,
date_creation timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Date de création',
date_lecture timestamp NULL DEFAULT NULL COMMENT 'Date de lecture',
statut ENUM('non_lue', 'lue') NOT NULL DEFAULT 'non_lue',
INDEX idx_user (fk_user),
INDEX idx_message (fk_message),
INDEX idx_room (fk_room),
FOREIGN KEY (fk_message) REFERENCES chat_messages(id) ON DELETE SET NULL,
FOREIGN KEY (fk_room) REFERENCES chat_rooms(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `z_params`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `params` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`libelle` varchar(35) NOT NULL DEFAULT '',
`valeur` varchar(255) NOT NULL DEFAULT '',
`aide` varchar(150) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `z_sessions`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `z_sessions` (
`sid` text NOT NULL,
`fk_user` int NOT NULL,
`role` varchar(10) DEFAULT NULL,
`date_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`ip` varchar(50) NOT NULL,
`browser` varchar(150) NOT NULL,
`data` mediumtext
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;

View File

@@ -0,0 +1,35 @@
<?php
/**
* Configuration simplifiée pour les scripts de migration
* Fournit les clés de chiffrement et autres paramètres nécessaires
* sans dépendre des en-têtes HTTP
*/
class AppConfig {
private static ?self $instance = null;
// Configuration spécifique pour la migration
private array $config = [
'encryption_key' => 'Qga2M8Ov6tyx2fIQRWHQ1U6oMK/bAFdTL7A8VRtiDhk=', // Clé de GeoSector
'app_identifier' => 'geosector', // Identifiant de l'application
];
private function __construct() {
// Constructeur simplifié sans validation d'application
}
public static function getInstance(): self {
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
public function getEncryptionKey(): string {
return $this->config['encryption_key'];
}
public function getAppIdentifier(): string {
return $this->config['app_identifier'];
}
}

357
api/scripts/php/migrate.php Normal file
View File

@@ -0,0 +1,357 @@
<?php
/**
* Script de migration générique pour transférer des données entre les bases geosector et geosector_app
*
* Usage:
* php migrate.php - Exécute toutes les migrations dans l'ordre
* php migrate.php <table_name> - Exécute la migration pour une table spécifique
*
* Options:
* --truncate Vide la table cible avant la migration
* --create-table Crée la table cible si elle n'existe pas
* --help Affiche l'aide
*/
require_once dirname(__DIR__) . '/config.php';
// Définition des mappages de colonnes pour chaque table
$tableMappings = [
'x_devises' => [
'source_to_target' => [
'rowid' => 'id',
'active' => 'chk_active'
],
'primary_key' => 'rowid', // Clé primaire dans la table source
'target_primary_key' => 'id' // Clé primaire dans la table cible
],
'users' => [
'source_to_target' => [
'id' => 'id',
'user_pass_hash' => 'password_hash',
'encrypted_user_name' => 'encrypted_last_name',
'lang' => 'preferred_language',
'chk_active' => 'is_active'
],
'primary_key' => 'id',
'target_primary_key' => 'id',
'encrypted_fields' => [
'email' => ['field' => 'encrypted_email', 'searchable' => true],
'user_name' => ['field' => 'encrypted_last_name', 'searchable' => false],
'phone' => ['field' => 'encrypted_phone', 'searchable' => false],
'mobile' => ['field' => 'encrypted_mobile', 'searchable' => false]
]
],
// Ajoutez d'autres tables selon les besoins
];
// Fonction pour afficher l'aide
function showHelp() {
echo "Usage: php migrate.php <table_name> [--truncate] [--create-table]\n";
echo "\nOptions disponibles:\n";
echo " --truncate Vide la table cible avant la migration\n";
echo " --create-table Crée la table cible si elle n'existe pas\n";
echo " --help Affiche cette aide\n";
echo "\nTables disponibles:\n";
global $tableMappings;
foreach (array_keys($tableMappings) as $table) {
echo " - $table\n";
}
exit(0);
}
// Définition des scripts de migration disponibles dans l'ordre d'exécution
$migrationScripts = [
'x_devises' => __DIR__ . '/migrate_x_devises.php',
'x_entites_types' => __DIR__ . '/migrate_x_entites_types.php',
'x_types_passages' => __DIR__ . '/migrate_x_types_passages.php',
'x_types_reglements' => __DIR__ . '/migrate_x_types_reglements.php',
'x_users_roles' => __DIR__ . '/migrate_x_users_roles.php',
'x_pays' => __DIR__ . '/migrate_x_pays.php',
'x_regions' => __DIR__ . '/migrate_x_regions.php',
'x_departements' => __DIR__ . '/migrate_x_departements.php',
'x_villes' => __DIR__ . '/migrate_x_villes.php',
'entites' => __DIR__ . '/migrate_entites.php',
'users' => __DIR__ . '/migrate_users.php',
'operations' => __DIR__ . '/migrate_operations.php',
'ope_sectors' => __DIR__ . '/migrate_ope_sectors.php',
'sectors_adresses' => __DIR__ . '/migrate_sectors_adresses.php',
'ope_users' => __DIR__ . '/migrate_ope_users.php',
'ope_users_sectors' => __DIR__ . '/migrate_ope_users_sectors.php',
'ope_pass' => __DIR__ . '/migrate_ope_pass.php',
'ope_pass_histo' => __DIR__ . '/migrate_ope_pass_histo.php',
'medias' => __DIR__ . '/migrate_medias.php'
// Ajoutez d'autres scripts de migration au fur et à mesure
];
// Fonction pour exécuter un script de migration spécifique
function executeMigrationScript($scriptPath) {
echo "\nExécution du script: " . basename($scriptPath) . "\n";
echo "------------------------------------------------\n";
// Exécuter le script PHP
include $scriptPath;
echo "\n";
return true;
}
// Traitement des arguments de ligne de commande
$tableName = null;
$truncateTable = false;
$createTable = false;
$runAllScripts = true;
for ($i = 1; $i < $_SERVER['argc']; $i++) {
$arg = $_SERVER['argv'][$i];
if ($arg === '--help') {
showHelp();
} elseif ($arg === '--truncate') {
$truncateTable = true;
} elseif ($arg === '--create-table') {
$createTable = true;
} elseif (substr($arg, 0, 2) !== '--') {
$tableName = $arg;
$runAllScripts = false;
}
}
// Si aucune table n'est spécifiée, exécuter tous les scripts de migration dans l'ordre
if ($runAllScripts) {
echo "\nDémarrage de la migration complète de la base de données\n";
echo "=======================================================\n";
$startTime = microtime(true);
$successCount = 0;
$failCount = 0;
foreach ($migrationScripts as $table => $scriptPath) {
if (file_exists($scriptPath)) {
try {
executeMigrationScript($scriptPath);
$successCount++;
} catch (Exception $e) {
echo "\nErreur lors de la migration de la table $table: " . $e->getMessage() . "\n";
$failCount++;
}
} else {
echo "\nScript de migration introuvable pour la table $table: $scriptPath\n";
$failCount++;
}
}
$endTime = microtime(true);
$executionTime = round($endTime - $startTime, 2);
echo "\n=======================================================\n";
echo "Migration terminée en $executionTime secondes\n";
echo "Tables migrées avec succès: $successCount\n";
echo "Tables en échec: $failCount\n";
exit(0);
}
// Si une table spécifique est demandée, vérifier si un script dédié existe
if (isset($migrationScripts[$tableName])) {
$scriptPath = $migrationScripts[$tableName];
if (file_exists($scriptPath)) {
executeMigrationScript($scriptPath);
exit(0);
}
}
// Sinon, utiliser la méthode générique de migration (code existant)
if (!isset($tableMappings[$tableName])) {
echo "Erreur: La table '$tableName' n'est pas configurée pour la migration.\n";
echo "Tables disponibles: " . implode(', ', array_keys($tableMappings)) . "\n";
exit(1);
}
// Création du dossier de logs si nécessaire
if (!is_dir(dirname(__DIR__) . '/logs')) {
mkdir(dirname(__DIR__) . '/logs', 0755, true);
}
logOperation("Démarrage de la migration de la table $tableName");
try {
// Connexion aux bases de données
$sourceDb = getSourceConnection();
$targetDb = getTargetConnection();
// Obtenir le service API pour le chiffrement si nécessaire
$apiService = null;
if (isset($tableMappings[$tableName]['encrypted_fields'])) {
$container = $GLOBALS['container'];
$apiService = $container->get('ApiService');
}
// Récupération des données de la source
$stmt = $sourceDb->query("SELECT * FROM $tableName");
$records = $stmt->fetchAll();
logOperation("Nombre d'enregistrements à migrer: " . count($records));
// Vérifier si la table existe dans la cible
try {
$targetDb->query("SELECT 1 FROM $tableName LIMIT 1");
$tableExists = true;
} catch (PDOException $e) {
$tableExists = false;
}
// Créer la table si elle n'existe pas et si l'option est activée
if (!$tableExists && $createTable) {
logOperation("La table $tableName n'existe pas dans la base cible. Création de la table...");
// Récupérer la structure de la table source
$stmt = $sourceDb->query("SHOW CREATE TABLE $tableName");
$tableStructure = $stmt->fetch(PDO::FETCH_ASSOC);
if (isset($tableStructure['Create Table'])) {
$createTableSql = $tableStructure['Create Table'];
// Adapter les noms de colonnes selon le mapping
$mapping = $tableMappings[$tableName]['source_to_target'];
foreach ($mapping as $sourceCol => $targetCol) {
$createTableSql = str_replace("`$sourceCol`", "`$targetCol`", $createTableSql);
}
// Remplacer le nom de la clé primaire si nécessaire
$sourcePk = $tableMappings[$tableName]['primary_key'];
$targetPk = $tableMappings[$tableName]['target_primary_key'];
if ($sourcePk !== $targetPk) {
$createTableSql = str_replace("PRIMARY KEY (`$sourcePk`)", "PRIMARY KEY (`$targetPk`)", $createTableSql);
}
// Créer la table
$targetDb->exec($createTableSql);
logOperation("Table $tableName créée avec succès");
} else {
throw new Exception("Impossible de récupérer la structure de la table source");
}
}
// Vider la table cible si l'option est activée
if ($truncateTable && $tableExists) {
logOperation("Vidage de la table cible $tableName...");
$targetDb->exec("TRUNCATE TABLE $tableName");
}
// Construire la requête d'insertion dynamiquement
$mapping = $tableMappings[$tableName]['source_to_target'];
// Récupérer les colonnes de la table cible
$stmt = $targetDb->query("DESCRIBE $tableName");
$targetColumns = $stmt->fetchAll(PDO::FETCH_COLUMN);
// Construire les listes de colonnes pour l'insertion
$insertColumns = [];
$insertPlaceholders = [];
$updateClauses = [];
foreach ($targetColumns as $column) {
$insertColumns[] = "`$column`";
$insertPlaceholders[] = ":$column";
$updateClauses[] = "`$column` = VALUES(`$column`)";
}
$insertColumnsSql = implode(", ", $insertColumns);
$insertPlaceholdersSql = implode(", ", $insertPlaceholders);
$updateClausesSql = implode(", ", $updateClauses);
$insertQuery = "INSERT INTO $tableName ($insertColumnsSql) "
. "VALUES ($insertPlaceholdersSql) "
. "ON DUPLICATE KEY UPDATE $updateClausesSql";
$insertStmt = $targetDb->prepare($insertQuery);
// Compteurs
$successCount = 0;
$errorCount = 0;
// Traitement de chaque enregistrement
foreach ($records as $record) {
try {
$data = [];
// Mappage des colonnes selon la configuration
foreach ($targetColumns as $targetCol) {
// Trouver la colonne source correspondante
$sourceCol = array_search($targetCol, $mapping);
if ($sourceCol !== false) {
// La colonne existe dans le mapping
$data[$targetCol] = $record[$sourceCol];
} elseif (isset($record[$targetCol])) {
// La colonne a le même nom dans les deux tables
$data[$targetCol] = $record[$targetCol];
} else {
// Colonne non trouvée, utiliser NULL ou une valeur par défaut
$data[$targetCol] = null;
}
}
// Traitement des champs chiffrés si nécessaire
if (isset($tableMappings[$tableName]['encrypted_fields']) && $apiService) {
foreach ($tableMappings[$tableName]['encrypted_fields'] as $sourceField => $config) {
$targetField = $config['field'];
$isSearchable = $config['searchable'];
if (isset($record[$sourceField]) && !empty($record[$sourceField])) {
// Vérifier si le champ est déjà chiffré
if (isset($record["encrypted_$sourceField"])) {
$data[$targetField] = $record["encrypted_$sourceField"];
} else {
// Chiffrer la donnée selon qu'elle est recherchable ou non
if ($isSearchable) {
$data[$targetField] = $apiService->encryptSearchableData($record[$sourceField]);
} else {
$data[$targetField] = $apiService->encryptData($record[$sourceField]);
}
}
}
}
}
// Gestion spécifique pour certaines tables
if ($tableName === 'users') {
// Conversion de chk_active (0,1,2) vers is_active (booléen)
if (isset($record['chk_active'])) {
$data['is_active'] = ($record['chk_active'] > 0) ? 1 : 0;
}
}
// Insertion dans la base cible
$insertStmt->execute($data);
$successCount++;
// Identifiant pour le log
$pkField = $tableMappings[$tableName]['primary_key'];
$recordId = $record[$pkField] ?? 'inconnu';
logOperation("Enregistrement ID $recordId migré avec succès", "INFO");
} catch (Exception $e) {
$errorCount++;
$pkField = $tableMappings[$tableName]['primary_key'];
$recordId = $record[$pkField] ?? 'inconnu';
logOperation("Erreur lors de la migration de l'enregistrement ID $recordId: " . $e->getMessage(), "ERROR");
}
}
logOperation("Migration terminée. Succès: $successCount, Erreurs: $errorCount");
// Fermer le tunnel SSH
closeSshTunnel();
} catch (Exception $e) {
logOperation("Erreur critique: " . $e->getMessage(), "ERROR");
// Fermer le tunnel SSH en cas d'erreur
closeSshTunnel();
exit(1);
}

View File

@@ -0,0 +1,201 @@
<?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);
}

View File

@@ -0,0 +1,123 @@
<?php
/**
* Script de migration de la table medias
* Ce script migre les médias en tenant compte des changements de structure
* et de la transformation de support_rowid en support_id
*/
// Inclusion des fichiers nécessaires
require_once __DIR__ . '/../config.php';
// Fonction principale de migration
try {
// Établissement des connexions aux bases de données
$sourceDb = getSourceConnection();
$targetDb = getTargetConnection();
// Début de la migration silencieuse (n'affiche que les erreurs)
// Suppression de toutes les données existantes dans la table medias
$deleteQuery = "DELETE FROM medias";
$targetDb->exec($deleteQuery);
// Récupération des IDs des utilisateurs qui ont été migrés
$stmt = $targetDb->query("SELECT id FROM users");
$migratedUsers = $stmt->fetchAll(PDO::FETCH_COLUMN);
if (empty($migratedUsers)) {
echo "ERREUR: Aucun utilisateur n'a été migré. Veuillez d'abord migrer la table users." . PHP_EOL;
closeSshTunnel();
exit(1);
}
// Récupération des médias depuis la source
$query = "SELECT * FROM medias";
$stmt = $sourceDb->query($query);
$medias = $stmt->fetchAll(PDO::FETCH_ASSOC);
// Préparation de la requête d'insertion
$insertQuery = "INSERT INTO medias (
support,
support_id,
fichier,
description,
created_at,
fk_user_creat,
updated_at,
fk_user_modif
) VALUES (
:support,
:support_id,
:fichier,
:description,
:created_at,
:fk_user_creat,
:updated_at,
:fk_user_modif
)";
$insertStmt = $targetDb->prepare($insertQuery);
// Compteurs pour le suivi
$inserted = 0;
$skipped = 0;
$errors = 0;
// Traitement de chaque média
foreach ($medias as $media) {
// Vérifier si l'utilisateur de création existe dans la table users de la cible
$fkUserCreat = $media['fk_user_creat'] ?? 0;
if ($fkUserCreat > 0 && !in_array($fkUserCreat, $migratedUsers)) {
// L'utilisateur n'a pas été migré, on utilise 0 (système)
$fkUserCreat = 0;
}
// Vérifier si l'utilisateur de modification existe dans la table users de la cible
$fkUserModif = $media['fk_user_modif'] ?? 0;
if ($fkUserModif > 0 && !in_array($fkUserModif, $migratedUsers)) {
// L'utilisateur n'a pas été migré, on utilise 0 (système)
$fkUserModif = 0;
}
// Conversion des dates
$createdAt = !empty($media['date_creat']) ? date('Y-m-d H:i:s', strtotime($media['date_creat'])) : date('Y-m-d H:i:s');
$updatedAt = !empty($media['date_modif']) ? date('Y-m-d H:i:s', strtotime($media['date_modif'])) : null;
// Préparation des données pour l'insertion
$mediaData = [
'support' => $media['support'] ?? '',
'support_id' => $media['support_rowid'] ?? 0, // Transformation de support_rowid en support_id
'fichier' => $media['fichier'] ?? '',
'description' => $media['description'] ?? '',
'created_at' => $createdAt,
'fk_user_creat' => $fkUserCreat,
'updated_at' => $updatedAt,
'fk_user_modif' => $fkUserModif
];
try {
// Insertion dans la table cible
$insertStmt->execute($mediaData);
$inserted++;
} catch (PDOException $e) {
echo "ERREUR: Migration du média : " . $e->getMessage() . "\n";
$errors++;
}
}
// Afficher uniquement s'il y a des erreurs
if ($errors > 0) {
echo "ERREUR: $errors erreurs lors de la migration de la table medias." . 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);
}

View File

@@ -0,0 +1,586 @@
<?php
/**
* Script de migration pour la table ope_pass
* Transfert les données depuis la table ope_pass de la base source vers la table ope_pass de la base cible
* Ne migre que les passages liés aux opérations qui ont été migrées
* Fait la correspondance entre les anciens secteurs (fk_old_sector) et les nouveaux secteurs (id) dans la table ope_sectors
* Effectue les changements de champs demandés (date_eve=>passed_at, libelle=>encrypted_name, email=>encrypted_email, phone=>encrypted_phone)
*/
require_once dirname(__DIR__) . '/config.php';
require_once __DIR__ . '/MigrationConfig.php';
require_once dirname(dirname(__DIR__)) . '/src/Services/ApiService.php';
try {
// Vérifier si un processus utilise déjà le port du tunnel SSH
echo "Vérification du port SSH..." . PHP_EOL;
// Création du tunnel SSH avec une meilleure gestion des erreurs
try {
// Tuer tout processus existant qui utilise le port 13306
// Sous Linux/Mac
@exec('kill $(lsof -t -i:13306) 2>/dev/null');
// Attendre un moment pour s'assurer que le port est libéré
sleep(1);
createSshTunnel();
echo "Tunnel SSH créé avec succès." . PHP_EOL;
} catch (Exception $e) {
echo "ERREUR lors de la création du tunnel SSH: " . $e->getMessage() . PHP_EOL;
exit(1);
}
// Connexion aux bases de données avec paramètres pour éviter le timeout
try {
echo "Connexion à la base source..." . PHP_EOL;
$sourceDb = getSourceConnection();
echo "Connexion à la base source établie." . PHP_EOL;
} catch (Exception $e) {
echo "ERREUR de connexion à la base source: " . $e->getMessage() . PHP_EOL;
closeSshTunnel();
exit(1);
}
// Configuration spéciale pour éviter les timeouts sur les grosses opérations
try {
echo "Connexion à la base cible..." . PHP_EOL;
$targetDb = getTargetConnection();
echo "Connexion à la base cible établie." . PHP_EOL;
// Configuration des timeouts adaptés à MariaDB 10.11
$targetDb->setAttribute(PDO::ATTR_TIMEOUT, 600); // 10 minutes pour PDO
echo " - Configuration des timeouts pour MariaDB 10.11" . PHP_EOL;
// Configurations spécifiques à MariaDB 10.11
$timeoutVars = [
"wait_timeout" => 3600, // 1 heure
"net_read_timeout" => 3600, // 1 heure
"net_write_timeout" => 3600, // 1 heure
"innodb_lock_wait_timeout" => 3600 // 1 heure
];
// Configurer les variables de session
foreach ($timeoutVars as $var => $value) {
try {
$sql = "SET SESSION $var=$value";
$targetDb->exec($sql);
echo " - Config MariaDB: $var = $value" . PHP_EOL;
} catch (PDOException $e) {
echo " - Impossible de configurer $var: " . $e->getMessage() . PHP_EOL;
}
}
echo "Paramètres de timeout configurés." . PHP_EOL;
} catch (Exception $e) {
echo "ERREUR de connexion à la base cible: " . $e->getMessage() . PHP_EOL;
closeSshTunnel();
exit(1);
}
// Début de la migration
// Vérifions la version de la base de données cible (MariaDB)
$versionTarget = $targetDb->query('SELECT VERSION() as version')->fetch();
echo "Version de la base cible (MariaDB): " . $versionTarget['version'] . PHP_EOL;
// Vérifions la version de la base de données source (MySQL)
$versionSource = $sourceDb->query('SELECT VERSION() as version')->fetch();
echo "Version de la base source (MySQL): " . $versionSource['version'] . PHP_EOL;
// Note sur les privilèges de contraintes
echo "NOTE: La suppression et recréation des contraintes nécessitent des privilèges SUPER ou ALTER TABLE." . PHP_EOL;
echo " Ces opérations peuvent être ignorées si l'utilisateur n'a pas les privilèges suffisants." . PHP_EOL;
echo " Il est recommandé d'exécuter ces opérations manuellement avec un utilisateur admin." . PHP_EOL;
// Suppression des contraintes relationnelles (tentatif)
echo "Tentative de suppression des contraintes relationnelles... " . PHP_EOL;
$dropConstraintsQueries = [
"ALTER TABLE ope_pass DROP FOREIGN KEY ope_pass_ibfk_1",
"ALTER TABLE ope_pass DROP FOREIGN KEY ope_pass_ibfk_2",
"ALTER TABLE ope_pass DROP FOREIGN KEY ope_pass_ibfk_3",
"ALTER TABLE ope_pass DROP FOREIGN KEY ope_pass_ibfk_4"
];
$constraintDropFailed = false;
foreach ($dropConstraintsQueries as $query) {
try {
$targetDb->exec($query);
echo " - Contrainte supprimée avec succès : " . substr($query, 0, 60) . "..." . PHP_EOL;
} catch (PDOException $e) {
echo " - Erreur lors de la suppression de la contrainte : " . $e->getMessage() . PHP_EOL;
$constraintDropFailed = true;
}
}
if ($constraintDropFailed) {
echo "ATTENTION: Les contraintes n'ont pas pu être supprimées. La migration continue sans cette étape." . PHP_EOL;
echo " Vous devrez peut-être désactiver les contraintes manuellement si la suppression échoue." . PHP_EOL;
}
// Suppression de toutes les données existantes dans la table ope_pass par lots pour éviter les timeouts
echo "Suppression des données existantes dans la table ope_pass (par lots)... " . PHP_EOL;
try {
// Désactiver temporairement les vérifications de clés étrangères
// Cela fonctionne à la fois dans MySQL et MariaDB
try {
$targetDb->exec("SET FOREIGN_KEY_CHECKS=0");
echo " - Vérification des clés étrangères temporairement désactivée." . PHP_EOL;
} catch (PDOException $e) {
echo " - Erreur lors de la désactivation des clés étrangères: " . $e->getMessage() . PHP_EOL;
}
// Suppression par lots
$batchSize = 100000;
$totalDeleted = 0;
$continue = true;
echo " - Suppression par lots de $batchSize enregistrements:" . PHP_EOL;
while ($continue) {
$deleteQuery = "DELETE FROM ope_pass LIMIT $batchSize";
$rowCount = $targetDb->exec($deleteQuery);
$totalDeleted += $rowCount;
echo " * Lot supprimé: $rowCount enregistrements (Total: $totalDeleted)" . PHP_EOL;
// Vérifier si nous avons terminé
if ($rowCount < $batchSize) {
$continue = false;
}
// Petit délai pour permettre des traitements serveur
if ($continue) {
usleep(100000); // 0.1 seconde
}
}
echo " - Total: $totalDeleted enregistrements supprimés." . PHP_EOL;
// Réactiver les vérifications de clés étrangères
try {
$targetDb->exec("SET FOREIGN_KEY_CHECKS=1");
echo " - Vérification des clés étrangères réactivée." . PHP_EOL;
} catch (PDOException $e) {
echo " - Erreur lors de la réactivation des clés étrangères: " . $e->getMessage() . PHP_EOL;
}
} catch (PDOException $e) {
echo " - Erreur lors de la suppression des données : " . $e->getMessage() . PHP_EOL;
// Réactiver les vérifications de clés étrangères en cas d'erreur
try {
$targetDb->exec("SET FOREIGN_KEY_CHECKS=1");
} catch (Exception $e2) {
echo " - Erreur lors de la réactivation des clés étrangères : " . $e2->getMessage() . PHP_EOL;
}
closeSshTunnel();
exit(1);
}
// Récupération des IDs des opérations qui ont été migrées
$stmt = $targetDb->query("SELECT id FROM operations");
$migratedOperations = $stmt->fetchAll(PDO::FETCH_COLUMN);
if (empty($migratedOperations)) {
echo "ERREUR: Aucune opération n'a été migrée. Veuillez d'abord migrer la table operations." . PHP_EOL;
closeSshTunnel();
exit(1);
}
// Récupération des IDs des utilisateurs qui ont été migrés
$stmt = $targetDb->query("SELECT id FROM users");
$migratedUsers = $stmt->fetchAll(PDO::FETCH_COLUMN);
if (empty($migratedUsers)) {
echo "ERREUR: Aucun utilisateur n'a été migré. Veuillez d'abord migrer la table users." . PHP_EOL;
closeSshTunnel();
exit(1);
}
// Récupération de la correspondance entre les anciens secteurs et les nouveaux
$query = "SELECT id, fk_operation, fk_old_sector FROM ope_sectors WHERE fk_old_sector IS NOT NULL";
$stmt = $targetDb->query($query);
$sectorMapping = $stmt->fetchAll(PDO::FETCH_ASSOC);
if (empty($sectorMapping)) {
echo "ERREUR: Aucun secteur n'a été migré. Veuillez d'abord migrer la table ope_sectors." . PHP_EOL;
closeSshTunnel();
exit(1);
}
// Création d'un tableau associatif pour faciliter la recherche des correspondances
$sectorMap = [];
foreach ($sectorMapping as $mapping) {
$key = $mapping['fk_operation'] . '_' . $mapping['fk_old_sector'];
$sectorMap[$key] = $mapping['id'];
}
// Pas d'affichage en mode silencieux
// Création de la liste des IDs d'opérations pour la requête IN
$operationIds = implode(',', $migratedOperations);
// Compter le nombre total de passages à migrer pour estimer le volume
$countQuery = "
SELECT COUNT(*) as total
FROM ope_pass p
WHERE p.fk_operation IN ($operationIds)
AND p.active = 1
";
$countStmt = $sourceDb->query($countQuery);
$totalCount = $countStmt->fetch(PDO::FETCH_ASSOC)['total'];
echo "Nombre total de passages à migrer: $totalCount" . PHP_EOL;
// Définir la taille des lots pour éviter les problèmes de mémoire
$batchSize = 5000;
$totalBatches = ceil($totalCount / $batchSize);
echo "Traitement par lots de $batchSize passages ($totalBatches lots au total)" . PHP_EOL;
// Pas d'affichage du nombre de passages à migrer en mode silencieux
// Préparation de la requête d'insertion
$insertQuery = "INSERT INTO ope_pass (
fk_operation,
fk_sector,
fk_user,
fk_adresse,
passed_at,
fk_type,
numero,
rue,
rue_bis,
ville,
fk_habitat,
appt,
niveau,
gps_lat,
gps_lng,
encrypted_name,
montant,
fk_type_reglement,
remarque,
encrypted_email,
nom_recu,
email_erreur,
chk_email_sent,
encrypted_phone,
docremis,
date_repasser,
nb_passages,
chk_gps_maj,
chk_map_create,
chk_mobile,
chk_synchro,
chk_api_adresse,
chk_maj_adresse,
anomalie,
created_at,
fk_user_creat,
updated_at,
fk_user_modif,
chk_active
) VALUES (
:fk_operation,
:fk_sector,
:fk_user,
:fk_adresse,
:passed_at,
:fk_type,
:numero,
:rue,
:rue_bis,
:ville,
:fk_habitat,
:appt,
:niveau,
:gps_lat,
:gps_lng,
:encrypted_name,
:montant,
:fk_type_reglement,
:remarque,
:encrypted_email,
:nom_recu,
:email_erreur,
:chk_email_sent,
:encrypted_phone,
:docremis,
:date_repasser,
:nb_passages,
:chk_gps_maj,
:chk_map_create,
:chk_mobile,
:chk_synchro,
:chk_api_adresse,
:chk_maj_adresse,
:anomalie,
:created_at,
:fk_user_creat,
:updated_at,
:fk_user_modif,
:chk_active
) ON DUPLICATE KEY UPDATE
fk_sector = VALUES(fk_sector),
passed_at = VALUES(passed_at),
numero = VALUES(numero),
rue = VALUES(rue),
rue_bis = VALUES(rue_bis),
ville = VALUES(ville),
fk_habitat = VALUES(fk_habitat),
appt = VALUES(appt),
niveau = VALUES(niveau),
gps_lat = VALUES(gps_lat),
gps_lng = VALUES(gps_lng),
encrypted_name = VALUES(encrypted_name),
montant = VALUES(montant),
fk_type_reglement = VALUES(fk_type_reglement),
remarque = VALUES(remarque),
encrypted_email = VALUES(encrypted_email),
nom_recu = VALUES(nom_recu),
email_erreur = VALUES(email_erreur),
chk_email_sent = VALUES(chk_email_sent),
encrypted_phone = VALUES(encrypted_phone),
docremis = VALUES(docremis),
date_repasser = VALUES(date_repasser),
nb_passages = VALUES(nb_passages),
chk_gps_maj = VALUES(chk_gps_maj),
chk_map_create = VALUES(chk_map_create),
chk_mobile = VALUES(chk_mobile),
chk_synchro = VALUES(chk_synchro),
chk_api_adresse = VALUES(chk_api_adresse),
chk_maj_adresse = VALUES(chk_maj_adresse),
anomalie = VALUES(anomalie),
updated_at = VALUES(updated_at),
fk_user_modif = VALUES(fk_user_modif),
chk_active = VALUES(chk_active)";
$insertStmt = $targetDb->prepare($insertQuery);
// Compteurs
$inserted = 0;
$skipped = 0;
$errors = 0;
// Traitement par lots pour éviter les problèmes de mémoire
for ($batch = 0; $batch < $totalBatches; $batch++) {
$offset = $batch * $batchSize;
echo "Traitement du lot " . ($batch + 1) . "/$totalBatches (offset: $offset)" . PHP_EOL;
// Récupération d'un lot de passages
$query = "
SELECT p.*
FROM ope_pass p
WHERE p.fk_operation IN ($operationIds)
AND p.active = 1
LIMIT $batchSize OFFSET $offset
";
$stmt = $sourceDb->query($query);
$passages = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo " - " . count($passages) . " passages récupérés dans ce lot" . PHP_EOL;
// Libérer la mémoire après avoir récupéré les données
$stmt->closeCursor();
unset($stmt);
// Traitement des passages de ce lot
$batchInserted = 0;
$batchSkipped = 0;
$batchErrors = 0;
// Commencer une transaction pour les insertions de ce lot
$targetDb->beginTransaction();
foreach ($passages as $passage) {
$fkOperation = $passage['fk_operation'];
$fkOldSector = $passage['fk_sector'];
// Vérifier si le secteur existe dans la table ope_sectors de la cible
// On utilise la requête pour trouver le secteur correspondant dans la table ope_sectors
$sectorQuery = "SELECT id FROM ope_sectors WHERE fk_operation = :fk_operation AND fk_old_sector = :fk_old_sector";
$sectorStmt = $targetDb->prepare($sectorQuery);
$sectorStmt->execute([
':fk_operation' => $fkOperation,
':fk_old_sector' => $fkOldSector
]);
$newSector = $sectorStmt->fetch(PDO::FETCH_ASSOC);
// Si le secteur n'a pas été migré, on ignore ce passage silencieusement
if (!$newSector) {
$skipped++;
continue;
}
$fkNewSector = $newSector['id'];
// Vérifier si l'utilisateur existe dans la table users de la cible
$fkUser = $passage['fk_user'] ?? 0;
if ($fkUser > 0 && !in_array($fkUser, $migratedUsers)) {
// L'utilisateur n'a pas été migré, on ignore ce passage silencieusement
$skipped++;
continue;
}
// Conversion des dates
$passedAt = !empty($passage['date_eve']) ? date('Y-m-d H:i:s', strtotime($passage['date_eve'])) : null;
$dateRepasser = !empty($passage['date_repasser']) ? date('Y-m-d H:i:s', strtotime($passage['date_repasser'])) : null;
$createdAt = !empty($passage['date_creat']) ? date('Y-m-d H:i:s', strtotime($passage['date_creat'])) : date('Y-m-d H:i:s');
$updatedAt = !empty($passage['date_modif']) ? date('Y-m-d H:i:s', strtotime($passage['date_modif'])) : null;
// Chiffrement des données sensibles
// Validation et chiffrement du nom
$encryptedName = '';
if (!empty($passage['libelle'])) {
$encryptedName = ApiService::encryptData($passage['libelle']);
}
// Validation et chiffrement de l'email
$encryptedEmail = '';
if (!empty($passage['email'])) {
// Vérifier si l'email est valide
if (filter_var($passage['email'], FILTER_VALIDATE_EMAIL)) {
$encryptedEmail = ApiService::encryptSearchableData($passage['email']);
}
}
$encryptedPhone = !empty($passage['phone']) ? ApiService::encryptData($passage['phone']) : '';
// Vérification et correction du type de règlement
$fkTypeReglement = $passage['fk_type_reglement'] ?? 1;
if (!in_array($fkTypeReglement, [1, 2, 3])) {
$fkTypeReglement = 4; // Forcer à 4 si différent de 1, 2 ou 3
}
// Préparation des données pour l'insertion
$passageData = [
'fk_operation' => $fkOperation,
'fk_sector' => $fkNewSector,
'fk_user' => $passage['fk_user'] ?? 0,
'fk_adresse' => $passage['fk_adresse'] ?? '',
'passed_at' => $passedAt, // Mapping date_eve => passed_at
'fk_type' => (isset($passage['fk_type']) && $passage['fk_type'] == '9') ? 6 :
((isset($passage['fk_type']) && $passage['fk_type'] == '8') ? 5 :
(isset($passage['fk_type']) ? (int)$passage['fk_type'] : 0)),
'numero' => $passage['numero'] ?? '',
'rue' => $passage['rue'] ?? '',
'rue_bis' => $passage['rue_bis'] ?? '',
'ville' => $passage['ville'] ?? '',
'fk_habitat' => $passage['fk_habitat'] ?? 1,
'appt' => $passage['appt'] ?? '',
'niveau' => $passage['niveau'] ?? '',
'gps_lat' => $passage['gps_lat'] ?? '',
'gps_lng' => $passage['gps_lng'] ?? '',
'encrypted_name' => $encryptedName, // Mapping libelle => encrypted_name avec chiffrement
'montant' => $passage['montant'] ?? 0,
'fk_type_reglement' => $fkTypeReglement, // Valeur corrigée
'remarque' => $passage['remarque'] ?? '',
'encrypted_email' => $encryptedEmail, // Mapping email => encrypted_email avec chiffrement
'nom_recu' => $passage['recu'] ?? null, // Mapping recu => nom_recu
'email_erreur' => $passage['email_erreur'] ?? '',
'chk_email_sent' => $passage['chk_email_sent'] ?? 0,
'encrypted_phone' => $encryptedPhone, // Mapping phone => encrypted_phone avec chiffrement
'docremis' => $passage['docremis'] ?? 0,
'date_repasser' => $dateRepasser,
'nb_passages' => $passage['nb_passages'] ?? 1,
'chk_gps_maj' => $passage['chk_gps_maj'] ?? 0,
'chk_map_create' => $passage['chk_map_create'] ?? 0,
'chk_mobile' => $passage['chk_mobile'] ?? 0,
'chk_synchro' => $passage['chk_synchro'] ?? 1,
'chk_api_adresse' => $passage['chk_api_adresse'] ?? 0,
'chk_maj_adresse' => $passage['chk_maj_adresse'] ?? 0,
'anomalie' => $passage['anomalie'] ?? 0,
'created_at' => $createdAt,
'fk_user_creat' => $passage['fk_user_creat'] ?? null,
'updated_at' => $updatedAt,
'fk_user_modif' => $passage['fk_user_modif'] ?? null,
'chk_active' => $passage['active'] ?? 1
];
try {
// Insertion dans la table cible
$insertStmt->execute($passageData);
$inserted++;
$batchInserted++;
// Libérer un peu de mémoire entre chaque insertion
if ($batchInserted % 100 == 0) {
unset($passageData);
gc_collect_cycles(); // Forcer le garbage collector
}
} catch (PDOException $e) {
echo "ERREUR: Migration du passage (rowid " . $passage['rowid'] . ", opération $fkOperation) : " . $e->getMessage() . "\n";
$errors++;
$batchErrors++;
}
// Libérer la mémoire du passage traité
unset($passage);
}
// Valider la transaction pour ce lot
try {
$targetDb->commit();
echo " - Lot $batch commité avec succès: $batchInserted insérés, $batchSkipped ignorés, $batchErrors erreurs" . PHP_EOL;
} catch (PDOException $e) {
$targetDb->rollBack();
echo "ERREUR lors du commit du lot $batch: " . $e->getMessage() . PHP_EOL;
}
// Libérer la mémoire après chaque lot
unset($passages);
gc_collect_cycles(); // Forcer le garbage collector
// Petite pause entre les lots pour éviter de surcharger le serveur
sleep(1);
}
echo "Migration de la table ope_pass terminée. $inserted passages insérés, $skipped passages ignorés, $errors erreurs." . PHP_EOL;
// Recréation des contraintes relationnelles
echo "Tentative de recréation des contraintes relationnelles... " . PHP_EOL;
$addConstraintsQueries = [
"ALTER TABLE ope_pass ADD CONSTRAINT ope_pass_ibfk_1 FOREIGN KEY (fk_operation) REFERENCES operations (id) ON DELETE RESTRICT ON UPDATE CASCADE",
"ALTER TABLE ope_pass ADD CONSTRAINT ope_pass_ibfk_2 FOREIGN KEY (fk_sector) REFERENCES ope_sectors (id) ON DELETE RESTRICT ON UPDATE CASCADE",
"ALTER TABLE ope_pass ADD CONSTRAINT ope_pass_ibfk_3 FOREIGN KEY (fk_user) REFERENCES users (id) ON DELETE RESTRICT ON UPDATE CASCADE",
"ALTER TABLE ope_pass ADD CONSTRAINT ope_pass_ibfk_4 FOREIGN KEY (fk_type_reglement) REFERENCES x_types_reglements (id) ON DELETE RESTRICT ON UPDATE CASCADE"
];
$constraintAddFailed = false;
foreach ($addConstraintsQueries as $query) {
try {
$targetDb->exec($query);
echo " - Contrainte recréée avec succès : " . substr($query, 0, 60) . "..." . PHP_EOL;
} catch (PDOException $e) {
echo " - Erreur lors de la recréation de la contrainte : " . $e->getMessage() . PHP_EOL;
$constraintAddFailed = true;
}
}
if ($constraintAddFailed) {
echo "ATTENTION: Certaines contraintes n'ont pas pu être recréées." . PHP_EOL;
echo " Script SQL pour recréer manuellement les contraintes:" . PHP_EOL;
echo "--------------------------------------------------------------" . PHP_EOL;
foreach ($addConstraintsQueries as $query) {
echo "$query;" . PHP_EOL;
}
echo "--------------------------------------------------------------" . 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);
}

View File

@@ -0,0 +1,126 @@
<?php
/**
* Script de migration de la table ope_pass_histo
* Ce script ne migre que les historiques dont le fk_pass existe dans la table ope_pass de la base cible
*/
// Inclusion des fichiers nécessaires
require_once __DIR__ . '/../config.php';
// Fonction principale de migration
try {
// Établissement des connexions aux bases de données
$sourceDb = getSourceConnection();
$targetDb = getTargetConnection();
// Début de la migration silencieuse (n'affiche que les erreurs)
// Suppression de toutes les données existantes dans la table ope_pass_histo
$deleteQuery = "DELETE FROM ope_pass_histo";
$targetDb->exec($deleteQuery);
// Récupération des IDs des passages qui ont été migrés
$stmt = $targetDb->query("SELECT id FROM ope_pass");
$migratedPasses = $stmt->fetchAll(PDO::FETCH_COLUMN);
if (empty($migratedPasses)) {
echo "ERREUR: Aucun passage n'a été migré. Veuillez d'abord migrer la table ope_pass." . PHP_EOL;
closeSshTunnel();
exit(1);
}
// Récupération des IDs des utilisateurs qui ont été migrés
$stmt = $targetDb->query("SELECT id FROM users");
$migratedUsers = $stmt->fetchAll(PDO::FETCH_COLUMN);
if (empty($migratedUsers)) {
echo "ERREUR: Aucun utilisateur n'a été migré. Veuillez d'abord migrer la table users." . PHP_EOL;
closeSshTunnel();
exit(1);
}
// Récupération directe des IDs des passages dans la table cible
$stmt = $targetDb->query("SELECT id FROM ope_pass");
$migratedPassIds = $stmt->fetchAll(PDO::FETCH_COLUMN);
if (empty($migratedPassIds)) {
echo "ERREUR: Aucun passage n'a été migré. Veuillez d'abord migrer la table ope_pass." . PHP_EOL;
closeSshTunnel();
exit(1);
}
// Récupération des historiques de passages depuis la source
$query = "SELECT * FROM ope_pass_histo";
$stmt = $sourceDb->query($query);
$histos = $stmt->fetchAll(PDO::FETCH_ASSOC);
// Préparation de la requête d'insertion
$insertQuery = "INSERT INTO ope_pass_histo (
fk_pass,
date_histo,
sujet,
remarque
) VALUES (
:fk_pass,
:date_histo,
:sujet,
:remarque
)";
$insertStmt = $targetDb->prepare($insertQuery);
// Compteurs pour le suivi
$inserted = 0;
$skipped = 0;
$errors = 0;
// Traitement de chaque historique
foreach ($histos as $histo) {
// Vérifier si l'ID du passage existe dans la table cible
$fkPass = $histo['fk_pass'];
if (!in_array($fkPass, $migratedPassIds)) {
// Le passage n'a pas été migré, on ignore cet historique
$skipped++;
continue;
}
// On ignore le champ fk_user qui n'existe plus dans la table cible
// Conversion des dates
$dateHisto = !empty($histo['date_histo']) ? date('Y-m-d H:i:s', strtotime($histo['date_histo'])) : null;
// Préparation des données pour l'insertion
$histoData = [
'fk_pass' => $fkPass,
'date_histo' => $dateHisto,
'sujet' => $histo['sujet'] ?? '',
'remarque' => $histo['remarque'] ?? ''
];
try {
// Insertion dans la table cible
$insertStmt->execute($histoData);
$inserted++;
} catch (PDOException $e) {
echo "ERREUR: Migration de l'historique (rowid {$histo['rowid']}, passage {$fkPass}) : " . $e->getMessage() . "\n";
$errors++;
}
}
// Afficher uniquement s'il y a des erreurs
if ($errors > 0) {
echo "ERREUR: $errors erreurs lors de la migration de la table ope_pass_histo." . 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);
}

View File

@@ -0,0 +1,152 @@
<?php
/**
* Script de migration pour la table ope_sectors
* Transfert les données depuis les tables sectors et ope_users_sectors de la base source vers la table ope_sectors de la base cible
* Ne migre que les secteurs liés aux opérations qui ont été migrées
*/
require_once dirname(__DIR__) . '/config.php';
require_once __DIR__ . '/MigrationConfig.php';
try {
// Création du tunnel SSH si nécessaire
createSshTunnel();
// Connexion aux bases de données
$sourceDb = getSourceConnection();
$targetDb = getTargetConnection();
echo "Début de la migration de la table ope_sectors...\n";
// Récupération des IDs des opérations qui ont été migrées
$stmt = $targetDb->query("SELECT id FROM operations");
$migratedOperations = $stmt->fetchAll(PDO::FETCH_COLUMN);
if (empty($migratedOperations)) {
echo "Aucune opération n'a été migrée. Veuillez d'abord migrer la table operations." . PHP_EOL;
closeSshTunnel();
exit(1);
}
echo "Nombre d'opérations migrées : " . count($migratedOperations) . PHP_EOL;
// Création de la liste des IDs d'opérations pour la requête IN
$operationIds = implode(',', $migratedOperations);
// Récupération des secteurs distincts liés aux opérations migrées
$query = "
SELECT DISTINCT ous.fk_operation, ous.fk_sector, s.libelle, s.sector, s.color
FROM ope_users_sectors ous
JOIN sectors s ON ous.fk_sector = s.rowid
WHERE ous.fk_operation IN ($operationIds)
AND ous.active = 1
AND s.active = 1
";
$stmt = $sourceDb->query($query);
$sectors = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo "Nombre de secteurs distincts à migrer : " . count($sectors) . PHP_EOL;
// Préparation de la requête d'insertion
$insertQuery = "INSERT INTO ope_sectors (
fk_operation,
fk_old_sector,
libelle,
sector,
color,
created_at,
fk_user_creat,
updated_at,
fk_user_modif,
chk_active
) VALUES (
:fk_operation,
:fk_old_sector,
:libelle,
:sector,
:color,
:created_at,
:fk_user_creat,
:updated_at,
:fk_user_modif,
:chk_active
) ON DUPLICATE KEY UPDATE
libelle = VALUES(libelle),
sector = VALUES(sector),
color = VALUES(color),
updated_at = VALUES(updated_at),
fk_user_modif = VALUES(fk_user_modif)";
$insertStmt = $targetDb->prepare($insertQuery);
// Compteurs
$inserted = 0;
$errors = 0;
// Traitement de chaque secteur
foreach ($sectors as $sector) {
// Récupération des informations du secteur source
$fkOperation = $sector['fk_operation'];
$fkOldSector = $sector['fk_sector'];
$libelle = $sector['libelle'] ?? '';
$sectorData = $sector['sector'] ?? '';
$color = $sector['color'] ?? '#4B77BE';
// Vérification si le secteur existe déjà pour cette opération
$checkQuery = "SELECT id FROM ope_sectors WHERE fk_operation = :fk_operation AND fk_old_sector = :fk_old_sector";
$checkStmt = $targetDb->prepare($checkQuery);
$checkStmt->execute([
'fk_operation' => $fkOperation,
'fk_old_sector' => $fkOldSector
]);
$exists = $checkStmt->fetch(PDO::FETCH_ASSOC);
// Si le secteur existe déjà, passer au suivant
if ($exists) {
echo "Le secteur avec fk_operation=$fkOperation et fk_old_sector=$fkOldSector existe déjà. Mise à jour...\n";
}
// Préparation des données pour l'insertion
$sectorData = [
'fk_operation' => $fkOperation,
'fk_old_sector' => $fkOldSector,
'libelle' => $libelle,
'sector' => $sectorData,
'color' => $color,
'created_at' => date('Y-m-d H:i:s'),
'fk_user_creat' => 1, // Utilisateur par défaut
'updated_at' => date('Y-m-d H:i:s'),
'fk_user_modif' => 1, // Utilisateur par défaut
'chk_active' => 1
];
try {
// Insertion dans la table cible
$insertStmt->execute($sectorData);
$inserted++;
// Affichage du progrès
if ($inserted % 10 === 0) {
echo "Progression : $inserted secteurs migrés...\n";
}
} catch (PDOException $e) {
echo "Erreur lors de la migration du secteur (opération $fkOperation, secteur $fkOldSector) : " . $e->getMessage() . "\n";
$errors++;
}
}
echo "Migration terminée. $inserted secteurs migrés avec succès. $errors erreurs rencontrées." . 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);
}

View File

@@ -0,0 +1,143 @@
<?php
/**
* Script de migration pour la table ope_users
* Transfert les données de la base source (geosector) vers la base cible (geosector_app)
* Ne migre que les enregistrements liés aux opérations qui ont été migrées
*/
require_once dirname(__DIR__) . '/config.php';
require_once __DIR__ . '/MigrationConfig.php';
try {
// Création du tunnel SSH si nécessaire
createSshTunnel();
// Connexion aux bases de données
$sourceDb = getSourceConnection();
$targetDb = getTargetConnection();
// Récupération des IDs des opérations qui ont été migrées
$stmt = $targetDb->query("SELECT id FROM operations");
$migratedOperations = $stmt->fetchAll(PDO::FETCH_COLUMN);
if (empty($migratedOperations)) {
echo "Aucune opération n'a été migrée. Veuillez d'abord migrer la table operations." . PHP_EOL;
closeSshTunnel();
exit(1);
}
echo "Nombre d'opérations migrées : " . count($migratedOperations) . PHP_EOL;
// Récupération des IDs des utilisateurs qui ont été migrés
$stmt = $targetDb->query("SELECT id FROM users");
$migratedUsers = $stmt->fetchAll(PDO::FETCH_COLUMN);
if (empty($migratedUsers)) {
echo "Aucun utilisateur n'a été migré. Veuillez d'abord migrer la table users." . PHP_EOL;
closeSshTunnel();
exit(1);
}
echo "Nombre d'utilisateurs migrés : " . count($migratedUsers) . PHP_EOL;
// Création de la liste des IDs d'opérations pour la requête IN
$operationIds = implode(',', $migratedOperations);
// Création de la liste des IDs d'utilisateurs pour la requête IN
$userIds = implode(',', $migratedUsers);
// Récupération des associations utilisateurs-opérations depuis la base source
// Ne récupérer que les associations qui concernent à la fois des opérations et des utilisateurs migrés
$query = "SELECT * FROM ope_users WHERE fk_operation IN ($operationIds) AND fk_user IN ($userIds)";
$stmt = $sourceDb->query($query);
$opeUsers = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo "Nombre d'associations utilisateurs-opérations à migrer : " . count($opeUsers) . PHP_EOL;
// Préparation de la requête d'insertion
$insertQuery = "INSERT INTO ope_users (
id,
fk_operation,
fk_user,
created_at,
fk_user_creat,
updated_at,
fk_user_modif,
chk_active
) VALUES (
:id,
:fk_operation,
:fk_user,
:created_at,
:fk_user_creat,
:updated_at,
:fk_user_modif,
:chk_active
) ON DUPLICATE KEY UPDATE
fk_operation = VALUES(fk_operation),
fk_user = VALUES(fk_user),
updated_at = VALUES(updated_at),
fk_user_modif = VALUES(fk_user_modif),
chk_active = VALUES(chk_active)";
$insertStmt = $targetDb->prepare($insertQuery);
// Compteurs
$inserted = 0;
$errors = 0;
// Traitement de chaque association utilisateur-opération
foreach ($opeUsers as $opeUser) {
// Mappage des champs
$id = isset($opeUser['rowid']) ? $opeUser['rowid'] : $opeUser['id'];
$chkActive = isset($opeUser['active']) ? $opeUser['active'] : (isset($opeUser['chk_active']) ? $opeUser['chk_active'] : 1);
// Gestion des dates
$createdAt = isset($opeUser['date_creat']) && !empty($opeUser['date_creat']) ?
date('Y-m-d H:i:s', strtotime($opeUser['date_creat'])) :
date('Y-m-d H:i:s');
$updatedAt = isset($opeUser['date_modif']) && !empty($opeUser['date_modif']) ?
date('Y-m-d H:i:s', strtotime($opeUser['date_modif'])) :
null;
// Préparation des données pour l'insertion
$opeUserData = [
'id' => $id,
'fk_operation' => $opeUser['fk_operation'],
'fk_user' => $opeUser['fk_user'],
'created_at' => $createdAt,
'fk_user_creat' => $opeUser['fk_user_creat'] ?? 0,
'updated_at' => $updatedAt,
'fk_user_modif' => $opeUser['fk_user_modif'] ?? 0,
'chk_active' => $chkActive
];
try {
// Insertion dans la table cible
$insertStmt->execute($opeUserData);
$inserted++;
// Affichage du progrès
if ($inserted % 100 === 0) {
echo "Progression : $inserted associations utilisateurs-opérations migrées..." . PHP_EOL;
}
} catch (PDOException $e) {
echo "Erreur lors de la migration de l'association utilisateur-opération ID $id : " . $e->getMessage() . PHP_EOL;
$errors++;
}
}
echo "Migration terminée. $inserted associations utilisateurs-opérations migrées avec succès. $errors erreurs rencontrées." . 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);
}

View File

@@ -0,0 +1,170 @@
<?php
/**
* Script de migration pour la table ope_users_sectors
* Transfert les données depuis la table ope_users_sectors de la base source vers la table ope_users_sectors de la base cible
* Ne migre que les associations liées aux opérations et utilisateurs qui ont été migrés
* Fait la correspondance entre les anciens secteurs (fk_old_sector) et les nouveaux secteurs (id) dans la table ope_sectors
*/
require_once dirname(__DIR__) . '/config.php';
require_once __DIR__ . '/MigrationConfig.php';
try {
// Création du tunnel SSH si nécessaire
createSshTunnel();
// Connexion aux bases de données
$sourceDb = getSourceConnection();
$targetDb = getTargetConnection();
echo "Début de la migration de la table ope_users_sectors...\n";
// Récupération des IDs des opérations qui ont été migrées
$stmt = $targetDb->query("SELECT id FROM operations");
$migratedOperations = $stmt->fetchAll(PDO::FETCH_COLUMN);
if (empty($migratedOperations)) {
echo "Aucune opération n'a été migrée. Veuillez d'abord migrer la table operations." . PHP_EOL;
closeSshTunnel();
exit(1);
}
echo "Nombre d'opérations migrées : " . count($migratedOperations) . PHP_EOL;
// Récupération des IDs des utilisateurs qui ont été migrés
$stmt = $targetDb->query("SELECT id FROM users");
$migratedUsers = $stmt->fetchAll(PDO::FETCH_COLUMN);
if (empty($migratedUsers)) {
echo "Aucun utilisateur n'a été migré. Veuillez d'abord migrer la table users." . PHP_EOL;
closeSshTunnel();
exit(1);
}
echo "Nombre d'utilisateurs migrés : " . count($migratedUsers) . PHP_EOL;
// Récupération de la correspondance entre les anciens secteurs et les nouveaux
$stmt = $targetDb->query("SELECT id, fk_operation, fk_old_sector FROM ope_sectors");
$sectorMapping = $stmt->fetchAll(PDO::FETCH_ASSOC);
if (empty($sectorMapping)) {
echo "Aucun secteur n'a été migré. Veuillez d'abord migrer la table ope_sectors." . PHP_EOL;
closeSshTunnel();
exit(1);
}
echo "Nombre de secteurs migrés : " . count($sectorMapping) . PHP_EOL;
// Création d'un tableau associatif pour faciliter la recherche des correspondances
$sectorMap = [];
foreach ($sectorMapping as $mapping) {
$key = $mapping['fk_operation'] . '_' . $mapping['fk_old_sector'];
$sectorMap[$key] = $mapping['id'];
}
// Création de la liste des IDs d'opérations pour la requête IN
$operationIds = implode(',', $migratedOperations);
// Création de la liste des IDs d'utilisateurs pour la requête IN
$userIds = implode(',', $migratedUsers);
// Récupération des associations utilisateurs-secteurs depuis la base source
$query = "
SELECT * FROM ope_users_sectors
WHERE fk_operation IN ($operationIds)
AND fk_user IN ($userIds)
AND active = 1
";
$stmt = $sourceDb->query($query);
$userSectors = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo "Nombre d'associations utilisateurs-secteurs à migrer : " . count($userSectors) . PHP_EOL;
// Préparation de la requête d'insertion
$insertQuery = "INSERT INTO ope_users_sectors (
fk_operation,
fk_user,
fk_sector,
created_at,
fk_user_creat,
updated_at,
fk_user_modif,
chk_active
) VALUES (
:fk_operation,
:fk_user,
:fk_sector,
:created_at,
:fk_user_creat,
:updated_at,
:fk_user_modif,
:chk_active
) ON DUPLICATE KEY UPDATE
updated_at = VALUES(updated_at),
fk_user_modif = VALUES(fk_user_modif),
chk_active = VALUES(chk_active)";
$insertStmt = $targetDb->prepare($insertQuery);
// Compteurs
$inserted = 0;
$skipped = 0;
$errors = 0;
// Traitement de chaque association utilisateur-secteur
foreach ($userSectors as $userSector) {
$fkOperation = $userSector['fk_operation'];
$fkUser = $userSector['fk_user'];
$fkOldSector = $userSector['fk_sector'];
// Recherche du nouvel ID de secteur
$key = $fkOperation . '_' . $fkOldSector;
if (!isset($sectorMap[$key])) {
echo "Secteur non trouvé pour l'opération $fkOperation et le secteur $fkOldSector. Association ignorée.\n";
$skipped++;
continue;
}
$fkNewSector = $sectorMap[$key];
// Préparation des données pour l'insertion
$userSectorData = [
'fk_operation' => $fkOperation,
'fk_user' => $fkUser,
'fk_sector' => $fkNewSector,
'created_at' => date('Y-m-d H:i:s'),
'fk_user_creat' => 1, // Utilisateur par défaut
'updated_at' => date('Y-m-d H:i:s'),
'fk_user_modif' => 1, // Utilisateur par défaut
'chk_active' => 1
];
try {
// Insertion dans la table cible
$insertStmt->execute($userSectorData);
$inserted++;
// Affichage du progrès
if ($inserted % 100 === 0) {
echo "Progression : $inserted associations utilisateurs-secteurs migrées...\n";
}
} catch (PDOException $e) {
echo "Erreur lors de la migration de l'association utilisateur-secteur (opération $fkOperation, utilisateur $fkUser, secteur $fkOldSector) : " . $e->getMessage() . "\n";
$errors++;
}
}
echo "Migration terminée. $inserted associations utilisateurs-secteurs migrées avec succès, $skipped ignorées. $errors erreurs rencontrées." . 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);
}

View File

@@ -0,0 +1,183 @@
<?php
/**
* Script de migration de la table operations
*
* Ce script migre les données de la table operations de la base source vers la base cible
*/
require_once dirname(__DIR__) . '/config.php';
require_once __DIR__ . '/MigrationConfig.php';
try {
// Création du tunnel SSH si nécessaire
createSshTunnel();
// Connexion aux bases de données
$sourceDb = getSourceConnection();
$targetDb = getTargetConnection();
echo "Début de la migration de la table operations...\n";
// Récupération des IDs des entités qui ont été migrées
$stmt = $targetDb->query("SELECT id FROM entites");
$migratedEntities = $stmt->fetchAll(PDO::FETCH_COLUMN);
if (empty($migratedEntities)) {
echo "Aucune entité n'a été migrée. Veuillez d'abord migrer la table entites." . PHP_EOL;
closeSshTunnel();
exit(1);
}
echo "Nombre d'entités migrées : " . count($migratedEntities) . PHP_EOL;
// Création de la liste des IDs d'entités pour la requête IN
$entityIds = implode(',', $migratedEntities);
// Vérification si la table doit être tronquée avant migration
$truncate = false; // Par défaut, ne pas tronquer
// Vérifier les arguments de ligne de commande
if (isset($argv) && in_array('--truncate', $argv)) {
$truncate = true;
}
if ($truncate) {
$targetDb->exec("TRUNCATE TABLE operations");
echo "Table operations tronquée.\n";
}
// Récupération des données de la table source
// Ne récupérer que les opérations liées aux entités qui ont été migrées
$query = "SELECT * FROM operations WHERE fk_entite IN ($entityIds) ORDER BY rowid DESC";
$stmt = $sourceDb->query($query);
$allOperations = $stmt->fetchAll(PDO::FETCH_ASSOC);
// Filtrer pour ne garder que les 3 dernières opérations par entité
$operationsByEntity = [];
$operations = [];
foreach ($allOperations as $operation) {
$entityId = $operation['fk_entite'] ?? 1;
if (!isset($operationsByEntity[$entityId])) {
$operationsByEntity[$entityId] = [];
}
// Ne garder que les 3 premières opérations par entité (déjà triées par rowid DESC)
if (count($operationsByEntity[$entityId]) < 3) {
$operationsByEntity[$entityId][] = $operation;
$operations[] = $operation;
}
}
echo "Nombre d'opérations à migrer : " . count($operations) . "\n";
// Préparation de la requête d'insertion
$insertQuery = "INSERT INTO operations (
id,
fk_entite,
libelle,
date_deb,
date_fin,
chk_distinct_sectors,
created_at,
fk_user_creat,
updated_at,
fk_user_modif,
chk_active
) VALUES (
:id,
:fk_entite,
:libelle,
:date_deb,
:date_fin,
:chk_distinct_sectors,
:created_at,
:fk_user_creat,
:updated_at,
:fk_user_modif,
:chk_active
) ON DUPLICATE KEY UPDATE
fk_entite = VALUES(fk_entite),
libelle = VALUES(libelle),
date_deb = VALUES(date_deb),
date_fin = VALUES(date_fin),
chk_distinct_sectors = VALUES(chk_distinct_sectors),
updated_at = VALUES(updated_at),
fk_user_modif = VALUES(fk_user_modif),
chk_active = VALUES(chk_active)";
$insertStmt = $targetDb->prepare($insertQuery);
// Compteurs
$inserted = 0;
$errors = 0;
// Traitement de chaque opération
foreach ($operations as $operation) {
// Mappage des champs
$id = isset($operation['rowid']) ? $operation['rowid'] : $operation['id'];
$chkActive = isset($operation['active']) ? $operation['active'] : (isset($operation['chk_active']) ? $operation['chk_active'] : 1);
// Gestion des dates
$createdAt = isset($operation['date_creat']) && !empty($operation['date_creat']) ?
date('Y-m-d H:i:s', strtotime($operation['date_creat'])) :
date('Y-m-d H:i:s');
$updatedAt = isset($operation['date_modif']) && !empty($operation['date_modif']) ?
date('Y-m-d H:i:s', strtotime($operation['date_modif'])) :
null;
// Formatage des dates début et fin
$dateDeb = isset($operation['date_deb']) && !empty($operation['date_deb']) ?
date('Y-m-d', strtotime($operation['date_deb'])) :
'0000-00-00';
$dateFin = isset($operation['date_fin']) && !empty($operation['date_fin']) ?
date('Y-m-d', strtotime($operation['date_fin'])) :
'0000-00-00';
// Préparation des données pour l'insertion
$operationData = [
'id' => $id,
'fk_entite' => $operation['fk_entite'] ?? 1,
'libelle' => $operation['libelle'] ?? '',
'date_deb' => $dateDeb,
'date_fin' => $dateFin,
'chk_distinct_sectors' => $operation['chk_distinct_sectors'] ?? 0,
'created_at' => $createdAt,
'fk_user_creat' => $operation['fk_user_creat'] ?? 0,
'updated_at' => $updatedAt,
'fk_user_modif' => $operation['fk_user_modif'] ?? 0,
'chk_active' => $chkActive
];
try {
// Insertion dans la table cible
$insertStmt->execute($operationData);
$inserted++;
// Affichage du progrès
if ($inserted % 100 === 0) {
echo "Progression : $inserted opérations migrées...\n";
}
} catch (PDOException $e) {
echo "Erreur lors de la migration de l'opération ID $id : " . $e->getMessage() . "\n";
$errors++;
}
}
echo "Migration terminée. $inserted opérations migrées avec succès. $errors erreurs rencontrées." . PHP_EOL;
echo "Migration de la table operations terminée avec succès." . 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);
}

View File

@@ -0,0 +1,163 @@
<?php
/**
* Script de migration pour la table sectors_adresses
* Transfert les données depuis la table sectors_adresses de la base source vers la table sectors_adresses de la base cible
* Ne migre que les adresses liées aux secteurs qui ont été migrés
* Fait la correspondance entre les anciens secteurs (fk_old_sector) et les nouveaux secteurs (id) dans la table ope_sectors
*/
require_once dirname(__DIR__) . '/config.php';
require_once __DIR__ . '/MigrationConfig.php';
try {
// Création du tunnel SSH si nécessaire
createSshTunnel();
// Connexion aux bases de données
$sourceDb = getSourceConnection();
$targetDb = getTargetConnection();
echo "Début de la migration de la table sectors_adresses...\n";
// Récupération de la correspondance entre les anciens secteurs et les nouveaux
$query = "SELECT id, fk_old_sector FROM ope_sectors WHERE fk_old_sector IS NOT NULL";
$stmt = $targetDb->query($query);
$sectorMapping = $stmt->fetchAll(PDO::FETCH_ASSOC);
if (empty($sectorMapping)) {
echo "Aucun secteur n'a été migré. Veuillez d'abord migrer la table ope_sectors." . PHP_EOL;
closeSshTunnel();
exit(1);
}
echo "Nombre de secteurs migrés : " . count($sectorMapping) . PHP_EOL;
// Création d'un tableau associatif pour faciliter la recherche des correspondances
$sectorMap = [];
foreach ($sectorMapping as $mapping) {
$sectorMap[$mapping['fk_old_sector']] = $mapping['id'];
}
// Création de la liste des IDs de secteurs pour la requête IN
$oldSectorIds = array_keys($sectorMap);
$oldSectorIdsStr = implode(',', $oldSectorIds);
// Récupération des adresses liées aux secteurs migrés
$query = "
SELECT * FROM sectors_adresses
WHERE fk_sector IN ($oldSectorIdsStr)
";
$stmt = $sourceDb->query($query);
$adresses = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo "Nombre d'adresses à migrer : " . count($adresses) . PHP_EOL;
// Préparation de la requête d'insertion
$insertQuery = "INSERT INTO sectors_adresses (
fk_adresse,
osm_id,
fk_sector,
osm_name,
numero,
rue_bis,
rue,
cp,
ville,
gps_lat,
gps_lng,
osm_date_creat,
created_at,
updated_at
) VALUES (
:fk_adresse,
:osm_id,
:fk_sector,
:osm_name,
:numero,
:rue_bis,
:rue,
:cp,
:ville,
:gps_lat,
:gps_lng,
:osm_date_creat,
:created_at,
:updated_at
) ON DUPLICATE KEY UPDATE
fk_adresse = VALUES(fk_adresse),
numero = VALUES(numero),
rue_bis = VALUES(rue_bis),
rue = VALUES(rue),
cp = VALUES(cp),
ville = VALUES(ville),
gps_lat = VALUES(gps_lat),
gps_lng = VALUES(gps_lng),
updated_at = VALUES(updated_at)";
$insertStmt = $targetDb->prepare($insertQuery);
// Compteurs
$inserted = 0;
$skipped = 0;
$errors = 0;
// Traitement de chaque adresse
foreach ($adresses as $adresse) {
$fkOldSector = $adresse['fk_sector'];
// Recherche du nouvel ID de secteur
if (!isset($sectorMap[$fkOldSector])) {
echo "Secteur non trouvé pour l'ID $fkOldSector. Adresse ignorée.\n";
$skipped++;
continue;
}
$fkNewSector = $sectorMap[$fkOldSector];
// Préparation des données pour l'insertion
$adresseData = [
'fk_adresse' => $adresse['fk_adresse'] ?? '',
'osm_id' => 0, // Valeur par défaut
'fk_sector' => $fkNewSector,
'osm_name' => '', // Valeur par défaut
'numero' => $adresse['numero'] ?? '',
'rue_bis' => $adresse['rue_bis'] ?? '',
'rue' => $adresse['rue'] ?? '',
'cp' => $adresse['cp'] ?? '',
'ville' => $adresse['ville'] ?? '',
'gps_lat' => $adresse['gps_lat'] ?? '',
'gps_lng' => $adresse['gps_lng'] ?? '',
'osm_date_creat' => '0000-00-00 00:00:00', // Valeur par défaut
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s')
];
try {
// Insertion dans la table cible
$insertStmt->execute($adresseData);
$inserted++;
// Affichage du progrès
if ($inserted % 100 === 0) {
echo "Progression : $inserted adresses migrées...\n";
}
} catch (PDOException $e) {
echo "Erreur lors de la migration de l'adresse (rowid " . $adresse['rowid'] . ", secteur $fkOldSector) : " . $e->getMessage() . "\n";
$errors++;
}
}
echo "Migration terminée. $inserted adresses migrées avec succès, $skipped ignorées. $errors erreurs rencontrées." . 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);
}

View File

@@ -0,0 +1,257 @@
<?php
/**
* Script de migration pour la table users
* 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();
// Récupération des utilisateurs depuis la base source
$stmt = $sourceDb->query("SELECT * FROM users");
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo "Nombre d'utilisateurs à migrer: " . count($users) . PHP_EOL;
// Préparation de la requête d'insertion
$insertQuery = "INSERT INTO users (
id,
fk_entite,
fk_role,
fk_titre,
encrypted_name,
first_name,
sect_name,
encrypted_user_name,
user_pass_hash,
encrypted_phone,
encrypted_mobile,
encrypted_email,
chk_alert_email,
chk_suivi,
date_naissance,
date_embauche,
fk_user_creat,
fk_user_modif,
chk_active
) VALUES (
:id,
:fk_entite,
:fk_role,
:fk_titre,
:encrypted_name,
:first_name,
:sect_name,
:encrypted_user_name,
:user_pass_hash,
:encrypted_phone,
:encrypted_mobile,
:encrypted_email,
:chk_alert_email,
:chk_suivi,
:date_naissance,
:date_embauche,
:fk_user_creat,
:fk_user_modif,
:chk_active
) ON DUPLICATE KEY UPDATE
fk_entite = VALUES(fk_entite),
fk_role = VALUES(fk_role),
fk_titre = VALUES(fk_titre),
encrypted_name = VALUES(encrypted_name),
first_name = VALUES(first_name),
sect_name = VALUES(sect_name),
encrypted_user_name = VALUES(encrypted_user_name),
user_pass_hash = VALUES(user_pass_hash),
encrypted_phone = VALUES(encrypted_phone),
encrypted_mobile = VALUES(encrypted_mobile),
encrypted_email = VALUES(encrypted_email),
chk_alert_email = VALUES(chk_alert_email),
chk_suivi = VALUES(chk_suivi),
date_naissance = VALUES(date_naissance),
date_embauche = VALUES(date_embauche),
fk_user_modif = VALUES(fk_user_modif),
chk_active = VALUES(chk_active)";
$insertStmt = $targetDb->prepare($insertQuery);
// Préparation de la requête pour vérifier si un utilisateur existe
$checkQuery = "SELECT COUNT(*) FROM users WHERE id = ?";
$checkStmt = $targetDb->prepare($checkQuery);
// Préparation de la requête pour la mise à jour
$updateQuery = "UPDATE users SET
fk_entite = :fk_entite,
fk_role = :fk_role,
fk_titre = :fk_titre,
encrypted_name = :encrypted_name,
first_name = :first_name,
sect_name = :sect_name,
encrypted_user_name = :encrypted_user_name,
user_pass_hash = :user_pass_hash,
encrypted_phone = :encrypted_phone,
encrypted_mobile = :encrypted_mobile,
encrypted_email = :encrypted_email,
chk_alert_email = :chk_alert_email,
chk_suivi = :chk_suivi,
date_naissance = :date_naissance,
date_embauche = :date_embauche,
fk_user_modif = :fk_user_modif,
chk_active = :chk_active
WHERE id = :id";
$updateStmt = $targetDb->prepare($updateQuery);
// Compteurs
$successCount = 0;
$errorCount = 0;
// Compteur pour les 100 premiers utilisateurs
$counter = 0;
$maxTestUsers = 100;
// Traitement de chaque utilisateur
foreach ($users as $user) {
try {
// Mappage des champs
$id = isset($user['rowid']) ? $user['rowid'] : $user['id'];
$chkActive = isset($user['active']) ? $user['active'] : (isset($user['chk_active']) ? $user['chk_active'] : 1);
// Test de déchiffrement pour les 100 premiers utilisateurs
if ($counter < $maxTestUsers) {
$counter++;
// Test pour l'email
$email = $user['email'] ?? '';
$encryptedEmail = !empty($email) ? ApiService::encryptSearchableData($email) : '';
$decryptedEmail = !empty($encryptedEmail) ? ApiService::decryptSearchableData($encryptedEmail) : '';
// Test pour le nom d'utilisateur
$username = $user['username'] ?? '';
$encryptedUsername = !empty($username) ? ApiService::encryptSearchableData($username) : '';
$decryptedUsername = !empty($encryptedUsername) ? ApiService::decryptSearchableData($encryptedUsername) : '';
// Afficher les résultats pour tous les utilisateurs testés
echo "===== TEST UTILISATEUR ID $id =====\n";
// Toujours afficher les informations d'email
echo "Email original: $email\n";
echo "Email chiffré: $encryptedEmail\n";
echo "Email déchiffré: $decryptedEmail\n";
// Toujours afficher les informations de nom d'utilisateur
echo "Username original: $username\n";
echo "Username chiffré: $encryptedUsername\n";
echo "Username déchiffré: $decryptedUsername\n";
echo "=================================================\n";
}
// Gestion du rôle utilisateur
$fkRole = isset($user['fk_role']) ? $user['fk_role'] : 1;
// Forcer fk_role=1 pour les utilisateurs avec fk_role=0
if ($fkRole == 0) {
$fkRole = 1;
}
// Gestion du titre utilisateur
$fkTitre = isset($user['fk_titre']) ? $user['fk_titre'] : 1;
// Forcer fk_titre=1 si différent de 1 ou 2
if ($fkTitre != 1 && $fkTitre != 2) {
$fkTitre = 1;
}
// Chiffrement des données sensibles (uniquement si non vides)
$libelle = $user['libelle'] ?? '';
$encryptedName = !empty($libelle) ? ApiService::encryptData($libelle) : '';
// Traitement du prénom
$prenom = $user['prenom'] ?? '';
// Traitement du nom de tournée (sect_name)
$sectName = $user['nom_tournee'] ?? '';
// Traitement du nom d'utilisateur
$username = $user['username'] ?? '';
// Utiliser encryptSearchableData car le nom d'utilisateur est utilisé comme clé de recherche
$encryptedUserName = !empty($username) ? ApiService::encryptSearchableData($username) : '';
// Traitement du mot de passe
// Utiliser userpswd s'il existe, sinon userpass
$userPassHash = $user['userpswd'] ?? ($user['userpass'] ?? '');
// Traitement des numéros de téléphone
$telephone = $user['telephone'] ?? '';
$mobile = $user['mobile'] ?? '';
$encryptedPhone = !empty($telephone) ? ApiService::encryptData($telephone) : '';
$encryptedMobile = !empty($mobile) ? ApiService::encryptData($mobile) : '';
// Chiffrement de l'email
$email = $user['email'] ?? '';
$encryptedEmail = !empty($email) ? ApiService::encryptSearchableData($email) : '';
// Préparation des données pour l'insertion
$userData = [
'id' => $id,
'fk_entite' => $user['fk_entite'] ?? 1,
'fk_role' => $fkRole,
'fk_titre' => $fkTitre,
'encrypted_name' => $encryptedName,
'first_name' => $prenom,
'sect_name' => $sectName,
'encrypted_user_name' => $encryptedUserName,
'user_pass_hash' => $userPassHash,
'encrypted_phone' => $encryptedPhone,
'encrypted_mobile' => $encryptedMobile,
'encrypted_email' => $encryptedEmail,
'chk_alert_email' => $user['alert_email'] ?? 1,
'chk_suivi' => $user['chk_suivi'] ?? 0,
'date_naissance' => $user['date_naissance'] ?? null,
'date_embauche' => $user['date_embauche'] ?? null,
'fk_user_creat' => $user['fk_user_creat'] ?? null,
'fk_user_modif' => $user['fk_user_modif'] ?? null,
'chk_active' => $chkActive
];
// Vérifier si l'utilisateur existe déjà
$checkStmt->execute([$id]);
$exists = $checkStmt->fetchColumn() > 0;
if ($exists) {
// Mise à jour de l'utilisateur existant - utiliser insertStmt avec ON DUPLICATE KEY UPDATE
$insertStmt->execute($userData);
$successCount++;
} else {
// L'utilisateur n'existe pas, on ne peut pas le mettre à jour
$errorCount++;
}
} catch (Exception $e) {
$errorCount++;
echo "Erreur lors de la migration de l'utilisateur 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);
}

View File

@@ -0,0 +1,87 @@
<?php
/**
* Script de migration pour la table x_departements
* Transfert les données de la base source (geosector) vers la base cible (geosector_app)
*/
require_once dirname(__DIR__) . '/config.php';
try {
// Création du tunnel SSH si nécessaire
createSshTunnel();
// Connexion aux bases de données
$sourceDb = getSourceConnection();
$targetDb = getTargetConnection();
// Récupération des départements depuis la base source
$stmt = $sourceDb->query("SELECT * FROM x_departements");
$departements = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo "Nombre de départements à migrer: " . count($departements) . PHP_EOL;
// Préparation de la requête d'insertion
$insertQuery = "INSERT INTO x_departements (
id,
code,
fk_region,
libelle,
chk_active
) VALUES (
:id,
:code,
:fk_region,
:libelle,
:chk_active
) ON DUPLICATE KEY UPDATE
code = VALUES(code),
fk_region = VALUES(fk_region),
libelle = VALUES(libelle),
chk_active = VALUES(chk_active)";
$insertStmt = $targetDb->prepare($insertQuery);
// Compteurs
$successCount = 0;
$errorCount = 0;
// Traitement de chaque département
foreach ($departements as $departement) {
try {
// Mappage des champs entre les deux structures
$id = isset($departement['rowid']) ? $departement['rowid'] : $departement['id'];
$chkActive = isset($departement['active']) ? $departement['active'] :
(isset($departement['chk_active']) ? $departement['chk_active'] : 1);
// Préparation des données pour l'insertion
$departementData = [
'id' => $id,
'code' => $departement['code'],
'fk_region' => $departement['fk_region'],
'libelle' => $departement['libelle'],
'chk_active' => $chkActive
];
// Insertion dans la base cible
$insertStmt->execute($departementData);
$successCount++;
} catch (Exception $e) {
$errorCount++;
echo "Erreur lors de la migration du département 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);
}

View File

@@ -0,0 +1,120 @@
<?php
/**
* Script de migration de la table x_devises de geosector vers geosector_app
*
* Ce script transfère les données de la table x_devises de geosector vers la nouvelle
* structure de la table x_devises dans geosector_app, en adaptant les noms de champs.
*/
require_once dirname(__DIR__) . '/config.php';
// Création du dossier de logs si nécessaire
if (!is_dir(dirname(__DIR__) . '/logs')) {
mkdir(dirname(__DIR__) . '/logs', 0755, true);
}
logOperation("Démarrage de la migration de la table x_devises");
try {
// Connexion aux bases de données
$sourceDb = getSourceConnection();
$targetDb = getTargetConnection();
// Récupération des devises de la source
$stmt = $sourceDb->query("SELECT * FROM x_devises");
$devises = $stmt->fetchAll();
logOperation("Nombre de devises à migrer: " . count($devises));
// Vérifier si la table existe dans la cible
try {
$targetDb->query("SELECT 1 FROM x_devises LIMIT 1");
$tableExists = true;
} catch (PDOException $e) {
$tableExists = false;
}
// Créer la table si elle n'existe pas
if (!$tableExists) {
logOperation("La table x_devises n'existe pas dans la base cible. Création de la table...");
$createTableSql = "CREATE TABLE `x_devises` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`code` varchar(10) NOT NULL,
`libelle` varchar(50) NOT NULL,
`symbole` varchar(10) DEFAULT NULL,
`chk_active` tinyint(1) UNSIGNED NOT NULL DEFAULT '1',
PRIMARY KEY (`id`),
UNIQUE KEY `code` (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;";
$targetDb->exec($createTableSql);
logOperation("Table x_devises créée avec succès");
}
// Préparation de la requête d'insertion
$insertQuery = "INSERT INTO x_devises (
id,
code,
libelle,
symbole,
chk_active
) VALUES (
:id,
:code,
:libelle,
:symbole,
:chk_active
) ON DUPLICATE KEY UPDATE
code = VALUES(code),
libelle = VALUES(libelle),
symbole = VALUES(symbole),
chk_active = VALUES(chk_active)";
$insertStmt = $targetDb->prepare($insertQuery);
// Compteurs
$successCount = 0;
$errorCount = 0;
// Traitement de chaque devise
foreach ($devises as $devise) {
try {
// Mappage des champs entre les deux structures
$id = isset($devise['rowid']) ? $devise['rowid'] : $devise['id'];
$chkActive = isset($devise['active']) ? $devise['active'] :
(isset($devise['chk_active']) ? $devise['chk_active'] : 1);
// Préparation des données pour l'insertion
$deviseData = [
'id' => $id,
'code' => $devise['code'],
'libelle' => $devise['libelle'],
'symbole' => $devise['symbole'] ?? null,
'chk_active' => $chkActive
];
// Insertion dans la base cible
$insertStmt->execute($deviseData);
$successCount++;
logOperation("Devise ID {$id} ({$devise['code']}) migrée avec succès", "INFO");
} catch (Exception $e) {
$errorCount++;
logOperation("Erreur lors de la migration de la devise ID {$id} ({$devise['code']}): " . $e->getMessage(), "ERROR");
}
}
logOperation("Migration terminée. Succès: $successCount, Erreurs: $errorCount");
// Fermer le tunnel SSH
closeSshTunnel();
} catch (Exception $e) {
logOperation("Erreur critique: " . $e->getMessage(), "ERROR");
// Fermer le tunnel SSH en cas d'erreur
closeSshTunnel();
exit(1);
}

View File

@@ -0,0 +1,75 @@
<?php
/**
* Script de migration de la table x_entites_types de geosector vers geosector_app
*
* Version simplifiée sans logs et contrôles de présence
*/
require_once dirname(__DIR__) . '/config.php';
try {
// Connexion aux bases de données
$sourceDb = getSourceConnection();
$targetDb = getTargetConnection();
// Récupération des types d'entités de la source
$stmt = $sourceDb->query("SELECT * FROM x_entites_types");
$entitesTypes = $stmt->fetchAll();
// Préparation de la requête d'insertion
$insertQuery = "INSERT INTO x_entites_types (
id,
libelle,
chk_active
) VALUES (
:id,
:libelle,
:chk_active
) ON DUPLICATE KEY UPDATE
libelle = VALUES(libelle),
chk_active = VALUES(chk_active)";
$insertStmt = $targetDb->prepare($insertQuery);
// Compteurs
$successCount = 0;
$errorCount = 0;
// Traitement de chaque type d'entité
foreach ($entitesTypes as $entiteType) {
try {
// Mappage des champs entre les deux structures
$id = isset($entiteType['rowid']) ? $entiteType['rowid'] : $entiteType['id'];
$chkActive = isset($entiteType['active']) ? $entiteType['active'] :
(isset($entiteType['chk_active']) ? $entiteType['chk_active'] : 1);
// Préparation des données pour l'insertion
$entiteTypeData = [
'id' => $id,
'libelle' => $entiteType['libelle'],
'chk_active' => $chkActive
];
// Insertion dans la base cible
$insertStmt->execute($entiteTypeData);
$successCount++;
} catch (Exception $e) {
$errorCount++;
echo "Erreur lors de la migration du type d'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);
}

View File

@@ -0,0 +1,87 @@
<?php
/**
* Script de migration de la table x_pays de geosector vers geosector_app
*
* Version simplifiée sans logs et contrôles de présence
*/
require_once dirname(__DIR__) . '/config.php';
try {
// Connexion aux bases de données
$sourceDb = getSourceConnection();
$targetDb = getTargetConnection();
// Récupération des pays de la source
$stmt = $sourceDb->query("SELECT * FROM x_pays");
$pays = $stmt->fetchAll();
// Préparation de la requête d'insertion
$insertQuery = "INSERT INTO x_pays (
id,
code,
fk_continent,
fk_devise,
libelle,
chk_active
) VALUES (
:id,
:code,
:fk_continent,
:fk_devise,
:libelle,
:chk_active
) ON DUPLICATE KEY UPDATE
code = VALUES(code),
fk_continent = VALUES(fk_continent),
fk_devise = VALUES(fk_devise),
libelle = VALUES(libelle),
chk_active = VALUES(chk_active)";
$insertStmt = $targetDb->prepare($insertQuery);
// Compteurs
$successCount = 0;
$errorCount = 0;
// Traitement de chaque pays
foreach ($pays as $pay) {
try {
// Mappage des champs entre les deux structures
$id = isset($pay['rowid']) ? $pay['rowid'] : $pay['id'];
$chkActive = isset($pay['active']) ? $pay['active'] :
(isset($pay['chk_active']) ? $pay['chk_active'] : 1);
// Préparation des données pour l'insertion
$paysData = [
'id' => $id,
'code' => $pay['code'],
'fk_continent' => $pay['fk_continent'],
'fk_devise' => $pay['fk_devise'],
'libelle' => $pay['libelle'],
'chk_active' => $chkActive
];
// Insertion dans la base cible
$insertStmt->execute($paysData);
$successCount++;
} catch (Exception $e) {
$errorCount++;
echo "Erreur lors de la migration du pays 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);
}

View File

@@ -0,0 +1,95 @@
<?php
/**
* Script de migration pour la table x_regions
* Transfert les données de la base source (geosector) vers la base cible (geosector_app)
*/
require_once dirname(__DIR__) . '/config.php';
try {
// Création du tunnel SSH si nécessaire
createSshTunnel();
// Connexion aux bases de données
$sourceDb = getSourceConnection();
$targetDb = getTargetConnection();
// Récupération des régions depuis la base source
$stmt = $sourceDb->query("SELECT * FROM x_regions");
$regions = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo "Nombre de régions à migrer: " . count($regions) . PHP_EOL;
// Préparation de la requête d'insertion
$insertQuery = "INSERT INTO x_regions (
id,
fk_pays,
libelle,
libelle_long,
table_osm,
departements,
chk_active
) VALUES (
:id,
:fk_pays,
:libelle,
:libelle_long,
:table_osm,
:departements,
:chk_active
) ON DUPLICATE KEY UPDATE
fk_pays = VALUES(fk_pays),
libelle = VALUES(libelle),
libelle_long = VALUES(libelle_long),
table_osm = VALUES(table_osm),
departements = VALUES(departements),
chk_active = VALUES(chk_active)";
$insertStmt = $targetDb->prepare($insertQuery);
// Compteurs
$successCount = 0;
$errorCount = 0;
// Traitement de chaque région
foreach ($regions as $region) {
try {
// Mappage des champs entre les deux structures
$id = isset($region['rowid']) ? $region['rowid'] : $region['id'];
$chkActive = isset($region['active']) ? $region['active'] :
(isset($region['chk_active']) ? $region['chk_active'] : 1);
// Préparation des données pour l'insertion
$regionData = [
'id' => $id,
'fk_pays' => $region['fk_pays'],
'libelle' => $region['libelle'],
'libelle_long' => $region['libelle_long'],
'table_osm' => $region['table_osm'],
'departements' => $region['departements'],
'chk_active' => $chkActive
];
// Insertion dans la base cible
$insertStmt->execute($regionData);
$successCount++;
} catch (Exception $e) {
$errorCount++;
echo "Erreur lors de la migration de la région 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);
}

View File

@@ -0,0 +1,87 @@
<?php
/**
* Script de migration de la table x_types_passages de geosector vers geosector_app
*
* Version simplifiée sans logs et contrôles de présence
*/
require_once dirname(__DIR__) . '/config.php';
try {
// Connexion aux bases de données
$sourceDb = getSourceConnection();
$targetDb = getTargetConnection();
// Récupération des types de passages de la source
$stmt = $sourceDb->query("SELECT * FROM x_types_passages");
$typesPassages = $stmt->fetchAll();
// Préparation de la requête d'insertion
$insertQuery = "INSERT INTO x_types_passages (
id,
libelle,
color_button,
color_mark,
color_table,
chk_active
) VALUES (
:id,
:libelle,
:color_button,
:color_mark,
:color_table,
:chk_active
) ON DUPLICATE KEY UPDATE
libelle = VALUES(libelle),
color_button = VALUES(color_button),
color_mark = VALUES(color_mark),
color_table = VALUES(color_table),
chk_active = VALUES(chk_active)";
$insertStmt = $targetDb->prepare($insertQuery);
// Compteurs
$successCount = 0;
$errorCount = 0;
// Traitement de chaque type de passage
foreach ($typesPassages as $typePassage) {
try {
// Mappage des champs entre les deux structures
$id = isset($typePassage['rowid']) ? $typePassage['rowid'] : $typePassage['id'];
$chkActive = isset($typePassage['active']) ? $typePassage['active'] :
(isset($typePassage['chk_active']) ? $typePassage['chk_active'] : 1);
// Préparation des données pour l'insertion
$typePassageData = [
'id' => $id,
'libelle' => $typePassage['libelle'],
'color_button' => $typePassage['color_button'],
'color_mark' => $typePassage['color_mark'],
'color_table' => $typePassage['color_table'],
'chk_active' => $chkActive
];
// Insertion dans la base cible
$insertStmt->execute($typePassageData);
$successCount++;
} catch (Exception $e) {
$errorCount++;
echo "Erreur lors de la migration du type de passage 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);
}

View File

@@ -0,0 +1,75 @@
<?php
/**
* Script de migration de la table x_types_reglements de geosector vers geosector_app
*
* Version simplifiée sans logs et contrôles de présence
*/
require_once dirname(__DIR__) . '/config.php';
try {
// Connexion aux bases de données
$sourceDb = getSourceConnection();
$targetDb = getTargetConnection();
// Récupération des types de règlements de la source
$stmt = $sourceDb->query("SELECT * FROM x_types_reglements");
$typesReglements = $stmt->fetchAll();
// Préparation de la requête d'insertion
$insertQuery = "INSERT INTO x_types_reglements (
id,
libelle,
chk_active
) VALUES (
:id,
:libelle,
:chk_active
) ON DUPLICATE KEY UPDATE
libelle = VALUES(libelle),
chk_active = VALUES(chk_active)";
$insertStmt = $targetDb->prepare($insertQuery);
// Compteurs
$successCount = 0;
$errorCount = 0;
// Traitement de chaque type de règlement
foreach ($typesReglements as $typeReglement) {
try {
// Mappage des champs entre les deux structures
$id = isset($typeReglement['rowid']) ? $typeReglement['rowid'] : $typeReglement['id'];
$chkActive = isset($typeReglement['active']) ? $typeReglement['active'] :
(isset($typeReglement['chk_active']) ? $typeReglement['chk_active'] : 1);
// Préparation des données pour l'insertion
$typeReglementData = [
'id' => $id,
'libelle' => $typeReglement['libelle'],
'chk_active' => $chkActive
];
// Insertion dans la base cible
$insertStmt->execute($typeReglementData);
$successCount++;
} catch (Exception $e) {
$errorCount++;
echo "Erreur lors de la migration du type de règlement 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);
}

View File

@@ -0,0 +1,75 @@
<?php
/**
* Script de migration de la table x_users_roles de geosector vers geosector_app
*
* Version simplifiée sans logs et contrôles de présence
*/
require_once dirname(__DIR__) . '/config.php';
try {
// Connexion aux bases de données
$sourceDb = getSourceConnection();
$targetDb = getTargetConnection();
// Récupération des rôles utilisateurs de la source
$stmt = $sourceDb->query("SELECT * FROM x_users_roles");
$usersRoles = $stmt->fetchAll();
// Préparation de la requête d'insertion
$insertQuery = "INSERT INTO x_users_roles (
id,
libelle,
chk_active
) VALUES (
:id,
:libelle,
:chk_active
) ON DUPLICATE KEY UPDATE
libelle = VALUES(libelle),
chk_active = VALUES(chk_active)";
$insertStmt = $targetDb->prepare($insertQuery);
// Compteurs
$successCount = 0;
$errorCount = 0;
// Traitement de chaque rôle utilisateur
foreach ($usersRoles as $userRole) {
try {
// Mappage des champs entre les deux structures
$id = isset($userRole['rowid']) ? $userRole['rowid'] : $userRole['id'];
$chkActive = isset($userRole['active']) ? $userRole['active'] :
(isset($userRole['chk_active']) ? $userRole['chk_active'] : 1);
// Préparation des données pour l'insertion
$userRoleData = [
'id' => $id,
'libelle' => $userRole['libelle'],
'chk_active' => $chkActive
];
// Insertion dans la base cible
$insertStmt->execute($userRoleData);
$successCount++;
} catch (Exception $e) {
$errorCount++;
echo "Erreur lors de la migration du rôle utilisateur 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);
}

View File

@@ -0,0 +1,94 @@
<?php
/**
* Script de migration pour la table x_villes
* Transfert les données de la base source (geosector) vers la base cible (geosector_app)
*/
require_once dirname(__DIR__) . '/config.php';
try {
// Création du tunnel SSH si nécessaire
createSshTunnel();
// Connexion aux bases de données
$sourceDb = getSourceConnection();
$targetDb = getTargetConnection();
// Récupération des villes depuis la base source
$stmt = $sourceDb->query("SELECT * FROM x_villes");
$villes = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo "Nombre de villes à migrer: " . count($villes) . PHP_EOL;
// Préparation de la requête d'insertion
$insertQuery = "INSERT INTO x_villes (
id,
fk_departement,
libelle,
code_postal,
code_insee,
chk_active
) VALUES (
:id,
:fk_departement,
:libelle,
:code_postal,
:code_insee,
:chk_active
) ON DUPLICATE KEY UPDATE
fk_departement = VALUES(fk_departement),
libelle = VALUES(libelle),
code_postal = VALUES(code_postal),
code_insee = VALUES(code_insee),
chk_active = VALUES(chk_active)";
$insertStmt = $targetDb->prepare($insertQuery);
// Compteurs
$successCount = 0;
$errorCount = 0;
// Traitement de chaque ville
foreach ($villes as $ville) {
try {
// Mappage des champs
$id = isset($ville['rowid']) ? $ville['rowid'] : $ville['id'];
$chkActive = isset($ville['active']) ? $ville['active'] : (isset($ville['chk_active']) ? $ville['chk_active'] : 1);
// Formatage du code postal (ajouter un 0 devant s'il ne contient que 4 chiffres)
$codePostal = $ville['cp'] ?? '';
if (strlen($codePostal) === 4 && is_numeric($codePostal)) {
$codePostal = '0' . $codePostal;
}
// Préparation des données pour l'insertion
$villeData = [
'id' => $id,
'fk_departement' => $ville['fk_departement'] ?? 1,
'libelle' => $ville['libelle'] ?? '',
'code_postal' => $codePostal,
'code_insee' => $ville['code_insee'] ?? '',
'chk_active' => $chkActive
];
// Insertion dans la base cible
$insertStmt->execute($villeData);
$successCount++;
} catch (Exception $e) {
$errorCount++;
echo "Erreur lors de la migration de la ville 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);
}

View File

@@ -0,0 +1,371 @@
#!/usr/bin/env python3
"""
Script pour comparer les schémas de tables entre deux bases de données
Utile pour vérifier la compatibilité avant migration
"""
import argparse
import configparser
import os
import sys
import time
import signal
import subprocess
import mysql.connector
from datetime import datetime
from tabulate import tabulate
def create_config_if_not_exists():
"""Crée un fichier de configuration s'il n'existe pas déjà"""
config_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'python', 'db_config.ini')
if not os.path.exists(os.path.dirname(config_path)):
os.makedirs(os.path.dirname(config_path))
if not os.path.exists(config_path):
config = configparser.ConfigParser()
config['SSH'] = {
'host': 'serveur-distant.exemple.com',
'port': '22',
'user': 'utilisateur',
'key_file': '/chemin/vers/cle_ssh'
}
config['REMOTE_DB'] = {
'host': 'localhost', # Hôte de la base sur le serveur distant
'port': '3306' # Port de la base sur le serveur distant
}
config['SOURCE_DB'] = {
'host': 'localhost', # Hôte local pour le tunnel SSH
'database': 'geosector',
'user': 'utilisateur_db',
'password': 'mot_de_passe',
'port': '13306' # Port local pour le tunnel SSH
}
config['TARGET_DB'] = {
'host': 'localhost',
'database': 'geosector_app',
'user': 'root',
'password': '',
'port': '3306'
}
with open(config_path, 'w') as configfile:
config.write(configfile)
print(f"Fichier de configuration créé: {config_path}")
return config_path
def get_db_config():
"""Charge la configuration de la base de données"""
config_path = create_config_if_not_exists()
config = configparser.ConfigParser()
config.read(config_path)
return config
# Variable globale pour stocker le processus du tunnel SSH
ssh_tunnel_process = None
def create_ssh_tunnel(ssh_config, remote_db_config, source_db_config):
"""Crée un tunnel SSH vers le serveur distant"""
global ssh_tunnel_process
# Vérifier si un tunnel SSH est déjà en cours d'exécution
try:
# Commande pour vérifier si le tunnel est déjà en cours d'exécution
check_command = f"ps aux | grep 'ssh -f -N -L {source_db_config['port']}:{remote_db_config['host']}:{remote_db_config['port']}' | grep -v grep"
result = subprocess.run(check_command, shell=True, capture_output=True, text=True)
if result.stdout.strip():
print("Un tunnel SSH est déjà en cours d'exécution")
return True
# Construire la commande SSH pour établir le tunnel
ssh_command = [
'ssh',
'-f', '-N',
'-L', f"{source_db_config['port']}:{remote_db_config['host']}:{remote_db_config['port']}",
'-p', ssh_config['port'],
'-i', ssh_config['key_file'],
f"{ssh_config['user']}@{ssh_config['host']}"
]
print(f"Création d'un tunnel SSH vers {ssh_config['host']}...")
ssh_tunnel_process = subprocess.Popen(ssh_command)
# Attendre que le tunnel soit établi
time.sleep(2)
# Vérifier si le processus est toujours en cours d'exécution
if ssh_tunnel_process.poll() is None:
print(f"Tunnel SSH établi sur le port local {source_db_config['port']}")
return True
else:
print("Erreur lors de la création du tunnel SSH")
return False
except Exception as e:
print(f"Erreur lors de la création du tunnel SSH: {e}")
return False
def close_ssh_tunnel():
"""Ferme le tunnel SSH"""
global ssh_tunnel_process
if ssh_tunnel_process is not None:
try:
# Tuer le processus SSH
ssh_tunnel_process.terminate()
ssh_tunnel_process.wait(timeout=5)
print("Tunnel SSH fermé")
except Exception as e:
print(f"Erreur lors de la fermeture du tunnel SSH: {e}")
# Forcer la fermeture si nécessaire
try:
ssh_tunnel_process.kill()
except:
pass
# Rechercher et tuer tous les processus SSH correspondants
try:
kill_command = "ps aux | grep 'ssh -f -N -L' | grep -v grep | awk '{print $2}' | xargs kill -9 2>/dev/null"
subprocess.run(kill_command, shell=True)
except:
pass
def connect_to_db(db_config):
"""Se connecte à une base de données MySQL/MariaDB"""
try:
connection = mysql.connector.connect(
host=db_config['host'],
database=db_config['database'],
user=db_config['user'],
password=db_config['password'],
port=int(db_config['port'])
)
return connection
except mysql.connector.Error as err:
print(f"Erreur de connexion à la base de données: {err}")
sys.exit(1)
def get_table_schema(connection, table_name):
"""Récupère le schéma d'une table"""
cursor = connection.cursor(dictionary=True)
cursor.execute(f"DESCRIBE {table_name}")
columns = cursor.fetchall()
cursor.close()
return columns
def get_all_tables(connection):
"""Récupère toutes les tables d'une base de données"""
cursor = connection.cursor()
cursor.execute("SHOW TABLES")
tables = [table[0] for table in cursor.fetchall()]
cursor.close()
return tables
def compare_tables(source_schema, target_schema):
"""Compare les schémas de deux tables"""
source_columns = {col['Field']: col for col in source_schema}
target_columns = {col['Field']: col for col in target_schema}
# Colonnes présentes dans les deux tables
common_columns = set(source_columns.keys()) & set(target_columns.keys())
# Colonnes uniquement dans la source
source_only = set(source_columns.keys()) - set(target_columns.keys())
# Colonnes uniquement dans la cible
target_only = set(target_columns.keys()) - set(source_columns.keys())
# Différences dans les colonnes communes
differences = []
for col_name in common_columns:
source_col = source_columns[col_name]
target_col = target_columns[col_name]
if source_col['Type'] != target_col['Type'] or \
source_col['Null'] != target_col['Null'] or \
source_col['Key'] != target_col['Key'] or \
source_col['Default'] != target_col['Default']:
differences.append({
'Column': col_name,
'Source_Type': source_col['Type'],
'Target_Type': target_col['Type'],
'Source_Null': source_col['Null'],
'Target_Null': target_col['Null'],
'Source_Key': source_col['Key'],
'Target_Key': target_col['Key'],
'Source_Default': source_col['Default'],
'Target_Default': target_col['Default']
})
return {
'common': common_columns,
'source_only': source_only,
'target_only': target_only,
'differences': differences
}
def generate_report(table_name, comparison, output_file=None):
"""Génère un rapport de comparaison"""
report = []
report.append(f"Rapport de comparaison pour la table: {table_name}")
report.append(f"Date: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
report.append("")
# Colonnes communes
report.append(f"Colonnes communes ({len(comparison['common'])}):")
if comparison['common']:
report.append(", ".join(sorted(comparison['common'])))
else:
report.append("Aucune")
report.append("")
# Colonnes uniquement dans la source
report.append(f"Colonnes uniquement dans la source ({len(comparison['source_only'])}):")
if comparison['source_only']:
report.append(", ".join(sorted(comparison['source_only'])))
else:
report.append("Aucune")
report.append("")
# Colonnes uniquement dans la cible
report.append(f"Colonnes uniquement dans la cible ({len(comparison['target_only'])}):")
if comparison['target_only']:
report.append(", ".join(sorted(comparison['target_only'])))
else:
report.append("Aucune")
report.append("")
# Différences dans les colonnes communes
report.append(f"Différences dans les colonnes communes ({len(comparison['differences'])}):")
if comparison['differences']:
headers = ["Colonne", "Type Source", "Type Cible", "Null Source", "Null Cible", "Clé Source", "Clé Cible", "Défaut Source", "Défaut Cible"]
table_data = []
for diff in comparison['differences']:
table_data.append([
diff['Column'],
diff['Source_Type'],
diff['Target_Type'],
diff['Source_Null'],
diff['Target_Null'],
diff['Source_Key'],
diff['Target_Key'],
diff['Source_Default'] or 'NULL',
diff['Target_Default'] or 'NULL'
])
report.append(tabulate(table_data, headers=headers, tablefmt="grid"))
else:
report.append("Aucune différence")
report_text = "\n".join(report)
if output_file:
with open(output_file, 'w') as f:
f.write(report_text)
print(f"Rapport enregistré dans: {output_file}")
return report_text
def main():
parser = argparse.ArgumentParser(description='Compare les schémas de tables entre deux bases de données')
parser.add_argument('table', help='Nom de la table à comparer')
parser.add_argument('--output', '-o', help='Fichier de sortie pour le rapport')
parser.add_argument('--no-ssh', action='store_true', help='Ne pas utiliser de tunnel SSH')
args = parser.parse_args()
table_name = args.table
output_file = args.output
use_ssh = not args.no_ssh
# Créer le dossier de logs si nécessaire
logs_dir = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'logs')
if not os.path.exists(logs_dir):
os.makedirs(logs_dir)
# Si aucun fichier de sortie n'est spécifié, en créer un dans le dossier logs
if not output_file:
output_file = os.path.join(logs_dir, f"schema_comparison_{table_name}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.txt")
# Charger la configuration
config = get_db_config()
# Établir un tunnel SSH si nécessaire
if use_ssh and 'SSH' in config and 'REMOTE_DB' in config:
if not create_ssh_tunnel(config['SSH'], config['REMOTE_DB'], config['SOURCE_DB']):
print("Impossible d'établir le tunnel SSH. Abandon.")
sys.exit(1)
# Se connecter aux bases de données
source_conn = connect_to_db(config['SOURCE_DB'])
target_conn = connect_to_db(config['TARGET_DB'])
# Vérifier si la table existe dans les deux bases
source_tables = get_all_tables(source_conn)
target_tables = get_all_tables(target_conn)
if table_name not in source_tables:
print(f"Erreur: La table '{table_name}' n'existe pas dans la base source.")
sys.exit(1)
if table_name not in target_tables:
print(f"Avertissement: La table '{table_name}' n'existe pas dans la base cible.")
print("Voulez-vous voir uniquement le schéma de la table source? (o/n)")
response = input().lower()
if response != 'o':
sys.exit(0)
# Afficher uniquement le schéma de la table source
source_schema = get_table_schema(source_conn, table_name)
print(f"\nSchéma de la table '{table_name}' dans la base source:")
headers = ["Champ", "Type", "Null", "Clé", "Défaut", "Extra"]
table_data = [[col['Field'], col['Type'], col['Null'], col['Key'], col['Default'] or 'NULL', col['Extra']] for col in source_schema]
print(tabulate(table_data, headers=headers, tablefmt="grid"))
# Enregistrer le schéma dans un fichier
with open(output_file, 'w') as f:
f.write(f"Schéma de la table '{table_name}' dans la base source:\n")
f.write(tabulate(table_data, headers=headers, tablefmt="grid"))
print(f"Schéma enregistré dans: {output_file}")
sys.exit(0)
# Récupérer les schémas des tables
source_schema = get_table_schema(source_conn, table_name)
target_schema = get_table_schema(target_conn, table_name)
# Comparer les schémas
comparison = compare_tables(source_schema, target_schema)
# Générer et afficher le rapport
report = generate_report(table_name, comparison, output_file)
print(report)
# Fermer les connexions
source_conn.close()
target_conn.close()
if __name__ == "__main__":
try:
# Configurer le gestionnaire de signal pour fermer proprement le tunnel SSH
signal.signal(signal.SIGINT, lambda sig, frame: (close_ssh_tunnel(), sys.exit(0)))
signal.signal(signal.SIGTERM, lambda sig, frame: (close_ssh_tunnel(), sys.exit(0)))
main()
finally:
# Fermer le tunnel SSH à la fin du script
close_ssh_tunnel()

View File

@@ -0,0 +1,187 @@
#!/bin/bash
# Script de migration d'une table de geosector vers geosector_app
# Usage: ./migrate_table.sh <nom_table> [options]
# Chemin du script
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
BASE_DIR="$(dirname "$SCRIPT_DIR")"
LOG_DIR="$BASE_DIR/logs"
CONFIG_FILE="$BASE_DIR/shell/db_config.sh"
# Création du répertoire de logs si nécessaire
mkdir -p "$LOG_DIR"
# Fichier de log
LOG_FILE="$LOG_DIR/migration_$(date +%Y-%m-%d).log"
# Fonction de logging
log_message() {
local level="$1"
local message="$2"
local timestamp=$(date +"%Y-%m-%d %H:%M:%S")
echo "[$timestamp] [$level] $message" | tee -a "$LOG_FILE"
}
# Vérification des arguments
if [ -z "$1" ]; then
log_message "ERROR" "Usage: $0 <nom_table> [options]"
exit 1
fi
TABLE_NAME="$1"
log_message "INFO" "Démarrage de la migration de la table: $TABLE_NAME"
# Charger la configuration de la base de données
if [ -f "$CONFIG_FILE" ]; then
source "$CONFIG_FILE"
else
# Configuration SSH par défaut
SSH_HOST="serveur-distant.exemple.com"
SSH_PORT="22"
SSH_USER="utilisateur"
SSH_KEY_FILE="/chemin/vers/cle_ssh"
# Configuration de la base de données source (distante)
REMOTE_DB_HOST="localhost"
REMOTE_DB_PORT="3306"
SOURCE_DB_HOST="localhost"
SOURCE_DB_NAME="geosector"
SOURCE_DB_USER="utilisateur_db"
SOURCE_DB_PASS="mot_de_passe"
SOURCE_DB_PORT="13306"
# Configuration de la base de données cible (locale)
TARGET_DB_HOST="localhost"
TARGET_DB_NAME="geosector_app"
TARGET_DB_USER="root"
TARGET_DB_PASS=""
TARGET_DB_PORT="3306"
# Créer le fichier de configuration
cat > "$CONFIG_FILE" << EOF
#!/bin/bash
# Configuration des bases de données pour les scripts de migration
# Configuration SSH pour accéder au serveur distant
SSH_HOST="serveur-distant.exemple.com"
SSH_PORT="22"
SSH_USER="utilisateur"
SSH_KEY_FILE="/chemin/vers/cle_ssh"
# Configuration de la base de données source (distante)
REMOTE_DB_HOST="localhost"
REMOTE_DB_PORT="3306"
SOURCE_DB_HOST="localhost"
SOURCE_DB_NAME="geosector"
SOURCE_DB_USER="utilisateur_db"
SOURCE_DB_PASS="mot_de_passe"
SOURCE_DB_PORT="13306"
# Configuration de la base de données cible (locale)
TARGET_DB_HOST="localhost"
TARGET_DB_NAME="geosector_app"
TARGET_DB_USER="root"
TARGET_DB_PASS=""
TARGET_DB_PORT="3306"
EOF
chmod +x "$CONFIG_FILE"
log_message "INFO" "Fichier de configuration créé: $CONFIG_FILE"
fi
# Fonction pour établir un tunnel SSH
establish_ssh_tunnel() {
# Vérifier si un tunnel SSH est déjà en cours d'exécution
TUNNEL_RUNNING=$(ps aux | grep "ssh -f -N -L $SOURCE_DB_PORT:$REMOTE_DB_HOST:$REMOTE_DB_PORT" | grep -v grep)
if [ -z "$TUNNEL_RUNNING" ]; then
log_message "INFO" "Établissement d'un tunnel SSH vers $SSH_HOST..."
ssh -f -N -L "$SOURCE_DB_PORT:$REMOTE_DB_HOST:$REMOTE_DB_PORT" -p "$SSH_PORT" "$SSH_USER@$SSH_HOST" -i "$SSH_KEY_FILE"
if [ $? -ne 0 ]; then
log_message "ERROR" "Impossible d'établir le tunnel SSH."
return 1
fi
# Attendre que le tunnel soit établi
sleep 2
log_message "INFO" "Tunnel SSH établi sur le port local $SOURCE_DB_PORT"
else
log_message "INFO" "Un tunnel SSH est déjà en cours d'exécution"
fi
return 0
}
# Fonction pour fermer le tunnel SSH
close_ssh_tunnel() {
log_message "INFO" "Fermeture du tunnel SSH..."
TUNNEL_PID=$(ps aux | grep "ssh -f -N -L $SOURCE_DB_PORT:$REMOTE_DB_HOST:$REMOTE_DB_PORT" | grep -v grep | awk '{print $2}')
if [ ! -z "$TUNNEL_PID" ]; then
kill -9 "$TUNNEL_PID" 2>/dev/null
log_message "INFO" "Tunnel SSH fermé"
fi
}
# Établir le tunnel SSH
establish_ssh_tunnel
if [ $? -ne 0 ]; then
log_message "ERROR" "Impossible de continuer sans tunnel SSH."
exit 1
fi
# Vérifier si la table existe dans la base source (via le tunnel SSH)
TABLE_EXISTS=$(mysql -h"$SOURCE_DB_HOST" -P"$SOURCE_DB_PORT" -u"$SOURCE_DB_USER" -p"$SOURCE_DB_PASS" -D"$SOURCE_DB_NAME" -se "SHOW TABLES LIKE '$TABLE_NAME'")
if [ -z "$TABLE_EXISTS" ]; then
log_message "ERROR" "La table '$TABLE_NAME' n'existe pas dans la base source."
close_ssh_tunnel
exit 1
fi
# Obtenir la structure de la table source (via le tunnel SSH)
log_message "INFO" "Récupération de la structure de la table source..."
mysql -h"$SOURCE_DB_HOST" -P"$SOURCE_DB_PORT" -u"$SOURCE_DB_USER" -p"$SOURCE_DB_PASS" -D"$SOURCE_DB_NAME" -e "SHOW CREATE TABLE $TABLE_NAME\G" > "$LOG_DIR/structure_source_$TABLE_NAME.sql"
# Vérifier si la table existe dans la base cible
TARGET_TABLE_EXISTS=$(mysql -h"$TARGET_DB_HOST" -P"$TARGET_DB_PORT" -u"$TARGET_DB_USER" -p"$TARGET_DB_PASS" -D"$TARGET_DB_NAME" -se "SHOW TABLES LIKE '$TABLE_NAME'")
if [ -z "$TARGET_TABLE_EXISTS" ]; then
log_message "WARNING" "La table '$TABLE_NAME' n'existe pas dans la base cible. Création de la table..."
# Créer la table dans la base cible avec la même structure (source via SSH)
mysql -h"$SOURCE_DB_HOST" -P"$SOURCE_DB_PORT" -u"$SOURCE_DB_USER" -p"$SOURCE_DB_PASS" -D"$SOURCE_DB_NAME" -e "SHOW CREATE TABLE $TABLE_NAME" | awk 'NR==2 {print $0}' | sed 's/CREATE TABLE/CREATE TABLE IF NOT EXISTS/g' > "$LOG_DIR/create_table_$TABLE_NAME.sql"
mysql -h"$TARGET_DB_HOST" -P"$TARGET_DB_PORT" -u"$TARGET_DB_USER" -p"$TARGET_DB_PASS" -D"$TARGET_DB_NAME" < "$LOG_DIR/create_table_$TABLE_NAME.sql"
fi
# Exporter les données de la table source (via le tunnel SSH)
log_message "INFO" "Exportation des données de la table source..."
mysqldump -h"$SOURCE_DB_HOST" -P"$SOURCE_DB_PORT" -u"$SOURCE_DB_USER" -p"$SOURCE_DB_PASS" --no-create-info --skip-triggers "$SOURCE_DB_NAME" "$TABLE_NAME" > "$LOG_DIR/data_$TABLE_NAME.sql"
# Vider la table cible (optionnel)
read -p "Voulez-vous vider la table cible avant l'importation? (o/n): " TRUNCATE_TABLE
if [[ "$TRUNCATE_TABLE" =~ ^[Oo]$ ]]; then
log_message "INFO" "Vidage de la table cible..."
mysql -h"$TARGET_DB_HOST" -P"$TARGET_DB_PORT" -u"$TARGET_DB_USER" -p"$TARGET_DB_PASS" -D"$TARGET_DB_NAME" -e "TRUNCATE TABLE $TABLE_NAME"
fi
# Importer les données dans la table cible
log_message "INFO" "Importation des données dans la table cible..."
mysql -h"$TARGET_DB_HOST" -P"$TARGET_DB_PORT" -u"$TARGET_DB_USER" -p"$TARGET_DB_PASS" "$TARGET_DB_NAME" < "$LOG_DIR/data_$TABLE_NAME.sql"
# Vérifier le nombre d'enregistrements
SOURCE_COUNT=$(mysql -h"$SOURCE_DB_HOST" -P"$SOURCE_DB_PORT" -u"$SOURCE_DB_USER" -p"$SOURCE_DB_PASS" -D"$SOURCE_DB_NAME" -se "SELECT COUNT(*) FROM $TABLE_NAME")
TARGET_COUNT=$(mysql -h"$TARGET_DB_HOST" -P"$TARGET_DB_PORT" -u"$TARGET_DB_USER" -p"$TARGET_DB_PASS" -D"$TARGET_DB_NAME" -se "SELECT COUNT(*) FROM $TABLE_NAME")
log_message "INFO" "Nombre d'enregistrements dans la table source: $SOURCE_COUNT"
log_message "INFO" "Nombre d'enregistrements dans la table cible: $TARGET_COUNT"
if [ "$SOURCE_COUNT" -eq "$TARGET_COUNT" ]; then
log_message "SUCCESS" "Migration réussie! Tous les enregistrements ont été transférés."
else
log_message "WARNING" "Le nombre d'enregistrements diffère entre les tables source et cible."
fi
log_message "INFO" "Migration terminée pour la table: $TABLE_NAME"
# Fermer le tunnel SSH à la fin
close_ssh_tunnel