-- ================================================================
-- EXEMPLE : EXERCICES AVEC DATES DIFFÉRENTES
-- ================================================================
-- Démonstration du calcul des soldes d'ouverture pour des copropriétés
-- avec des dates d'exercice différentes (exercice civil vs exercice fiscal)
-- ================================================================

-- ----------------------------------------------------------------
-- SITUATION : 3 copropriétés avec des dates différentes
-- ----------------------------------------------------------------

/*
COPRO 1 - Exercice civil (année calendaire)
  Exercice 2023 : 01/01/2023 → 31/12/2023
  Exercice 2024 : 01/01/2024 → 31/12/2024
  Exercice 2025 : 01/01/2025 → 31/12/2025

COPRO 34 - Exercice fiscal (juillet → juin)
  Exercice 2024 : 01/07/2024 → 30/06/2025
  Exercice 2025 : 01/07/2025 → 30/06/2026

COPRO 35 - Exercice décalé (septembre → août)
  Exercice 2024 : 01/09/2024 → 31/08/2025
  Exercice 2025 : 01/09/2025 → 31/08/2026
*/

-- ----------------------------------------------------------------
-- EXEMPLE 1 : Copro 1 (exercice civil)
-- ----------------------------------------------------------------

-- Données de la table exercices :
-- id=3, id_copro=1, debut='2024-01-01', fin='2024-12-31', nom='2024'
-- id=5, id_copro=1, debut='2025-01-01', fin='2025-12-31', nom='2025'

-- Calculer le solde d'ouverture du compte 512002 pour l'exercice 2025
SET @id_copro = 1;
SET @id_exercice_courant = 5;  -- Exercice 2025
SET @numero_compte = '512002';

-- Récupérer la date de début de l'exercice 2025
SELECT debut INTO @date_debut FROM exercices WHERE id = @id_exercice_courant;
-- Résultat : @date_debut = '2025-01-01'

-- Calculer le solde d'ouverture = tout ce qui s'est passé AVANT le 01/01/2025
SELECT 
    @numero_compte AS compte,
    @date_debut 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
  AND ec.id_copro = @id_copro
  AND ec.date_ecriture < @date_debut  -- < 2025-01-01
  AND ec.valide = 1;

/*
Résultat attendu :
  compte      | date_ouverture | solde_ouverture
  512002      | 2025-01-01     | 1000.00
  
Ce solde de 1000€ = cumul de toutes les opérations de 2023 + 2024
*/

-- ----------------------------------------------------------------
-- EXEMPLE 2 : Copro 34 (exercice fiscal juillet-juin)
-- ----------------------------------------------------------------

-- Données de la table exercices :
-- id=21, id_copro=34, debut='2024-07-01', fin='2025-06-30', nom='2024'
-- id=20, id_copro=34, debut='2025-07-01', fin='2026-06-30', nom='2025'

SET @id_copro = 34;
SET @id_exercice_courant = 20;  -- Exercice 2025 (01/07/2025 → 30/06/2026)
SET @numero_compte = '512001';

SELECT debut INTO @date_debut FROM exercices WHERE id = @id_exercice_courant;
-- Résultat : @date_debut = '2025-07-01'

-- Calculer le solde d'ouverture = tout ce qui s'est passé AVANT le 01/07/2025
SELECT 
    @numero_compte AS compte,
    @date_debut 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
  AND ec.id_copro = @id_copro
  AND ec.date_ecriture < @date_debut  -- < 2025-07-01
  AND ec.valide = 1;

/*
Résultat attendu :
  compte      | date_ouverture | solde_ouverture
  512001      | 2025-07-01     | 2500.00
  
Ce solde inclut :
- Toutes les opérations de l'exercice 2024 (01/07/2024 → 30/06/2025)
- Toutes les opérations des exercices précédents
*/

-- ----------------------------------------------------------------
-- EXEMPLE 3 : Comparaison des soldes à différentes dates
-- ----------------------------------------------------------------

-- Voir l'évolution du solde du compte 512002 (copro 1) :

-- Solde au 31/12/2023 (fin exercice 2023)
SELECT COALESCE(SUM(le.debit - le.credit), 0) AS solde_31_12_2023
FROM lignes_ecritures le
JOIN ecritures_comptables ec ON ec.id = le.id_ecriture
WHERE le.numero_compte = '512002'
  AND ec.id_copro = 1
  AND ec.date_ecriture < '2024-01-01'
  AND ec.valide = 1;

-- Solde au 31/12/2024 (fin exercice 2024)
SELECT COALESCE(SUM(le.debit - le.credit), 0) AS solde_31_12_2024
FROM lignes_ecritures le
JOIN ecritures_comptables ec ON ec.id = le.id_ecriture
WHERE le.numero_compte = '512002'
  AND ec.id_copro = 1
  AND ec.date_ecriture < '2025-01-01'
  AND ec.valide = 1;

