-- ================================================================
-- CALCUL DES SOLDES D'OUVERTURE (À NOUVEAUX)
-- ================================================================
-- Ces requêtes permettent de calculer automatiquement les soldes
-- d'ouverture pour un nouvel exercice SANS créer d'écritures.
-- ================================================================

-- ----------------------------------------------------------------
-- 1) SOLDE D'OUVERTURE D'UN COMPTE BANCAIRE (512XXX)
-- ----------------------------------------------------------------

-- Solde d'ouverture = Solde de clôture de l'exercice précédent
-- Exemple : Pour l'exercice 2025 (id=5), calculer le solde à la fin de 2024

-- Paramètres à adapter :
SET @id_copro = 1;
SET @numero_compte_512 = '512002';  -- Compte bancaire concerné
SET @id_exercice_courant = 5;       -- ID de l'exercice actuel (ex: 2025)

-- Récupérer automatiquement la date de début de l'exercice courant
-- Le solde d'ouverture = tout ce qui s'est passé AVANT cette date
SELECT debut INTO @date_debut_exercice
FROM exercices
WHERE id = @id_exercice_courant;

-- Calculer le solde d'ouverture (cumul de tous les exercices précédents)
SELECT 
    @numero_compte_512 AS compte_bancaire,
    @date_debut_exercice AS date_ouverture,
    COALESCE(SUM(le.debit - le.credit), 0) AS solde_ouverture
FROM lignes_ecritures le
JOIN ecritures_comptables ec ON ec.id = le.id_ecriture
WHERE le.numero_compte = @numero_compte_512
  AND ec.id_copro = @id_copro
  AND ec.date_ecriture < @date_debut_exercice  -- Tout AVANT l'ouverture
  AND ec.valide = 1;

-- ----------------------------------------------------------------
-- 2) SOLDES D'OUVERTURE DE TOUS LES COMPTES BANCAIRES
-- ----------------------------------------------------------------

-- Pour afficher tous les comptes bancaires avec leur solde d'ouverture
-- Récupère automatiquement la date de début de l'exercice

SELECT 
    ba.id AS id_bank_account,
    ba.nom_banque,
    ba.numero_compte_512,
    @date_debut_exercice AS date_ouverture,
    COALESCE(SUM(le.debit - le.credit), 0) AS solde_ouverture
FROM bank_account ba
LEFT JOIN lignes_ecritures le ON le.numero_compte = ba.numero_compte_512
LEFT JOIN ecritures_comptables ec ON ec.id = le.id_ecriture
    AND ec.id_copro = @id_copro
    AND ec.date_ecriture < @date_debut_exercice  -- Tout AVANT l'ouverture
    AND ec.valide = 1
WHERE ba.id_copro = @id_copro
  AND ba.numero_compte_512 IS NOT NULL
GROUP BY ba.id, ba.nom_banque, ba.numero_compte_512
ORDER BY ba.numero_compte_512;

-- ----------------------------------------------------------------
-- 3) SOLDES D'OUVERTURE DES COPROPRIÉTAIRES (450XXX)
-- ----------------------------------------------------------------

-- Débiteurs = copropriétaires qui doivent de l'argent (solde > 0)
-- Créditeurs = copropriétaires en avance (solde < 0)

SELECT 
    u.id AS id_user,
    u.prenom,
    u.nom,
    u.compte_450,
    @date_debut_exercice AS date_ouverture,
    COALESCE(SUM(le.debit - le.credit), 0) AS solde_ouverture,
    CASE 
        WHEN SUM(le.debit - le.credit) > 0 THEN 'DÉBITEUR'
        WHEN SUM(le.debit - le.credit) < 0 THEN 'CRÉDITEUR'
        ELSE 'SOLDÉ'
    END AS statut
FROM users u
LEFT JOIN lignes_ecritures le ON le.numero_compte = u.compte_450
LEFT JOIN ecritures_comptables ec ON ec.id = le.id_ecriture
    AND ec.id_copro = @id_copro
    AND ec.date_ecriture < @date_debut_exercice  -- Tout AVANT l'ouverture
    AND ec.valide = 1
WHERE u.copro = @id_copro
  AND u.admin = 0
  AND u.compte_450 IS NOT NULL
GROUP BY u.id, u.prenom, u.nom, u.compte_450
HAVING ABS(solde_ouverture) > 0.01  -- Ignorer les montants < 1 centime
ORDER BY solde_ouverture DESC;

-- ----------------------------------------------------------------
-- 4) SOLDES D'OUVERTURE DES FOURNISSEURS (401XXX)
-- ----------------------------------------------------------------

-- Fournisseurs avec des factures impayées

