-- ================================================================
-- SYNDICOS - MIGRATION DES DONNÉES VERS LA COMPTABILITÉ
-- ================================================================
-- Ce script migre les données existantes vers le nouveau système
-- ================================================================

-- ----------------------------------------------------------------
-- 1. GÉNÉRER LES COMPTES 450 POUR LES COPROPRIÉTAIRES EXISTANTS
-- ----------------------------------------------------------------

-- Mettre à jour les copropriétaires existants avec des comptes 450
-- Note: Les triggers vont s'occuper de créer les entrées dans plan_comptable

SET @numero := 0;
SET @copro_actuelle := 0;

UPDATE users u
SET u.compte_450 = (
    SELECT CONCAT(
        '450',
        LPAD(
            (@numero := IF(@copro_actuelle = u.copro, @numero + 1, 1)),
            6, '0'
        ),
        UPPER(
            REPLACE(
                REPLACE(
                    REPLACE(
                        REPLACE(
                            REPLACE(SUBSTRING(u.nom, 1, 8), ' ', ''),
                            'É', 'E'
                        ),
                        'È', 'E'
                    ),
                    'À', 'A'
                ),
                '-', ''
            )
        )
    )
    FROM (SELECT @copro_actuelle := u.copro) as dummy
)
WHERE u.admin = 0 AND (u.compte_450 IS NULL OR u.compte_450 = '')
ORDER BY u.copro, u.id;

-- ----------------------------------------------------------------
-- 2. CRÉER LES COMPTES DANS LE PLAN COMPTABLE
-- ----------------------------------------------------------------

-- Créer les comptes fournisseurs dans le plan comptable
INSERT INTO plan_comptable (numero_compte, libelle, type_compte, classe, id_copro, id_entite, type_entite)
SELECT 
    f.compte_401,
    f.nom,
    'tiers',
    '4',
    f.id_copro,
    f.id,
    'fournisseur'
FROM fournisseurs f
WHERE f.compte_401 IS NOT NULL
ON DUPLICATE KEY UPDATE
    libelle = VALUES(libelle),
    date_modification = CURRENT_TIMESTAMP;

-- Créer les comptes copropriétaires dans le plan comptable
INSERT INTO plan_comptable (numero_compte, libelle, type_compte, classe, id_copro, id_entite, type_entite)
SELECT 
    u.compte_450,
    CONCAT(u.prenom, ' ', u.nom),
    'tiers',
    '4',
    u.copro,
    u.id,
    'coproprietaire'
FROM users u
WHERE u.admin = 0 AND u.compte_450 IS NOT NULL
ON DUPLICATE KEY UPDATE
    libelle = VALUES(libelle),
    date_modification = CURRENT_TIMESTAMP;

-- Créer les comptes bancaires dans le plan comptable
-- Note: Il faudra d'abord remplir le champ numero_compte_512 dans bank_account
INSERT INTO plan_comptable (numero_compte, libelle, type_compte, classe, id_copro, id_entite, type_entite)
SELECT 
    ba.numero_compte_512,
    CONCAT('Banque - ', ba.bank_name),
    'actif',
    '5',
    ba.id_copro,
    ba.id,
    'banque'
FROM bank_account ba
WHERE ba.numero_compte_512 IS NOT NULL
ON DUPLICATE KEY UPDATE
    libelle = VALUES(libelle),
    date_modification = CURRENT_TIMESTAMP;

-- ----------------------------------------------------------------
-- 3. ATTRIBUER DES NUMÉROS DE COMPTE 512 AUX BANQUES
-- ----------------------------------------------------------------

-- Générer automatiquement les numéros 512001, 512002, etc. pour chaque copro
SET @numero_banque := 0;
SET @copro_actuelle := 0;

UPDATE bank_account ba
SET ba.numero_compte_512 = (
    SELECT CONCAT(
        '512',
        LPAD(
            (@numero_banque := IF(@copro_actuelle = ba.id_copro, @numero_banque + 1, 1)),
            3, '0'
        )
    )
    FROM (SELECT @copro_actuelle := ba.id_copro) as dummy
)
WHERE ba.numero_compte_512 IS NULL
ORDER BY ba.id_copro, ba.id;

-- Créer les comptes bancaires dans le plan comptable (après attribution des numéros)
INSERT INTO plan_comptable (numero_compte, libelle, type_compte, classe, id_copro, id_entite, type_entite)
SELECT 
    ba.numero_compte_512,
    CONCAT('Banque - ', ba.bank_name),
    'actif',
    '5',
    ba.id_copro,
    ba.id,
    'banque'
FROM bank_account ba
WHERE ba.numero_compte_512 IS NOT NULL
ON DUPLICATE KEY UPDATE
    libelle = VALUES(libelle),
    date_modification = CURRENT_TIMESTAMP;

