-- ================================================================
-- CORRECTION DES DONNÉES DE VIREMENT
-- ================================================================
-- Ce script corrige les données corrompues dans la table bank
-- où transfer_id contient l'ID de l'opération au lieu de l'ID du compte
-- ================================================================

-- 1) Afficher les virements actuels avec leur problème
SELECT 
    b.id,
    b.id_bank AS compte_source_id,
    ba_source.nom_banque AS compte_source,
    b.transfer_id AS transfer_id_actuel,
    b.debit,
    b.credit,
    b.date,
    b.description
FROM bank b
JOIN bank_account ba_source ON ba_source.id = b.id_bank
WHERE b.transfer_id IS NOT NULL
ORDER BY b.date DESC, b.id;

-- ================================================================
-- 2) CORRECTION : Mettre à jour transfer_id pour qu'il contienne
--    l'ID du compte bancaire destination, pas l'ID de l'opération
-- ================================================================

-- MÉTHODE 1 : Correction simple (si transfer_id contient l'ID de l'opération miroir)
-- Cette requête fonctionne si les virements ont été créés avec l'ancien système
UPDATE bank b1
JOIN bank b2 ON b2.id = b1.transfer_id  -- b2 = l'opération miroir actuelle (mauvais)
SET b1.transfer_id = b2.id_bank         -- correction : prendre l'ID du compte bancaire de b2
WHERE b1.transfer_id IS NOT NULL
  AND b1.transfer_id != b2.id_bank      -- uniquement si pas déjà corrigé
  AND EXISTS (SELECT 1 FROM bank WHERE id = b1.transfer_id);  -- vérifier que transfer_id pointe vers une opération

-- Afficher le nombre de lignes corrigées
SELECT ROW_COUNT() AS 'Lignes corrigées (Méthode 1)';

-- ================================================================
-- MÉTHODE 2 : Reconstruction complète (si les données sont très corrompues)
-- ================================================================
-- Cette méthode recherche les paires de virements en se basant sur :
-- - Même date, même montant (inversé), même description
-- - Comptes inversés (id_bank de l'un = destination probable de l'autre)

-- D'abord, mettre transfer_id à NULL pour tous les virements
UPDATE bank 
SET transfer_id = NULL 
WHERE transfer_id IS NOT NULL;

-- Ensuite, reconstruire les liens en trouvant les paires
UPDATE bank b1
JOIN bank b2 ON b1.id_bank != b2.id_bank                        -- Comptes différents
    AND b1.id_copro = b2.id_copro                               -- Même copropriété
    AND DATE(b1.date) = DATE(b2.date)                           -- Même date
    AND b1.description = b2.description                         -- Même libellé
    AND ABS(COALESCE(b1.debit, 0) - COALESCE(b2.credit, 0)) < 0.01   -- Montant inversé
    AND ABS(COALESCE(b1.credit, 0) - COALESCE(b2.debit, 0)) < 0.01   -- Montant inversé
    AND b1.id < b2.id                                           -- Éviter les doublons (ne traiter qu'une fois)
    AND (
        (b1.debit IS NOT NULL AND b1.debit > 0 AND b2.credit IS NOT NULL AND b2.credit > 0)
        OR
        (b1.credit IS NOT NULL AND b1.credit > 0 AND b2.debit IS NOT NULL AND b2.debit > 0)
    )
SET 
    b1.transfer_id = b2.id_bank,    -- b1 transfère vers le compte de b2
    b2.transfer_id = b1.id_bank     -- b2 reçoit depuis le compte de b1
WHERE b1.transfer_id IS NULL 
  AND b2.transfer_id IS NULL;

-- Afficher le nombre de paires reconstruites
SELECT COUNT(*) / 2 AS 'Paires de virements reconstruites (Méthode 2)' 
FROM bank 
WHERE transfer_id IS NOT NULL;

-- ================================================================
-- 3) NETTOYAGE : Supprimer les comptes 512007, 512008, 512009, 512010
--    qui ont été créés par erreur
-- ================================================================

-- D'abord, vérifier qu'aucune opération n'utilise ces comptes
SELECT 
    ba.id,
    ba.nom_banque,
    ba.numero_compte_512,
    COUNT(b.id) AS nb_operations
FROM bank_account ba
LEFT JOIN bank b ON b.id_bank = ba.id
WHERE ba.numero_compte_512 IN ('512007', '512008', '512009', '512010')
GROUP BY ba.id, ba.nom_banque, ba.numero_compte_512;

-- Si nb_operations = 0 pour tous, on peut supprimer en sécurité :

-- Supprimer du plan comptable
DELETE FROM plan_comptable 
WHERE numero_compte IN ('512007', '512008', '512009', '512010')
  AND type_entite = 'banque';

-- Mettre à NULL le numéro de compte dans bank_account (pour réattribution automatique)
UPDATE bank_account 
SET numero_compte_512 = NULL 
WHERE numero_compte_512 IN ('512007', '512008', '512009', '512010');

-- ================================================================
-- 4) VÉRIFICATION FINALE
-- ================================================================

-- Vérifier que transfer_id pointe maintenant vers des comptes bancaires valides
SELECT 
    b.id,
    b.id_bank AS compte_source_id,
    ba_source.nom_banque AS compte_source,
    ba_source.numero_compte_512 AS numero_source,
    b.transfer_id AS compte_dest_id,
    ba_dest.nom_banque AS compte_dest,
    ba_dest.numero_compte_512 AS numero_dest,
    b.debit,
    b.credit,
    b.date,
    b.description
FROM bank b
JOIN bank_account ba_source ON ba_source.id = b.id_bank
LEFT JOIN bank_account ba_dest ON ba_dest.id = b.transfer_id
WHERE b.transfer_id IS NOT NULL
ORDER BY b.date DESC, b.id;

-- Si compte_dest est NULL, c'est qu'il reste des données corrompues !

-- ================================================================
-- 5) NETTOYAGE DES ÉCRITURES COMPTABLES DUPLIQUÉES
-- ================================================================

-- Trouver les écritures en double pour les virements
SELECT 
    ec.id,
    ec.numero_ecriture,
    ec.date_ecriture,
    ec.libelle,
    ec.montant_total,
    b.id AS bank_id,
    b.id_bank,
    b.transfer_id
FROM ecritures_comptables ec
JOIN bank b ON b.id_ecriture_comptable = ec.id
WHERE ec.source_type = 'bank'
  AND b.transfer_id IS NOT NULL
ORDER BY ec.date_ecriture DESC, ec.id DESC;

-- Pour supprimer les écritures en double (ATTENTION : vérifier avant !)
-- Garder uniquement l'écriture du côté DÉBIT (celle qui a créé les 4 lignes complètes)
-- DELETE FROM lignes_ecritures WHERE id_ecriture IN (SELECT id FROM ecritures_comptables WHERE ...);
-- DELETE FROM ecritures_comptables WHERE ...;

-- ================================================================
-- FIN DE LA CORRECTION
-- ================================================================
