🚀 Début de la migration Globale ..."; // ========================================== // 0. MISE À JOUR DE LA META DB // ========================================== echo "

Mise Ă  jour Meta DB (househub_meta)

"; // ========================================== // MIGRATIONS PAR FAMILLE // ========================================== $stmt = $meta_pdo->query("SELECT id, name, db_name FROM families WHERE db_name != ''"); $families = $stmt->fetchAll(); $host = getenv('DB_HOST') ?: 'househub-db'; $user = getenv('DB_USER') ?: 'househub'; $pass = getenv('DB_PASS') ?: 'changeme'; foreach ($families as $f) { $db_name = $f['db_name']; $family_id = $f['id']; echo "

Mise Ă  jour de {$f['name']} ($db_name)

"; // ========================================== // 8. SEPARATION CIBLE BUDGET / DESTINATION VIREMENT // ========================================== echo "
  • Table pf_alloc_categories (Fix Collision) : "; try { $fam_pdo->exec("ALTER TABLE pf_alloc_categories ADD COLUMN transfer_dest VARCHAR(50) DEFAULT NULL AFTER target"); echo "Succès ! Colonne 'transfer_dest' ajoutĂ©e pour prĂ©server vos objectifs chiffrĂ©s.
  • "; } catch (\PDOException $e) { echo "La colonne transfer_dest existe dĂ©jĂ ."; } // ========================================== // 9. TRANSFERT DES DONNÉES (Cible -> Destination) // ========================================== echo "
  • Table pf_alloc_categories (RĂ©cupĂ©ration des donnĂ©es) : "; try { // VĂ©rifier si la colonne target est encore au format texte (VARCHAR) $stmtCol = $fam_pdo->query("SHOW COLUMNS FROM pf_alloc_categories LIKE 'target'"); $colInfo = $stmtCol->fetch(PDO::FETCH_ASSOC); if ($colInfo && strpos(strtolower($colInfo['Type']), 'varchar') !== false) { // 1. DĂ©placer les textes "vers..." $updated1 = $fam_pdo->exec("UPDATE pf_alloc_categories SET transfer_dest = target, target = '0' WHERE target LIKE 'vers %'"); // 2. GĂ©rer le mot 'SYSTEM' $updated2 = $fam_pdo->exec("UPDATE pf_alloc_categories SET transfer_dest = 'SYSTEM', target = '0' WHERE target = 'SYSTEM'"); // 3. SĂ©curitĂ© absolue avant conversion $fam_pdo->exec("UPDATE pf_alloc_categories SET target = '0' WHERE target NOT REGEXP '^[0-9]+(\\\\.[0-9]+)?$'"); echo "" . ($updated1 + $updated2) . " destinations rĂ©cupĂ©rĂ©es et dĂ©placĂ©es.
    "; // 4. Remettre la colonne en format numérique $fam_pdo->exec("ALTER TABLE pf_alloc_categories MODIFY target DECIMAL(10,2) DEFAULT 0.00"); echo "Colonne 'target' re-sécurisée en format monétaire DECIMAL(10,2).
  • "; } else { echo "La colonne 'target' est dĂ©jĂ  au format DECIMAL, transfert ignorĂ©."; } } catch (\PDOException $e) { echo "Erreur : " . $e->getMessage() . ""; } try { // RĂ©cupĂ©ration de toutes les bases de donnĂ©es de familles via la base meta $stmtFamilies = $meta_pdo->query("SELECT id, db_name FROM families WHERE is_active = 1"); while ($fam = $stmtFamilies->fetch(PDO::FETCH_ASSOC)) { error_log("Migration de la base familiale : " . $fam['db_name']); $fam_dsn = "mysql:host=" . DB_HOST . ";dbname=" . $fam['db_name'] . ";charset=utf8mb4"; $fam_pdo = new PDO($fam_dsn, DB_USER, DB_PASS, $options); // Injection incrĂ©mentale sĂ©curisĂ©e $fam_pdo->exec(" CREATE TABLE IF NOT EXISTS `pf_advances` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `advance_date` DATE NOT NULL, `payer` VARCHAR(100) NOT NULL, `description` VARCHAR(255) NOT NULL, `amount` DECIMAL(10,2) DEFAULT 0.00, `from_savings` TINYINT(1) DEFAULT 0, `is_resolved` TINYINT(1) DEFAULT 0, `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; "); } error_log("âś… Migration de la table pf_advances terminĂ©e sur tous les tenants."); } catch (Exception $e) { die("❌ Erreur critique lors de la migration : " . $e->getMessage()); } } echo "

    🎉 Migration terminée avec succès !

    "; ?>