-- ============================================================================
-- PTA V7.5 - Quota PTA sur l'année civile
-- MySQL 8+
-- À exécuter après la V7 / V7.4.
-- ============================================================================
-- Règle métier :
--   * 1607 h à 100 % sont planifiées sur l'année civile : 01/01 -> 31/12.
--   * la date de début du contrat reste une information RH et ne décale plus
--     la période annuelle du PTA ;
--   * un agent peut participer à des équipes périscolaires ET extrascolaires.
--     Aucun type périscolaire/extrascolaire n'est porté par l'agent.
--
-- Cette migration ne supprime pas les anciens PTA construits sur une période
-- contractuelle. Elle crée, si besoin, une ligne civile équivalente afin de
-- conserver l'historique et d'éviter une migration destructive.
-- ============================================================================

START TRANSACTION;

UPDATE quota_agent_annuel
SET commentaire = 'Quota PTA de référence - année civile'
WHERE commentaire IS NULL
   OR commentaire LIKE '%contrat%'
   OR commentaire LIKE '%période%';

-- Recrée une ligne PTA civile à partir des anciennes lignes non civiles.
-- INSERT IGNORE évite tout conflit si la ligne annuelle existe déjà.
INSERT IGNORE INTO pta_annuel (
    id_agent,
    date_debut,
    date_fin,
    quotite_travail,
    quota_reference_minutes,
    quota_cible_minutes,
    enveloppe_formation_minutes,
    conges_annuels_jours_cible,
    jours_fractionnement_cible,
    statut,
    commentaire,
    date_validation
)
SELECT
    pa.id_agent,
    STR_TO_DATE(CONCAT(YEAR(pa.date_debut), '-01-01'), '%Y-%m-%d') AS date_debut,
    STR_TO_DATE(CONCAT(YEAR(pa.date_debut), '-12-31'), '%Y-%m-%d') AS date_fin,
    pa.quotite_travail,
    pa.quota_reference_minutes,
    pa.quota_cible_minutes,
    pa.enveloppe_formation_minutes,
    pa.conges_annuels_jours_cible,
    pa.jours_fractionnement_cible,
    pa.statut,
    CONCAT(
        COALESCE(NULLIF(pa.commentaire, ''), ''),
        CASE WHEN COALESCE(NULLIF(pa.commentaire, ''), '') = '' THEN '' ELSE ' - ' END,
        'Période convertie en année civile par migration V7.5'
    ),
    pa.date_validation
FROM pta_annuel pa
WHERE pa.date_debut <> STR_TO_DATE(CONCAT(YEAR(pa.date_debut), '-01-01'), '%Y-%m-%d')
   OR pa.date_fin <> STR_TO_DATE(CONCAT(YEAR(pa.date_debut), '-12-31'), '%Y-%m-%d');

-- La vue de synthèse ne présente désormais que les PTA civils.
CREATE OR REPLACE VIEW v_pta_annuel_synthese AS
SELECT
    pa.id_pta,
    pa.id_agent,
    a.matricule,
    a.nom,
    a.prenom,
    po.code AS poste_code,
    po.libelle AS poste_libelle,
    a.type_contrat,
    pa.date_debut,
    pa.date_fin,
    pa.quotite_travail,
    pa.quota_cible_minutes,
    COALESCE(SUM(CASE WHEN mp.compte_dans_quota = TRUE THEN TIMESTAMPDIFF(MINUTE, CONCAT(ch.date_jour, ' ', ch.heure_debut), CONCAT(ch.date_jour, ' ', ch.heure_fin)) ELSE 0 END), 0) AS minutes_decomptees,
    pa.quota_cible_minutes - COALESCE(SUM(CASE WHEN mp.compte_dans_quota = TRUE THEN TIMESTAMPDIFF(MINUTE, CONCAT(ch.date_jour, ' ', ch.heure_debut), CONCAT(ch.date_jour, ' ', ch.heure_fin)) ELSE 0 END), 0) AS minutes_restantes,
    pa.statut
FROM pta_annuel pa
JOIN agent a ON a.id_agent = pa.id_agent
LEFT JOIN poste_agent po ON po.id_poste = a.id_poste
LEFT JOIN planning p ON p.id_agent = pa.id_agent
LEFT JOIN creneau_horaire ch
    ON ch.id_planning = p.id_planning
   AND ch.date_jour BETWEEN pa.date_debut AND pa.date_fin
LEFT JOIN motif_planning mp ON mp.id_motif = ch.id_motif
WHERE pa.date_debut = STR_TO_DATE(CONCAT(YEAR(pa.date_debut), '-01-01'), '%Y-%m-%d')
  AND pa.date_fin = STR_TO_DATE(CONCAT(YEAR(pa.date_debut), '-12-31'), '%Y-%m-%d')
GROUP BY pa.id_pta, pa.id_agent, a.matricule, a.nom, a.prenom, po.code, po.libelle,
         a.type_contrat, pa.date_debut, pa.date_fin, pa.quotite_travail,
         pa.quota_cible_minutes, pa.statut;

COMMIT;
