sum(case when bl_histo_rub IN ('SALBASE', '51_PAY_METIER') then montant_sal else 0 end) as prendre_minconv from w_hst_hp group by 1,2,3,4,5,6,7,8 ; -- Suppression des rubriques 51_MAINTIEN de septembre 2017 à septembre 2018 inclu (suite à qualif. RH-Paie avec Mme SALMON). DELETE FROM w_hst_hp WHERE 1=1 AND bl_histo_rub = '51_MAINTIEN' AND mois_paie between 201709 and 201809 ; -- Suppression des rubriques SALBASE et 51_PAY_METIER lorsque le coefficient de la grille est <= 337 (suite à qualif. RH-Paie avec Mme SALMON). -- DROP TABLE IF EXISTS w_grille_eig -- ; -- CREATE TEMP TABLE w_grille_eig AS -- SELECT grialias, grilibelle, griid, 0::numeric as griparentid, gricoef -- Correction de la racine qui pointe sur elle-même et bloque la requête récursive qui suit. -- FROM prod_eig.sgrheig_grilles_convention -- where griid = 1 -- union -- SELECT grialias, grilibelle, griid, griparentid, gricoef -- FROM prod_eig.sgrheig_grilles_convention -- where griid > 1 -- ; -- DROP TABLE IF EXISTS w_grille_eig_coeff -- ; -- CREATE TEMP TABLE w_grille_eig_coeff AS -- with RECURSIVE search_graph as ( -- SELECT grialias, grilibelle, griid, griparentid, gricoef -- FROM w_grille_eig -- where griid = 1 -- UNION ALL -- SELECT o.grialias, o.grilibelle, o.griid, o.griparentid, coalesce(nullif(o.gricoef, 0), search_graph.gricoef) as gricoef -- si le coefficient n'est pas renseigné on prend celui du parent. -- FROM w_grille_eig as o -- JOIN search_graph ON search_graph.griid = o.griparentid) -- select * from search_graph -- ; -- DELETE FROM w_hst_hp -- USING prod_eig.sgrheig_contrats, w_grille_eig_coeff -- WHERE 1=1 -- AND sgrheig_contrats.ctrid = w_hst_hp.bl_histo_ctrid -- AND w_grille_eig_coeff.grialias::int = sgrheig_contrats.v_grialias::int -- AND bl_histo_rub IN ('SALBASE', '51_PAY_METIER') -- AND gricoef::int <= 337 -- ; -- WITH w_grille_eig_coeff as ( -- select cti_bul -- from w_hst_bul -- where coeff <= 328 -- ) -- DELETE FROM w_hst_hp -- USING w_grille_eig_coeff -- WHERE 1=1 -- AND w_hst_hp.cti_bul = w_grille_eig_coeff.cti_bul -- AND bl_histo_rub IN ('SALBASE', '51_PAY_METIER') -- ; WITH w_minconv as ( select cti_bul from w_hst_bul where prendre_minconv ) DELETE FROM w_hst_hp USING w_minconv WHERE 1=1 AND w_hst_hp.cti_bul = w_minconv.cti_bul AND bl_histo_rub IN ('SALBASE', '51_PAY_METIER') ; INSERT INTO rh.p_chiffrier_production(entreprise_id, etablissement_id, mois, nombre_salaries, montant_brut, nombre_heures) SELECT entreprise_id, t_etablissements.oid, to_char(date_debut, 'YYYYMM')::numeric, count(DISTINCT bl_histo_perid), sum(CASE WHEN p_brut and p_cumul THEN (CASE s_brut WHEN 0 THEN to_number(coalesce(nullif(trim(nombre::text), ''), '0'), '999999999999.9999') WHEN 1 THEN base WHEN 2 THEN taux_sal WHEN 3 THEN montant_sal WHEN 4 THEN taux_emp WHEN 5 THEN montant_emp WHEN 6 THEN montant_sal + montant_emp WHEN 7 THEN montant_sal - montant_emp WHEN 8 THEN -montant_sal + montant_emp END) ELSE 0 END * c_brut), sum(CASE WHEN p_heures_payees and p_cumul THEN (CASE s_heures_payees WHEN 0 THEN to_number(coalesce(nullif(trim(nombre::text), ''), '0'), '999999999999.9999') WHEN 1 THEN base WHEN 2 THEN taux_sal WHEN 3 THEN montant_sal WHEN 4 THEN taux_emp WHEN 5 THEN montant_emp WHEN 6 THEN montant_sal + montant_emp WHEN 7 THEN montant_sal - montant_emp WHEN 8 THEN -montant_sal + montant_emp END) ELSE 0 END * c_heures_payees) FROM w_hst_hp JOIN prod_eig.sgrheig_contrats ON true AND sgrheig_contrats.v_matpers::int = w_hst_hp.v_matpers AND sgrheig_contrats.ctrid = w_hst_hp.bl_histo_ctrid JOIN rh.t_etablissements ON t_etablissements.code_original = w_hst_hp.bl_histo_etab JOIN prod_eig.sgrheig_rubriques ON sgrheig_rubriques.rubid::int::text = w_hst_hp.bl_histo_clerub JOIN rh.t_rubriques ON t_rubriques.code_original = w_hst_hp.bl_histo_clerub WHERE 1=1 AND trim(sgrheig_contrats.v_matpers) != '' AND to_char(date_paie, 'YYYY')::int >= 2015 AND (p_cumul OR p_detail) GROUP BY 1,2,3 ; -- Ajout de la ligne chiffrier (production) à 0 pour le mois en cours si besoin. INSERT INTO rh.p_chiffrier_production (entreprise_id, etablissement_id, mois, nombre_salaries, montant_brut, nombre_heures) SELECT entreprise_id, etablissement_id, mois_paie_encours::numeric, 0,0,0 FROM w_periode, rh.p_chiffrier_production WHERE mois_paie_encours NOT IN (SELECT mois FROM rh.p_chiffrier_production GROUP BY 1) GROUP BY 1,2,3 ; ]]> on met le mois de paie en cours (et surtout pas current_date). from w_hst_contrat, w_periode group by 1 UNION ALL select v_matpers as mat, min(date_debut) as date_debut, max(greatest(date_fin, date_paie)) as date_fin from w_hst_bul group by 1 ) as subq join prod_eig.sgrheig_personnes on sgrheig_personnes.permatricule::int = subq.mat JOIN rh.t_etablissements ON peretab = t_etablissements.code_original group by 1 ; CREATE INDEX i_lim_sal_v_matpers ON w_lim_sal USING btree(v_matpers); CREATE INDEX i_lim_sal_dates ON w_lim_sal USING btree(date_debut, date_fin); DROP TABLE IF EXISTS w_evt_mois ; -- CREATE TEMP TABLE w_evt_mois AS -- select -- w_lim_sal.v_matpers, -- cti_cnt, -- contrat -- cti_bul, -- bulletin. -- p_calendrier.mois, -- min(p_calendrier.date) as date_debut, -- max(p_calendrier.date) as date_fin, -- (max(p_calendrier.date) - min(p_calendrier.date) + 1)::numeric / (base.cti_last_day(max(p_calendrier.date)) - base.cti_first_day(min(p_calendrier.date)) + 1)::numeric as ratio_temps -- from base.p_calendrier -- join w_lim_sal on p_calendrier.date between w_lim_sal.date_debut and w_lim_sal.date_fin -- left join w_hst_contrat on 1=1 -- and w_hst_contrat.mat = w_lim_sal.v_matpers -- and p_calendrier.date between w_hst_contrat.date_debut and w_hst_contrat.date_fin -- left join w_hst_bul on 1=1 -- and w_hst_bul.v_matpers = w_lim_sal.v_matpers -- and p_calendrier.date between w_hst_bul.date_debut and w_hst_bul.date_fin -- group by 1,2,3,4--5,,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38 -- having 1!=1 -- or cti_cnt is not null -- on ne conserve que les évenements ou il y a un contrat OU -- or cti_bul is not null -- un bulletin -- ; CREATE TEMP TABLE w_evt_mois AS with ValidDates as ( select v_matpers::int, date_debut::date as date from w_hst_contrat union select v_matpers::int, date_fin::date as date from w_hst_contrat union select v_matpers, date_debut::date as date from w_hst_bul union select v_matpers, date_fin::date as date from w_hst_bul ) , ValidDateRanges1 as ( select *, case when lead(date) over w = date + '1 day'::interval then false else true end as correct, (case when lead(date) over w = date + '1 day'::interval then null else (date + '1 day'::interval) end)::date as date_debut, (case when lead(date) over w = date + '1 day'::interval then null else (lead(date) over w - '1 day'::interval) end)::date as date_fin from ValidDates window w as (partition by v_matpers order by Date) ) , ValidDateRanges as ( select v_matpers, date_debut as ValidFrom, date_fin as ValidTo from ValidDateRanges1 where correct union select v_matpers, date, date from ValidDates ) , detail as ( select E.v_matpers, OU.cti_cnt, -- L.cti_bul, null::text as cti_bul, D.ValidFrom, D.ValidTo, e.date_fin as max_date from w_lim_sal E join ValidDateRanges D on E.v_matpers::int=D.v_matpers::int and base.cti_overlaps(E.date_debut::date, E.date_fin::date, D.ValidFrom ,D.ValidTo ) left join w_hst_contrat OU on true and OU.v_matpers::int=D.v_matpers and base.cti_overlaps(OU.date_debut::date, OU.date_fin::date, D.ValidFrom ,D.ValidTo ) -- left join w_hst_bul L on true -- and L.v_matpers=D.v_matpers -- and base.cti_overlaps(L.date_debut::date, L.date_fin::date, D.ValidFrom ,D.ValidTo ) -- and L.bl_histo_ctrid = OU.ctrid where false or cti_cnt is not null -- or cti_bul is not null ) --,toto as ( select v_matpers, cti_cnt, -- contrat cti_cnt as cti_cnt_all, cti_bul, -- bulletin. mois, min(greatest(validfrom, date_debut)) as date_debut, max(least(validto, date_fin)) as date_fin, (max(least(validto, date_fin)) - min(greatest(validfrom, date_debut)) + 1)::numeric / (max(date_fin) - min(date_debut) + 1)::numeric as ratio_temps from detail left join base.p_calendrier_mois on true and base.cti_overlaps(validfrom, validto, date_debut, date_fin) and date_fin <= max_date group by 1,2,3,4,5 -- ) -- select -- v_matpers, -- cti_cnt, -- contrat -- -- coalesce(cti_cnt, -- si la valeur est renseignée sur la ligne courante, on la prend. -- -- (max(case when cti_cnt is null then null else ARRAY[extract(epoch from date_debut)::text, cti_cnt] end) over wb)[2], -- sinon on prend la valeur renseignée la plus proche dans le passé -- -- (min(case when cti_cnt is null then null else ARRAY[extract(epoch from date_debut)::text, cti_cnt] end) over wf)[2], -- sinon on prend la valeur renseignée la plus proche dans le futur -- -- null -- sinon on prend null. Ne devrait pas arriver. -- -- ) -- cti_cnt as cti_cnt_all, -- cti_bul, -- bulletin. -- -- coalesce(cti_bul, -- si la valeur est renseignée sur la ligne courante, on la prend. -- -- (max(case when cti_bul is null then null else ARRAY[extract(epoch from date_debut)::text, cti_bul] end) over wb)[2], -- sinon on prend la valeur renseignée la plus proche dans le passé -- -- (min(case when cti_bul is null then null else ARRAY[extract(epoch from date_debut)::text, cti_bul] end) over wf)[2], -- sinon on prend la valeur renseignée la plus proche dans le futur -- -- null -- sinon on prend null. Ne devrait pas arriver. -- -- ) as cti_bul_all, -- mois, -- date_debut, -- date_fin, -- ratio_temps -- from toto -- window wb as (PARTITION BY v_matpers ORDER BY date_debut rows unbounded preceding), -- sélectionne les lignes précédentes -- wf as (PARTITION BY v_matpers ORDER BY date_debut rows between current row and unbounded following) -- sélectionne les lignes suivantes ; -- WITH all_rsg as ( -- SELECT -- t1.ctid, -- (max(array[t2.date_fin::text, t2.cti_cnt]))[2] as cti_cnt -- FROM w_evt_mois as t1 -- LEFT JOIN w_evt_mois as t2 ON true -- AND t1.v_matpers = t2.v_matpers -- AND t2.date_fin < t1.date_debut -- -- WHERE cti_cnt IS NULL -- GROUP BY 1 -- ) -- UPDATE w_evt_mois SET -- cti_cnt_all = all_rsg.cti_cnt -- FROM all_rsg -- WHERE true -- AND w_evt_mois.ctid = all_rsg.ctid -- AND w_evt_mois.cti_cnt IS NULL -- ; ]]> = 2015 AND t_rubriques.p_detail GROUP BY 1,2,3, 6,7,8,9,10,11,12 ; DROP TABLE IF EXISTS w_hp_1 ; CREATE TEMP TABLE w_hp_1 AS SELECT (max(ARRAY[extract(epoch from p_contrats.date_fin)::text, p_contrats.code_original]))[2] as cti_cnt_id, cti_bul, w_hp.date_debut, w_hp.date_fin, w_hp.mois_paie, w_hp.date_paie, p_salaries.oid as salarie_id, (max(ARRAY[extract(epoch from p_contrats.date_fin), p_contrats.oid]))[2] as contrat_id, (max(ARRAY[extract(epoch from p_contrats_mois.date_fin), p_contrats_mois.oid]))[2] as contrat_mois_id, mois, w_hp.rubrique_id, w_hp.compte_id, 0 as organisme_cotisation_id, t_etablissements.oid as etablissement_id, w_hp.base, w_hp.nombre, w_hp.heures_contrat, w_hp.heures_payees, w_hp.heures_travaillees, w_hp.montant_masse_salariale, w_hp.montant_brut, w_hp.montant_avantage_nature, w_hp.montant_frais_imposables, w_hp.taux_cotisation_salarie, w_hp.montant_cotisation_salarie, w_hp.taux_cotisation_patronale, w_hp.montant_cotisation_patronale, w_hp.montant_od_net_salarie, w_hp.montant_od_net_patronale, w_hp.montant_net_imposable_salarie, w_hp.montant_net_a_payer_salarie, w_hp.nombre_provisions, w_hp.montant_provisions, w_hp.montant_masse_salariale_provisionnee FROM w_hp JOIN rh.p_salaries on p_salaries.code_original = w_hp.v_matpers LEFT JOIN rh.p_contrats on p_contrats.code_original = w_hp.bl_histo_ctrid LEFT JOIN rh.p_contrats_mois on 1=1 AND p_contrats_mois.contrat_id = p_contrats.oid AND p_contrats_mois.mois_activite = w_hp.mois_paie JOIN rh.t_etablissements on t_etablissements.code_original = w_hp.bl_histo_etab GROUP BY 2,3,4,5,6,7, 10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34, w_hp.ctid ; -- Associer les bulletins hors contrat (is null) avec le contrat précédent. UPDATE w_hp_1 SET contrat_id = subq.contrat_id, contrat_mois_id = subq.contrat_mois_id FROM ( select w_hp_1.ctid, (max(array[extract(epoch from p_contrats_mois.date_fin), p_contrats_mois.contrat_id]))[2] as contrat_id, (max(array[extract(epoch from p_contrats_mois.date_fin), p_contrats_mois.oid]))[2] as contrat_mois_id from w_hp_1 join rh.p_contrats_mois on true and p_contrats_mois.salarie_id = w_hp_1.salarie_id and p_contrats_mois.date_fin < w_hp_1.date_debut where contrat_mois_id is null group by 1) as subq WHERE true AND w_hp_1.ctid = subq.ctid AND w_hp_1.contrat_mois_id is null ; -- Associer les bulletins hors contrat (is null) avec le contrat suivant. UPDATE w_hp_1 SET contrat_id = subq.contrat_id, contrat_mois_id = subq.contrat_mois_id FROM ( select w_hp_1.ctid, (max(array[extract(epoch from p_contrats_mois.date_fin), p_contrats_mois.contrat_id]))[2] as contrat_id, (max(array[extract(epoch from p_contrats_mois.date_fin), p_contrats_mois.oid]))[2] as contrat_mois_id from w_hp_1 join rh.p_contrats_mois on true and p_contrats_mois.salarie_id = w_hp_1.salarie_id and p_contrats_mois.date_fin > w_hp_1.date_debut where contrat_mois_id is null group by 1) as subq WHERE true AND w_hp_1.ctid = subq.ctid AND w_hp_1.contrat_mois_id is null ; TRUNCATE rh.p_historique_paie ; INSERT INTO rh.p_historique_paie( salarie_id, contrat_id, contrat_mois_id, mois_activite, date_debut, date_fin, mois_paie, date_paie, rubrique_id, compte_id, organisme_cotisation_id, etablissement_id, base, nombre, heure_contrat, heure_payee, heure_travaillee, montant_masse_salariale, montant_brut, montant_avantage_nature, montant_frais_imposables, taux_cotisation_salarie, montant_cotisation_salarie, taux_cotisation_patronale, montant_cotisation_patronale, montant_od_net_salarie, montant_od_net_patronale, montant_net_imposable_salarie, montant_net_a_payer_salarie, nombre_provisions, montant_provisions, montant_masse_salariale_provisionnee) SELECT salarie_id, contrat_id, contrat_mois_id, mois, date_debut, date_fin, mois_paie, date_paie, --bul_datepaie, rubrique_id, compte_id, organisme_cotisation_id, etablissement_id, base, nombre, heures_contrat, heures_payees, heures_travaillees, montant_masse_salariale, montant_brut, montant_avantage_nature, montant_frais_imposables, taux_cotisation_salarie, montant_cotisation_salarie, taux_cotisation_patronale, montant_cotisation_patronale, montant_od_net_salarie, montant_od_net_patronale, montant_net_imposable_salarie, montant_net_a_payer_salarie, nombre_provisions, montant_provisions, montant_masse_salariale_provisionnee FROM w_hp_1 ; ]]> = 2015 -- AND p_cumul -- NE PAS LE METTRE ICI, ça enlève trop de ligne !! GROUP BY 1,2,3,4 ; -- Insérer pour chaque bulletin une ligne qui va faire le compte avec le total (rubrique 'C000' nommée 'Ecart cumulé') INSERT INTO rh.p_historique_paie ( contrat_id, contrat_mois_id, date_debut, date_fin, date_paie, mois_activite, mois_paie, base, nombre, heure_contrat, heure_payee, heure_travaillee, montant_avantage_nature, montant_brut, montant_masse_salariale, montant_cotisation_patronale, montant_cotisation_salarie, montant_frais_imposables, montant_net_a_payer_salarie, montant_net_imposable_salarie, montant_od_net_salarie, organisme_cotisation_id, etablissement_id, rubrique_id, compte_id, salarie_id, taux_cotisation_patronale, taux_cotisation_salarie, nombre_provisions, montant_provisions, montant_masse_salariale_provisionnee) SELECT subq.contrat_id, subq.contrat_mois_id, subq.date_debut, subq.date_fin, subq.date_paie, subq.mois_activite, subq.mois_paie, 0 AS base, 0 AS nombre, COALESCE(hcum_heures_contrat,0) - subq.heure_contrat AS heure_contrat, COALESCE(hcum_heures_payees,0) - subq.heure_payee AS heure_payee, COALESCE(hcum_heures_travaillees,0) - subq.heure_travaillee AS heure_travaillee, COALESCE(hcum_avantage_nature,0) - subq.montant_avantage_nature AS montant_avantage_nature, COALESCE(hcum_brut,0) - subq.montant_brut AS montant_brut, COALESCE(hcum_masse_salariale, 0) - subq.montant_masse_salariale AS montant_masse_salariale, COALESCE(hcum_cotisation_patronale,0) - subq.montant_cotisation_patronale AS montant_cotisation_patronale, COALESCE(hcum_cotisation_salarie,0) - subq.montant_cotisation_salarie AS montant_cotisation_salarie, 0 AS montant_frais_imposables, COALESCE(hcum_net_a_payer_salarie,0) - subq.montant_net_a_payer_salarie AS montant_net_a_payer_salarie, COALESCE(hcum_net_imposable_salarie,0) - subq.montant_net_imposable_salarie AS montant_net_imposable_salarie, 0 AS montant_od_net_salarie, subq.organisme_cotisation_id AS organisme_cotisation_id, subq.etablissement_id as etablissement_id, (SELECT oid FROM rh.t_rubriques WHERE code = 'C000') AS rubrique_id, 0 AS compte_id, subq.salarie_id AS salarie_id, 0 AS taux_cotisation_patronale, 0 AS taux_cotisation_salarie, COALESCE(hcum_nombre_provisions,0) - subq.nombre_provisions AS nombre_provisions, COALESCE(hcum_montant_provisions,0) - subq.montant_provisions AS montant_provisions, COALESCE(hcum_masse_salariale_provisionnee,0) - subq.montant_masse_salariale_provisionnee AS montant_masse_salariale_provisionnee FROM ( SELECT cti_bul, contrat_id, contrat_mois_id, date_debut, date_fin, date_paie as date_paie, mois as mois_activite, mois_paie as mois_paie, 0 AS base, 0 AS nombre, sum(heures_contrat) AS heure_contrat, sum(heures_payees) AS heure_payee, sum(heures_travaillees) AS heure_travaillee, sum(montant_avantage_nature) AS montant_avantage_nature, sum(montant_brut) AS montant_brut, sum(montant_masse_salariale) AS montant_masse_salariale, sum(montant_cotisation_patronale) AS montant_cotisation_patronale, sum(montant_cotisation_salarie) AS montant_cotisation_salarie, 0 AS montant_frais_imposables, sum(montant_net_a_payer_salarie) AS montant_net_a_payer_salarie, sum(montant_net_imposable_salarie) AS montant_net_imposable_salarie, 0 AS montant_od_net_salarie, organisme_cotisation_id, etablissement_id, (SELECT oid FROM rh.t_rubriques WHERE code = 'C000'), salarie_id, 0 AS taux_cotisation_patronale, 0 AS taux_cotisation_salarie, sum(nombre_provisions) AS nombre_provisions, sum(montant_provisions) AS montant_provisions, sum(montant_masse_salariale_provisionnee) AS montant_masse_salariale_provisionnee FROM w_hp_1 GROUP BY 1,2,3,4,5,6,7,8,9,10, 22, 23,24,25,26) AS subq JOIN w_totaux ON w_totaux.cti_bul = subq.cti_bul WHERE 1!=1 OR COALESCE(hcum_avantage_nature,0) - subq.montant_avantage_nature != 0 OR COALESCE(hcum_brut,0) - subq.montant_brut != 0 OR COALESCE(hcum_masse_salariale,0) - subq.montant_masse_salariale != 0 OR COALESCE(hcum_net_a_payer_salarie,0) - subq.montant_net_a_payer_salarie != 0 OR COALESCE(hcum_net_imposable_salarie,0) - subq.montant_net_imposable_salarie != 0 OR COALESCE(hcum_cotisation_patronale,0) - subq.montant_cotisation_patronale != 0 OR COALESCE(hcum_cotisation_salarie,0) - subq.montant_cotisation_salarie != 0 OR COALESCE(hcum_heures_contrat,0) - subq.heure_contrat != 0 OR COALESCE(hcum_heures_payees,0) - subq.heure_payee != 0 OR COALESCE(hcum_heures_travaillees,0) - subq.heure_travaillee != 0 OR COALESCE(hcum_nombre_provisions,0) - subq.nombre_provisions != 0 OR COALESCE(hcum_montant_provisions,0) - subq.montant_provisions != 0 OR COALESCE(hcum_masse_salariale_provisionnee,0) - subq.montant_masse_salariale_provisionnee != 0 ; ]]>