-- ============================================================================ -- MIGRATION: Gestion multi-contacts par client -- Version: 2.0.3 -- Date: 2025-10-21 -- -- Description: -- - Création de la table clients_contacts -- - Migration des contacts existants depuis la table clients -- - Ajout du champ fk_contact dans la table devis -- -- IMPORTANT: Ce script ne modifie PAS la table clients (champs conservés) -- ============================================================================ USE cleo; -- ============================================================================ -- ÉTAPE 1: Création de la table clients_contacts -- ============================================================================ DROP TABLE IF EXISTS `clients_contacts`; CREATE TABLE `clients_contacts` ( `rowid` int(11) NOT NULL AUTO_INCREMENT, `fk_client` int(11) NOT NULL, `nom` varchar(50) DEFAULT NULL, `prenom` varchar(50) DEFAULT NULL, `fonction` varchar(50) DEFAULT NULL, `telephone` varchar(20) DEFAULT NULL, `mobile` varchar(20) DEFAULT NULL, `email` varchar(75) DEFAULT NULL, `principal` tinyint(1) DEFAULT 0 COMMENT 'Contact principal du client', `active` tinyint(1) DEFAULT 1, `date_creat` datetime DEFAULT NULL, `fk_user_creat` int(11) DEFAULT NULL, `date_modif` datetime DEFAULT NULL, `fk_user_modif` int(11) DEFAULT NULL, PRIMARY KEY (`rowid`), UNIQUE KEY `rowid_UNIQUE` (`rowid`), KEY `fk_client` (`fk_client`), KEY `principal` (`fk_client`, `principal`), KEY `email` (`email`), CONSTRAINT `clients_contacts_fk_client` FOREIGN KEY (`fk_client`) REFERENCES `clients` (`rowid`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Contacts multiples par client' `PAGE_COMPRESSED`='ON'; -- ============================================================================ -- ÉTAPE 2: Migration des contacts existants depuis la table clients -- ============================================================================ INSERT INTO `clients_contacts` ( `fk_client`, `nom`, `prenom`, `fonction`, `telephone`, `mobile`, `email`, `principal`, `active`, `date_creat`, `fk_user_creat`, `date_modif`, `fk_user_modif` ) SELECT c.rowid AS fk_client, c.contact_nom AS nom, c.contact_prenom AS prenom, c.contact_fonction AS fonction, c.telephone, c.mobile, c.email, 1 AS principal, c.active, c.date_creat, c.fk_user_creat, c.date_modif, c.fk_user_modif FROM `clients` c WHERE c.active = 1 AND ( c.contact_nom IS NOT NULL OR c.contact_prenom IS NOT NULL OR c.email IS NOT NULL OR c.telephone IS NOT NULL OR c.mobile IS NOT NULL ); -- ============================================================================ -- ÉTAPE 3: Ajout du champ fk_contact dans la table devis -- ============================================================================ ALTER TABLE `devis` ADD COLUMN `fk_contact` int(11) DEFAULT NULL AFTER `fk_client`, ADD KEY `fk_contact` (`fk_contact`); -- ============================================================================ -- ÉTAPE 4: Liaison des devis existants avec les contacts principaux -- ============================================================================ UPDATE `devis` d INNER JOIN `clients_contacts` cc ON d.fk_client = cc.fk_client AND cc.principal = 1 SET d.fk_contact = cc.rowid WHERE d.fk_client > 0; -- ============================================================================ -- ÉTAPE 5: Vérifications post-migration -- ============================================================================ -- Nombre de clients avec contacts SELECT COUNT(*) AS 'Clients avec contacts migrés' FROM clients_contacts; -- Nombre de clients actifs SELECT COUNT(*) AS 'Total clients actifs' FROM clients WHERE active = 1; -- Nombre de contacts principaux SELECT COUNT(*) AS 'Contacts principaux' FROM clients_contacts WHERE principal = 1; -- Devis avec contact associé SELECT COUNT(*) AS 'Devis avec contact associé' FROM devis WHERE fk_contact IS NOT NULL; -- Devis sans contact (à vérifier) SELECT COUNT(*) AS 'Devis SANS contact (à vérifier)' FROM devis WHERE fk_client > 0 AND fk_contact IS NULL; -- Clients sans contact migré (potentiellement vides) SELECT c.rowid, c.code, c.libelle FROM clients c LEFT JOIN clients_contacts cc ON c.rowid = cc.fk_client WHERE c.active = 1 AND cc.rowid IS NULL LIMIT 10; -- ============================================================================ -- FIN DE LA MIGRATION -- ============================================================================