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