-- ----------------------------------------------------------------
-- 4. CRÉER LES ÉCRITURES POUR LES OPÉRATIONS EXISTANTES
-- ----------------------------------------------------------------

-- Note: Cette partie est commentée car elle peut être très longue
-- Il vaut mieux la faire progressivement ou par lot

/*
-- Désactiver temporairement le trigger pour éviter les doublons
DROP TRIGGER IF EXISTS after_insert_bank_ecriture;

-- Créer les écritures pour toutes les opérations bancaires existantes
DELIMITER $$

DROP PROCEDURE IF EXISTS migrer_operations_bancaires$$

CREATE PROCEDURE migrer_operations_bancaires()
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE v_id_bank BIGINT;
    DECLARE cur CURSOR FOR 
        SELECT id FROM bank WHERE id_ecriture_comptable IS NULL ORDER BY date, id;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    
    OPEN cur;
    
    read_loop: LOOP
        FETCH cur INTO v_id_bank;
        IF done THEN
            LEAVE read_loop;
        END IF;
        
        -- Générer l'écriture pour cette opération
        CALL creer_ecriture_bancaire(v_id_bank);
    END LOOP;
    
    CLOSE cur;
END$$

DELIMITER ;

-- Lancer la migration (peut prendre du temps si beaucoup d'opérations)
-- CALL migrer_operations_bancaires();

-- Recréer le trigger
DELIMITER $$
CREATE TRIGGER `after_insert_bank_ecriture`
AFTER INSERT ON `bank`
FOR EACH ROW
BEGIN
    CALL creer_ecriture_bancaire(NEW.id);
END$$
DELIMITER ;
*/

-- ----------------------------------------------------------------
-- 5. CRÉER QUELQUES COMPTES GÉNÉRIQUES UTILES
-- ----------------------------------------------------------------

-- Pour chaque copropriété, créer des comptes génériques
INSERT INTO plan_comptable (numero_compte, libelle, type_compte, classe, id_copro, type_entite)
SELECT DISTINCT 
    '6DIVERS' as numero_compte,
    'Charges diverses' as libelle,
    'charge' as type_compte,
    '6' as classe,
    id_copro,
    'autre' as type_entite
FROM bank
WHERE id_copro NOT IN (
    SELECT id_copro FROM plan_comptable WHERE numero_compte = '6DIVERS'
)
ON DUPLICATE KEY UPDATE
    date_modification = CURRENT_TIMESTAMP;

INSERT INTO plan_comptable (numero_compte, libelle, type_compte, classe, id_copro, type_entite)
SELECT DISTINCT 
    '706001' as numero_compte,
    'Appels de fonds (charges courantes)' as libelle,
    'produit' as type_compte,
    '7' as classe,
    id_copro,
    'autre' as type_entite
FROM bank
WHERE id_copro NOT IN (
    SELECT id_copro FROM plan_comptable WHERE numero_compte = '706001'
)
ON DUPLICATE KEY UPDATE
    date_modification = CURRENT_TIMESTAMP;

INSERT INTO plan_comptable (numero_compte, libelle, type_compte, classe, id_copro, type_entite)
SELECT DISTINCT 
    '706002' as numero_compte,
    'Appels de fonds exceptionnels' as libelle,
    'produit' as type_compte,
    '7' as classe,
    id_copro,
    'autre' as type_entite
FROM bank
WHERE id_copro NOT IN (
    SELECT id_copro FROM plan_comptable WHERE numero_compte = '706002'
)
ON DUPLICATE KEY UPDATE
    date_modification = CURRENT_TIMESTAMP;

-- ================================================================
-- VÉRIFICATIONS POST-MIGRATION
-- ================================================================

-- Vérifier les fournisseurs sans compte
SELECT id, nom, id_copro 
FROM fournisseurs 
WHERE compte_401 IS NULL OR compte_401 = '';

-- Vérifier les copropriétaires sans compte
SELECT id, prenom, nom, copro
FROM users 
WHERE admin = 0 AND (compte_450 IS NULL OR compte_450 = '');

-- Vérifier les comptes bancaires sans numéro
SELECT id, bank_name, id_copro
FROM bank_account
WHERE numero_compte_512 IS NULL OR numero_compte_512 = '';

-- Compter les opérations bancaires sans écriture comptable
SELECT COUNT(*) as operations_sans_ecriture
FROM bank
WHERE id_ecriture_comptable IS NULL;

-- ================================================================
-- FIN DE LA MIGRATION
-- ================================================================

-- PROCHAINES ÉTAPES MANUELLES :
-- 
-- 1. Vérifier que tous les comptes bancaires ont un numero_compte_512
-- 2. Vérifier que tous les fournisseurs ont un compte_401
-- 3. Vérifier que tous les copropriétaires ont un compte_450
-- 4. Lancer la migration des écritures (décommenter la procédure ci-dessus)
-- 5. Tester la création d'une nouvelle opération bancaire