-- Solde au 30/06/2025 (milieu d'exercice pour copro 1, mais fin d'exercice pour copro 34)
SELECT COALESCE(SUM(le.debit - le.credit), 0) AS solde_30_06_2025
FROM lignes_ecritures le
JOIN ecritures_comptables ec ON ec.id = le.id_ecriture
WHERE le.numero_compte = '512002'
  AND ec.id_copro = 1
  AND ec.date_ecriture < '2025-07-01'
  AND ec.valide = 1;

-- ----------------------------------------------------------------
-- EXEMPLE 4 : Fonction PHP universelle
-- ----------------------------------------------------------------

/*
Cette fonction fonctionne pour TOUTES les copropriétés,
quelle que soit la date de début/fin d'exercice :

function getSoldeOuverture($numeroCompte, $idCopro, $idExercice) {
    // 1. Récupérer la date de début de l'exercice
    $sql = "SELECT debut FROM exercices WHERE id = :id_exercice";
    $stmt = $pdo->prepare($sql);
    $stmt->execute(['id_exercice' => $idExercice]);
    $dateDebut = $stmt->fetchColumn();
    
    // 2. Calculer le solde à cette date
    $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 = :numero_compte
          AND ec.id_copro = :id_copro
          AND ec.date_ecriture < :date_debut
          AND ec.valide = 1
    ";
    
    $stmt = $pdo->prepare($sql);
    $stmt->execute([
        'numero_compte' => $numeroCompte,
        'id_copro' => $idCopro,
        'date_debut' => $dateDebut
    ]);
    
    return $stmt->fetchColumn();
}

// Exemples d'utilisation :

// Copro 1 - Exercice 2025 (01/01/2025)
$solde1 = getSoldeOuverture('512002', 1, 5);
echo "Copro 1 - Solde au 01/01/2025 : " . number_format($solde1, 2) . " €\n";

// Copro 34 - Exercice 2025 (01/07/2025)
$solde34 = getSoldeOuverture('512001', 34, 20);
echo "Copro 34 - Solde au 01/07/2025 : " . number_format($solde34, 2) . " €\n";

// Copro 35 - Exercice 2025 (01/09/2025)
$solde35 = getSoldeOuverture('512003', 35, 22);
echo "Copro 35 - Solde au 01/09/2025 : " . number_format($solde35, 2) . " €\n";

// Tous les calculs sont corrects car ils se basent sur la date réelle de début
// stockée dans la table exercices, pas sur une date fixe !
*/

-- ----------------------------------------------------------------
-- EXEMPLE 5 : Afficher tous les soldes d'ouverture avec leurs dates
-- ----------------------------------------------------------------

-- Vue complète avec les dates de début d'exercice
SELECT 
    ba.id_copro,
    ex.nom AS exercice,
    ex.debut AS date_ouverture,
    ex.fin AS date_cloture,
    ba.nom_banque,
    ba.numero_compte_512,
    COALESCE(SUM(le.debit - le.credit), 0) AS solde_ouverture
FROM bank_account ba
JOIN exercices ex ON ex.id_copro = ba.id_copro
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 = ba.id_copro
    AND ec.date_ecriture < ex.debut  -- Solde AVANT le début de l'exercice
    AND ec.valide = 1
WHERE ba.numero_compte_512 IS NOT NULL
  AND ex.cloture = 0  -- Exercice en cours
GROUP BY ba.id_copro, ex.nom, ex.debut, ex.fin, ba.nom_banque, ba.numero_compte_512
ORDER BY ba.id_copro, ba.numero_compte_512;

/*
Résultat attendu :
id_copro | exercice | date_ouverture | date_cloture | nom_banque        | numero_compte_512 | solde_ouverture
---------|----------|----------------|--------------|-------------------|-------------------|----------------
1        | 2025     | 2025-01-01     | 2025-12-31   | Crédit Agricole   | 512002            | 1000.00
34       | 2025     | 2025-07-01     | 2026-06-30   | BNP Paribas       | 512001            | 2500.00
35       | 2025     | 2025-09-01     | 2026-08-31   | Société Générale  | 512003            | 3200.00

Chaque copropriété a :
- Sa propre date d'ouverture
- Son propre solde calculé à cette date
- Sans AUCUNE écriture comptable créée
*/

-- ================================================================
-- CONCLUSION
-- ================================================================

/*
✅ AVANTAGES de cette méthode :

1. Universel : Fonctionne pour TOUTES les dates d'exercice
2. Automatique : Pas besoin de saisir les reprises manuellement
3. Exact : Le calcul se base sur la date réelle dans la table exercices
4. Propre : Aucune pollution du compte 580000
5. Flexible : Change automatiquement si on modifie les dates d'exercice

❌ ERREUR À ÉVITER :

Ne JAMAIS coder en dur des dates comme :
  - '2025-01-01' 
  - '2024-12-31'
  
Toujours récupérer dynamiquement depuis :
  - exercices.debut
  - exercices.fin
*/
