Fonctionnalités principales : 1. Marchés hybrides - Onglet Mercurial - Ajout onglet Mercurial avec style distinct (vert, gras, blanc) - Affichage des produits mercuriaux pour marchés hybrides - Filtrage automatique des produits "Hors Marché 999" - Documentation Phase 2 avec CAS 1 et CAS 2 de marchés hybrides - Règles métier pour validation différenciée (devis 100% mercurial vs mixte) 2. Corrections bugs - Fix flag chkChange sur onglet "Sélection Produits" (callback asynchrone) - Plus d'alerte intempestive après sauvegarde des produits 3. Outils de déploiement - Nouveau script deploy-file.sh pour déploiement unitaire (DEV/PROD) - Amélioration deploy-cleo.sh 4. Gestion multi-contacts (v2.0.3) - Contrôleur AJAX cjxcontacts.php - Script migration clients_contacts - Documentation complète 5. Documentation - Mise à jour TODO.md avec Phase 2 marchés hybrides - Mise à jour README.md v2.0.3 - Ajout RULES.md - Ajout migration_clients_contacts.sql 6. Nettoyage - Suppression fichiers obsolètes (conf_new.php, conf_old.php, uof_linet_20250911.sql) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
144 lines
4.6 KiB
SQL
144 lines
4.6 KiB
SQL
-- ============================================================================
|
|
-- 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
|
|
-- ============================================================================
|