-- ================================================================
-- NETTOYAGE DES REPRISES DE SOLDES ERRONÉES
-- ================================================================
-- Supprime les écritures comptables créées à tort pour les reprises
-- de soldes bancaires (qui utilisent 580000 au lieu de rien)
-- ================================================================

-- ----------------------------------------------------------------
-- 1) DIAGNOSTIC : Identifier les reprises de soldes
-- ----------------------------------------------------------------

-- Repérer les opérations de reprise (description contenant "solde" ou "reprise")
SELECT 
    b.id AS bank_id,
    b.date,
    b.description,
    b.debit,
    b.credit,
    ba.nom_banque,
    ba.numero_compte_512,
    ec.id AS ecriture_id,
    ec.numero_ecriture
FROM bank b
JOIN bank_account ba ON ba.id = b.id_bank
LEFT JOIN ecritures_comptables ec ON ec.id = b.id_ecriture_comptable
WHERE (
    LOWER(b.description) LIKE '%solde%' 
    OR LOWER(b.description) LIKE '%reprise%'
    OR LOWER(b.description) LIKE '%à nouveau%'
    OR LOWER(b.description) LIKE '%ouverture%'
)
AND b.fournisseur IS NULL
AND b.coproprietaire IS NULL
AND b.transfer_id IS NULL
ORDER BY b.date DESC;

-- Vérifier les lignes comptables associées (devrait montrer 580000 en contrepartie)
SELECT 
    b.id AS bank_id,
    b.description,
    le.numero_compte,
    pc.libelle,
    le.debit,
    le.credit
FROM bank b
JOIN ecritures_comptables ec ON ec.id = b.id_ecriture_comptable
JOIN lignes_ecritures le ON le.id_ecriture = ec.id
LEFT JOIN plan_comptable pc ON pc.numero_compte = le.numero_compte
WHERE (
    LOWER(b.description) LIKE '%solde%' 
    OR LOWER(b.description) LIKE '%reprise%'
    OR LOWER(b.description) LIKE '%à nouveau%'
    OR LOWER(b.description) LIKE '%ouverture%'
)
AND b.fournisseur IS NULL
AND b.coproprietaire IS NULL
AND b.transfer_id IS NULL
ORDER BY b.id, le.numero_ligne;

-- ----------------------------------------------------------------
-- 2) SAUVEGARDE : Créer une copie avant suppression
-- ----------------------------------------------------------------

CREATE TABLE IF NOT EXISTS bank_reprise_backup AS
SELECT b.*, ba.nom_banque, ba.numero_compte_512
FROM bank b
JOIN bank_account ba ON ba.id = b.id_bank
WHERE (
    LOWER(b.description) LIKE '%solde%' 
    OR LOWER(b.description) LIKE '%reprise%'
    OR LOWER(b.description) LIKE '%à nouveau%'
    OR LOWER(b.description) LIKE '%ouverture%'
)
AND b.fournisseur IS NULL
AND b.coproprietaire IS NULL
AND b.transfer_id IS NULL;

SELECT COUNT(*) AS 'Opérations sauvegardées' FROM bank_reprise_backup;

-- ----------------------------------------------------------------
-- 3) SUPPRESSION : Nettoyer les écritures erronées
-- ----------------------------------------------------------------

-- Supprimer les lignes comptables
DELETE le FROM lignes_ecritures le
JOIN ecritures_comptables ec ON ec.id = le.id_ecriture
JOIN bank b ON b.id_ecriture_comptable = ec.id
WHERE (
    LOWER(b.description) LIKE '%solde%' 
    OR LOWER(b.description) LIKE '%reprise%'
    OR LOWER(b.description) LIKE '%à nouveau%'
    OR LOWER(b.description) LIKE '%ouverture%'
)
AND b.fournisseur IS NULL
AND b.coproprietaire IS NULL
AND b.transfer_id IS NULL;

SELECT ROW_COUNT() AS 'Lignes comptables supprimées';

-- Supprimer les écritures comptables
DELETE ec FROM ecritures_comptables ec
JOIN bank b ON b.id_ecriture_comptable = ec.id
WHERE (
    LOWER(b.description) LIKE '%solde%' 
    OR LOWER(b.description) LIKE '%reprise%'
    OR LOWER(b.description) LIKE '%à nouveau%'
    OR LOWER(b.description) LIKE '%ouverture%'
)
AND b.fournisseur IS NULL
AND b.coproprietaire IS NULL
AND b.transfer_id IS NULL;

SELECT ROW_COUNT() AS 'Écritures comptables supprimées';

-- Supprimer les opérations bancaires (reprises de solde)
DELETE FROM bank
WHERE (
    LOWER(description) LIKE '%solde%' 
    OR LOWER(description) LIKE '%reprise%'
    OR LOWER(description) LIKE '%à nouveau%'
    OR LOWER(description) LIKE '%ouverture%'
)
AND fournisseur IS NULL
AND coproprietaire IS NULL
AND transfer_id IS NULL;

SELECT ROW_COUNT() AS 'Opérations bancaires supprimées';

-- ----------------------------------------------------------------
-- 4) VÉRIFICATION POST-NETTOYAGE
-- ----------------------------------------------------------------

-- Vérifier qu'il ne reste plus de reprises
SELECT COUNT(*) AS 'Reprises restantes (devrait être 0)'
FROM bank
WHERE (
    LOWER(description) LIKE '%solde%' 
    OR LOWER(description) LIKE '%reprise%'
    OR LOWER(description) LIKE '%à nouveau%'
    OR LOWER(description) LIKE '%ouverture%'
)
AND fournisseur IS NULL
AND coproprietaire IS NULL
AND transfer_id IS NULL;

-- Vérifier le solde du compte 580000 (devrait diminuer)
SELECT 
    pc.numero_compte,
    pc.libelle,
    pc.id_copro,
    COALESCE(SUM(le.debit), 0) AS total_debit,
    COALESCE(SUM(le.credit), 0) AS total_credit,
    COALESCE(SUM(le.debit - le.credit), 0) AS solde
FROM plan_comptable pc
LEFT JOIN lignes_ecritures le ON le.numero_compte = pc.numero_compte
LEFT JOIN ecritures_comptables ec ON ec.id = le.id_ecriture 
    AND ec.id_copro = pc.id_copro 
    AND ec.valide = 1
WHERE pc.numero_compte = '580000'
GROUP BY pc.numero_compte, pc.libelle, pc.id_copro
HAVING total_debit > 0 OR total_credit > 0
ORDER BY pc.id_copro;

-- ================================================================
-- FIN DU NETTOYAGE
-- ================================================================

/*
EXPLICATION :

Les reprises de soldes NE DOIVENT PAS créer d'écritures comptables.

Selon la documentation comptable des syndics :
"On ne passe pas d'écriture de transfert : c'est simplement la balance 
d'ouverture du nouvel exercice."

Le solde d'ouverture d'un exercice N+1 = solde de clôture de l'exercice N

Il se calcule automatiquement par :
  SELECT SUM(debit - credit) 
  FROM lignes_ecritures le
  JOIN ecritures_comptables ec ON ec.id = le.id_ecriture
  WHERE le.numero_compte = '512XXX'
  AND ec.date_ecriture < '2025-01-01'
  AND ec.id_exercice IN (exercices_precedents)

Ce script supprime les fausses écritures créées pour les reprises,
qui polluaient le compte 580000 "Virements internes".
*/