SELECT 
    f.id AS id_fournisseur,
    f.nom,
    f.compte_401,
    @date_debut_exercice AS date_ouverture,
    COALESCE(SUM(le.credit - le.debit), 0) AS solde_ouverture,
    CASE 
        WHEN SUM(le.credit - le.debit) > 0 THEN 'DETTE'
        WHEN SUM(le.credit - le.debit) < 0 THEN 'AVANCE'
        ELSE 'SOLDÉ'
    END AS statut
FROM fournisseurs f
LEFT JOIN lignes_ecritures le ON le.numero_compte = f.compte_401
LEFT JOIN ecritures_comptables ec ON ec.id = le.id_ecriture
    AND ec.id_copro = @id_copro
    AND ec.date_ecriture < @date_debut_exercice  -- Tout AVANT l'ouverture
    AND ec.valide = 1
WHERE f.id_copro = @id_copro
  AND f.compte_401 IS NOT NULL
GROUP BY f.id, f.nom, f.compte_401
HAVING ABS(solde_ouverture) > 0.01
ORDER BY solde_ouverture DESC;

-- ----------------------------------------------------------------
-- 5) BALANCE D'OUVERTURE COMPLÈTE (TOUS LES COMPTES)
-- ----------------------------------------------------------------

-- Afficher le solde d'ouverture de TOUS les comptes du plan comptable

SELECT 
    pc.numero_compte,
    pc.libelle,
    pc.type_compte,
    pc.classe,
    @date_debut_exercice AS date_ouverture,
    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_ouverture
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 = @id_copro
    AND ec.date_ecriture < @date_debut_exercice  -- Tout AVANT l'ouverture
    AND ec.valide = 1
WHERE pc.id_copro = @id_copro
  AND pc.actif = 1
GROUP BY pc.numero_compte, pc.libelle, pc.type_compte, pc.classe
HAVING ABS(solde_ouverture) > 0.01
ORDER BY pc.numero_compte;

-- ----------------------------------------------------------------
-- 6) SYNTHÈSE PAR CLASSE DE COMPTES
-- ----------------------------------------------------------------

SELECT 
    pc.classe,
    CASE pc.classe
        WHEN '1' THEN 'Capitaux'
        WHEN '2' THEN 'Immobilisations'
        WHEN '4' THEN 'Tiers (Fournisseurs, Copropriétaires)'
        WHEN '5' THEN 'Financier (Banques)'
        WHEN '6' THEN 'Charges'
        WHEN '7' THEN 'Produits'
        ELSE 'Autre'
    END AS libelle_classe,
    @date_debut_exercice AS date_ouverture,
    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_ouverture
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 = @id_copro
    AND ec.date_ecriture < @date_debut_exercice  -- Tout AVANT l'ouverture
    AND ec.valide = 1
WHERE pc.id_copro = @id_copro
  AND pc.actif = 1
GROUP BY pc.classe
ORDER BY pc.classe;

-- ================================================================
-- FONCTION PHP / PROCÉDURE STOCKÉE
-- ================================================================

-- Pour automatiser dans l'application PHP, créer une fonction :
/*
function getSoldeOuverture($numeroCompte, $idCopro, $idExercice) {
    // Récupérer la date de début de l'exercice
    $sql = "SELECT debut FROM exercices WHERE id = ?";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$idExercice]);
    $dateDebut = $stmt->fetchColumn();
    
    // Calculer le solde d'ouverture (tout ce qui s'est passé AVANT)
    $sql = "
        SELECT COALESCE(SUM(le.debit - le.credit), 0) AS solde_ouverture
        FROM lignes_ecritures le
        JOIN ecritures_comptables ec ON ec.id = le.id_ecriture
        WHERE le.numero_compte = ?
          AND ec.id_copro = ?
          AND ec.date_ecriture < ?  -- Tout AVANT la date de début
          AND ec.valide = 1
    ";
    
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$numeroCompte, $idCopro, $dateDebut]);
    return $stmt->fetchColumn();
}

// Exemple d'utilisation :
// $soldeOuverture = getSoldeOuverture('512002', 1, 5);  // Exercice ID 5
// echo "Solde d'ouverture : " . number_format($soldeOuverture, 2) . " €";
*/

-- ================================================================
-- FIN DES REQUÊTES DE CALCUL
-- ================================================================

/*
PRINCIPE DES À NOUVEAUX (REPRISE DE SOLDES) :

1. Les soldes ne sont PAS des opérations comptables
2. Ils se calculent automatiquement à partir des exercices précédents
3. AUCUNE écriture comptable n'est créée

Exemple concret :
- Exercice 2024 : Compte 512002 = 1000€ au 31/12/2024
- Exercice 2025 : Compte 512002 = 1000€ au 01/01/2025 (automatique)

Le solde d'ouverture s'affiche dans les états comptables mais
n'apparaît PAS dans la table lignes_ecritures.

C'est un calcul dynamique basé sur l'historique.
*/
