-- Migration: Insertion FRAIS_PRO pour les calculs qui ne la contiennent pas
-- Date: 2026-02-10

IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'RsCalcul')
BEGIN
    PRINT 'Table RsCalcul non trouvée - migration ignorée';
    RETURN;
END

IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'FraisProfessionnels')
BEGIN
    PRINT 'Table FraisProfessionnels non trouvée - migration ignorée';
    RETURN;
END

;WITH
    BaseCalcul AS (
        SELECT
            R.id_calcul,
            R.Matricule,
            R.base as base_mensuelle,
            L.jours_declare,
            -- Salaire mensuel théorique = (SBI / jours) * 26
            CASE
                WHEN L.jours_declare > 0 THEN R.base / L.jours_declare * 26.0
                ELSE R.base
            END as salaire_theorique,
            ISNULL(fp.taux, 0) as taux,
            ISNULL(fp.Plafond, 0) as Plafond,
            -- Calcul des frais pro sur salaire théorique
            CASE
                WHEN fp.taux IS NULL THEN 0
                WHEN L.jours_declare = 0 THEN 0
                WHEN ((R.base / L.jours_declare * 26.0) * fp.taux / 100) > fp.Plafond THEN fp.Plafond
                ELSE (R.base / L.jours_declare * 26.0) * fp.taux / 100
            END as frais_pro_brut,
            -- Frais pro mensuel = frais_pro_brut proratisé selon jours travaillés
            CASE
                WHEN fp.taux IS NULL THEN 0
                WHEN L.jours_declare = 0 THEN 0
                WHEN ((R.base / L.jours_declare * 26.0) * fp.taux / 100) > fp.Plafond
                    THEN fp.Plafond * L.jours_declare / 26.0
                ELSE (R.base / L.jours_declare * 26.0) * fp.taux / 100 * L.jours_declare / 26.0
            END as frais_pro_mensuel
        FROM RsCalcul R
            JOIN lcalcule L ON R.Matricule = L.Matricule AND R.id_calcul = L.id_calcul
            JOIN Calcul C ON R.id_calcul = C.id_calcul
            LEFT JOIN FraisProfessionnels fp ON
                CASE
                    WHEN L.jours_declare > 0 THEN R.base / L.jours_declare * 26.0
                    ELSE R.base
                END BETWEEN fp.Tranche1 AND fp.Tranche2
        WHERE R.Rubrique = '300'
            AND C.Annee >= 2023
            -- Exclure les calculs qui ont déjà FRAIS_PRO pour ce matricule
            AND NOT EXISTS (
                SELECT 1 FROM RsCalcul R2
                WHERE R2.id_calcul = R.id_calcul
                AND R2.Matricule = R.Matricule
                AND R2.Rubrique = 'FRAIS_PRO'
            )
    )
INSERT INTO RsCalcul
    (id_calcul, Matricule, Rubrique, Base, taux, Gain, Retenu, TauxPatronal, MontantPatronal, DetailCalcul)
SELECT
    B.id_calcul,
    B.Matricule,
    'FRAIS_PRO',
    B.frais_pro_mensuel,
    0, 0, 0, 0, 0,
    CONCAT(
        N'[MIGRATION] SBI=', FORMAT(B.base_mensuelle,'N2'),
        N' / ', B.jours_declare, N' × 26',
        N' = ', FORMAT(B.salaire_theorique,'N2'),
        N' × ', FORMAT(B.taux,'N2'), N'%',
        N' = ', FORMAT(B.frais_pro_brut,'N2'),
        IIF(B.frais_pro_brut >= B.Plafond AND B.Plafond > 0, N' (plafonné)', N''),
        N' × ', B.jours_declare, N'/26',
        N' = ', FORMAT(B.frais_pro_mensuel,'N2')
    )
FROM BaseCalcul B;

PRINT CONCAT('Lignes FRAIS_PRO insérées: ', @@ROWCOUNT);
