-- ============================================================================
-- Script SQL pour corriger les dates de paiement manquantes
-- Date: 2026-02-12
-- Description: Définir une date de paiement pour les quittances marquées 
--              comme payées mais sans date de paiement (payer_at = NULL)
-- ============================================================================

-- ÉTAPE 1 : VÉRIFICATION - Voir les quittances payées sans date
-- ----------------------------------------------------------------------------
SELECT 
    'Quittances payées sans date de paiement' as description,
    COUNT(*) as nombre
FROM quittances
WHERE is_payer = 1 
  AND payer_at IS NULL
  AND deleted_at IS NULL;

-- ÉTAPE 2 : DÉTAILS - Liste des quittances concernées
-- ----------------------------------------------------------------------------
SELECT 
    id,
    code,
    total,
    end_at as date_fin,
    is_payer,
    payer_at,
    is_penalite,
    penalite,
    created_at,
    updated_at
FROM quittances
WHERE is_payer = 1 
  AND payer_at IS NULL
  AND deleted_at IS NULL
ORDER BY end_at DESC;

-- ÉTAPE 3 : CORRECTION - Option A : Utiliser la date de mise à jour
-- ----------------------------------------------------------------------------
-- Cette requête définit payer_at = updated_at (date de dernière modification)
-- Décommentez pour exécuter :

/*
UPDATE quittances
SET payer_at = updated_at
WHERE is_payer = 1 
  AND payer_at IS NULL
  AND deleted_at IS NULL
  AND updated_at IS NOT NULL;
*/

-- ÉTAPE 4 : CORRECTION - Option B : Utiliser la date du 10 du mois (paiement à temps théorique)
-- ----------------------------------------------------------------------------
-- Cette requête définit payer_at = 10 du mois de end_at
-- Utile si on veut considérer tous les paiements comme "à temps"
-- Décommentez pour exécuter :

/*
UPDATE quittances
SET payer_at = DATE_FORMAT(end_at, '%Y-%m-10')
WHERE is_payer = 1 
  AND payer_at IS NULL
  AND deleted_at IS NULL
  AND end_at IS NOT NULL;
*/

-- ÉTAPE 5 : CORRECTION - Option C : Utiliser la date actuelle
-- ----------------------------------------------------------------------------
-- Cette requête définit payer_at = date actuelle
-- À utiliser si vous venez juste de marquer ces quittances comme payées
-- Décommentez pour exécuter :

/*
UPDATE quittances
SET payer_at = CURDATE()
WHERE is_payer = 1 
  AND payer_at IS NULL
  AND deleted_at IS NULL;
*/

-- ÉTAPE 6 : VÉRIFICATION POST-CORRECTION
-- ----------------------------------------------------------------------------
-- Vérifier qu'il ne reste plus de quittances payées sans date

SELECT 
    'Après correction' as statut,
    COUNT(*) as quittances_sans_date
FROM quittances
WHERE is_payer = 1 
  AND payer_at IS NULL
  AND deleted_at IS NULL;

-- ÉTAPE 7 : STATISTIQUES - Quittances avec date de paiement vs délai
-- ----------------------------------------------------------------------------
SELECT 
    CASE 
        WHEN payer_at IS NULL THEN 'Sans date de paiement'
        WHEN payer_at <= DATE_FORMAT(end_at, '%Y-%m-10') THEN 'Payé à temps (avant le 10)'
        ELSE 'Payé en retard (après le 10)'
    END as categorie,
    COUNT(*) as nombre,
    ROUND(AVG(total), 2) as montant_moyen
FROM quittances
WHERE is_payer = 1 
  AND deleted_at IS NULL
GROUP BY 
    CASE 
        WHEN payer_at IS NULL THEN 'Sans date de paiement'
        WHEN payer_at <= DATE_FORMAT(end_at, '%Y-%m-10') THEN 'Payé à temps (avant le 10)'
        ELSE 'Payé en retard (après le 10)'
    END;

-- ÉTAPE 8 : DÉTECTION - Quittances payées après le 10 mais sans pénalité
-- ----------------------------------------------------------------------------
-- Ces quittances ont peut-être besoin d'une pénalité

SELECT 
    id,
    code,
    total,
    payer_at,
    DATE_FORMAT(end_at, '%Y-%m-10') as date_limite,
    DATEDIFF(payer_at, DATE_FORMAT(end_at, '%Y-%m-10')) as jours_retard,
    is_penalite,
    penalite
FROM quittances
WHERE is_payer = 1 
  AND payer_at > DATE_FORMAT(end_at, '%Y-%m-10')
  AND is_penalite = 0
  AND deleted_at IS NULL
ORDER BY jours_retard DESC;

-- ============================================================================
-- RECOMMANDATIONS D'UTILISATION
-- ============================================================================
-- 
-- 1. TOUJOURS exécuter d'abord les requêtes de VÉRIFICATION (ÉTAPES 1-2)
-- 2. Choisir UNE SEULE option de correction (A, B ou C) selon votre cas :
--    
--    Option A : Si les quittances ont été modifiées récemment
--               → Utilise updated_at comme date de paiement
--    
--    Option B : Si vous voulez considérer tous les paiements comme "à temps"
--               → Utilise le 10 du mois comme date de paiement
--    
--    Option C : Si vous marquez les quittances comme payées aujourd'hui
--               → Utilise la date actuelle
-- 
-- 3. Exécuter la requête de VÉRIFICATION POST-CORRECTION (ÉTAPE 6)
-- 4. Consulter les STATISTIQUES (ÉTAPES 7-8) pour avoir une vue d'ensemble
-- 
-- ============================================================================
-- NOTES IMPORTANTES
-- ============================================================================
-- 
-- - Ces requêtes sont SÛRES car elles ne modifient que les quittances 
--   déjà marquées comme payées (is_payer = 1)
-- 
-- - Les requêtes UPDATE sont commentées par défaut (/* ... */)
--   Vous devez les décommenter pour les exécuter
-- 
-- - Faites une SAUVEGARDE de votre base de données avant toute modification :
--   mysqldump -u root -p softsys_loyer > backup_avant_correction.sql
-- 
-- - Testez d'abord sur un environnement de développement
-- 
-- ============================================================================
