= 79900 THEN false ELSE t_hbns.coderubrique is not null END as brut, CASE WHEN 1=1 AND t_rub.coderubrique > 19990 AND t_rub.dasavnat != 1 and t_hbns.coderubrique is not null THEN true ELSE false END as odns, false as odnp, false as cosd, false as copa from prod_sage.t_rub left join prod_sage.t_hbns on t_hbns.coderubrique = t_rub.coderubrique where 1=1 and t_rub.imprimable NOT IN (1, 3) AND t_hbns.valeurmontant != 0 group by 1,2,3 UNION select t_rub.coderubrique, CASE WHEN 1!=1 OR t_rub.dasavnat = 1 OR t_rub.coderubrique >= 79900 THEN false ELSE T_BNSSAL.coderubrique is not null END as brut, CASE WHEN 1=1 AND t_rub.coderubrique > 19990 AND t_rub.dasavnat != 1 and T_BNSSAL.coderubrique is not null THEN true ELSE false END as odns, false as odnp, false as cosd, false as copa from prod_sage.t_rub left join prod_sage.t_bnssal on t_bnssal.coderubrique = t_rub.coderubrique where 1=1 and t_rub.imprimable NOT IN (1, 3) AND t_bnssal.valeurmontantsalarial != 0 group by 1,2,3 UNION select t_rub.coderubrique, false as brut, false as odns, false as odnp, true as cosd, true as copa FROM prod_sage.t_hcot JOIN prod_sage.t_rub ON t_rub.coderubrique = t_hcot.coderubrique WHERE 1=1 AND t_rub.imprimable != 1 and (false or t_hcot.valeursmontantsalarial != 0 OR t_hcot.valeursmontantpatronal != 0) group by 1,2,3 UNION select t_rub.coderubrique, false as brut, false as odns, false as odnp, true as cosd, true as copa FROM prod_sage.T_COTSAL JOIN prod_sage.t_rub ON t_rub.coderubrique = T_COTSAL.coderubrique WHERE 1=1 AND t_rub.imprimable != 1 and (false or t_cotsal.valeurmontantsal != 0 or t_cotsal.valeurmontantpatronal != 0) group by 1,2,3 ) as subq group by 1) as subqq where 1=1 AND t_rubriques.code_original = subqq.coderubrique AND NOT t_rubriques.user_modified ; ]]> = to_char(rhp('rhprovider_start')::date, 'YYYY')::int AND date_part('year', t_hcum.datehist) <= date_part('year', now() + interval '5 years') GROUP BY 1,2,3,4 HAVING sum(round((CASE WHEN entite IN (3, 4, 6, 7, 8, 84, 86) THEN valeurcumul ELSE 0 END)::numeric,2))::numeric != 0) as subq group by 1,2,3 ; ]]> = to_char(rhp('rhprovider_start')::date, 'YYYY')::int AND date_part('year', t_hcum.datehist) <= date_part('year', now() + interval '5 years') GROUP BY 1,2,3,4 HAVING sum(round((CASE WHEN entite IN (3, 4, 6, 7, 8, 84, 86) THEN valeurcumul ELSE 0 END)::numeric,2))::numeric != 0) as subq group by 1,2,3 ; ]]> aux dates de fin. DROP TABLE IF EXISTS w_hst_contrat_0 ; CREATE TEMP TABLE w_hst_contrat_0 AS SELECT * FROM prod_sage.t_hst_contrat ; UPDATE w_hst_contrat_0 SET datedebutcontrat = datefincontrat, datefincontrat = datedebutcontrat WHERE datedebutcontrat > datefincontrat ; -- Préparation contrats (pb chevauchement) DROP TABLE IF EXISTS w_hst_contrat ; CREATE TEMP TABLE w_hst_contrat AS WITH hst_cnt as ( SELECT -- nettoie l'historique (infoencours = 0) de manière séquentielle. case when lead(datedebutcontrat) over w = datedebutcontrat then true else false end as to_ex1, -- date de début suivante identique à celle de la ligne actuelle -- nettoie l'historique (infoencours = 0) par rapport à la ligne infoencours. case when last_value(datedebutcontrat) over w <= datedebutcontrat and infoencours = 0 then true else false end as to_ex2, -- date infoencours <= date ligne actuelle * FROM w_hst_contrat_0 where 1=1 and datedebutcontrat is not null -- la date de début doit être renseignée. and case when infoencours = 0 and datefincontrat is null then false else true end -- l'historique doit avoir des des dates de fin. window w as (partition by numsalarie order by infoencours, datedebutcontrat, datehist rows between UNBOUNDED PRECEDING and UNBOUNDED following)), hst_soc as ( SELECT -- nettoie l'historique (infoencours = 0) de manière séquentielle. case when lead(datedepart) over w = datedepart then true else false end as to_ex1, -- date de début suivante identique à celle de la ligne actuelle -- nettoie l'historique (infoencours = 0) par rapport à la ligne infoencours. case when last_value(datedepart) over w <= datedepart and infoencours = 0 then true else false end as to_ex2, -- date infoencours <= date ligne actuelle * FROM prod_sage.t_hst_infossociete where 1=1 and datedepart is not null -- la date de début doit être renseignée. and case when infoencours = 0 and datedepart is null then false else true end -- l'historique doit avoir des des dates d'embauche. window w as (partition by numsalarie order by infoencours, datedepart, datehist rows between UNBOUNDED PRECEDING and UNBOUNDED following)) -- selection avec correction des dates de fin chevauchantes. select rank() OVER (ORDER BY hst_cnt.numsalarie, hst_cnt.infoencours, datedebutcontrat, hst_cnt.datehist) as sequence, hst_cnt.numsalarie::text||'-'::text||rank() OVER (PARTITION BY hst_cnt.numsalarie ORDER BY hst_cnt.infoencours, datedebutcontrat, hst_cnt.datehist) as cti_cnt, datedebutcontrat::date as date_debut, (case when lead(datedebutcontrat) over w <= datefincontrat then lead(datedebutcontrat) over w - '1 day'::interval else coalesce(datefincontrat, '2099-12-31'::date) end)::date as date_fin, coalesce(hst_soc.codemotifdepart, chr(1) || '*') as soc_codemotifdepart, hst_cnt.* from hst_cnt left join hst_soc on 1=1 and hst_soc.numsalarie = hst_cnt.numsalarie and hst_soc.datedepart = hst_cnt.datefincontrat AND NOT hst_soc.to_ex1 AND NOT hst_soc.to_ex2 where 1=1 AND NOT hst_cnt.to_ex1 AND NOT hst_cnt.to_ex2 window w as (PARTITION BY hst_cnt.numsalarie ORDER BY hst_cnt.infoencours, datedebutcontrat, hst_cnt.datehist) ; CREATE INDEX i_hst_contrat_numsalarie ON w_hst_contrat USING btree(numsalarie); CREATE INDEX i_hst_contrat_dates ON w_hst_contrat USING btree(date_debut, date_fin); -- Salaries DROP TABLE IF EXISTS w_sal_ets ; CREATE TEMP TABLE w_sal_ets AS with hst_pre as ( select numsalarie, coalesce(dateentree, datedebut) as dateentree, datehist, codeetab, datesortie, infoencours FROM prod_sage.t_hst_etablissement) , hst_corr as ( select numsalarie, coalesce(case when infoencours = 1 and dateentree is null then greatest(lag(datehist) over w, lag(dateentree) over w) + '1 day'::interval else dateentree end, '1900-01-01'::date) as dateentree, datehist, codeetab, datesortie, infoencours FROM hst_pre where not (infoencours = 0 and dateentree is null) -- On exclu les historiques (infoencours = 0) avec une dateentree nulle. window w as (partition by numsalarie order by infoencours, dateentree, datehist rows between UNBOUNDED PRECEDING and UNBOUNDED following)) , hst_ets as ( select lead(dateentree) over w, case when lead(dateentree) over w = dateentree then true else false end as to_ex1, case when last_value(dateentree) over w <= dateentree and infoencours = 0 then true else false end as to_ex2 ,* FROM hst_corr where dateentree is not null window w as (partition by numsalarie order by infoencours, dateentree, datehist rows between UNBOUNDED PRECEDING and UNBOUNDED following)) select rank() OVER (ORDER BY numsalarie, infoencours, dateentree, datehist) as sequence, numsalarie::text||'-'::text||rank() OVER w as cti_ets, case when rank() OVER w = 1 then '1900-01-01'::date else dateentree::date end as date_debut, case when rank() OVER wd = 1 then '2099-12-31'::date else (case when lead(dateentree) over w <= coalesce(datesortie, '2099-12-31'::date) then lead(dateentree) over w - '1 day'::interval else coalesce(datesortie, '2099-12-31'::date) end)::date end as date_fin, min(dateentree::date) over wu as date_entree_ets, max(coalesce(datesortie::date, '2099-12-31'::date)) over wu as date_sortie_ets, * from hst_ets where 1=1 AND NOT to_ex1 AND NOT to_ex2 window w as (PARTITION BY numsalarie ORDER BY infoencours, dateentree, datehist), wd as (PARTITION BY numsalarie ORDER BY infoencours desc, dateentree desc, datehist desc), wu as (PARTITION BY numsalarie) ; CREATE INDEX i_sal_ets_numsalarie ON w_sal_ets USING btree(numsalarie); CREATE INDEX i_sal_ets_dates ON w_sal_ets USING btree(date_debut, date_fin); -- Historique des affectations. On ne se base plus que sur la date de début. DROP TABLE IF EXISTS w_hst_aff ; CREATE TEMP TABLE w_hst_aff AS with hst_corr as ( select coalesce(case when infoencours = 1 and datedebut is null then greatest(lag(datehist) over w, lag(datedebut) over w) + '1 day'::interval else datedebut end, '1900-01-01'::date) as datedebut, numsalarie, datehist, infoencours, departement, service, unite, categorie, emploioccupe, qualification, niveau, coefficient, indice FROM prod_sage.t_hst_affectation where true and not (infoencours = 0 and datedebut is null) -- Mais on exclu les historiques (infoencours = 0) avec une datedebut nulle. window w as (partition by numsalarie order by infoencours, datedebut, datehist rows between UNBOUNDED PRECEDING and UNBOUNDED following)) , hst_aff as ( select lead(datedebut) over w, case when lead(datedebut) over w = datedebut then true else false end as to_ex1, case when last_value(datedebut) over w <= datedebut and infoencours = 0 then true else false end as to_ex2 ,* FROM hst_corr window w as (partition by numsalarie order by infoencours, datedebut, datehist rows between UNBOUNDED PRECEDING and UNBOUNDED following)) select rank() OVER (ORDER BY numsalarie, infoencours, datedebut, datehist) as sequence, numsalarie::text||'-'::text||rank() OVER w as cti_aff, case when rank() OVER w = 1 then '1900-01-01'::date else datedebut::date end as date_debut, case when rank() OVER wd = 1 then '2099-12-31'::date else lead(datedebut) over w - '1 day'::interval end as date_fin, * from hst_aff where 1=1 AND NOT to_ex1 AND NOT to_ex2 window w as (PARTITION BY numsalarie ORDER BY infoencours, datedebut, datehist), wd as (PARTITION BY numsalarie ORDER BY infoencours desc, datedebut desc, datehist desc), wu as (PARTITION BY numsalarie) ; CREATE INDEX i_hst_aff_numsalarie ON w_hst_aff USING btree(numsalarie); CREATE INDEX i_hst_aff_dates ON w_hst_aff USING btree(date_debut, date_fin); -- Historique des postes. DROP TABLE IF EXISTS w_hst_pst ; CREATE TEMP TABLE w_hst_pst AS with hst_corr as ( select coalesce(case when infoencours = 1 and datedebut is null then greatest(lag(datehist) over w, lag(datedebut) over w) + '1 day'::interval else datedebut end, '1900-01-01'::date) as datedebut, numsalarie, datehist, infoencours, codeposte FROM prod_sage.t_hst_poste where true and not (infoencours = 0 and datedebut is null) -- Mais on exclu les historiques (infoencours = 0) avec une datedebut nulle. and trim(codeposte) is distinct from '' window w as (partition by numsalarie order by infoencours, datehist, datedebut rows between UNBOUNDED PRECEDING and UNBOUNDED following)) , hst_pst as ( select lead(datedebut) over w, case when lead(datedebut) over w = datedebut then true else false end as to_ex1, case when last_value(datedebut) over w <= datedebut and infoencours = 0 then true else false end as to_ex2 ,* FROM hst_corr window w as (partition by numsalarie order by infoencours, datehist, datedebut rows between UNBOUNDED PRECEDING and UNBOUNDED following)) select rank() OVER (ORDER BY numsalarie, infoencours, datedebut, datehist) as sequence, numsalarie::text||'-'::text||rank() OVER w as cti_pst, case when rank() OVER w = 1 then '1900-01-01'::date else datedebut::date end as date_debut, case when rank() OVER wd = 1 then '2099-12-31'::date else lead(datedebut) over w - '1 day'::interval end as date_fin, * from hst_pst where 1=1 AND NOT to_ex1 AND NOT to_ex2 window w as (PARTITION BY numsalarie ORDER BY infoencours, datedebut, datehist), wd as (PARTITION BY numsalarie ORDER BY infoencours desc, datedebut desc, datehist desc), wu as (PARTITION BY numsalarie) ; CREATE INDEX i_hst_pst_numsalarie ON w_hst_pst USING btree(numsalarie); CREATE INDEX i_hst_pst_dates ON w_hst_pst USING btree(date_debut, date_fin); -- Historique des affections au travers des bulletins. DROP TABLE IF EXISTS w_hst_affbul ; CREATE TEMP TABLE w_hst_affbul AS with temp_affbul as ( select numsalarie, datehist::date, case when typedubulletin != 0 then base.cti_first_day(datehist::date) else datehist::date end as datehist_cti, -- Permet de revenir vers un cas standard de bulletin exceptionnel émi le 1er du mois. debutpaiement::date, finpaiement::date, departement, service, unite, categorie, codeetab, typedubulletin from prod_sage.t_haff where datehist != '2069-09-16'::date) -- TOUS les datehist à 2069-09-16 n'ont aucune données renseignées. select numsalarie, numsalarie::text||'-'::text||rank() OVER w AS cti_affbul, datehist, typedubulletin, coalesce(lag(datehist_cti + 1) over w, base.cti_first_day(datehist_cti)) as date_debut, datehist_cti as date_fin, debutpaiement::date, finpaiement::date, departement, service, unite, categorie, codeetab from temp_affbul window w as (partition by numsalarie order by datehist_cti, typedubulletin) ; CREATE INDEX i_hst_affbul_numsalarie ON w_hst_affbul USING btree(numsalarie); CREATE INDEX i_hst_affbul_dates ON w_hst_affbul USING btree(date_debut, date_fin); -- Historique des bulletins (basé sur l'historique des cumuls t_hcum + w_periode pour le mois en cours). DROP TABLE IF EXISTS w_hst_bul ; CREATE TEMP TABLE w_hst_bul AS with w_hcum as ( select numsalarie, datehist::date, case when typedubulletin != 0 then base.cti_first_day(datehist::date) else datehist::date end as datehist_cti, -- Permet de revenir vers un cas standard de bulletin exceptionnel émi le 1er du mois. typedubulletin, max(case when codeconstante = 'ETP' then VALEURCUMUL else null end) as cumul_68, max(case when codeconstante = 'HORAIRE' then VALEURCUMUL else null end) as cumul_81 from prod_sage.t_hcum join prod_sage.t_cst on 1=1 AND typeconstante = 6 AND t_cst.CodeOperande1 = t_hcum.entite where datehist != '2069-09-16'::date -- TOUS les datehist à 2069-09-16 n'ont aucune données renseignées. group by 1,2,3,4 union select numsalarie, date_paie_encours as datehist, date_paie_encours as datehist_cti, 0 as typedubulletin, null as cumul_68, null as cumul_81 from prod_sage.t_bnssal join w_periode on true where t_bnssal.valeurmontantsalarial != 0 -- repris depuis l'historique de la paie. group by 1,2,3,4 union select numsalarie, date_paie_encours as datehist, date_paie_encours as datehist_cti, 0 as typedubulletin, null as cumul_68, null as cumul_81 FROM prod_sage.t_cotsal join w_periode on true WHERE false OR t_cotsal.valeurmontantsal != 0 or t_cotsal.valeurmontantpatronal != 0 group by 1,2,3,4) , w_hcum2 as ( select numsalarie, numsalarie::text||'-'::text||rank() OVER w AS cti_bul, coalesce(cumul_68, -- si la valeur est renseignée sur la ligne courante, on la prend. (max(case when cumul_68 is null then null else ARRAY[extract(epoch from datehist_cti)::numeric, cumul_68] end) over wb)[2], -- sinon on prend la valeur renseignée la plus proche dans le passé (min(case when cumul_68 is null then null else ARRAY[extract(epoch from datehist_cti)::numeric, cumul_68] end) over wf)[2], -- sinon on prend la valeur renseignée la plus proche dans le futur null -- sinon on prend null ) as cumul_68, coalesce(cumul_81, -- si la valeur est renseignée sur la ligne courante, on la prend. (max(case when cumul_81 is null then null else ARRAY[extract(epoch from datehist_cti)::numeric, cumul_81] end) over wb)[2], -- sinon on prend la valeur renseignée la plus proche dans le passé (min(case when cumul_81 is null then null else ARRAY[extract(epoch from datehist_cti)::numeric, cumul_81] end) over wf)[2], -- sinon on prend la valeur renseignée la plus proche dans le futur null -- sinon on prend null ) as cumul_81, datehist, datehist_cti, typedubulletin, coalesce(lag(datehist_cti + 1) over w, base.cti_first_day(datehist_cti)) as date_debut, datehist_cti as date_fin from w_hcum window w as (partition by numsalarie order by datehist_cti, typedubulletin), wb as (PARTITION BY numsalarie ORDER BY datehist_cti, typedubulletin rows unbounded preceding), -- sélectionne les lignes précédentes wf as (PARTITION BY numsalarie ORDER BY datehist_cti, typedubulletin rows between current row and unbounded following)) -- sélectionne les lignes suivantes select numsalarie, cti_bul, cumul_68, cumul_81, coalesce( CASE WHEN sage_temps_travail.valeur = 'ETP' THEN cumul_68 -- Pour calculer un ETP contrat théorique, on prend la valeur ETP si non nulle... WHEN sage_temps_travail.valeur = 'HORAIRE' THEN case when round(cumul_81::numeric, 2) = 151.67 then 1.0 else round(cumul_81::numeric, 2) / 151.67 end END, CASE WHEN sage_temps_travail.valeur = 'HORAIRE' THEN case when round(cumul_81::numeric, 2) = 151.67 then 1.0 else round(cumul_81::numeric, 2) / 151.67 end WHEN sage_temps_travail.valeur = 'ETP' THEN cumul_68 -- ... sinon on prend le nombre d'heures contrat... END, 1.0) as etp_contrat, -- ... sinon on met 1 par défaut. datehist, datehist_cti, typedubulletin, date_debut, date_fin from w_hcum2 join (SELECT valeur FROM rh.t_divers WHERE code = 'SAGE_TEMPS_TRAVAIL') as sage_temps_travail on true ; CREATE INDEX i_hst_bul_numsalarie ON w_hst_bul USING btree(numsalarie); CREATE INDEX i_hst_bul_dates ON w_hst_bul USING btree(date_debut, date_fin); -- Historique codes insee DROP TABLE IF EXISTS w_hst_insee ; CREATE TEMP TABLE w_hst_insee AS with hst_insee as ( select lead(datedebut) over w, case when lead(datedebut) over w = datedebut then true else false end as to_ex1, case when last_value(datedebut) over w <= datedebut and infoencours = 0 then true else false end as to_ex2 ,* FROM prod_sage.t_hst_dadsu WHERE case when infoencours = 0 and datedebut is null then false else true end -- on exclu de facto les datedebut null pour les infos pas en cours. window w as (partition by numsalarie order by infoencours, datedebut, datehist rows between UNBOUNDED PRECEDING and UNBOUNDED following)) select rank() OVER (ORDER BY numsalarie, infoencours, datedebut, datehist) as sequence, numsalarie::text||'-'::text||rank() OVER w as cti_insee, numsalarie, coalesce(lag(datedebut::date + 1) over w, '0001-01-01'::date) as date_debut, coalesce(datedebut::date, '2099-12-31'::date) as date_fin, coalesce(nullif(codeinsee, ''), -- si la valeur est renseignée sur la ligne courante, on la prend. (max(ARRAY[case when codeinsee = '' then null else coalesce(datedebut::date, '2099-12-31'::date)::text end, nullif(codeinsee, '')::text]) over wb)[2], -- sinon on prend la valeur renseignée la plus proche dans le passé (min(ARRAY[case when codeinsee = '' then null else coalesce(datedebut::date, '2099-12-31'::date)::text end, nullif(codeinsee, '')::text]) over wf)[2], -- sinon on prend la valeur renseignée la plus proche dans le futur null -- sinon on prend null ) as codeinsee from hst_insee where 1=1 AND NOT to_ex1 AND NOT to_ex2 window w as (PARTITION BY numsalarie ORDER BY infoencours, datedebut, datehist), wb as (PARTITION BY numsalarie ORDER BY infoencours, datedebut, datehist rows unbounded preceding), -- sélectionne les lignes précédentes wf as (PARTITION BY numsalarie ORDER BY infoencours, datedebut, datehist rows between current row and unbounded following) -- sélectionne les lignes suivantes ; CREATE INDEX i_hst_insee_numsalarie ON w_hst_insee USING btree(numsalarie); CREATE INDEX i_hst_insee_dates ON w_hst_insee USING btree(date_debut, date_fin); -- Identification des dates limites pour chaque salariés (pour des raisons de performances). -- Basé sur les contrats et les bulletins (historique des cumuls t_hcum). DROP TABLE IF EXISTS w_lim_sal ; CREATE TEMP TABLE w_lim_sal AS select numsalarie, matriculesalarie as matricule, min(date_debut) as date_debut, max(date_fin) as date_fin from ( select numsalarie, min(date_debut) as date_debut, coalesce(nullif(max(date_fin), '2099-12-31'::date), max(date_paie_encours)) as date_fin -- 2099-12-31 correspond à "contrat en cours" => 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 numsalarie, min(date_debut) as date_debut, max(date_fin) as date_fin from w_hst_bul group by 1 ) as subq join prod_sage.t_sal on t_sal.sa_compteurnumero = subq.numsalarie group by 1,2 ; CREATE INDEX i_lim_sal_numsalarie ON w_lim_sal USING btree(numsalarie); 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 with raw_data as( select w_lim_sal.numsalarie, w_lim_sal.matricule, cti_cnt, -- contrat cti_ets, -- ets. cti_aff, -- affectations cti_pst, -- postes cti_affbul, -- affectations bulletins cti_bul, -- bulletins cti_insee, -- insee p_calendrier.date 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.numsalarie = w_lim_sal.numsalarie and p_calendrier.date between w_hst_contrat.date_debut and w_hst_contrat.date_fin left join w_sal_ets on 1=1 and w_sal_ets.numsalarie = w_lim_sal.numsalarie and p_calendrier.date between w_sal_ets.date_debut and w_sal_ets.date_fin left join w_hst_insee on 1=1 and w_hst_insee.numsalarie = w_lim_sal.numsalarie and p_calendrier.date between w_hst_insee.date_debut and w_hst_insee.date_fin left join w_hst_aff on 1=1 and w_hst_aff.numsalarie = w_lim_sal.numsalarie and p_calendrier.date between w_hst_aff.date_debut and w_hst_aff.date_fin left join w_hst_pst on 1=1 and w_hst_pst.numsalarie = w_lim_sal.numsalarie and p_calendrier.date between w_hst_pst.date_debut and w_hst_pst.date_fin left join w_hst_affbul on 1=1 and w_hst_affbul.numsalarie = w_lim_sal.numsalarie and p_calendrier.date between w_hst_affbul.date_debut and w_hst_affbul.date_fin left join w_hst_bul on 1=1 and w_hst_bul.numsalarie = w_lim_sal.numsalarie and p_calendrier.date between w_hst_bul.date_debut and w_hst_bul.date_fin where 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 ), clustering as ( select numsalarie, matricule, cti_cnt, cti_ets, cti_aff, cti_pst, cti_affbul, cti_bul, cti_insee, date, case when lag(coalesce(cti_cnt, '')||coalesce(cti_ets, '')||coalesce(cti_aff, '')||coalesce(cti_pst, '')||coalesce(cti_affbul, '')||coalesce(cti_bul, '')||coalesce(cti_insee, '')) over w = coalesce(cti_cnt, '')||coalesce(cti_ets, '')||coalesce(cti_aff, '')||coalesce(cti_pst, '')||coalesce(cti_affbul, '')||coalesce(cti_bul, '')||coalesce(cti_insee, '') then null else true end as new_cluster from raw_data window w as (partition by numsalarie order by date)), assigned_clustering as ( select numsalarie, matricule, cti_cnt, cti_ets, cti_aff, cti_pst, cti_affbul, cti_bul, cti_insee, date, to_char(date, 'YYYYMM')::int as mois, count(new_cluster) over (order by numsalarie, date rows unbounded preceding) as cluster_id from clustering) select numsalarie, matricule, cti_cnt, cti_ets, cti_aff, cti_pst, cti_affbul, cti_bul, cti_insee, mois, -- FIXME PAS SUR PAS SUR PAS SUR PAS SUR PAS SUR PAS SUR PAS SUR PAS SUR PAS SUR PAS SUR PAS SUR PAS SUR min(date) AS date_debut, max(date) AS date_fin from assigned_clustering group by 1,2,3,4,5,6,7,8,9,10, cluster_id ; ]]> = 79900 THEN 0 ELSE t_hbns.valeurmontant END)::numeric AS montant_brut, (CASE WHEN t_rub.gain = 1 THEN 1 ELSE -1 END) * (CASE WHEN 1!=1 OR t_rubriques.code_calcul NOT IN ('3') OR t_rub.coderubrique >= 79900 THEN 0 ELSE t_hbns.valeurmontant END)::numeric AS montant_frais_imposables, t_hbns.valeurtaux::numeric AS taux_sal, 0::numeric AS montant_sal, 0::numeric AS taux_pat, 0::numeric AS montant_pat, ((CASE WHEN t_rub.gain = 1 THEN -1 ELSE 1 END) * CASE WHEN t_rub.coderubrique > 19990 AND t_rub.dasavnat != 1 THEN t_hbns.valeurmontant ELSE 0 END)::numeric AS od_net, 0 as od_net_p, (CASE WHEN t_rub.gain = 1 THEN -1 ELSE 1 END) * (CASE WHEN 1!=1 OR t_rub.dasavnat = 1 AND montantdequivalence = 0 OR t_rubriques.code_calcul = '4' THEN t_hbns.valeurmontant ELSE 0 END)::numeric AS avt_nat, 0 AS net_imposable, 0 AS net_a_payer, 0 AS nombre_provisions, 0 AS montant_provisions, 0 AS montant_masse_salariale_provisionnee, t_rub.nodordre AS ordre, 0 AS type_rub FROM prod_sage.t_hbns JOIN w_profils ON 1=1 AND w_profils.numsalarie = t_hbns.numsalarie AND t_hbns.datehist between w_profils.date_debut and w_profils.date_fin JOIN prod_sage.t_rub ON t_rub.coderubrique = t_hbns.coderubrique JOIN rh.t_rubriques ON t_rubriques.code_original = t_rub.coderubrique WHERE 1=1 AND t_hbns.datehist >= rhp('rhprovider_start')::date AND t_rub.imprimable NOT IN (1, 3) AND t_hbns.valeurmontant != 0 and t_rubriques.code_calcul NOT IN ('9') ; -- BRUT et od (paie non cloturee) INSERT INTO w_hp SELECT w_profils.contrat_mois_id, w_profils.contrat_id, w_profils.salarie_id, w_profils.profil_id, w_profils.matricule AS code_original, w_profils.matricule AS matricule, w_profils.numsalarie, w_profils.unite, w_profils.categorie, date_paie_encours AS date, 0 as typedubulletin, w_profils.bul_date_debut as date_debut, w_profils.bul_date_fin as date_fin, (date_part('year', date_paie_encours)::text||lpad(date_part('month', date_paie_encours), 2, '0'))::numeric AS mois, t_rub.coderubrique, t_rubriques.oid AS rub_id, t_rubriques.code_original AS rub_code, t_rubriques.texte AS rub_texte, T_BNSSAL.valeurbase::numeric AS base, T_BNSSAL.valeurnombre::numeric AS nombre, 0 as heure_contrat, 0 as heure_payee, 0 as heure_travaillee, 0 as masse_salariale, (CASE WHEN t_rub.gain = 1 THEN 1 ELSE -1 END) * (CASE WHEN t_rubriques.code_calcul IN ('3', '4') OR t_rub.dasavnat = 1 OR t_rub.coderubrique = '9' OR t_rub.coderubrique >= 79900 THEN 0 ELSE T_BNSSAL.VALEURMONTANTSALARIAL END) AS montant_brut, (CASE WHEN t_rub.gain = 1 THEN 1 ELSE -1 END) * (CASE WHEN t_rubriques.code_calcul NOT IN ('3') OR t_rub.coderubrique = '9' OR t_rub.coderubrique >= 79900 THEN 0 ELSE T_BNSSAL.VALEURMONTANTSALARIAL END) AS montant_frais_imposables, T_BNSSAL.VALEURTAUXSALARIAL AS taux_sal, 0 AS montant_sal, 0 AS taux_pat, 0 AS montant_pat, (CASE WHEN t_rub.gain = 1 THEN -1 ELSE 1 END) * CASE WHEN t_rub.coderubrique > 19990 AND t_rub.dasavnat != 1 THEN T_BNSSAL.VALEURMONTANTSALARIAL ELSE 0 END AS od_net, 0 as od_net_p, (CASE WHEN t_rub.gain = 1 THEN -1 ELSE 1 END) * CASE WHEN t_rub.dasavnat = 1 AND montantdequivalence = 0 OR t_rubriques.code_calcul = '4' THEN T_BNSSAL.VALEURMONTANTSALARIAL ELSE 0 END AS avt_nat, 0 AS net_imposable, 0 AS net_a_payer, 0 AS nombre_provisions, 0 AS montant_provisions, 0 AS montant_masse_salariale_provisionnee t_rub.nodordre AS ordre, 0 AS type_rub FROM prod_sage.T_BNSSAL JOIN w_periode ON 1=1 JOIN w_profils ON 1=1 AND w_profils.numsalarie = T_BNSSAL.numsalarie AND date_paie_encours between w_profils.date_debut and w_profils.date_fin JOIN prod_sage.t_rub ON t_rub.coderubrique = T_BNSSAL.coderubrique JOIN rh.t_rubriques ON t_rubriques.code_original = t_rub.coderubrique WHERE 1=1 AND t_rub.imprimable NOT IN (1, 3) AND T_BNSSAL.VALEURMONTANTSALARIAL != 0 and t_rubriques.code_calcul NOT IN ('9') ; -- Cotisations (mois clotures) INSERT INTO w_hp SELECT w_profils.contrat_mois_id, w_profils.contrat_id, w_profils.salarie_id, w_profils.profil_id, w_profils.matricule AS code_original, w_profils.matricule AS matricule, w_profils.numsalarie, w_profils.unite, w_profils.categorie, t_hcot.datehcot AS date, t_hcot.typedubulletin, w_profils.bul_date_debut as date_debut, w_profils.bul_date_fin as date_fin, (date_part('year', t_hcot.datehcot)::text||lpad(date_part('month', t_hcot.datehcot), 2, '0'))::numeric AS mois, t_rub.coderubrique, t_rubriques.oid AS rub_id, t_rubriques.code_original AS rub_code, t_rubriques.texte AS rub_texte, t_hcot.valeursbase AS base, t_hcot.valeursnombre AS nombre, 0 as heure_contrat, 0 as heure_payee, 0 as heure_travaillee, 0 as masse_salariale, 0 AS montant_brut, 0 AS montant_frais_imposables, t_hcot.valeurstauxsalarial AS taux_sal, (CASE WHEN t_rub.gain = 1 THEN -1 ELSE 1 END) * t_hcot.valeursmontantsalarial AS montant_sal, t_hcot.valeurstauxpatronal AS taux_pat, (CASE WHEN t_rub.gain = 1 THEN -1 ELSE 1 END) * t_hcot.valeursmontantpatronal AS montant_pat, 0 AS od_net, 0 as od_net_p, 0 AS avt_nat, 0 AS net_imposable, 0 AS net_a_payer, 0 AS nombre_provisions, 0 AS montant_provisions, 0 AS montant_masse_salariale_provisionnee, t_rub.nodordre AS ordre, 1 AS type_rub FROM prod_sage.t_hcot JOIN w_profils ON 1=1 AND w_profils.numsalarie = t_hcot.numsalarie AND t_hcot.datehcot between w_profils.date_debut and w_profils.date_fin JOIN prod_sage.t_rub ON t_rub.coderubrique = t_hcot.coderubrique JOIN rh.t_rubriques ON t_rubriques.code_original = t_rub.coderubrique WHERE true AND t_hcot.datehcot >= rhp('rhprovider_start')::date AND t_rub.imprimable != 1 AND (t_hcot.valeursmontantsalarial != 0 OR t_hcot.valeursmontantpatronal != 0) ; -- Cotisations (mois non clotures) INSERT INTO w_hp SELECT w_profils.contrat_mois_id, w_profils.contrat_id, w_profils.salarie_id, w_profils.profil_id, w_profils.matricule AS code_original, w_profils.matricule AS matricule, w_profils.numsalarie, w_profils.unite, w_profils.categorie, date_paie_encours AS date, 0 as typedubulletin, w_profils.bul_date_debut as date_debut, w_profils.bul_date_fin as date_fin, (date_part('year', date_paie_encours)::text||lpad(date_part('month', date_paie_encours), 2, '0'))::numeric AS mois, t_rub.coderubrique, t_rubriques.oid AS rub_id, t_rubriques.code_original AS rub_code, t_rubriques.texte AS rub_texte, T_COTSAL.valeurbase AS base, T_COTSAL.valeurnombre AS nombre, 0 as heure_contrat, 0 as heure_payee, 0 as heure_travaillee, 0 as masse_salariale, 0 AS montant_brut, 0 AS montant_frais_imposables, T_COTSAL.VALEURTAUXSAL AS taux_sal, (CASE WHEN t_rub.gain = 1 THEN -1 ELSE 1 END) * T_COTSAL.VALEURMONTANTSAL AS montant_sal, T_COTSAL.VALEURTAUXPATRONAL AS taux_pat, (CASE WHEN t_rub.gain = 1 THEN -1 ELSE 1 END) * T_COTSAL.VALEURMONTANTPATRONAL AS montant_pat, 0 AS od_net, 0 as od_net_p, 0 AS avt_nat, 0 AS net_imposable, 0 AS net_a_payer, 0 AS nombre_provisions, 0 AS montant_provisions, 0 AS montant_masse_salariale_provisionnee, t_rub.nodordre AS ordre, 1 AS type_rub FROM prod_sage.T_COTSAL JOIN w_periode ON 1=1 JOIN w_profils ON 1=1 AND w_profils.numsalarie = T_COTSAL.numsalarie AND date_paie_encours between w_profils.date_debut and w_profils.date_fin JOIN prod_sage.t_rub ON t_rub.coderubrique = T_COTSAL.coderubrique JOIN rh.t_rubriques ON t_rubriques.code_original = t_rub.coderubrique WHERE t_rub.imprimable != 1 AND (T_COTSAL.VALEURMONTANTSAL != 0 OR T_COTSAL.VALEURMONTANTPATRONAL != 0) ; -- Cumuls paie cloturee INSERT INTO w_hp SELECT w_profils.contrat_mois_id, w_profils.contrat_id, w_profils.salarie_id, w_profils.profil_id, w_profils.matricule AS code_original, w_profils.matricule AS matricule, w_profils.numsalarie, w_profils.unite, w_profils.categorie, t_hcum.datehist AS date, t_hcum.typedubulletin, w_profils.bul_date_debut as date_debut, w_profils.bul_date_fin as date_fin, (date_part('year', t_hcum.datehist)::text||lpad(date_part('month', t_hcum.datehist), 2, '0'))::numeric AS mois, 0 AS coderubrique, t_rubriques.oid AS rub_id, t_rubriques.code_original AS rub_code, t_rubriques.texte AS rub_texte, CASE WHEN ENTITE IN (84, 86) THEN t_hcum.VALEURCUMUL ELSE 0 END AS base, CASE WHEN ENTITE IN (84, 86) THEN t_hcum.VALEURCUMUL ELSE 0 END AS nombre, 0 as heure_contrat, 0 as heure_payee, 0 as heure_travaillee, 0 as masse_salariale, 0 AS montant_brut, 0 AS montant_frais_imposables, 0 AS taux_sal, 0 AS montant_sal, 0 AS taux_pat, 0 AS montant_pat, 0 AS od_net, 0 as od_net_p, 0 AS avt_nat, CASE WHEN ENTITE = 4 THEN t_hcum.VALEURCUMUL ELSE 0 END AS net_imposable, CASE WHEN ENTITE = 3 THEN t_hcum.VALEURCUMUL ELSE 0 END AS net_a_payer, 0 AS nombre_provisions, 0 AS montant_provisions, 0 AS montant_masse_salariale_provisionnee, t_rubriques.rang_edition AS ordre, 2 AS type_rub FROM prod_sage.t_hcum JOIN w_profils ON 1=1 AND w_profils.numsalarie = t_hcum.numsalarie AND t_hcum.datehist between w_profils.date_debut and w_profils.date_fin JOIN rh.t_rubriques ON t_rubriques.code_original = 'C' || lpad(t_hcum.ENTITE, 3, '0') WHERE true AND t_hcum.datehist >= rhp('rhprovider_start')::date AND ENTITE IN (3, 4, 84, 86) ; -- Cumuls paie non cloturee INSERT INTO w_hp SELECT w_profils.contrat_mois_id, w_profils.contrat_id, w_profils.salarie_id, w_profils.profil_id, w_profils.matricule AS code_original, w_profils.matricule AS matricule, w_profils.numsalarie, w_profils.unite, w_profils.categorie, date_paie_encours AS date, 0 as typedubulletin, w_profils.bul_date_debut as date_debut, w_profils.bul_date_fin as date_fin, (date_part('year', date_paie_encours)::text||lpad(date_part('month', date_paie_encours), 2, '0'))::numeric AS mois, 0 AS coderubrique, t_rubriques.oid AS rub_id, t_rubriques.code_original AS rub_code, t_rubriques.texte AS rub_texte, CASE WHEN OPCSTCUMUL in (84, 86) THEN T_CUMSAL.VALEURCUMINTERMEDIAIRE ELSE 0 END AS base, CASE WHEN OPCSTCUMUL in (84, 86) THEN T_CUMSAL.VALEURCUMINTERMEDIAIRE ELSE 0 END AS nombre, 0 as heure_contrat, 0 as heure_payee, 0 as heure_travaillee, 0 as masse_salariale, 0 AS montant_brut, 0 AS montant_frais_imposables, 0 AS taux_sal, 0 AS montant_sal, 0 AS taux_pat, 0 AS montant_pat, 0 AS od_net, 0 as od_net_p, 0 AS avt_nat, CASE WHEN OPCSTCUMUL = 4 THEN T_CUMSAL.VALEURCUMINTERMEDIAIRE ELSE 0 END AS net_imposable, CASE WHEN OPCSTCUMUL = 3 THEN T_CUMSAL.VALEURCUMINTERMEDIAIRE ELSE 0 END AS net_a_payer, 0 AS nombre_provisions, 0 AS montant_provisions, 0 AS montant_masse_salariale_provisionnee, t_rubriques.rang_edition AS ordre, 2 AS type_rub FROM prod_sage.T_CUMSAL JOIN w_periode ON 1=1 JOIN w_profils ON 1=1 AND w_profils.numsalarie = T_CUMSAL.numsalarie AND date_paie_encours between w_profils.date_debut and w_profils.date_fin JOIN rh.t_rubriques ON t_rubriques.code_original = 'C' || lpad(T_CUMSAL.OPCSTCUMUL, 3, '0') WHERE OPCSTCUMUL IN (3, 4, 84, 86) ; -- Suppression des bulletins composés uniquement des 3 (ou 4) rubriques de cumul : -- * 3 (net à payer), -- * 4 (net imposable), -- * 86 (heures payées), -- * [84 (heures travaillées)] -- toutes à 0. DELETE FROM w_hp USING ( select matricule, date from w_hp group by 1,2 having 1=1 AND sum(base) = 0 AND sum(net_imposable) = 0 AND sum(net_a_payer) = 0 AND count(*) in (3, 4) ) AS subq WHERE 1=1 AND w_hp.matricule = subq.matricule AND w_hp.date = subq.date ; ]]> = rhp('rhprovider_start')::date -- Filtrer les lignes générées systématiquement tous les mois par Sage pour chaque salarié même s'il n'y a rien. AND (false OR t_hbns.valeurmontant != 0 OR t_hbns.valeurnombre != 0) AND (false OR p_nombre OR p_base OR p_heures_contrat OR p_heures_payees OR p_heures_travaillees OR p_masse_salariale OR p_brut OR p_avantage_nature OR p_frais_imposables OR p_cotisation_salarie OR p_cotisation_patronale OR p_od_net_salarie OR p_od_net_patronale OR p_net_imposable OR p_net_a_payer OR p_nombre_provisions OR p_montant_provisions OR p_masse_salariale_provisionnee) ; -- BRUT et od (paie non cloturee) INSERT INTO w_hp SELECT w_profils.contrat_mois_id, w_profils.contrat_id, w_profils.salarie_id, w_profils.profil_id, w_profils.matricule AS code_original, w_profils.matricule AS matricule, w_profils.numsalarie, w_profils.unite, w_profils.categorie, date_paie_encours AS date, 0 as typedubulletin, w_profils.bul_date_debut as date_debut, w_profils.bul_date_fin as date_fin, (date_part('year', date_paie_encours)::text||lpad(date_part('month', date_paie_encours), 2, '0'))::numeric AS mois, t_rub.coderubrique, t_rubriques.oid AS rub_id, t_rubriques.code_original AS rub_code, t_rubriques.texte AS rub_texte, t_rubriques.c_base * case when @t_rubriques.c_base != 1 then coalesce(w_profils.etp_contrat, 1.0) else 1.0 end * CASE WHEN p_base THEN (CASE s_base WHEN 0 THEN t_bnssal.valeurnombre::numeric WHEN 1 THEN t_bnssal.valeurbase::numeric WHEN 3 THEN t_bnssal.valeurmontantsalarial::numeric WHEN 5 THEN t_bnssal.valeurmontantsalarial::numeric END) else 0 end AS base, t_rubriques.c_nombre * case when @t_rubriques.c_nombre != 1 then coalesce(w_profils.etp_contrat, 1.0) else 1.0 end * CASE WHEN p_nombre THEN (CASE s_nombre WHEN 0 THEN t_bnssal.valeurnombre::numeric WHEN 1 THEN t_bnssal.valeurbase::numeric WHEN 3 THEN t_bnssal.valeurmontantsalarial::numeric WHEN 5 THEN t_bnssal.valeurmontantsalarial::numeric END) else 0 end AS nombre, t_rubriques.c_heures_contrat * case when @t_rubriques.c_heures_contrat != 1 then coalesce(w_profils.etp_contrat, 1.0) else 1.0 end * CASE WHEN p_heures_contrat then (CASE s_heures_contrat WHEN 0 THEN t_bnssal.valeurnombre::numeric WHEN 1 THEN t_bnssal.valeurbase::numeric WHEN 3 THEN t_bnssal.valeurmontantsalarial::numeric WHEN 5 THEN t_bnssal.valeurmontantsalarial::numeric END) else 0 end AS heure_contrat, t_rubriques.c_heures_payees * case when @t_rubriques.c_heures_payees != 1 then coalesce(w_profils.etp_contrat, 1.0) else 1.0 end * CASE WHEN p_heures_payees then (CASE s_heures_payees WHEN 0 THEN t_bnssal.valeurnombre::numeric WHEN 1 THEN t_bnssal.valeurbase::numeric WHEN 3 THEN t_bnssal.valeurmontantsalarial::numeric WHEN 5 THEN t_bnssal.valeurmontantsalarial::numeric END) else 0 end AS heure_payee, t_rubriques.c_heures_travaillees * case when @t_rubriques.c_heures_travaillees != 1 then coalesce(w_profils.etp_contrat, 1.0) else 1.0 end * CASE WHEN p_heures_travaillees then (CASE s_heures_travaillees WHEN 0 THEN t_bnssal.valeurnombre::numeric WHEN 1 THEN t_bnssal.valeurbase::numeric WHEN 3 THEN t_bnssal.valeurmontantsalarial::numeric WHEN 5 THEN t_bnssal.valeurmontantsalarial::numeric END) else 0 end AS heure_travaillee, t_rubriques.c_masse_salariale * (CASE WHEN t_rub.gain = 1 THEN 1 ELSE -1 END) * (CASE WHEN p_masse_salariale THEN t_bnssal.valeurmontantsalarial::numeric else 0 end) AS masse_salariale, t_rubriques.c_brut * (CASE WHEN t_rub.gain = 1 THEN 1 ELSE -1 END) * (CASE WHEN p_brut THEN t_bnssal.valeurmontantsalarial::numeric else 0 end) AS montant_brut, t_rubriques.c_frais_imposables * (CASE WHEN t_rub.gain = 1 THEN 1 ELSE -1 END) * (case when p_frais_imposables then t_bnssal.valeurmontantsalarial::numeric else 0 end) AS montant_frais_imposables, t_rubriques.coefficient_txs * (CASE WHEN t_rub.gain = 1 THEN 1 ELSE -1 END) * (case when p_cotisation_salarie then t_bnssal.valeurtauxsalarial::numeric else 0 end) AS taux_sal, t_rubriques.c_cotisation_salarie * (CASE WHEN t_rub.gain = 1 THEN 1 ELSE -1 END) * (case when p_cotisation_salarie then t_bnssal.valeurmontantsalarial::numeric else 0 end) AS montant_sal, t_rubriques.coefficient_txp * (CASE WHEN t_rub.gain = 1 THEN 1 ELSE -1 END) * (case when p_cotisation_patronale then 0 else 0 end) AS taux_pat, t_rubriques.c_cotisation_patronale * (CASE WHEN t_rub.gain = 1 THEN 1 ELSE -1 END) * (case when p_cotisation_patronale then 0 else 0 end) AS montant_pat, t_rubriques.c_od_net_salarie * (CASE WHEN t_rub.gain = 1 THEN 1 ELSE -1 END) * (CASE WHEN p_od_net_salarie THEN t_bnssal.valeurmontantsalarial::numeric ELSE 0 END) AS od_net, t_rubriques.c_od_net_patronale * (CASE WHEN t_rub.gain = 1 THEN 1 ELSE -1 END) * (CASE WHEN p_od_net_patronale then 0 ELSE 0 END) AS od_net_p, t_rubriques.c_avantage_nature * (CASE WHEN t_rub.gain = 1 THEN 1 ELSE -1 END) * (CASE WHEN p_avantage_nature THEN t_bnssal.valeurmontantsalarial::numeric ELSE 0 END) AS avt_nat, t_rubriques.c_net_imposable * (CASE WHEN t_rub.gain = 1 THEN 1 ELSE -1 END) * (CASE WHEN p_net_imposable THEN t_bnssal.valeurmontantsalarial::numeric ELSE 0 END) AS net_imposable, t_rubriques.c_net_a_payer * (CASE WHEN t_rub.gain = 1 THEN 1 ELSE -1 END) * (CASE WHEN p_net_a_payer THEN t_bnssal.valeurmontantsalarial::numeric ELSE 0 END) AS net_a_payer, t_rubriques.c_nombre_provisions * (CASE WHEN t_rub.gain = 1 THEN 1 ELSE -1 END) * CASE WHEN p_nombre_provisions then (CASE s_nombre_provisions WHEN 0 THEN t_bnssal.valeurnombre::numeric WHEN 1 THEN t_bnssal.valeurbase::numeric WHEN 3 THEN t_bnssal.valeurmontantsalarial::numeric WHEN 5 THEN t_bnssal.valeurmontantsalarial::numeric END) else 0 end AS nombre_provisions, t_rubriques.c_montant_provisions * (CASE WHEN t_rub.gain = 1 THEN 1 ELSE -1 END) * CASE WHEN p_montant_provisions then (CASE s_montant_provisions WHEN 0 THEN t_bnssal.valeurnombre::numeric WHEN 1 THEN t_bnssal.valeurbase::numeric WHEN 3 THEN t_bnssal.valeurmontantsalarial::numeric WHEN 5 THEN t_bnssal.valeurmontantsalarial::numeric END) else 0 end AS montant_provisions, t_rubriques.c_masse_salariale_provisionnee * (CASE WHEN t_rub.gain = 1 THEN 1 ELSE -1 END) * CASE WHEN p_masse_salariale_provisionnee then (CASE s_masse_salariale_provisionnee WHEN 0 THEN t_bnssal.valeurnombre::numeric WHEN 1 THEN t_bnssal.valeurbase::numeric WHEN 3 THEN t_bnssal.valeurmontantsalarial::numeric WHEN 5 THEN t_bnssal.valeurmontantsalarial::numeric END) else 0 end AS masse_salariale_provisionnee, t_rub.nodordre AS ordre, 0 AS type_rub FROM prod_sage.t_bnssal JOIN w_periode ON 1=1 JOIN w_profils ON 1=1 AND w_profils.numsalarie = t_bnssal.numsalarie AND date_paie_encours between w_profils.date_debut and w_profils.date_fin JOIN prod_sage.t_rub ON t_rub.coderubrique = t_bnssal.coderubrique JOIN rh.t_rubriques ON t_rubriques.code_original = t_rub.coderubrique where 1=1 -- Filtrer les lignes générées systématiquement tous les mois par Sage pour chaque salarié même s'il n'y a rien. AND (false OR t_bnssal.valeurmontantsalarial != 0 OR t_bnssal.valeurnombre != 0) AND (false OR p_nombre OR p_base OR p_heures_contrat OR p_heures_payees OR p_heures_travaillees OR p_masse_salariale OR p_brut OR p_avantage_nature OR p_frais_imposables OR p_cotisation_salarie OR p_cotisation_patronale OR p_od_net_salarie OR p_od_net_patronale OR p_net_imposable OR p_net_a_payer OR p_nombre_provisions OR p_montant_provisions OR p_masse_salariale_provisionnee) ; -- Cotisations (mois clotures) INSERT INTO w_hp SELECT w_profils.contrat_mois_id, w_profils.contrat_id, w_profils.salarie_id, w_profils.profil_id, w_profils.matricule AS code_original, w_profils.matricule AS matricule, w_profils.numsalarie, w_profils.unite, w_profils.categorie, t_hcot.datehcot AS date, t_hcot.typedubulletin, w_profils.bul_date_debut as date_debut, w_profils.bul_date_fin as date_fin, (date_part('year', t_hcot.datehcot)::text||lpad(date_part('month', t_hcot.datehcot), 2, '0'))::numeric AS mois, t_rub.coderubrique, t_rubriques.oid AS rub_id, t_rubriques.code_original AS rub_code, t_rubriques.texte AS rub_texte, t_rubriques.c_base * case when @t_rubriques.c_base != 1 then coalesce(w_hst_bul.etp_contrat, 1.0) else 1.0 end * CASE WHEN p_base THEN (CASE s_base WHEN 0 THEN t_hcot.valeursnombre::numeric WHEN 1 THEN t_hcot.valeursbase::numeric WHEN 2 THEN t_hcot.valeurstauxsalarial::numeric WHEN 3 THEN t_hcot.valeursmontantsalarial::numeric WHEN 4 THEN t_hcot.valeurstauxpatronal::numeric WHEN 5 THEN t_hcot.valeursmontantpatronal::numeric WHEN 6 THEN t_hcot.valeursmontantsalarial::numeric + t_hcot.valeursmontantpatronal::numeric WHEN 7 THEN t_hcot.valeursmontantsalarial::numeric - t_hcot.valeursmontantpatronal::numeric WHEN 8 THEN -t_hcot.valeursmontantsalarial::numeric + t_hcot.valeursmontantpatronal::numeric END) else 0 end AS base, t_rubriques.c_nombre * case when @t_rubriques.c_nombre != 1 then coalesce(w_hst_bul.etp_contrat, 1.0) else 1.0 end * CASE WHEN p_nombre THEN (CASE s_nombre WHEN 0 THEN t_hcot.valeursnombre::numeric WHEN 1 THEN t_hcot.valeursbase::numeric WHEN 2 THEN t_hcot.valeurstauxsalarial::numeric WHEN 3 THEN t_hcot.valeursmontantsalarial::numeric WHEN 4 THEN t_hcot.valeurstauxpatronal::numeric WHEN 5 THEN t_hcot.valeursmontantpatronal::numeric WHEN 6 THEN t_hcot.valeursmontantsalarial::numeric + t_hcot.valeursmontantpatronal::numeric WHEN 7 THEN t_hcot.valeursmontantsalarial::numeric - t_hcot.valeursmontantpatronal::numeric WHEN 8 THEN -t_hcot.valeursmontantsalarial::numeric + t_hcot.valeursmontantpatronal::numeric END) else 0 end AS nombre, t_rubriques.c_heures_contrat * CASE WHEN p_heures_contrat THEN t_hcot.valeursnombre::numeric else 0 end AS heure_contrat, t_rubriques.c_heures_payees * CASE WHEN p_heures_payees THEN t_hcot.valeursnombre::numeric else 0 end AS heure_payee, t_rubriques.c_heures_travaillees * CASE WHEN p_heures_travaillees THEN t_hcot.valeursnombre::numeric else 0 end AS heure_travaillee, t_rubriques.c_masse_salariale * (CASE WHEN t_rub.gain = 1 THEN -1 ELSE 1 END) * (CASE WHEN p_masse_salariale THEN t_hcot.valeursmontantpatronal::numeric else 0 end) AS masse_salariale, t_rubriques.c_brut * (CASE WHEN t_rub.gain = 1 THEN -1 ELSE 1 END) * (CASE WHEN p_brut THEN t_hcot.valeursmontantsalarial::numeric else 0 end) AS montant_brut, t_rubriques.c_frais_imposables * (CASE WHEN t_rub.gain = 1 THEN -1 ELSE 1 END) * (case when p_frais_imposables then t_hcot.valeursmontantsalarial::numeric else 0 end) AS montant_frais_imposables, t_rubriques.coefficient_txs * (CASE WHEN t_rub.gain = 1 THEN -1 ELSE 1 END) * (case when p_cotisation_salarie then t_hcot.valeurstauxsalarial::numeric else 0 end) AS taux_sal, t_rubriques.c_cotisation_salarie * (CASE WHEN t_rub.gain = 1 THEN -1 ELSE 1 END) * (case when p_cotisation_salarie then t_hcot.valeursmontantsalarial::numeric else 0 end) AS montant_sal, t_rubriques.coefficient_txp * (CASE WHEN t_rub.gain = 1 THEN -1 ELSE 1 END) * (case when p_cotisation_patronale then t_hcot.valeurstauxpatronal::numeric else 0 end) AS taux_pat, t_rubriques.c_cotisation_patronale * (CASE WHEN t_rub.gain = 1 THEN -1 ELSE 1 END) * (case when p_cotisation_patronale then t_hcot.valeursmontantpatronal::numeric else 0 end) AS montant_pat, t_rubriques.c_od_net_salarie * (CASE WHEN t_rub.gain = 1 THEN -1 ELSE 1 END) * (CASE WHEN p_od_net_salarie THEN t_hcot.valeursmontantsalarial::numeric ELSE 0 END) AS od_net, t_rubriques.c_od_net_patronale * (CASE WHEN t_rub.gain = 1 THEN -1 ELSE 1 END) * (CASE WHEN p_od_net_patronale THEN t_hcot.valeursmontantpatronal::numeric ELSE 0 END) AS od_net_p, t_rubriques.c_avantage_nature * (CASE WHEN t_rub.gain = 1 THEN -1 ELSE 1 END) * (CASE WHEN p_avantage_nature THEN t_hcot.valeursmontantsalarial::numeric ELSE 0 END) AS avt_nat, t_rubriques.c_net_imposable * (CASE WHEN t_rub.gain = 1 THEN 1 ELSE -1 END) * CASE WHEN p_net_imposable THEN (CASE s_net_imposable WHEN 0 THEN t_hcot.valeursnombre::numeric WHEN 1 THEN t_hcot.valeursbase::numeric WHEN 2 THEN t_hcot.valeurstauxsalarial::numeric WHEN 3 THEN t_hcot.valeursmontantsalarial::numeric WHEN 4 THEN t_hcot.valeurstauxpatronal::numeric WHEN 5 THEN t_hcot.valeursmontantpatronal::numeric WHEN 6 THEN t_hcot.valeursmontantsalarial::numeric + t_hcot.valeursmontantpatronal::numeric WHEN 7 THEN t_hcot.valeursmontantsalarial::numeric - t_hcot.valeursmontantpatronal::numeric WHEN 8 THEN -t_hcot.valeursmontantsalarial::numeric + t_hcot.valeursmontantpatronal::numeric END) ELSE 0 END AS net_imposable, t_rubriques.c_net_a_payer * (CASE WHEN t_rub.gain = 1 THEN 1 ELSE -1 END) * (CASE WHEN p_net_a_payer THEN t_hcot.valeursmontantsalarial::numeric ELSE 0 END) AS net_a_payer, t_rubriques.c_nombre_provisions * (CASE WHEN t_rub.gain = 1 THEN 1 ELSE -1 END) * CASE WHEN p_nombre_provisions then (CASE s_nombre_provisions WHEN 0 THEN t_hcot.valeursnombre::numeric WHEN 1 THEN t_hcot.valeursbase::numeric WHEN 2 THEN t_hcot.valeurstauxsalarial::numeric WHEN 3 THEN t_hcot.valeursmontantsalarial::numeric WHEN 4 THEN t_hcot.valeurstauxpatronal::numeric WHEN 5 THEN t_hcot.valeursmontantpatronal::numeric WHEN 6 THEN t_hcot.valeursmontantsalarial::numeric + t_hcot.valeursmontantpatronal::numeric WHEN 7 THEN t_hcot.valeursmontantsalarial::numeric - t_hcot.valeursmontantpatronal::numeric WHEN 8 THEN -t_hcot.valeursmontantsalarial::numeric + t_hcot.valeursmontantpatronal::numeric END) else 0 end AS nombre_provisions, t_rubriques.c_montant_provisions * (CASE WHEN t_rub.gain = 1 THEN 1 ELSE -1 END) * CASE WHEN p_montant_provisions then (CASE s_montant_provisions WHEN 0 THEN t_hcot.valeursnombre::numeric WHEN 1 THEN t_hcot.valeursbase::numeric WHEN 2 THEN t_hcot.valeurstauxsalarial::numeric WHEN 3 THEN t_hcot.valeursmontantsalarial::numeric WHEN 4 THEN t_hcot.valeurstauxpatronal::numeric WHEN 5 THEN t_hcot.valeursmontantpatronal::numeric WHEN 6 THEN t_hcot.valeursmontantsalarial::numeric + t_hcot.valeursmontantpatronal::numeric WHEN 7 THEN t_hcot.valeursmontantsalarial::numeric - t_hcot.valeursmontantpatronal::numeric WHEN 8 THEN -t_hcot.valeursmontantsalarial::numeric + t_hcot.valeursmontantpatronal::numeric END) else 0 end AS montant_provisions, t_rubriques.c_masse_salariale_provisionnee * (CASE WHEN t_rub.gain = 1 THEN 1 ELSE -1 END) * CASE WHEN p_masse_salariale_provisionnee then (CASE s_masse_salariale_provisionnee WHEN 0 THEN t_hcot.valeursnombre::numeric WHEN 1 THEN t_hcot.valeursbase::numeric WHEN 2 THEN t_hcot.valeurstauxsalarial::numeric WHEN 3 THEN t_hcot.valeursmontantsalarial::numeric WHEN 4 THEN t_hcot.valeurstauxpatronal::numeric WHEN 5 THEN t_hcot.valeursmontantpatronal::numeric WHEN 6 THEN t_hcot.valeursmontantsalarial::numeric + t_hcot.valeursmontantpatronal::numeric WHEN 7 THEN t_hcot.valeursmontantsalarial::numeric - t_hcot.valeursmontantpatronal::numeric WHEN 8 THEN -t_hcot.valeursmontantsalarial::numeric + t_hcot.valeursmontantpatronal::numeric END) else 0 end AS masse_salariale_provisionnee, t_rub.nodordre AS ordre, 1 AS type_rub FROM prod_sage.t_hcot JOIN w_hst_bul ON 1=1 AND w_hst_bul.numsalarie = t_hcot.numsalarie AND w_hst_bul.datehist = t_hcot.datehcot AND w_hst_bul.typedubulletin = t_hcot.typedubulletin JOIN w_profils ON 1=1 AND w_profils.numsalarie = t_hcot.numsalarie AND w_hst_bul.datehist_cti between w_profils.date_debut and w_profils.date_fin AND w_profils.typedubulletin = t_hcot.typedubulletin JOIN prod_sage.t_rub ON t_rub.coderubrique = t_hcot.coderubrique JOIN rh.t_rubriques ON t_rubriques.code_original = t_rub.coderubrique WHERE true AND t_hcot.datehcot >= rhp('rhprovider_start')::date -- Filtrer les lignes générées systématiquement tous les mois par Sage pour chaque salarié même s'il n'y a rien. AND (false OR t_hcot.valeursnombre != 0 OR t_hcot.valeursmontantsalarial != 0 OR t_hcot.valeursmontantpatronal != 0) AND (false OR p_nombre OR p_base OR p_heures_contrat OR p_heures_payees OR p_heures_travaillees OR p_masse_salariale OR p_brut OR p_avantage_nature OR p_frais_imposables OR p_cotisation_salarie OR p_cotisation_patronale OR p_od_net_salarie OR p_od_net_patronale OR p_net_imposable OR p_net_a_payer OR p_nombre_provisions OR p_montant_provisions OR p_masse_salariale_provisionnee) ; -- Cotisations (mois non clotures) INSERT INTO w_hp SELECT w_profils.contrat_mois_id, w_profils.contrat_id, w_profils.salarie_id, w_profils.profil_id, w_profils.matricule AS code_original, w_profils.matricule AS matricule, w_profils.numsalarie, w_profils.unite, w_profils.categorie, date_paie_encours AS date, 0 as typedubulletin, w_profils.bul_date_debut as date_debut, w_profils.bul_date_fin as date_fin, (date_part('year', date_paie_encours)::text||lpad(date_part('month', date_paie_encours), 2, '0'))::numeric AS mois, t_rub.coderubrique, t_rubriques.oid AS rub_id, t_rubriques.code_original AS rub_code, t_rubriques.texte AS rub_texte, t_rubriques.c_base * case when @t_rubriques.c_base != 1 then coalesce(w_profils.etp_contrat, 1.0) else 1.0 end * CASE WHEN p_base THEN (CASE s_base WHEN 0 THEN t_cotsal.valeurnombre::numeric WHEN 1 THEN t_cotsal.valeurbase::numeric WHEN 2 THEN t_cotsal.valeurtauxsal::numeric WHEN 3 THEN t_cotsal.valeurmontantsal::numeric WHEN 4 THEN t_cotsal.valeurtauxpatronal::numeric WHEN 5 THEN t_cotsal.valeurmontantpatronal::numeric WHEN 6 THEN t_cotsal.valeurmontantsal::numeric + t_cotsal.valeurmontantpatronal::numeric WHEN 7 THEN t_cotsal.valeurmontantsal::numeric - t_cotsal.valeurmontantpatronal::numeric WHEN 8 THEN -t_cotsal.valeurmontantsal::numeric + t_cotsal.valeurmontantpatronal::numeric END) else 0 end AS base, t_rubriques.c_nombre * case when @t_rubriques.c_nombre != 1 then coalesce(w_profils.etp_contrat, 1.0) else 1.0 end * CASE WHEN p_nombre THEN (CASE s_nombre WHEN 0 THEN t_cotsal.valeurnombre::numeric WHEN 1 THEN t_cotsal.valeurbase::numeric WHEN 2 THEN t_cotsal.valeurtauxsal::numeric WHEN 3 THEN t_cotsal.valeurmontantsal::numeric WHEN 4 THEN t_cotsal.valeurtauxpatronal::numeric WHEN 5 THEN t_cotsal.valeurmontantpatronal::numeric WHEN 6 THEN t_cotsal.valeurmontantsal::numeric + t_cotsal.valeurmontantpatronal::numeric WHEN 7 THEN t_cotsal.valeurmontantsal::numeric - t_cotsal.valeurmontantpatronal::numeric WHEN 8 THEN -t_cotsal.valeurmontantsal::numeric + t_cotsal.valeurmontantpatronal::numeric END) else 0 end AS nombre, t_rubriques.c_heures_contrat * CASE WHEN p_heures_contrat THEN t_cotsal.valeurnombre::numeric else 0 end AS heure_contrat, t_rubriques.c_heures_payees * CASE WHEN p_heures_payees THEN t_cotsal.valeurnombre::numeric else 0 end AS heure_payee, t_rubriques.c_heures_travaillees * CASE WHEN p_heures_travaillees THEN t_cotsal.valeurnombre::numeric else 0 end AS heure_travaillee, t_rubriques.c_masse_salariale * (CASE WHEN t_rub.gain = 1 THEN -1 ELSE 1 END) * (CASE WHEN p_masse_salariale THEN t_cotsal.valeurmontantpatronal::numeric else 0 end) AS masse_salariale, t_rubriques.c_brut * (CASE WHEN t_rub.gain = 1 THEN -1 ELSE 1 END) * (CASE WHEN p_brut THEN t_cotsal.valeurmontantsal::numeric else 0 end) AS montant_brut, t_rubriques.c_frais_imposables * (CASE WHEN t_rub.gain = 1 THEN -1 ELSE 1 END) * (case when p_frais_imposables then t_cotsal.valeurmontantsal::numeric else 0 end) AS montant_frais_imposables, t_rubriques.coefficient_txs * (CASE WHEN t_rub.gain = 1 THEN -1 ELSE 1 END) * (case when p_cotisation_salarie then t_cotsal.valeurtauxsal::numeric else 0 end) AS taux_sal, t_rubriques.c_cotisation_salarie * (CASE WHEN t_rub.gain = 1 THEN -1 ELSE 1 END) * (case when p_cotisation_salarie then t_cotsal.valeurmontantsal::numeric else 0 end) AS montant_sal, t_rubriques.coefficient_txp * (CASE WHEN t_rub.gain = 1 THEN -1 ELSE 1 END) * (case when p_cotisation_patronale then t_cotsal.valeurtauxpatronal::numeric else 0 end) AS taux_pat, t_rubriques.c_cotisation_patronale * (CASE WHEN t_rub.gain = 1 THEN -1 ELSE 1 END) * (case when p_cotisation_patronale then t_cotsal.valeurmontantpatronal::numeric else 0 end) AS montant_pat, t_rubriques.c_od_net_salarie * (CASE WHEN t_rub.gain = 1 THEN -1 ELSE 1 END) * (CASE WHEN p_od_net_salarie THEN t_cotsal.valeurmontantsal::numeric ELSE 0 END) AS od_net, t_rubriques.c_od_net_patronale * (CASE WHEN t_rub.gain = 1 THEN -1 ELSE 1 END) * (CASE WHEN p_od_net_patronale THEN t_cotsal.valeurmontantpatronal::numeric ELSE 0 END) AS od_net_p, t_rubriques.c_avantage_nature * (CASE WHEN t_rub.gain = 1 THEN -1 ELSE 1 END) * (CASE WHEN p_avantage_nature THEN t_cotsal.valeurmontantsal::numeric ELSE 0 END) AS avt_nat, t_rubriques.c_net_imposable * (CASE WHEN t_rub.gain = 1 THEN 1 ELSE -1 END) * CASE WHEN p_net_imposable THEN (CASE s_net_imposable WHEN 0 THEN t_cotsal.valeurnombre::numeric WHEN 1 THEN t_cotsal.valeurbase::numeric WHEN 2 THEN t_cotsal.valeurtauxsal::numeric WHEN 3 THEN t_cotsal.valeurmontantsal::numeric WHEN 4 THEN t_cotsal.valeurtauxpatronal::numeric WHEN 5 THEN t_cotsal.valeurmontantpatronal::numeric WHEN 6 THEN t_cotsal.valeurmontantsal::numeric + t_cotsal.valeurmontantpatronal::numeric WHEN 7 THEN t_cotsal.valeurmontantsal::numeric - t_cotsal.valeurmontantpatronal::numeric WHEN 8 THEN -t_cotsal.valeurmontantsal::numeric + t_cotsal.valeurmontantpatronal::numeric END) ELSE 0 END AS net_imposable, t_rubriques.c_net_a_payer * (CASE WHEN t_rub.gain = 1 THEN 1 ELSE -1 END) * (CASE WHEN p_net_a_payer THEN t_cotsal.valeurmontantsal::numeric ELSE 0 END) AS net_a_payer, t_rubriques.c_nombre_provisions * (CASE WHEN t_rub.gain = 1 THEN 1 ELSE -1 END) * CASE WHEN p_nombre_provisions then (CASE s_nombre_provisions WHEN 0 THEN t_cotsal.valeurnombre::numeric WHEN 1 THEN t_cotsal.valeurbase::numeric WHEN 2 THEN t_cotsal.valeurtauxsal::numeric WHEN 3 THEN t_cotsal.valeurmontantsal::numeric WHEN 4 THEN t_cotsal.valeurtauxpatronal::numeric WHEN 5 THEN t_cotsal.valeurmontantpatronal::numeric WHEN 6 THEN t_cotsal.valeurmontantsal::numeric + t_cotsal.valeurmontantpatronal::numeric WHEN 7 THEN t_cotsal.valeurmontantsal::numeric - t_cotsal.valeurmontantpatronal::numeric WHEN 8 THEN -t_cotsal.valeurmontantsal::numeric + t_cotsal.valeurmontantpatronal::numeric END) else 0 end AS nombre_provisions, t_rubriques.c_montant_provisions * (CASE WHEN t_rub.gain = 1 THEN 1 ELSE -1 END) * CASE WHEN p_montant_provisions then (CASE s_montant_provisions WHEN 0 THEN t_cotsal.valeurnombre::numeric WHEN 1 THEN t_cotsal.valeurbase::numeric WHEN 2 THEN t_cotsal.valeurtauxsal::numeric WHEN 3 THEN t_cotsal.valeurmontantsal::numeric WHEN 4 THEN t_cotsal.valeurtauxpatronal::numeric WHEN 5 THEN t_cotsal.valeurmontantpatronal::numeric WHEN 6 THEN t_cotsal.valeurmontantsal::numeric + t_cotsal.valeurmontantpatronal::numeric WHEN 7 THEN t_cotsal.valeurmontantsal::numeric - t_cotsal.valeurmontantpatronal::numeric WHEN 8 THEN -t_cotsal.valeurmontantsal::numeric + t_cotsal.valeurmontantpatronal::numeric END) else 0 end AS montant_provisions, t_rubriques.c_masse_salariale_provisionnee * (CASE WHEN t_rub.gain = 1 THEN 1 ELSE -1 END) * CASE WHEN p_masse_salariale_provisionnee then (CASE s_masse_salariale_provisionnee WHEN 0 THEN t_cotsal.valeurnombre::numeric WHEN 1 THEN t_cotsal.valeurbase::numeric WHEN 2 THEN t_cotsal.valeurtauxsal::numeric WHEN 3 THEN t_cotsal.valeurmontantsal::numeric WHEN 4 THEN t_cotsal.valeurtauxpatronal::numeric WHEN 5 THEN t_cotsal.valeurmontantpatronal::numeric WHEN 6 THEN t_cotsal.valeurmontantsal::numeric + t_cotsal.valeurmontantpatronal::numeric WHEN 7 THEN t_cotsal.valeurmontantsal::numeric - t_cotsal.valeurmontantpatronal::numeric WHEN 8 THEN -t_cotsal.valeurmontantsal::numeric + t_cotsal.valeurmontantpatronal::numeric END) else 0 end AS masse_salariale_provisionnee, t_rub.nodordre AS ordre, 1 AS type_rub FROM prod_sage.t_cotsal JOIN w_periode ON 1=1 JOIN w_profils ON 1=1 AND w_profils.numsalarie = T_COTSAL.numsalarie AND date_paie_encours between w_profils.date_debut and w_profils.date_fin JOIN prod_sage.t_rub ON t_rub.coderubrique = T_COTSAL.coderubrique JOIN rh.t_rubriques ON t_rubriques.code_original = t_rub.coderubrique WHERE true -- Filtrer les lignes générées systématiquement tous les mois par Sage pour chaque salarié même s'il n'y a rien. AND (false OR t_cotsal.valeurnombre != 0 OR t_cotsal.valeurmontantsal != 0 OR t_cotsal.valeurmontantpatronal != 0) AND (false OR p_nombre OR p_base OR p_heures_contrat OR p_heures_payees OR p_heures_travaillees OR p_masse_salariale OR p_brut OR p_avantage_nature OR p_frais_imposables OR p_cotisation_salarie OR p_cotisation_patronale OR p_od_net_salarie OR p_od_net_patronale OR p_net_imposable OR p_net_a_payer OR p_nombre_provisions OR p_montant_provisions OR p_masse_salariale_provisionnee) ; -- Cumuls paie cloturee INSERT INTO w_hp SELECT w_profils.contrat_mois_id, w_profils.contrat_id, w_profils.salarie_id, w_profils.profil_id, w_profils.matricule AS code_original, w_profils.matricule AS matricule, w_profils.numsalarie, w_profils.unite, w_profils.categorie, t_hcum.datehist AS date, t_hcum.typedubulletin, w_profils.bul_date_debut as date_debut, w_profils.bul_date_fin as date_fin, (date_part('year', t_hcum.datehist)::text||lpad(date_part('month', t_hcum.datehist), 2, '0'))::numeric AS mois, 0 AS coderubrique, t_rubriques.oid AS rub_id, t_rubriques.code_original AS rub_code, t_rubriques.texte AS rub_texte, t_rubriques.c_base * CASE WHEN p_base THEN t_hcum.valeurcumul::numeric else 0 end AS base, t_rubriques.c_nombre * CASE WHEN p_nombre THEN t_hcum.valeurcumul::numeric else 0 end AS nombre, t_rubriques.c_heures_contrat * CASE WHEN p_heures_contrat THEN t_hcum.valeurcumul::numeric else 0 end AS heure_contrat, t_rubriques.c_heures_payees * CASE WHEN p_heures_payees THEN t_hcum.valeurcumul::numeric else 0 end AS heure_payee, t_rubriques.c_heures_travaillees * CASE WHEN p_heures_travaillees THEN t_hcum.valeurcumul::numeric else 0 end AS heure_travaillee, t_rubriques.c_masse_salariale * CASE WHEN p_masse_salariale THEN t_hcum.valeurcumul::numeric else 0 end AS masse_salariale, t_rubriques.c_brut * CASE WHEN p_brut THEN t_hcum.valeurcumul::numeric else 0 end AS montant_brut, t_rubriques.c_frais_imposables * case when p_frais_imposables then t_hcum.valeurcumul::numeric else 0 end AS montant_frais_imposables, t_rubriques.coefficient_txs * case when p_cotisation_salarie then t_hcum.valeurcumul::numeric else 0 end AS taux_sal, t_rubriques.c_cotisation_salarie * case when p_cotisation_salarie then t_hcum.valeurcumul::numeric else 0 end AS montant_sal, t_rubriques.coefficient_txp * case when p_cotisation_patronale then t_hcum.valeurcumul::numeric else 0 end AS taux_pat, t_rubriques.c_cotisation_patronale * case when p_cotisation_patronale then t_hcum.valeurcumul::numeric else 0 end AS montant_pat, t_rubriques.c_od_net_salarie * CASE WHEN p_od_net_salarie THEN t_hcum.valeurcumul::numeric ELSE 0 END AS od_net, t_rubriques.c_od_net_patronale * CASE WHEN p_od_net_patronale THEN t_hcum.valeurcumul::numeric ELSE 0 END AS od_net_p, t_rubriques.c_avantage_nature * CASE WHEN p_avantage_nature THEN t_hcum.valeurcumul::numeric ELSE 0 END AS avt_nat, t_rubriques.c_net_imposable * CASE WHEN p_net_imposable THEN t_hcum.valeurcumul::numeric ELSE 0 END AS net_imposable, t_rubriques.c_net_a_payer * CASE WHEN p_net_a_payer THEN t_hcum.valeurcumul::numeric ELSE 0 END AS net_a_payer, t_rubriques.c_nombre_provisions * CASE WHEN p_nombre_provisions THEN t_hcum.valeurcumul::numeric ELSE 0 END AS nombre_provisions, t_rubriques.c_montant_provisions * CASE WHEN p_montant_provisions THEN t_hcum.valeurcumul::numeric ELSE 0 END AS montant_provisions, t_rubriques.c_masse_salariale_provisionnee * CASE WHEN p_masse_salariale_provisionnee THEN t_hcum.valeurcumul::numeric ELSE 0 END AS masse_salariale_provisionnee, t_rubriques.rang_edition AS ordre, 2 AS type_rub FROM prod_sage.t_hcum JOIN w_hst_bul ON 1=1 AND w_hst_bul.numsalarie = t_hcum.numsalarie AND w_hst_bul.datehist = t_hcum.datehist AND w_hst_bul.typedubulletin = t_hcum.typedubulletin JOIN w_profils ON 1=1 AND w_profils.numsalarie = t_hcum.numsalarie AND w_hst_bul.datehist_cti between w_profils.date_debut and w_profils.date_fin AND w_profils.typedubulletin = t_hcum.typedubulletin JOIN rh.t_rubriques ON t_rubriques.code_original = 'C' || lpad(t_hcum.entite, 3, '0') WHERE true AND t_hcum.datehist >= rhp('rhprovider_start')::date AND (false OR p_base OR p_nombre OR p_heures_contrat OR p_heures_payees OR p_heures_travaillees OR p_masse_salariale OR p_brut OR p_avantage_nature OR p_frais_imposables OR p_cotisation_salarie OR p_cotisation_patronale OR p_od_net_salarie OR p_od_net_patronale OR p_net_imposable OR p_net_a_payer OR p_nombre_provisions OR p_montant_provisions OR p_masse_salariale_provisionnee) ; -- Cumuls paie non cloturee INSERT INTO w_hp SELECT w_profils.contrat_mois_id, w_profils.contrat_id, w_profils.salarie_id, w_profils.profil_id, w_profils.matricule AS code_original, w_profils.matricule AS matricule, w_profils.numsalarie, w_profils.unite, w_profils.categorie, date_paie_encours AS date, 0 as typedubulletin, w_profils.bul_date_debut as date_debut, w_profils.bul_date_fin as date_fin, (date_part('year', date_paie_encours)::text||lpad(date_part('month', date_paie_encours), 2, '0'))::numeric AS mois, 0 AS coderubrique, t_rubriques.oid AS rub_id, t_rubriques.code_original AS rub_code, t_rubriques.texte AS rub_texte, t_rubriques.c_base * CASE WHEN p_base THEN t_cumsal.valeurcumintermediaire::numeric else 0 end AS base, t_rubriques.c_nombre * CASE WHEN p_nombre THEN t_cumsal.valeurcumintermediaire::numeric else 0 end AS nombre, t_rubriques.c_heures_contrat * CASE WHEN p_heures_contrat THEN t_cumsal.valeurcumintermediaire::numeric else 0 end AS heure_contrat, t_rubriques.c_heures_payees * CASE WHEN p_heures_payees THEN t_cumsal.valeurcumintermediaire::numeric else 0 end AS heure_payee, t_rubriques.c_heures_travaillees * CASE WHEN p_heures_travaillees THEN t_cumsal.valeurcumintermediaire::numeric else 0 end AS heure_travaillee, t_rubriques.c_masse_salariale * CASE WHEN p_masse_salariale THEN t_cumsal.valeurcumintermediaire::numeric else 0 end AS masse_salariale, t_rubriques.c_brut * CASE WHEN p_brut THEN t_cumsal.valeurcumintermediaire::numeric else 0 end AS montant_brut, t_rubriques.c_frais_imposables * case when p_frais_imposables then t_cumsal.valeurcumintermediaire::numeric else 0 end AS montant_frais_imposables, t_rubriques.coefficient_txs * case when p_cotisation_salarie then t_cumsal.valeurcumintermediaire::numeric else 0 end AS taux_sal, t_rubriques.c_cotisation_salarie * case when p_cotisation_salarie then t_cumsal.valeurcumintermediaire::numeric else 0 end AS montant_sal, t_rubriques.coefficient_txp * case when p_cotisation_patronale then t_cumsal.valeurcumintermediaire::numeric else 0 end AS taux_pat, t_rubriques.c_cotisation_patronale * case when p_cotisation_patronale then t_cumsal.valeurcumintermediaire::numeric else 0 end AS montant_pat, t_rubriques.c_od_net_salarie * CASE WHEN p_od_net_salarie THEN t_cumsal.valeurcumintermediaire::numeric ELSE 0 END AS od_net, t_rubriques.c_od_net_patronale * CASE WHEN p_od_net_patronale THEN t_cumsal.valeurcumintermediaire::numeric ELSE 0 END AS od_net_p, t_rubriques.c_avantage_nature * CASE WHEN p_avantage_nature THEN t_cumsal.valeurcumintermediaire::numeric ELSE 0 END AS avt_nat, t_rubriques.c_net_imposable * CASE WHEN p_net_imposable THEN t_cumsal.valeurcumintermediaire::numeric ELSE 0 END AS net_imposable, t_rubriques.c_net_a_payer * CASE WHEN p_net_a_payer THEN t_cumsal.valeurcumintermediaire::numeric ELSE 0 END AS net_a_payer, t_rubriques.c_nombre_provisions * CASE WHEN p_nombre_provisions THEN t_cumsal.valeurcumintermediaire::numeric ELSE 0 END AS nombre_provisions, t_rubriques.c_montant_provisions * CASE WHEN p_montant_provisions THEN t_cumsal.valeurcumintermediaire::numeric ELSE 0 END AS montant_provisions, t_rubriques.c_masse_salariale_provisionnee * CASE WHEN p_masse_salariale_provisionnee THEN t_cumsal.valeurcumintermediaire::numeric ELSE 0 END AS masse_salariale_provisionnee, t_rubriques.rang_edition AS ordre, 2 AS type_rub FROM prod_sage.t_cumsal JOIN w_periode ON 1=1 JOIN w_profils ON 1=1 AND w_profils.numsalarie = t_cumsal.numsalarie AND date_paie_encours between w_profils.date_debut and w_profils.date_fin JOIN rh.t_rubriques ON t_rubriques.code_original = 'C' || lpad(t_cumsal.opcstcumul, 3, '0') WHERE false OR p_base OR p_nombre OR p_heures_contrat OR p_heures_payees OR p_heures_travaillees OR p_masse_salariale OR p_brut OR p_avantage_nature OR p_frais_imposables OR p_cotisation_salarie OR p_cotisation_patronale OR p_od_net_salarie OR p_od_net_patronale OR p_net_imposable OR p_net_a_payer OR p_nombre_provisions OR p_montant_provisions OR p_masse_salariale_provisionnee ; INSERT INTO w_hp SELECT w_profils.contrat_mois_id, w_profils.contrat_id, w_profils.salarie_id, w_profils.profil_id, w_profils.matricule AS code_original, w_profils.matricule AS matricule, w_profils.numsalarie, w_profils.unite, w_profils.categorie, t_hcum.datehist AS date, t_hcum.typedubulletin, w_profils.bul_date_debut as date_debut, w_profils.bul_date_fin as date_fin, (date_part('year', t_hcum.datehist)::text||lpad(date_part('month', t_hcum.datehist), 2, '0'))::numeric AS mois, 0 AS coderubrique, t_rubriques.oid AS rub_id, t_rubriques.code_original AS rub_code, t_rubriques.texte AS rub_texte, t_rubriques.c_base * CASE WHEN p_base THEN t_hcum.valeurcumul::numeric else 0 end AS base, t_rubriques.c_nombre * CASE WHEN p_nombre THEN t_hcum.valeurcumul::numeric else 0 end AS nombre, t_rubriques.c_heures_contrat * CASE WHEN p_heures_contrat THEN t_hcum.valeurcumul::numeric else 0 end AS heure_contrat, t_rubriques.c_heures_payees * CASE WHEN p_heures_payees THEN t_hcum.valeurcumul::numeric else 0 end AS heure_payee, t_rubriques.c_heures_travaillees * CASE WHEN p_heures_travaillees THEN t_hcum.valeurcumul::numeric else 0 end AS heure_travaillee, t_rubriques.c_masse_salariale * CASE WHEN p_masse_salariale THEN t_hcum.valeurcumul::numeric else 0 end AS masse_salariale, t_rubriques.c_brut * CASE WHEN p_brut THEN t_hcum.valeurcumul::numeric else 0 end AS montant_brut, t_rubriques.c_frais_imposables * case when p_frais_imposables then t_hcum.valeurcumul::numeric else 0 end AS montant_frais_imposables, t_rubriques.coefficient_txs * case when p_cotisation_salarie then t_hcum.valeurcumul::numeric else 0 end AS taux_sal, t_rubriques.c_cotisation_salarie * case when p_cotisation_salarie then t_hcum.valeurcumul::numeric else 0 end AS montant_sal, t_rubriques.coefficient_txp * case when p_cotisation_patronale then t_hcum.valeurcumul::numeric else 0 end AS taux_pat, t_rubriques.c_cotisation_patronale * case when p_cotisation_patronale then t_hcum.valeurcumul::numeric else 0 end AS montant_pat, t_rubriques.c_od_net_salarie * CASE WHEN p_od_net_salarie THEN t_hcum.valeurcumul::numeric ELSE 0 END AS od_net, t_rubriques.c_od_net_patronale * CASE WHEN p_od_net_patronale THEN t_hcum.valeurcumul::numeric ELSE 0 END AS od_net_p, t_rubriques.c_avantage_nature * CASE WHEN p_avantage_nature THEN t_hcum.valeurcumul::numeric ELSE 0 END AS avt_nat, t_rubriques.c_net_imposable * CASE WHEN p_net_imposable THEN t_hcum.valeurcumul::numeric ELSE 0 END AS net_imposable, t_rubriques.c_net_a_payer * CASE WHEN p_net_a_payer THEN t_hcum.valeurcumul::numeric ELSE 0 END AS net_a_payer, t_rubriques.c_nombre_provisions * CASE WHEN p_nombre_provisions THEN t_hcum.valeurcumul::numeric ELSE 0 END AS nombre_provisions, t_rubriques.c_montant_provisions * CASE WHEN p_montant_provisions THEN t_hcum.valeurcumul::numeric ELSE 0 END AS montant_provisions, t_rubriques.c_masse_salariale_provisionnee * CASE WHEN p_masse_salariale_provisionnee THEN t_hcum.valeurcumul::numeric ELSE 0 END AS masse_salariale_provisionnee, t_rubriques.rang_edition AS ordre, 2 AS type_rub FROM prod_sage.t_hcum JOIN w_hst_bul ON 1=1 AND w_hst_bul.numsalarie = t_hcum.numsalarie AND w_hst_bul.datehist = t_hcum.datehist AND w_hst_bul.typedubulletin = t_hcum.typedubulletin JOIN w_profils ON 1=1 AND w_profils.numsalarie = t_hcum.numsalarie AND w_hst_bul.datehist_cti between w_profils.date_debut and w_profils.date_fin AND w_profils.typedubulletin = t_hcum.typedubulletin JOIN prod_sage.t_cst ON 1=1 AND typeconstante = 6 AND t_cst.CodeOperande1 = t_hcum.entite JOIN rh.t_rubriques ON t_rubriques.code_original = t_cst.CodeConstante WHERE true AND t_hcum.datehist >= rhp('rhprovider_start')::date AND t_hcum.valeurcumul::numeric != 0 AND (false OR p_base OR p_nombre OR p_heures_contrat OR p_heures_payees OR p_heures_travaillees OR p_masse_salariale OR p_brut OR p_avantage_nature OR p_frais_imposables OR p_cotisation_salarie OR p_cotisation_patronale OR p_od_net_salarie OR p_od_net_patronale OR p_net_imposable OR p_net_a_payer OR p_nombre_provisions OR p_montant_provisions OR p_masse_salariale_provisionnee) ; -- Cumuls paie non cloturee INSERT INTO w_hp SELECT w_profils.contrat_mois_id, w_profils.contrat_id, w_profils.salarie_id, w_profils.profil_id, w_profils.matricule AS code_original, w_profils.matricule AS matricule, w_profils.numsalarie, w_profils.unite, w_profils.categorie, date_paie_encours AS date, 0 as typedubulletin, w_profils.bul_date_debut as date_debut, w_profils.bul_date_fin as date_fin, (date_part('year', date_paie_encours)::text||lpad(date_part('month', date_paie_encours), 2, '0'))::numeric AS mois, 0 AS coderubrique, t_rubriques.oid AS rub_id, t_rubriques.code_original AS rub_code, t_rubriques.texte AS rub_texte, t_rubriques.c_base * CASE WHEN p_base THEN t_cumsal.valeurcumintermediaire::numeric else 0 end AS base, t_rubriques.c_nombre * CASE WHEN p_nombre THEN t_cumsal.valeurcumintermediaire::numeric else 0 end AS nombre, t_rubriques.c_heures_contrat * CASE WHEN p_heures_contrat THEN t_cumsal.valeurcumintermediaire::numeric else 0 end AS heure_contrat, t_rubriques.c_heures_payees * CASE WHEN p_heures_payees THEN t_cumsal.valeurcumintermediaire::numeric else 0 end AS heure_payee, t_rubriques.c_heures_travaillees * CASE WHEN p_heures_travaillees THEN t_cumsal.valeurcumintermediaire::numeric else 0 end AS heure_travaillee, t_rubriques.c_masse_salariale * CASE WHEN p_masse_salariale THEN t_cumsal.valeurcumintermediaire::numeric else 0 end AS masse_salariale, t_rubriques.c_brut * CASE WHEN p_brut THEN t_cumsal.valeurcumintermediaire::numeric else 0 end AS montant_brut, t_rubriques.c_frais_imposables * case when p_frais_imposables then t_cumsal.valeurcumintermediaire::numeric else 0 end AS montant_frais_imposables, t_rubriques.coefficient_txs * case when p_cotisation_salarie then t_cumsal.valeurcumintermediaire::numeric else 0 end AS taux_sal, t_rubriques.c_cotisation_salarie * case when p_cotisation_salarie then t_cumsal.valeurcumintermediaire::numeric else 0 end AS montant_sal, t_rubriques.coefficient_txp * case when p_cotisation_patronale then t_cumsal.valeurcumintermediaire::numeric else 0 end AS taux_pat, t_rubriques.c_cotisation_patronale * case when p_cotisation_patronale then t_cumsal.valeurcumintermediaire::numeric else 0 end AS montant_pat, t_rubriques.c_od_net_salarie * CASE WHEN p_od_net_salarie THEN t_cumsal.valeurcumintermediaire::numeric ELSE 0 END AS od_net, t_rubriques.c_od_net_patronale * CASE WHEN p_od_net_patronale THEN t_cumsal.valeurcumintermediaire::numeric ELSE 0 END AS od_net_p, t_rubriques.c_avantage_nature * CASE WHEN p_avantage_nature THEN t_cumsal.valeurcumintermediaire::numeric ELSE 0 END AS avt_nat, t_rubriques.c_net_imposable * CASE WHEN p_net_imposable THEN t_cumsal.valeurcumintermediaire::numeric ELSE 0 END AS net_imposable, t_rubriques.c_net_a_payer * CASE WHEN p_net_a_payer THEN t_cumsal.valeurcumintermediaire::numeric ELSE 0 END AS net_a_payer, t_rubriques.c_nombre_provisions * CASE WHEN p_nombre_provisions THEN t_cumsal.valeurcumintermediaire::numeric ELSE 0 END AS nombre_provisions, t_rubriques.c_montant_provisions * CASE WHEN p_montant_provisions THEN t_cumsal.valeurcumintermediaire::numeric ELSE 0 END AS montant_provisions, t_rubriques.c_masse_salariale_provisionnee * CASE WHEN p_masse_salariale_provisionnee THEN t_cumsal.valeurcumintermediaire::numeric ELSE 0 END AS masse_salariale_provisionnee, t_rubriques.rang_edition AS ordre, 2 AS type_rub FROM prod_sage.t_cumsal JOIN w_periode ON 1=1 JOIN w_profils ON 1=1 AND w_profils.numsalarie = t_cumsal.numsalarie AND date_paie_encours between w_profils.date_debut and w_profils.date_fin JOIN prod_sage.t_cst ON 1=1 AND typeconstante = 6 AND t_cst.CodeOperande1 = t_cumsal.opcstcumul JOIN rh.t_rubriques ON t_rubriques.code_original = t_cst.CodeConstante WHERE true AND t_cumsal.valeurcumintermediaire::numeric != 0 AND (false OR p_base OR p_nombre OR p_heures_contrat OR p_heures_payees OR p_heures_travaillees OR p_masse_salariale OR p_brut OR p_avantage_nature OR p_frais_imposables OR p_cotisation_salarie OR p_cotisation_patronale OR p_od_net_salarie OR p_od_net_patronale OR p_net_imposable OR p_net_a_payer OR p_nombre_provisions OR p_montant_provisions OR p_masse_salariale_provisionnee) ; ]]> 1 AND w_MOD_SAUF.NOLIEN IS NOT NULL THEN T_RUB.CODERUBRIQUE ELSE 0 END) AS RUBRIQUES_SAUF, MAX(CASE WHEN NUMERO = 4 THEN BORNEINF ELSE NULL END) AS BORNEINF_CATEGORIE, MAX(CASE WHEN NUMERO = 4 THEN BORNESUP ELSE NULL END) AS BORNESUP_CATEGORIE, MAX(CASE WHEN NUMERO = 3 THEN BORNEINF ELSE NULL END) AS BORNEINF_UNITE, MAX(CASE WHEN NUMERO = 3 THEN BORNESUP ELSE NULL END) AS BORNESUP_UNITE, MAX(CASE WHEN NUMERO = 9 THEN BORNEINF ELSE NULL END) AS BORNEINF_MATRICULE, MAX(CASE WHEN NUMERO = 9 THEN BORNESUP ELSE NULL END) AS BORNESUP_MATRICULE FROM prod_sage.T_MOD LEFT JOIN w_MOD_SAUF ON W_MOD_SAUF.NOLIEN = T_MOD.NOLIEN AND W_MOD_SAUF.NOLIGNE = T_MOD.NOLIGNE JOIN prod_sage.T_ECR ON T_MOD.NOLIEN = T_ECR.NOLIEN AND T_MOD.NOLIGNE = T_ECR.NOLIGNE AND COMPTEGENERAL BETWEEN '6' AND '799999' JOIN prod_sage.T_SEL ON T_MOD.NOLIEN = T_SEL.NOLIEN AND T_MOD.NOLIGNE = T_SEL.NOLIGNE JOIN prod_sage.t_CRITERESSEL ON t_CRITERESSEL.IDSEL = T_SEL.IDSEL LEFT JOIN prod_sage.T_RUB ON (CODEELEMENT = T_RUB.CODERUBRIQUE OR TYPEELEMENT = 2 AND CODEELEMENT = 'BRUT' AND T_RUB.CODERUBRIQUE IN (SELECT coderubrique FROM prod_sage.T_RUB WHERE TYPERUBRIQUE = 1)) GROUP BY 1,2,3 ; UPDATE w_SEL SET BORNEINF_CATEGORIE = COALESCE(BORNEINF_CATEGORIE,''), BORNESUP_CATEGORIE = COALESCE(BORNESUP_CATEGORIE,'99999999'), BORNEINF_UNITE = COALESCE(BORNEINF_UNITE,''), BORNESUP_UNITE = COALESCE(BORNESUP_UNITE,'99999999') ; DROP TABLE IF EXISTS w_HP_CPT; CREATE TEMP TABLE w_HP_CPT AS SELECT NUMSALARIE, UNITE, CATEGORIE, CODERUBRIQUE, ''::text AS COMPTEGENERAL, NULL::bigint AS compte_id FROM w_hp WHERE CODERUBRIQUE <> 0 GROUP BY 1,2,3,4 ; UPDATE w_HP_CPT SET COMPTEGENERAL = w_SEL.COMPTEGENERAL FROM w_SEL WHERE w_hp_CPT.CODERUBRIQUE = ANY(w_SEL.RUBRIQUES) AND w_hp_CPT.CODERUBRIQUE <> ALL(w_SEL.RUBRIQUES_SAUF) AND UNITE BETWEEN BORNEINF_UNITE AND BORNESUP_UNITE AND CATEGORIE BETWEEN BORNEINF_CATEGORIE AND BORNESUP_CATEGORIE ; UPDATE w_HP_CPT SET compte_id = t_compte.oid FROM rh.t_compte WHERE COMPTEGENERAL = t_compte.code ; CREATE INDEX i_HP_CPT_1 ON w_HP_CPT USING btree (NUMSALARIE) ; -- Génération paie SELECT base.cti_stash_table_indexes('rh', 'p_historique_paie') ; TRUNCATE rh.p_historique_paie ; INSERT INTO rh.p_historique_paie( code_original, age_id, base, nombre, contrat_id, contrat_mois_id, date_debut, date_fin, date_paie, mois_activite, mois_paie, 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, profil_id, rubrique_id, compte_id, salarie_id, taux_cotisation_patronale, taux_cotisation_salarie, nombre_provisions, montant_provisions, montant_masse_salariale_provisionnee) SELECT w_hp.matricule||date::date||typedubulletin::text as code_original, date_part('year', age(date, date_naissance)) AS age_id, base, nombre, contrat_id, contrat_mois_id, w_hp.date_debut, w_hp.date_fin, date::date AS date_paie, w_hp.mois AS mois_activite, w_hp.mois AS mois_paie, heure_contrat, heure_payee, heure_travaillee, avt_nat AS montant_avantage_nature, montant_brut AS montant_brut, masse_salariale as montant_masse_salariale, montant_pat AS montant_cotisation_patronale, montant_sal AS montant_cotisation_salarie, montant_frais_imposables, net_a_payer AS montant_net_a_payer_salarie, net_imposable AS montant_net_imposable_salarie, od_net AS montant_od_net_salarie, 0 AS organisme_cotisation_id, w_hp.profil_id, t_rubriques.oid AS rubrique_id, COALESCE(w_HP_CPT.compte_id, w_RUB_CPG.compte_id,0) AS compte_id, p_salaries.oid, taux_pat AS taux_cotisation_patronale, taux_sal AS taux_cotisation_salarie, nombre_provisions, montant_provisions, masse_salariale_provisionnee AS montant_masse_salariale_provisionnee FROM w_hp JOIN rh.p_salaries ON p_salaries.matricule = w_hp.matricule JOIN rh.t_rubriques ON t_rubriques.code_original = w_hp.rub_code LEFT JOIN w_HP_CPT ON w_hp.NUMSALARIE = w_HP_CPT.NUMSALARIE AND w_hp.UNITE = w_HP_CPT.UNITE AND w_hp.CATEGORIE = w_HP_CPT.CATEGORIE AND w_hp.CODERUBRIQUE = w_HP_CPT.CODERUBRIQUE LEFT JOIN w_RUB_CPG ON w_hp.rub_code = w_RUB_CPG.CODERUBRIQUE WHERE t_rubriques.p_detail ; SELECT base.cti_stash_pop_table_indexes('rh', 'p_historique_paie') ; ]]> = rhp('rhprovider_start')::date GROUP BY 1,2,3 ; -- 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 ( age_id, contrat_id, contrat_mois_id, date_debut, date_fin, date_paie, mois_activite, mois_paie, base, nombre, heure_contrat, heure_payee, heure_travaillee, montant_masse_salariale, montant_avantage_nature, montant_brut, 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, profil_id, rubrique_id, compte_id, salarie_id, taux_cotisation_patronale, taux_cotisation_salarie, nombre_provisions, montant_provisions, montant_masse_salariale_provisionnee) SELECT subq.age_id, 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, 0 as heure_contrat, 0 as heure_payee, 0 as heure_travaillee, 0 as montant_masse_salariale, COALESCE(hcum_avantage_nature,0) - subq.montant_avantage_nature AS montant_avantage_nature, COALESCE(hcum_brut,0) - subq.montant_brut AS montant_brut, 0 AS montant_cotisation_patronale, 0 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.profil_id AS profil_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, 0 AS nombre_provisions, 0 AS montant_provisions, 0 AS montant_masse_salariale_provisionnee FROM ( SELECT p_historique_paie.age_id, p_historique_paie.contrat_id, p_historique_paie.contrat_mois_id, p_historique_paie.date_debut, p_historique_paie.date_fin, p_historique_paie.date_paie, p_historique_paie.mois_activite, p_historique_paie.mois_paie, sum(montant_avantage_nature) AS montant_avantage_nature, sum(montant_brut) AS montant_brut, 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, p_historique_paie.organisme_cotisation_id, p_historique_paie.profil_id, (SELECT oid FROM rh.t_rubriques WHERE code = 'C000'), p_historique_paie.salarie_id, 0 AS taux_cotisation_patronale, 0 AS taux_cotisation_salarie, 0 AS nombre_provisions, 0 AS montant_provisions, 0 AS montant_masse_salariale_provisionnee FROM rh.p_historique_paie JOIN rh.p_salaries ON p_salaries.oid = p_historique_paie.salarie_id GROUP BY 1,2,3,4,5,6,7,8, 17,18,19,20) AS subq JOIN rh.p_salaries ON p_salaries.oid = subq.salarie_id JOIN w_totaux ON 1=1 AND w_totaux.matricule = p_salaries.matricule AND w_totaux.date = subq.date_paie 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_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 ; -- Insérer pour chaque bulletin une ligne qui va faire le compte avec le total (rubrique 'C006' nommée 'Ecart cumulé patronal') INSERT INTO rh.p_historique_paie ( age_id, contrat_id, contrat_mois_id, date_debut, date_fin, date_paie, mois_activite, mois_paie, base, nombre, heure_contrat, heure_payee, heure_travaillee, montant_masse_salariale, montant_avantage_nature, montant_brut, 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, profil_id, rubrique_id, compte_id, salarie_id, taux_cotisation_patronale, taux_cotisation_salarie, nombre_provisions, montant_provisions, montant_masse_salariale_provisionnee ) SELECT subq.age_id, 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, 0 as heure_contrat, 0 as heure_payee, 0 as heure_travaillee, 0 as montant_masse_salariale, 0 AS montant_avantage_nature, 0 AS montant_brut, COALESCE(hcum_cotisation_patronale,0) - subq.montant_cotisation_patronale AS montant_cotisation_patronale, 0 AS montant_cotisation_salarie, 0 AS montant_frais_imposables, 0 AS montant_net_a_payer_salarie, 0 AS montant_net_imposable_salarie, 0 AS montant_od_net_salarie, subq.organisme_cotisation_id AS organisme_cotisation_id, subq.profil_id AS profil_id, (SELECT oid FROM rh.t_rubriques WHERE code = 'C006') AS rubrique_id, 0 AS compte_id, subq.salarie_id AS salarie_id, 0 AS taux_cotisation_patronale, 0 AS taux_cotisation_salarie, 0 AS nombre_provisions, 0 AS montant_provisions, 0 AS montant_masse_salariale_provisionnee FROM ( SELECT p_historique_paie.age_id, p_historique_paie.contrat_id, p_historique_paie.contrat_mois_id, p_historique_paie.date_debut, p_historique_paie.date_fin, p_historique_paie.date_paie, p_historique_paie.mois_activite, p_historique_paie.mois_paie, sum(montant_avantage_nature) AS montant_avantage_nature, sum(montant_brut) AS montant_brut, 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, p_historique_paie.organisme_cotisation_id, p_historique_paie.profil_id, (SELECT oid FROM rh.t_rubriques WHERE code = 'C006'), p_historique_paie.salarie_id, 0 AS taux_cotisation_patronale, 0 AS taux_cotisation_salarie, 0 AS nombre_provisions, 0 AS montant_provisions, 0 AS montant_masse_salariale_provisionnee FROM rh.p_historique_paie JOIN rh.p_salaries ON p_salaries.oid = p_historique_paie.salarie_id GROUP BY 1,2,3,4,5,6,7,8, 17,18,19,20) AS subq JOIN rh.p_salaries ON p_salaries.oid = subq.salarie_id JOIN w_totaux ON 1=1 AND w_totaux.matricule = p_salaries.matricule AND w_totaux.date = subq.date_paie WHERE 1!=1 OR COALESCE(hcum_cotisation_patronale,0) - subq.montant_cotisation_patronale <> 0 ; -- Insérer pour chaque bulletin une ligne qui va faire le compte avec le total (rubrique 'C007' nommée 'Ecart cumulé cotisations salariales') INSERT INTO rh.p_historique_paie ( age_id, contrat_id, contrat_mois_id, date_debut, date_fin, date_paie, mois_activite, mois_paie, base, nombre, heure_contrat, heure_payee, heure_travaillee, montant_masse_salariale, montant_avantage_nature, montant_brut, 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, profil_id, rubrique_id, compte_id, salarie_id, taux_cotisation_patronale, taux_cotisation_salarie, nombre_provisions, montant_provisions, montant_masse_salariale_provisionnee) SELECT subq.age_id, 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, 0 as heure_contrat, 0 as heure_payee, 0 as heure_travaillee, 0 as montant_masse_salariale, 0 AS montant_avantage_nature, 0 AS montant_brut, 0 AS montant_cotisation_patronale, COALESCE(hcum_cotisation_salarie,0) - subq.montant_cotisation_salarie AS montant_cotisation_salarie, 0 AS montant_frais_imposables, 0 AS montant_net_a_payer_salarie, 0 AS montant_net_imposable_salarie, 0 AS montant_od_net_salarie, subq.organisme_cotisation_id AS organisme_cotisation_id, subq.profil_id AS profil_id, (SELECT oid FROM rh.t_rubriques WHERE code = 'C007') AS rubrique_id, 0 AS compte_id, subq.salarie_id AS salarie_id, 0 AS taux_cotisation_patronale, 0 AS taux_cotisation_salarie, 0 AS nombre_provisions, 0 AS montant_provisions, 0 AS montant_masse_salariale_provisionnee FROM ( SELECT p_historique_paie.age_id, p_historique_paie.contrat_id, p_historique_paie.contrat_mois_id, p_historique_paie.date_debut, p_historique_paie.date_fin, p_historique_paie.date_paie, p_historique_paie.mois_activite, p_historique_paie.mois_paie, sum(montant_avantage_nature) AS montant_avantage_nature, sum(montant_brut) AS montant_brut, 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, p_historique_paie.organisme_cotisation_id, p_historique_paie.profil_id, (SELECT oid FROM rh.t_rubriques WHERE code = 'C000'), p_historique_paie.salarie_id, 0 AS taux_cotisation_patronale, 0 AS taux_cotisation_salarie, 0 AS nombre_provisions, 0 AS montant_provisions, 0 AS montant_masse_salariale_provisionnee FROM rh.p_historique_paie JOIN rh.p_salaries ON p_salaries.oid = p_historique_paie.salarie_id GROUP BY 1,2,3,4,5,6,7,8, 17,18,19,20) AS subq JOIN rh.p_salaries ON p_salaries.oid = subq.salarie_id JOIN w_totaux ON 1=1 AND w_totaux.matricule = p_salaries.matricule AND w_totaux.date = subq.date_paie WHERE 1!=1 OR COALESCE(hcum_cotisation_salarie,0) - subq.montant_cotisation_salarie <> 0 ; -- Supprimer les C000 qui contrepassent exactement DROP TABLE IF EXISTS w_historique_paie_c000 ; CREATE TEMP TABLE w_historique_paie_c000 AS SELECT contrat_mois_id, mois_paie, SUM(montant_brut) AS montant_brut_c000, MIN(rubrique_id) AS rubrique_c000_id FROM rh.p_historique_paie WHERE rubrique_id IN (SELECT oid FROM rh.t_rubriques WHERE code = 'C000') GROUP BY 1,2 HAVING SUM(montant_brut) <> 0 ; DROP TABLE IF EXISTS w_historique_paie_frais ; CREATE TEMP TABLE w_historique_paie_frais AS SELECT p_historique_paie.contrat_mois_id, p_historique_paie.mois_paie, rubrique_c000_id, MIN(rubrique_id) AS rubrique_frais_id FROM rh.p_historique_paie JOIN w_historique_paie_c000 ON p_historique_paie.contrat_mois_id = w_historique_paie_c000.contrat_mois_id AND p_historique_paie.mois_paie = w_historique_paie_c000.mois_paie AND p_historique_paie.montant_brut = 0 - w_historique_paie_c000.montant_brut_c000 GROUP BY 1,2,3 HAVING count(*) = 1 ; UPDATE rh.p_historique_paie SET montant_frais_imposables = CASE WHEN rubrique_id = rubrique_frais_id THEN montant_brut ELSE 0 END, montant_brut = 0 FROM w_historique_paie_frais WHERE 1=1 AND p_historique_paie.contrat_mois_id = w_historique_paie_frais.contrat_mois_id AND p_historique_paie.mois_paie = w_historique_paie_frais.mois_paie AND p_historique_paie.rubrique_id IN (rubrique_frais_id, rubrique_c000_id) ; ]]> = '2008-01-01' GROUP BY 1,2,3,4 ; -- Peuplement de rh.p_visites_medicales TRUNCATE rh.p_visites_medicales ; ALTER SEQUENCE rh.s_visites_medicales RESTART WITH 1 ; INSERT INTO rh.p_visites_medicales( salarie_id, contrat_id, contrat_mois_id, mois_activite, date, motif_visite_id) SELECT p_salaries.oid, p_contrats_mois.contrat_id, p_contrats_mois.oid, w_visites.mois_activite, w_visites.date, coalesce(t_motifs_visite.oid, 0) FROM w_visites JOIN rh.p_salaries ON p_salaries.matricule = w_visites.matricule JOIN rh.p_contrats_mois ON 1=1 AND p_contrats_mois.salarie_id = p_salaries.oid AND w_visites.date BETWEEN p_contrats_mois.date_debut AND p_contrats_mois.date_fin LEFT JOIN rh.t_motifs_visite ON t_motifs_visite.code_original = w_visites.motif ; ]]>