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); }