return: text
lang: plpgsql
src: |
  DECLARE
        min_month_to_get numeric;
        closed_payroll_month numeric;
        max_month_to_get numeric;
    BEGIN
    -- Date la plus ancienne à récupérer de la paie
    min_month_to_get = (SELECT MIN(mois_paie) FROM rh.p_historique_paie);
  
    -- Date la plus récente à récupérer de la paie. Dernière paie cloturée
    closed_payroll_month = (SELECT MAX(mois_paie) FROM rh.p_historique_paie);
  
    -- Pour l'instant, le calcul ne se fait que jusqu'au dernier mois de paie cloturé
    max_month_to_get = closed_payroll_month;
  
    -- Vidage des tables
    TRUNCATE rh.p_taux_horaires_mensuels;
    TRUNCATE rh.p_croisement_paie_planning;
    TRUNCATE rh.p_sommes_mensuelles_ventilees_paie;
    TRUNCATE rh.p_sommes_mensuelles_ventilees_planning;
    TRUNCATE rh.p_presence_salaries;
    TRUNCATE rh.t_periode_paie;
  
    -- Génération des périodes de paie
    DROP TABLE IF EXISTS periode_paie
    ;
  
    CREATE TEMP TABLE periode_paie AS
    SELECT 
        date AS date_debut,
        ((date + interval '1 MONTH') - interval '1 DAY')::date AS date_fin,
        (to_char(((date + interval '1 MONTH') - interval '1 DAY')::date, 'YYYYMM'))::int AS mois_paie
        FROM base.p_calendrier
    WHERE 
        date BETWEEN (SELECT MIN(p_historique_paie.date_debut) FROM rh.p_historique_paie) AND (SELECT MAX(p_historique_paie.date_fin) FROM rh.p_historique_paie)
        AND date_part('DAY', date) = (SELECT valeur::numeric FROM rh.t_divers WHERE code = 'CPP_JOUR_DEBUT_MOIS_PAIE') 
    ORDER BY 1
    ;
  
    INSERT INTO rh.t_periode_paie (
        date_debut,
        date_fin,
        mois_paie
    )
    SELECT
        date_debut,
        date_fin,
        mois_paie
    FROM periode_paie
    ;
    
    -- Récupération des salariés présents en paie par mois
    DROP TABLE IF EXISTS presence_histo_paie
    ;
  
    CREATE TEMP TABLE presence_histo_paie AS 
        SELECT 
            p_historique_paie.salarie_id,
            t_periode_paie.mois_paie
        FROM rh.p_historique_paie
        JOIN rh.t_periode_paie ON t_periode_paie.mois_paie = p_historique_paie.mois_paie
  	  GROUP BY 1,2
    ;
  
    -- Récupération des salariés présents au planning par mois
    DROP TABLE IF EXISTS presence_mouvements_planning
    ;
  
    CREATE TEMP TABLE presence_mouvements_planning AS
        SELECT
            p_planning_mouvement.salarie_id,
            t_periode_paie.mois_paie
        FROM rh.p_planning_mouvement
        JOIN rh.t_periode_paie ON true
        WHERE p_planning_mouvement.date BETWEEN t_periode_paie.date_debut AND t_periode_paie.date_fin
  	  GROUP BY 1,2
    ;
  
    -- Génération de la présence des salariés dans la paie et dans le planning par mois
    DROP TABLE IF EXISTS presence_salaries
    ;
  
    CREATE TEMP TABLE presence_salaries AS 
      SELECT 
          p_salaries.oid AS salarie_id,
          t_periode_paie.mois_paie,
          COUNT(presence_histo_paie.salarie_id) > 0 AS present_paie,
          COUNT(presence_mouvements_planning.salarie_id) > 0 AS present_planning,
          CASE WHEN p_salaries.matricule LIKE 'INTERIM-%' THEN true ELSE false END AS est_interimaire
      FROM rh.p_salaries
      JOIN rh.t_periode_paie ON true
      LEFT JOIN presence_histo_paie ON
          presence_histo_paie.salarie_id = p_salaries.oid AND
          presence_histo_paie.mois_paie = t_periode_paie.mois_paie
      LEFT JOIN presence_mouvements_planning ON
          presence_mouvements_planning.salarie_id = p_salaries.oid AND
          presence_mouvements_planning.mois_paie = t_periode_paie.mois_paie
      GROUP BY 1,2
      ORDER BY 1,2
    ;
      
  	
    INSERT INTO rh.p_presence_salaries(
  	salarie_id, 
      mois_paie, 
      present_paie, 
      present_planning, 
      est_interimaire
    )
  	SELECT 
        salarie_id, 
        mois_paie, 
        present_paie, 
        present_planning, 
        est_interimaire
    FROM presence_salaries
    ;
    
    ANALYZE rh.p_presence_salaries
    ;
    
    -- Aggrégation par salarié, mois, établissement, service et qualification des différents indicateurs de paie (montant_brut, montant_masse_salariale, etc)
    DROP TABLE IF EXISTS sommes_mensuelles_ventilees_paie
    ;
  
    CREATE TEMP TABLE sommes_mensuelles_ventilees_paie AS
     SELECT 
        p_historique_paie.salarie_id,
        p_historique_paie.mois_paie,
        p_historique_paie.etablissement_id,
        t_services.oid AS paie_service_id,
        t_services.code AS paie_service_code,
        t_services.texte AS paie_service_texte,
        t_qualifications.oid AS paie_qualification_id,
        t_qualifications.code AS paie_qualification_code,
        t_qualifications.texte AS paie_qualification_texte,
        sum(p_historique_paie.heure_contrat) AS heure_contrat,
        sum(p_historique_paie.heure_payee) AS heure_payee,
        sum(p_historique_paie.heure_travaillee) AS heure_travaillee,
        sum(p_historique_paie.montant_brut) AS montant_brut,
        sum(p_historique_paie.montant_masse_salariale) AS montant_masse_salariale,
        sum(p_historique_paie.montant_cotisation_patronale) AS montant_cotisation_patronale,
        sum(p_historique_paie.montant_provisions) AS montant_provisions,
        sum(p_historique_paie.montant_masse_salariale_provisionnee) AS montant_masse_salariale_provisionnee,
        sum(base.cti_division(p_historique_paie.heure_contrat * p_profil_contrat_mois.ratio, t_etablissements.base_calcul_etp)) AS equivalent_temps_plein
       FROM rh.p_historique_paie
         JOIN rh.p_contrats_mois ON p_contrats_mois.oid = p_historique_paie.contrat_mois_id
         JOIN rh.p_profils ON p_profils.oid = p_contrats_mois.profil_id
         JOIN rh.p_profil_contrat_mois ON p_profil_contrat_mois.contrat_mois_id = p_contrats_mois.oid AND p_profil_contrat_mois.profil_id = p_contrats_mois.profil_id
         JOIN rh.t_etablissements ON t_etablissements.oid = p_historique_paie.etablissement_id
         JOIN rh.t_qualifications ON t_qualifications.oid = p_profils.qualification_id
         JOIN rh.t_services ON t_services.oid = p_profils.service_id
      WHERE p_historique_paie.mois_paie BETWEEN min_month_to_get AND closed_payroll_month
      GROUP BY p_historique_paie.salarie_id, p_historique_paie.mois_paie, p_historique_paie.etablissement_id, t_services.oid, t_qualifications.oid
    ;
  
    CREATE INDEX sommes_mensuelles_ventilees_paie_i1 ON sommes_mensuelles_ventilees_paie USING btree(salarie_id)
    ;
  
    CREATE INDEX sommes_mensuelles_ventilees_paie_i2 ON sommes_mensuelles_ventilees_paie USING btree(mois_paie)
    ;
  
    CREATE INDEX sommes_mensuelles_ventilees_paie_i3 ON sommes_mensuelles_ventilees_paie USING btree(etablissement_id)
    ;
  
    ANALYZE sommes_mensuelles_ventilees_paie
    ;
  
    -- Aggrégation par salarié et mois des différents indicateurs de paie (montant_brut, montant_masse_salariale, etc)
    DROP TABLE IF EXISTS sommes_mensuelles_paie
    ;
  
    CREATE TEMP TABLE sommes_mensuelles_paie AS
        SELECT
            salarie_id,
            mois_paie,
            sum(heure_contrat) AS heure_contrat,
            sum(heure_payee) AS heure_payee,
            sum(heure_travaillee) AS heure_travaillee,
            sum(montant_brut) AS montant_brut,
            sum(montant_masse_salariale) AS montant_masse_salariale,
            sum(montant_cotisation_patronale) AS montant_cotisation_patronale,
            sum(montant_provisions) AS montant_provisions,
            sum(montant_masse_salariale_provisionnee) AS montant_masse_salariale_provisionnee,
            sum(equivalent_temps_plein) AS equivalent_temps_plein
        FROM sommes_mensuelles_ventilees_paie
        GROUP BY 1,2
    ;
  
    CREATE INDEX sommes_mensuelles_paie_i1 ON sommes_mensuelles_paie USING btree(salarie_id)
    ;
  
    CREATE INDEX sommes_mensuelles_paie_i2 ON sommes_mensuelles_paie USING btree(mois_paie)
    ;
  
    ANALYZE sommes_mensuelles_paie
    ;
  
    -- Aggrégation par salarié, mois, établissement, service et qualification des différents indicateurs de planning (les 3 principaux indicateurs de temps : temps_du_initial, temps_du, temps_valide)
    DROP TABLE IF EXISTS sommes_mensuelles_ventilees_planning
    ;
  
    CREATE TEMP TABLE sommes_mensuelles_ventilees_planning AS
     SELECT 
        p_planning_mouvement.salarie_id,
        t_periode_paie.mois_paie,
        p_planning_mouvement.etablissement_id, 
        t_planning_service.oid AS planning_service_id,
        t_planning_service.code AS planning_service_code,
        t_planning_service.texte AS planning_service_texte,
        t_planning_qualification.oid AS planning_qualification_id,
        t_planning_qualification.code AS planning_qualification_code,
        t_planning_qualification.texte AS planning_qualification_texte,
        sum(p_planning_mouvement.temps_du_initial) AS temps_du_initial,
        sum(p_planning_mouvement.temps_du) AS temps_du,
        sum(p_planning_mouvement.temps_valide) AS temps_valide
       FROM rh.p_planning_mouvement
         JOIN rh.t_periode_paie ON base.cti_overlaps(t_periode_paie.date_debut, t_periode_paie.date_fin, p_planning_mouvement.date, p_planning_mouvement.date)
         LEFT JOIN rh.t_planning_service ON t_planning_service.oid = p_planning_mouvement.service_id
         LEFT JOIN rh.t_planning_qualification ON t_planning_qualification.oid = p_planning_mouvement.qualification_id
      WHERE p_planning_mouvement.mois BETWEEN min_month_to_get AND closed_payroll_month
      GROUP BY p_planning_mouvement.salarie_id, t_periode_paie.mois_paie, p_planning_mouvement.etablissement_id, t_planning_service.oid, t_planning_service.code, t_planning_service.texte, t_planning_qualification.oid, t_planning_qualification.code, t_planning_qualification.texte
    ;
  
    CREATE INDEX sommes_mensuelles_ventilees_planning_i1 ON sommes_mensuelles_ventilees_planning USING btree(salarie_id)
    ;
  
    CREATE INDEX sommes_mensuelles_ventilees_planning_i2 ON sommes_mensuelles_ventilees_planning USING btree(mois_paie)
    ;
  
    CREATE INDEX sommes_mensuelles_ventilees_planning_i3 ON sommes_mensuelles_ventilees_planning USING btree(etablissement_id)
    ;
  
    ANALYZE sommes_mensuelles_ventilees_planning
    ;
  
    -- Aggrégation par salarié, mois et établissement des différents indicateurs de planning (les 3 principaux indicateurs de temps : temps_du_initial, temps_du, temps_valide)
    DROP TABLE IF EXISTS sommes_mensuelles_planning
    ;
  
    CREATE TEMP TABLE sommes_mensuelles_planning AS
        SELECT 
            salarie_id,
            mois_paie,
            etablissement_id,
            sum(temps_du_initial) AS temps_du_initial,
            sum(temps_du) AS temps_du,
            sum(temps_valide) AS temps_valide
        FROM sommes_mensuelles_ventilees_planning
        GROUP BY 1,2,3
    ;
  
    CREATE INDEX sommes_mensuelles_planning_i1 ON sommes_mensuelles_planning USING btree(salarie_id)
    ;
  
    CREATE INDEX sommes_mensuelles_planning_i2 ON sommes_mensuelles_planning USING btree(mois_paie)
    ;
  
    CREATE INDEX sommes_mensuelles_planning_i3 ON sommes_mensuelles_planning USING btree(etablissement_id)
    ;
  
    ANALYZE sommes_mensuelles_planning
    ;
    
    INSERT INTO rh.p_sommes_mensuelles_ventilees_paie (
        salarie_id,
        mois_paie,
        etablissement_id,
        paie_service_id,
        paie_service_code,
        paie_service_texte,
        paie_qualification_id,
        paie_qualification_code,
        paie_qualification_texte,
        heure_contrat,
        heure_payee,
        heure_travaillee,
        montant_brut,
        montant_masse_salariale,
        montant_cotisation_patronale,
        montant_provisions,
        montant_masse_salariale_provisionnee,
        equivalent_temps_plein
    )
    SELECT 
        salarie_id,
        mois_paie,
        etablissement_id,
        paie_service_id,
        paie_service_code,
        paie_service_texte,
        paie_qualification_id,
        paie_qualification_code,
        paie_qualification_texte,
        heure_contrat,
        heure_payee,
        heure_travaillee,
        montant_brut,
        montant_masse_salariale,
        montant_cotisation_patronale,
        montant_provisions,
        montant_masse_salariale_provisionnee,
        equivalent_temps_plein
    FROM sommes_mensuelles_ventilees_paie
    ;
  
    INSERT INTO rh.p_sommes_mensuelles_ventilees_planning (
        salarie_id,
        mois_paie,
        etablissement_id,
        planning_service_id,
        planning_service_code,
        planning_service_texte,
        planning_qualification_id,
        planning_qualification_code,
        planning_qualification_texte,
        temps_du_initial,
        temps_du,
        temps_valide
    )
    SELECT 
        salarie_id,
        mois_paie,
        etablissement_id,
        planning_service_id,
        planning_service_code,
        planning_service_texte,
        planning_qualification_id,
        planning_qualification_code,
        planning_qualification_texte,
        temps_du_initial,
        temps_du,
        temps_valide
    FROM sommes_mensuelles_ventilees_planning
    ;
    
    -- Calcul du taux horaire mensuel pour chaque salarié
    -- En rapport les différents indicateurs de paie (montant_brut, montant_masse_salariale, etc) au différents indicateur de planning (les 3 principaux indicateurs de temps : temps_du_initial, temps_du, temps_valide)
    DROP TABLE IF EXISTS taux_horaires_mensuels
    ;
  
    CREATE TEMP TABLE taux_horaires_mensuels AS
     SELECT sommes_mensuelles_planning.salarie_id,
        sommes_mensuelles_planning.mois_paie,
        sommes_mensuelles_planning.temps_du_initial,
        sommes_mensuelles_planning.temps_du,
        sommes_mensuelles_planning.temps_valide,
        sommes_mensuelles_paie.heure_contrat,
        base.cti_division(sommes_mensuelles_paie.heure_contrat, sommes_mensuelles_planning.temps_du_initial) AS taux_horaire_heure_contrat_temps_du_initial,
        base.cti_division(sommes_mensuelles_paie.heure_contrat, sommes_mensuelles_planning.temps_du) AS taux_horaire_heure_contrat_temps_du,
        base.cti_division(sommes_mensuelles_paie.heure_contrat, sommes_mensuelles_planning.temps_valide) AS taux_horaire_heure_contrat_temps_valide,
        sommes_mensuelles_paie.heure_payee,
        base.cti_division(sommes_mensuelles_paie.heure_payee, sommes_mensuelles_planning.temps_du_initial) AS taux_horaire_heure_payee_temps_du_initial,
        base.cti_division(sommes_mensuelles_paie.heure_payee, sommes_mensuelles_planning.temps_du) AS taux_horaire_heure_payee_temps_du,
        base.cti_division(sommes_mensuelles_paie.heure_payee, sommes_mensuelles_planning.temps_valide) AS taux_horaire_heure_payee_temps_valide,
        sommes_mensuelles_paie.heure_travaillee,
        base.cti_division(sommes_mensuelles_paie.heure_travaillee, sommes_mensuelles_planning.temps_du_initial) AS taux_horaire_heure_travaillee_temps_du_initial,
        base.cti_division(sommes_mensuelles_paie.heure_travaillee, sommes_mensuelles_planning.temps_du) AS taux_horaire_heure_travaillee_temps_du,
        base.cti_division(sommes_mensuelles_paie.heure_travaillee, sommes_mensuelles_planning.temps_valide) AS taux_horaire_heure_travaillee_temps_valide,
        sommes_mensuelles_paie.montant_brut,
        base.cti_division(sommes_mensuelles_paie.montant_brut, sommes_mensuelles_planning.temps_du_initial) AS taux_horaire_montant_brut_temps_du_initial,
        base.cti_division(sommes_mensuelles_paie.montant_brut, sommes_mensuelles_planning.temps_du) AS taux_horaire_montant_brut_temps_du,
        base.cti_division(sommes_mensuelles_paie.montant_brut, sommes_mensuelles_planning.temps_valide) AS taux_horaire_montant_brut_temps_valide,
        sommes_mensuelles_paie.montant_masse_salariale,
        base.cti_division(sommes_mensuelles_paie.montant_masse_salariale, sommes_mensuelles_planning.temps_du_initial) AS taux_horaire_montant_masse_salariale_temps_du_initial,
        base.cti_division(sommes_mensuelles_paie.montant_masse_salariale, sommes_mensuelles_planning.temps_du) AS taux_horaire_montant_masse_salariale_temps_du,
        base.cti_division(sommes_mensuelles_paie.montant_masse_salariale, sommes_mensuelles_planning.temps_valide) AS taux_horaire_montant_masse_salariale_temps_valide,
        sommes_mensuelles_paie.montant_cotisation_patronale,
        base.cti_division(sommes_mensuelles_paie.montant_cotisation_patronale, sommes_mensuelles_planning.temps_du_initial) AS taux_horaire_montant_cotisation_patronale_temps_du_initial,
        base.cti_division(sommes_mensuelles_paie.montant_cotisation_patronale, sommes_mensuelles_planning.temps_du) AS taux_horaire_montant_cotisation_patronale_temps_du,
        base.cti_division(sommes_mensuelles_paie.montant_cotisation_patronale, sommes_mensuelles_planning.temps_valide) AS taux_horaire_montant_cotisation_patronale_temps_valide,
        sommes_mensuelles_paie.montant_provisions,
        base.cti_division(sommes_mensuelles_paie.montant_provisions, sommes_mensuelles_planning.temps_du_initial) AS taux_horaire_montant_provisions_temps_du_initial,
        base.cti_division(sommes_mensuelles_paie.montant_provisions, sommes_mensuelles_planning.temps_du) AS taux_horaire_montant_provisions_temps_du,
        base.cti_division(sommes_mensuelles_paie.montant_provisions, sommes_mensuelles_planning.temps_valide) AS taux_horaire_montant_provisions_temps_valide,
        sommes_mensuelles_paie.montant_masse_salariale_provisionnee,
        base.cti_division(sommes_mensuelles_paie.montant_masse_salariale_provisionnee, sommes_mensuelles_planning.temps_du_initial) AS taux_horaire_montant_masse_salariale_provisionnee_temps_du_init,
        base.cti_division(sommes_mensuelles_paie.montant_masse_salariale_provisionnee, sommes_mensuelles_planning.temps_du) AS taux_horaire_montant_masse_salariale_provisionnee_temps_du,
        base.cti_division(sommes_mensuelles_paie.montant_masse_salariale_provisionnee, sommes_mensuelles_planning.temps_valide) AS taux_horaire_montant_masse_salariale_provisionnee_temps_valide,
        sommes_mensuelles_paie.equivalent_temps_plein,
        base.cti_division(sommes_mensuelles_paie.equivalent_temps_plein, sommes_mensuelles_planning.temps_du_initial) AS taux_horaire_equivalent_temps_plein_temps_du_initial,
        base.cti_division(sommes_mensuelles_paie.equivalent_temps_plein, sommes_mensuelles_planning.temps_du) AS taux_horaire_equivalent_temps_plein_temps_du,
        base.cti_division(sommes_mensuelles_paie.equivalent_temps_plein, sommes_mensuelles_planning.temps_valide) AS taux_horaire_equivalent_temps_plein_temps_valide
       FROM rh.p_presence_salaries 
       JOIN sommes_mensuelles_planning ON 
            sommes_mensuelles_planning.salarie_id = p_presence_salaries.salarie_id AND 
            sommes_mensuelles_planning.mois_paie = p_presence_salaries.mois_paie
        JOIN sommes_mensuelles_paie ON 
            sommes_mensuelles_paie.salarie_id = p_presence_salaries.salarie_id AND 
            sommes_mensuelles_paie.mois_paie = p_presence_salaries.mois_paie
      WHERE p_presence_salaries.present_paie = true AND p_presence_salaries.present_planning = true AND p_presence_salaries.est_interimaire = false
    ;
  
    CREATE INDEX taux_horaires_mensuels_i1 ON taux_horaires_mensuels USING btree(salarie_id)
    ;
  
    CREATE INDEX taux_horaires_mensuels_i2 ON taux_horaires_mensuels USING btree(mois_paie)
    ;
  
    ANALYZE taux_horaires_mensuels
    ;
  
    INSERT INTO rh.p_taux_horaires_mensuels (
        salarie_id,
        mois_paie,
        temps_du_initial,
        temps_du,
        temps_valide,
        heure_contrat,
        taux_horaire_heure_contrat_temps_du_initial,
        taux_horaire_heure_contrat_temps_du,
        taux_horaire_heure_contrat_temps_valide,
        heure_payee,
        taux_horaire_heure_payee_temps_du_initial,
        taux_horaire_heure_payee_temps_du,
        taux_horaire_heure_payee_temps_valide,
        heure_travaillee,
        taux_horaire_heure_travaillee_temps_du_initial,
        taux_horaire_heure_travaillee_temps_du,
        taux_horaire_heure_travaillee_temps_valide,
        montant_brut,
        taux_horaire_montant_brut_temps_du_initial,
        taux_horaire_montant_brut_temps_du,
        taux_horaire_montant_brut_temps_valide,
        montant_masse_salariale,
        taux_horaire_montant_masse_salariale_temps_du_initial,
        taux_horaire_montant_masse_salariale_temps_du,
        taux_horaire_montant_masse_salariale_temps_valide,
        montant_cotisation_patronale,
        taux_horaire_montant_cotisation_patronale_temps_du_initial,
        taux_horaire_montant_cotisation_patronale_temps_du,
        taux_horaire_montant_cotisation_patronale_temps_valide,
        montant_provisions,
        taux_horaire_montant_provisions_temps_du_initial,
        taux_horaire_montant_provisions_temps_du,
        taux_horaire_montant_provisions_temps_valide,
        montant_masse_salariale_provisionnee,
        taux_horaire_montant_masse_salariale_provisionnee_temps_du_init,
        taux_horaire_montant_masse_salariale_provisionnee_temps_du,
        taux_horaire_montant_masse_salariale_provisionnee_temps_valide,
        equivalent_temps_plein,
        taux_horaire_equivalent_temps_plein_temps_du_initial,
        taux_horaire_equivalent_temps_plein_temps_du,
        taux_horaire_equivalent_temps_plein_temps_valide
    )
    SELECT 
        salarie_id,
        mois_paie,
        temps_du_initial,
        temps_du,
        temps_valide,
        heure_contrat,
        taux_horaire_heure_contrat_temps_du_initial,
        taux_horaire_heure_contrat_temps_du,
        taux_horaire_heure_contrat_temps_valide,
        heure_payee,
        taux_horaire_heure_payee_temps_du_initial,
        taux_horaire_heure_payee_temps_du,
        taux_horaire_heure_payee_temps_valide,
        heure_travaillee,
        taux_horaire_heure_travaillee_temps_du_initial,
        taux_horaire_heure_travaillee_temps_du,
        taux_horaire_heure_travaillee_temps_valide,
        montant_brut,
        taux_horaire_montant_brut_temps_du_initial,
        taux_horaire_montant_brut_temps_du,
        taux_horaire_montant_brut_temps_valide,
        montant_masse_salariale,
        taux_horaire_montant_masse_salariale_temps_du_initial,
        taux_horaire_montant_masse_salariale_temps_du,
        taux_horaire_montant_masse_salariale_temps_valide,
        montant_cotisation_patronale,
        taux_horaire_montant_cotisation_patronale_temps_du_initial,
        taux_horaire_montant_cotisation_patronale_temps_du,
        taux_horaire_montant_cotisation_patronale_temps_valide,
        montant_provisions,
        taux_horaire_montant_provisions_temps_du_initial,
        taux_horaire_montant_provisions_temps_du,
        taux_horaire_montant_provisions_temps_valide,
        montant_masse_salariale_provisionnee,
        taux_horaire_montant_masse_salariale_provisionnee_temps_du_init,
        taux_horaire_montant_masse_salariale_provisionnee_temps_du,
        taux_horaire_montant_masse_salariale_provisionnee_temps_valide,
        equivalent_temps_plein,
        taux_horaire_equivalent_temps_plein_temps_du_initial,
        taux_horaire_equivalent_temps_plein_temps_du,
        taux_horaire_equivalent_temps_plein_temps_valide
    FROM taux_horaires_mensuels
    ;
  
    -- Calcul du taux horaire mensuel moyen par service et qualification pour chaque salarié
    DROP TABLE IF EXISTS taux_horaires_mensuels_ventiles
    ;
  
    CREATE TEMP TABLE taux_horaires_mensuels_ventiles AS
        SELECT 
            p_taux_horaires_mensuels.mois_paie,
            p_sommes_mensuelles_ventilees_planning.planning_service_id,
            p_sommes_mensuelles_ventilees_planning.planning_qualification_id,
            AVG(p_taux_horaires_mensuels.temps_du_initial) AS temps_du_initial,
            AVG(p_taux_horaires_mensuels.temps_du) AS temps_du,
            AVG(p_taux_horaires_mensuels.temps_valide) AS temps_valide,
            AVG(p_taux_horaires_mensuels.heure_contrat) AS heure_contrat,
            AVG(p_taux_horaires_mensuels.taux_horaire_heure_contrat_temps_du_initial) AS taux_horaire_heure_contrat_temps_du_initial,
            AVG(p_taux_horaires_mensuels.taux_horaire_heure_contrat_temps_du) AS taux_horaire_heure_contrat_temps_du,
            AVG(p_taux_horaires_mensuels.taux_horaire_heure_contrat_temps_valide) AS taux_horaire_heure_contrat_temps_valide,
            AVG(p_taux_horaires_mensuels.heure_payee) AS heure_payee,
            AVG(p_taux_horaires_mensuels.taux_horaire_heure_payee_temps_du_initial) AS taux_horaire_heure_payee_temps_du_initial,
            AVG(p_taux_horaires_mensuels.taux_horaire_heure_payee_temps_du) AS taux_horaire_heure_payee_temps_du,
            AVG(p_taux_horaires_mensuels.taux_horaire_heure_payee_temps_valide) AS taux_horaire_heure_payee_temps_valide,
            AVG(p_taux_horaires_mensuels.heure_travaillee) AS heure_travaillee,
            AVG(p_taux_horaires_mensuels.taux_horaire_heure_travaillee_temps_du_initial) AS taux_horaire_heure_travaillee_temps_du_initial,
            AVG(p_taux_horaires_mensuels.taux_horaire_heure_travaillee_temps_du) AS taux_horaire_heure_travaillee_temps_du,
            AVG(p_taux_horaires_mensuels.taux_horaire_heure_travaillee_temps_valide) AS taux_horaire_heure_travaillee_temps_valide,
            AVG(p_taux_horaires_mensuels.montant_brut) AS montant_brut,
            AVG(p_taux_horaires_mensuels.taux_horaire_montant_brut_temps_du_initial) AS taux_horaire_montant_brut_temps_du_initial,
            AVG(p_taux_horaires_mensuels.taux_horaire_montant_brut_temps_du) AS taux_horaire_montant_brut_temps_du,
            AVG(p_taux_horaires_mensuels.taux_horaire_montant_brut_temps_valide) AS taux_horaire_montant_brut_temps_valide,
            AVG(p_taux_horaires_mensuels.montant_masse_salariale) AS montant_masse_salariale,
            AVG(p_taux_horaires_mensuels.taux_horaire_montant_masse_salariale_temps_du_initial) AS taux_horaire_montant_masse_salariale_temps_du_initial,
            AVG(p_taux_horaires_mensuels.taux_horaire_montant_masse_salariale_temps_du) AS taux_horaire_montant_masse_salariale_temps_du,
            AVG(p_taux_horaires_mensuels.taux_horaire_montant_masse_salariale_temps_valide) AS taux_horaire_montant_masse_salariale_temps_valide,
            AVG(p_taux_horaires_mensuels.montant_cotisation_patronale) AS montant_cotisation_patronale,
            AVG(p_taux_horaires_mensuels.taux_horaire_montant_cotisation_patronale_temps_du_initial) AS taux_horaire_montant_cotisation_patronale_temps_du_initial,
            AVG(p_taux_horaires_mensuels.taux_horaire_montant_cotisation_patronale_temps_du) AS taux_horaire_montant_cotisation_patronale_temps_du,
            AVG(p_taux_horaires_mensuels.taux_horaire_montant_cotisation_patronale_temps_valide) AS taux_horaire_montant_cotisation_patronale_temps_valide,
            AVG(p_taux_horaires_mensuels.montant_provisions) AS montant_provisions,
            AVG(p_taux_horaires_mensuels.taux_horaire_montant_provisions_temps_du_initial) AS taux_horaire_montant_provisions_temps_du_initial,
            AVG(p_taux_horaires_mensuels.taux_horaire_montant_provisions_temps_du) AS taux_horaire_montant_provisions_temps_du,
            AVG(p_taux_horaires_mensuels.taux_horaire_montant_provisions_temps_valide) AS taux_horaire_montant_provisions_temps_valide,
            AVG(p_taux_horaires_mensuels.montant_masse_salariale_provisionnee) AS montant_masse_salariale_provisionnee,
            AVG(p_taux_horaires_mensuels.taux_horaire_montant_masse_salariale_provisionnee_temps_du_init) AS taux_horaire_montant_masse_salariale_provisionnee_temps_du_init,
            AVG(p_taux_horaires_mensuels.taux_horaire_montant_masse_salariale_provisionnee_temps_du) AS taux_horaire_montant_masse_salariale_provisionnee_temps_du,
            AVG(p_taux_horaires_mensuels.taux_horaire_montant_masse_salariale_provisionnee_temps_valide) AS taux_horaire_montant_masse_salariale_provisionnee_temps_valide,
            AVG(p_taux_horaires_mensuels.equivalent_temps_plein) AS equivalent_temps_plein,
            AVG(p_taux_horaires_mensuels.taux_horaire_equivalent_temps_plein_temps_du_initial) AS taux_horaire_equivalent_temps_plein_temps_du_initial,
            AVG(p_taux_horaires_mensuels.taux_horaire_equivalent_temps_plein_temps_du) AS taux_horaire_equivalent_temps_plein_temps_du,
            AVG(p_taux_horaires_mensuels.taux_horaire_equivalent_temps_plein_temps_valide) AS taux_horaire_equivalent_temps_plein_temps_valide
        FROM rh.p_sommes_mensuelles_ventilees_planning
        JOIN rh.p_taux_horaires_mensuels ON 
            p_taux_horaires_mensuels.salarie_id = p_sommes_mensuelles_ventilees_planning.salarie_id AND 
            p_taux_horaires_mensuels.mois_paie = p_sommes_mensuelles_ventilees_planning.mois_paie
        GROUP BY 1,2,3
    ;
  
    -- Génération du croisement
    -- Récupération du planning quotidien de chaque salarié auquel on multiplie les différents temps par le taux horaire (précédemment calculé) du salarié
    DROP TABLE IF EXISTS croisement_paie_planning
    ;
  
    CREATE TEMP TABLE croisement_paie_planning AS
     -- Cas des salariés (présents dans la paie et dans le planning) 
     SELECT 
        p_planning_mouvement.oid AS planning_id,
        p_presence_salaries.salarie_id,
        p_planning_mouvement.date,
        t_periode_paie.mois_paie,
        p_planning_mouvement.etablissement_id,
        p_planning_mouvement.contrat_mois_id,
        'Salariés'::text AS presence_detail,
        p_planning_mouvement.temps_du_initial,
        p_planning_mouvement.temps_du,
        p_planning_mouvement.temps_valide,
        round(p_planning_mouvement.temps_du_initial * p_taux_horaires_mensuels.taux_horaire_heure_contrat_temps_du_initial, 2) AS HEUR_CONT_PROR_TEMP_DU_INIT,
        round(p_planning_mouvement.temps_du * p_taux_horaires_mensuels.taux_horaire_heure_contrat_temps_du, 2) AS HEUR_CONT_PROR_TEMP_DU,
        round(p_planning_mouvement.temps_valide * p_taux_horaires_mensuels.taux_horaire_heure_contrat_temps_valide, 2) AS HEUR_CONT_PROR_TEMP_VALI,
        round(p_planning_mouvement.temps_du_initial * p_taux_horaires_mensuels.taux_horaire_heure_payee_temps_du_initial, 2) AS HEUR_PAYE_PROR_TEMP_DU_INIT,
        round(p_planning_mouvement.temps_du * p_taux_horaires_mensuels.taux_horaire_heure_payee_temps_du, 2) AS HEUR_PAYE_PROR_TEMP_DU,
        round(p_planning_mouvement.temps_valide * p_taux_horaires_mensuels.taux_horaire_heure_payee_temps_valide, 2) AS HEUR_PAYE_PROR_TEMP_VALI,
        round(p_planning_mouvement.temps_du_initial * p_taux_horaires_mensuels.taux_horaire_heure_travaillee_temps_du_initial, 2) AS HEUR_TRAV_PROR_TEMP_DU_INIT,
        round(p_planning_mouvement.temps_du * p_taux_horaires_mensuels.taux_horaire_heure_travaillee_temps_du, 2) AS HEUR_TRAV_PROR_TEMP_DU,
        round(p_planning_mouvement.temps_valide * p_taux_horaires_mensuels.taux_horaire_heure_travaillee_temps_valide, 2) AS HEUR_TRAV_PROR_TEMP_VALI,
        round(p_planning_mouvement.temps_du_initial * p_taux_horaires_mensuels.taux_horaire_montant_brut_temps_du_initial, 2) AS MONT_BRUT_PROR_TEMP_DU_INIT,
        round(p_planning_mouvement.temps_du * p_taux_horaires_mensuels.taux_horaire_montant_brut_temps_du, 2) AS MONT_BRUT_PROR_TEMP_DU,
        round(p_planning_mouvement.temps_valide * p_taux_horaires_mensuels.taux_horaire_montant_brut_temps_valide, 2) AS MONT_BRUT_PROR_TEMP_VALI,
        round(p_planning_mouvement.temps_du_initial * p_taux_horaires_mensuels.taux_horaire_montant_masse_salariale_temps_du_initial, 2) AS MONT_MASS_SALA_PROR_TEMP_DU_INIT,
        round(p_planning_mouvement.temps_du * p_taux_horaires_mensuels.taux_horaire_montant_masse_salariale_temps_du, 2) AS MONT_MASS_SALA_PROR_TEMP_DU,
        round(p_planning_mouvement.temps_valide * p_taux_horaires_mensuels.taux_horaire_montant_masse_salariale_temps_valide, 2) AS MONT_MASS_SALA_PROR_TEMP_VALI,
        round(p_planning_mouvement.temps_du_initial * p_taux_horaires_mensuels.taux_horaire_montant_cotisation_patronale_temps_du_initial, 2) AS MONT_COTI_PATR_PROR_TEMP_DU_INIT,
        round(p_planning_mouvement.temps_du * p_taux_horaires_mensuels.taux_horaire_montant_cotisation_patronale_temps_du, 2) AS MONT_COTI_PATR_PROR_TEMP_DU,
        round(p_planning_mouvement.temps_valide * p_taux_horaires_mensuels.taux_horaire_montant_cotisation_patronale_temps_valide, 2) AS MONT_COTI_PATR_PROR_TEMP_VALI,
        round(p_planning_mouvement.temps_du_initial * p_taux_horaires_mensuels.taux_horaire_montant_provisions_temps_du_initial, 2) AS MONT_PROV_PROR_TEMP_DU_INIT,
        round(p_planning_mouvement.temps_du * p_taux_horaires_mensuels.taux_horaire_montant_provisions_temps_du, 2) AS MONT_PROV_PROR_TEMP_DU,
        round(p_planning_mouvement.temps_valide * p_taux_horaires_mensuels.taux_horaire_montant_provisions_temps_valide, 2) AS MONT_PROV_PROR_TEMP_VALI,
        round(p_planning_mouvement.temps_du_initial * p_taux_horaires_mensuels.taux_horaire_montant_masse_salariale_provisionnee_temps_du_init, 2) AS MONT_MASS_SALA_PROV_PROR_TEMP_DU_INIT,
        round(p_planning_mouvement.temps_du * p_taux_horaires_mensuels.taux_horaire_montant_masse_salariale_provisionnee_temps_du, 2) AS MONT_MASS_SALA_PROV_PROR_TEMP_DU,
        round(p_planning_mouvement.temps_valide * p_taux_horaires_mensuels.taux_horaire_montant_masse_salariale_provisionnee_temps_valide, 2) AS MONT_MASS_SALA_PROV_PROR_TEMP_VALI,
        0::numeric AS MONT_INTE_PROR_TEMP_DU_INIT,
        0::numeric AS MONT_INTE_PROR_TEMP_DU,
        0::numeric AS MONT_INTE_PROR_TEMP_VALI,
        round(p_planning_mouvement.temps_du_initial * p_taux_horaires_mensuels.taux_horaire_montant_masse_salariale_temps_du_initial, 2) AS MONT_MASS_SALA_INTE_PROR_TEMP_DU_INIT,
        round(p_planning_mouvement.temps_du * p_taux_horaires_mensuels.taux_horaire_montant_masse_salariale_temps_du, 2) AS MONT_MASS_SALA_INTE_PROR_TEMP_DU,
        round(p_planning_mouvement.temps_valide * p_taux_horaires_mensuels.taux_horaire_montant_masse_salariale_temps_valide, 2) AS MONT_MASS_SALA_INTE_PROR_TEMP_VALI,
        round(p_planning_mouvement.temps_du_initial * p_taux_horaires_mensuels.taux_horaire_montant_masse_salariale_provisionnee_temps_du_init, 2) AS MONT_MASS_SALA_PROV_INTE_PROR_TEMP_DU_INIT,
        round(p_planning_mouvement.temps_du * p_taux_horaires_mensuels.taux_horaire_montant_masse_salariale_provisionnee_temps_du, 2) AS MONT_MASS_SALA_PROV_INTE_PROR_TEMP_DU,
        round(p_planning_mouvement.temps_valide * p_taux_horaires_mensuels.taux_horaire_montant_masse_salariale_provisionnee_temps_valide, 2) AS MONT_MASS_SALA_PROV_INTE_PROR_TEMP_VALI
       FROM rh.p_presence_salaries
         JOIN rh.t_periode_paie ON 
            t_periode_paie.mois_paie = p_presence_salaries.mois_paie AND 
            t_periode_paie.mois_paie BETWEEN min_month_to_get AND closed_payroll_month
         JOIN rh.p_planning_mouvement ON 
            p_planning_mouvement.salarie_id = p_presence_salaries.salarie_id AND 
            p_planning_mouvement.date >= t_periode_paie.date_debut AND 
            p_planning_mouvement.date <= t_periode_paie.date_fin
         JOIN rh.p_taux_horaires_mensuels ON 
            p_taux_horaires_mensuels.salarie_id = p_presence_salaries.salarie_id AND 
            p_taux_horaires_mensuels.mois_paie = p_presence_salaries.mois_paie
      WHERE p_presence_salaries.present_paie = true AND p_presence_salaries.present_planning = true AND p_presence_salaries.est_interimaire = false
      ;
  
    INSERT INTO croisement_paie_planning
     -- Cas des intérimaires (présents au planning et ayant été détecté précédemment commes des intérimaires). Application du coefficient multiplicateur CPP_COEF_VALORISATION_INTERIM pour valoriser le coût de l'intérim
     SELECT 
        p_planning_mouvement.oid AS planning_id,
        p_presence_salaries.salarie_id,
        p_planning_mouvement.date,
        t_periode_paie.mois_paie,
        p_planning_mouvement.etablissement_id,
        p_planning_mouvement.contrat_mois_id AS contrat_mois_id,
        'Intérimaires'::text AS presence_detail,
        p_planning_mouvement.temps_du_initial,
        p_planning_mouvement.temps_du,
        p_planning_mouvement.temps_valide,
        round(p_planning_mouvement.temps_du_initial * taux_horaires_mensuels_ventiles.taux_horaire_heure_contrat_temps_du_initial, 2) * t_divers.valeur::numeric  AS HEUR_CONT_PROR_TEMP_DU_INIT,
        round(p_planning_mouvement.temps_du * taux_horaires_mensuels_ventiles.taux_horaire_heure_contrat_temps_du, 2) * t_divers.valeur::numeric AS HEUR_CONT_PROR_TEMP_DU,
        round(p_planning_mouvement.temps_valide * taux_horaires_mensuels_ventiles.taux_horaire_heure_contrat_temps_valide, 2) * t_divers.valeur::numeric AS HEUR_CONT_PROR_TEMP_VAL,
        round(p_planning_mouvement.temps_du_initial * taux_horaires_mensuels_ventiles.taux_horaire_heure_payee_temps_du_initial, 2) * t_divers.valeur::numeric AS HEUR_PAYE_PROR_TEMP_DU_INIT,
        round(p_planning_mouvement.temps_du * taux_horaires_mensuels_ventiles.taux_horaire_heure_payee_temps_du, 2) * t_divers.valeur::numeric AS HEUR_PAYE_PROR_TEMP_DU,
        round(p_planning_mouvement.temps_valide * taux_horaires_mensuels_ventiles.taux_horaire_heure_payee_temps_valide, 2) * t_divers.valeur::numeric AS HEUR_PAYE_PROR_TEMP_VALI,
        round(p_planning_mouvement.temps_du_initial * taux_horaires_mensuels_ventiles.taux_horaire_heure_travaillee_temps_du_initial, 2) * t_divers.valeur::numeric AS HEUR_TRAV_PROR_TEMP_DU_INIT,
        round(p_planning_mouvement.temps_du * taux_horaires_mensuels_ventiles.taux_horaire_heure_travaillee_temps_du, 2) * t_divers.valeur::numeric AS HEUR_TRAV_PROR_TEMP_DU,
        round(p_planning_mouvement.temps_valide * taux_horaires_mensuels_ventiles.taux_horaire_heure_travaillee_temps_valide, 2) * t_divers.valeur::numeric AS HEUR_TRAV_PROR_TEMP_VALI,
        0::numeric AS MONT_BRUT_PROR_TEMP_DU_INIT,
        0::numeric AS MONT_BRUT_PROR_TEMP_DU,
        0::numeric AS MONT_BRUT_PROR_TEMP_VALI,
        0::numeric AS MONT_MASS_SALA_PROR_TEMP_DU_INIT,
        0::numeric AS MONT_MASS_SALA_PROR_TEMP_DU,
        0::numeric AS MONT_MASS_SALA_PROR_TEMP_VALI,
        0::numeric AS MONT_COTI_PATR_PROR_TEMP_DU_INIT,
        0::numeric AS MONT_COTI_PATR_PROR_TEMP_DU,
        0::numeric AS MONT_COTI_PATR_PROR_TEMP_VALI,
        0::numeric AS MONT_PROV_PROR_TEMP_DU_INIT,
        0::numeric AS MONT_PROV_PROR_TEMP_DU,
        0::numeric AS MONT_PROV_PROR_TEMP_VALI,
        0::numeric AS MONT_MASS_SALA_PROV_PROR_TEMP_DU_INIT,
        0::numeric AS MONT_MASS_SALA_PROV_PROR_TEMP_DU,
        0::numeric AS MONT_MASS_SALA_PROV_PROR_TEMP_VALI,
        round(p_planning_mouvement.temps_du_initial * taux_horaires_mensuels_ventiles.taux_horaire_montant_brut_temps_du_initial, 2) * t_divers.valeur::numeric AS MONT_INTE_PROR_TEMP_DU_INIT,
        round(p_planning_mouvement.temps_du * taux_horaires_mensuels_ventiles.taux_horaire_montant_brut_temps_du, 2) * t_divers.valeur::numeric AS MONT_INTE_PROR_TEMP_DU,
        round(p_planning_mouvement.temps_valide * taux_horaires_mensuels_ventiles.taux_horaire_montant_brut_temps_valide, 2) * t_divers.valeur::numeric AS MONT_INTE_PROR_TEMP_VALI,
        round(p_planning_mouvement.temps_du_initial * taux_horaires_mensuels_ventiles.taux_horaire_montant_brut_temps_du_initial, 2) * t_divers.valeur::numeric AS MONT_MASS_SALA_INTE_PROR_TEMP_DU_INIT,
        round(p_planning_mouvement.temps_du * taux_horaires_mensuels_ventiles.taux_horaire_montant_brut_temps_du, 2) * t_divers.valeur::numeric AS MONT_MASS_SALA_INTE_PROR_TEMP_DU,
        round(p_planning_mouvement.temps_valide * taux_horaires_mensuels_ventiles.taux_horaire_montant_brut_temps_valide, 2) * t_divers.valeur::numeric AS MONT_MASS_SALA_INTE_PROR_TEMP_VALI,
        round(p_planning_mouvement.temps_du_initial * taux_horaires_mensuels_ventiles.taux_horaire_montant_masse_salariale_provisionnee_temps_du_init, 2) * t_divers.valeur::numeric AS MONT_MASS_SALA_PROV_INTE_PROR_TEMP_DU_INIT,
        round(p_planning_mouvement.temps_du * taux_horaires_mensuels_ventiles.taux_horaire_montant_masse_salariale_provisionnee_temps_du, 2) * t_divers.valeur::numeric AS MONT_MASS_SALA_PROV_INTE_PROR_TEMP_DU,
        round(p_planning_mouvement.temps_valide * taux_horaires_mensuels_ventiles.taux_horaire_montant_masse_salariale_provisionnee_temps_valide, 2) * t_divers.valeur::numeric AS MONT_MASS_SALA_PROV_INTE_PROR_TEMP_VALI
       FROM rh.p_presence_salaries
         JOIN rh.t_periode_paie ON 
            t_periode_paie.mois_paie = p_presence_salaries.mois_paie 
         JOIN rh.p_planning_mouvement ON 
            p_planning_mouvement.salarie_id = p_presence_salaries.salarie_id AND 
            p_planning_mouvement.date >= t_periode_paie.date_debut AND 
            p_planning_mouvement.date <= t_periode_paie.date_fin
         LEFT JOIN taux_horaires_mensuels_ventiles ON 
            taux_horaires_mensuels_ventiles.mois_paie = p_presence_salaries.mois_paie AND
            taux_horaires_mensuels_ventiles.planning_service_id = p_planning_mouvement.service_id AND
            taux_horaires_mensuels_ventiles.planning_qualification_id = p_planning_mouvement.qualification_id
        JOIN rh.t_divers ON t_divers.code = 'CPP_COEF_VALORISATION_INTERIM'
      WHERE p_presence_salaries.present_planning = true AND p_presence_salaries.est_interimaire = true
    ;
  
    INSERT INTO rh.p_croisement_paie_planning (
        planning_id,
        salarie_id,
        date,
        mois_paie,
        etablissement_id,
        contrat_mois_id,
        presence_detail,
        temps_du_initial,
        temps_du,
        temps_valide,
        HEUR_CONT_PROR_TEMP_DU_INIT,
        HEUR_CONT_PROR_TEMP_DU,
        HEUR_CONT_PROR_TEMP_VALI,
        HEUR_PAYE_PROR_TEMP_DU_INIT,
        HEUR_PAYE_PROR_TEMP_DU,
        HEUR_PAYE_PROR_TEMP_VALI,
        HEUR_TRAV_PROR_TEMP_DU_INIT,
        HEUR_TRAV_PROR_TEMP_DU,
        HEUR_TRAV_PROR_TEMP_VALI,
        MONT_BRUT_PROR_TEMP_DU_INIT,
        MONT_BRUT_PROR_TEMP_DU,
        MONT_BRUT_PROR_TEMP_VALI,
        MONT_MASS_SALA_PROR_TEMP_DU_INIT,
        MONT_MASS_SALA_PROR_TEMP_DU,
        MONT_MASS_SALA_PROR_TEMP_VALI,
        MONT_COTI_PATR_PROR_TEMP_DU_INIT,
        MONT_COTI_PATR_PROR_TEMP_DU,
        MONT_COTI_PATR_PROR_TEMP_VALI,
        MONT_PROV_PROR_TEMP_DU_INIT,
        MONT_PROV_PROR_TEMP_DU,
        MONT_PROV_PROR_TEMP_VALI,
        MONT_MASS_SALA_PROV_PROR_TEMP_DU_INIT,
        MONT_MASS_SALA_PROV_PROR_TEMP_DU,
        MONT_MASS_SALA_PROV_PROR_TEMP_VALI,
        MONT_INTE_PROR_TEMP_DU_INIT,
        MONT_INTE_PROR_TEMP_DU,
        MONT_INTE_PROR_TEMP_VALI,
        MONT_MASS_SALA_INTE_PROR_TEMP_DU_INIT,
        MONT_MASS_SALA_INTE_PROR_TEMP_DU,
        MONT_MASS_SALA_INTE_PROR_TEMP_VALI,
        MONT_MASS_SALA_PROV_INTE_PROR_TEMP_DU_INIT,
        MONT_MASS_SALA_PROV_INTE_PROR_TEMP_DU,
        MONT_MASS_SALA_PROV_INTE_PROR_TEMP_VALI
    )
    SELECT 
        planning_id,
        salarie_id,
        date,
        mois_paie,
        etablissement_id,
        contrat_mois_id,
        presence_detail,
        temps_du_initial,
        temps_du,
        temps_valide,
        HEUR_CONT_PROR_TEMP_DU_INIT,
        HEUR_CONT_PROR_TEMP_DU,
        HEUR_CONT_PROR_TEMP_VALI,
        HEUR_PAYE_PROR_TEMP_DU_INIT,
        HEUR_PAYE_PROR_TEMP_DU,
        HEUR_PAYE_PROR_TEMP_VALI,
        HEUR_TRAV_PROR_TEMP_DU_INIT,
        HEUR_TRAV_PROR_TEMP_DU,
        HEUR_TRAV_PROR_TEMP_VALI,
        MONT_BRUT_PROR_TEMP_DU_INIT,
        MONT_BRUT_PROR_TEMP_DU,
        MONT_BRUT_PROR_TEMP_VALI,
        MONT_MASS_SALA_PROR_TEMP_DU_INIT,
        MONT_MASS_SALA_PROR_TEMP_DU,
        MONT_MASS_SALA_PROR_TEMP_VALI,
        MONT_COTI_PATR_PROR_TEMP_DU_INIT,
        MONT_COTI_PATR_PROR_TEMP_DU,
        MONT_COTI_PATR_PROR_TEMP_VALI,
        MONT_PROV_PROR_TEMP_DU_INIT,
        MONT_PROV_PROR_TEMP_DU,
        MONT_PROV_PROR_TEMP_VALI,
        MONT_MASS_SALA_PROV_PROR_TEMP_DU_INIT,
        MONT_MASS_SALA_PROV_PROR_TEMP_DU,
        MONT_MASS_SALA_PROV_PROR_TEMP_VALI,
        MONT_INTE_PROR_TEMP_DU_INIT,
        MONT_INTE_PROR_TEMP_DU,
        MONT_INTE_PROR_TEMP_VALI,
        MONT_MASS_SALA_INTE_PROR_TEMP_DU_INIT,
        MONT_MASS_SALA_INTE_PROR_TEMP_DU,
        MONT_MASS_SALA_INTE_PROR_TEMP_VALI,
        MONT_MASS_SALA_PROV_INTE_PROR_TEMP_DU_INIT,
        MONT_MASS_SALA_PROV_INTE_PROR_TEMP_DU,
        MONT_MASS_SALA_PROV_INTE_PROR_TEMP_VALI
    FROM croisement_paie_planning
    ;
  
    ANALYZE rh.p_croisement_paie_planning
    ;
  
    RETURN 'OK';
  
  END