You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

1854 lines
85 KiB

<?xml version="1.0" encoding="ISO-8859-15"?>
<ROOT>
<NODE name="INIT" label="INITIALISATIONS">
<NODE label="Pré-traitements">
<sqlcmd><![CDATA[
SET DATESTYLE TO ISO, European
;
-- Matérialisation tables historique
DROP TABLE IF EXISTS MATERIAL_HIST_RUBR_SALA_T;
CREATE TEMP TABLE MATERIAL_HIST_RUBR_SALA_T AS
SELECT
PERI,
ID_RUBR,
ID_SALA,
LIBELLE,
NOMB,
BASE,
TAUX_SALA,
MONT_SALA,
TAUX_PATR,
MONT_PATR,
BASE_COTI,
DATE_PAIE,
DATE_DEBU_PERI,
DATE_FIN_PERI,
ID_ETAB,
CODE_ANAL,
CATE_PROF,
SERV,
DEPA,
ID_SOCI,
ID_MODBULL,
ID_CAIS,
CODE_RUBR,
INTI_RUBR,
TYPE_RUBR,
ID_SIMU,
FIXE,
ACTI,
NEUT_CODE,
REGR,
EMPL,
ID_EMPL,
MONT_PATR_IMPO,
EQUI,
ID_PERS
FROM prod_nibelis.HIST_RUBR_SALA_T
;
ANALYSE MATERIAL_HIST_RUBR_SALA_T
;
CREATE INDEX i_MATERIAL_HIST_RUBR_SALA_T_1
ON MATERIAL_HIST_RUBR_SALA_T
USING btree
(ID_SALA);
CREATE INDEX i_MATERIAL_HIST_RUBR_SALA_T_2
ON MATERIAL_HIST_RUBR_SALA_T
USING btree
(ID_RUBR);
DROP TABLE IF EXISTS MATERIAL_HIST_CONS_SALA;
CREATE TEMP TABLE MATERIAL_HIST_CONS_SALA AS
SELECT PERI, ID_SALA, CODE_CONS, VALE
FROM prod_nibelis.HIST_CONS_SALA_CUMUL
WHERE CODE_CONS = ANY(ARRAY['COEFFIC', 'PRESENCE', 'TOTALH', 'TOTALHTRAV'])
;
ANALYSE MATERIAL_HIST_CONS_SALA
;
CREATE INDEX i_MATERIAL_HIST_CONS_SALA_1
ON MATERIAL_HIST_CONS_SALA
USING btree
(ID_SALA);
CREATE INDEX i_MATERIAL_HIST_CONS_SALA_2
ON MATERIAL_HIST_CONS_SALA
USING btree
(CODE_CONS);
-- Table de travail HIST_SALARIE
DROP TABLE IF EXISTS w_HIST_SALARIE
;
CREATE TEMP TABLE w_HIST_SALARIE AS
SELECT *
FROM prod_nibelis.HIST_SALARIE HIST_SALARIE
WHERE DATE_DEBU_CONT IS NOT NULL
;
ANALYSE w_HIST_SALARIE
;
CREATE INDEX i_w_HIST_SALARIE_1
ON w_HIST_SALARIE
USING btree
(ID_SALA);
-- Attention, le matricule du salarie a pu changer. On garde le courant
UPDATE w_HIST_SALARIE HIST_SALARIE
SET MATR = SALARIE_T.MATR
FROM prod_nibelis.SALARIE_T
WHERE HIST_SALARIE.ID_SALA = SALARIE_T.ID_SALA AND
HIST_SALARIE.MATR IS DISTINCT FROM SALARIE_T.MATR
;
DROP TABLE IF EXISTS w_ets
;
CREATE TEMP TABLE w_ets AS
SELECT
id_etab,
id_soci::int,
sire,
0::bigint as entreprise_id,
0::bigint as etablissement_id
from prod_nibelis.etablissement_t
where 1=1
AND (1!=1
OR substr(sire, 1, 9) IN (SELECT rhp_in('siren')) -- Soit un ou plusieurs SIREN ont été défini,
OR sire IN (SELECT rhp_in('siren')) -- et/ou soit un ou plusieurs SIRET,
OR id_etab IN (SELECT rhp_in('siren'))) -- et/ou soit un ou plusieurs codes établissement.
;
DROP TABLE IF EXISTS w_sal2excl
;
CREATE TEMP TABLE w_sal2excl AS
select id_sala
from prod_nibelis.salarie_t
where true
and id_etab in (select id_etab from w_ets group by 1)
and id_simu is not null
;
DROP TABLE IF EXISTS w_HIST_RUBR_SALA_T;
CREATE TEMP TABLE w_HIST_RUBR_SALA_T AS
SELECT ID_SALA, PERI
FROM MATERIAL_HIST_RUBR_SALA_T HIST_RUBR_SALA_T
GROUP BY 1,2
;
ANALYSE w_HIST_RUBR_SALA_T
;
DROP TABLE IF EXISTS w_cnt
;
CREATE TEMP TABLE w_cnt AS
with cnt_agg as (
select
id_etab::bigint,
hist_salarie.id_sala::bigint,
trim(matr) as matr,
trim(matr)||'-'::text||to_char(to_date(COALESCE(hist_salarie.date_debu_cont,hist_salarie.date_emba),'DD/MM/YYYY'), 'YYYYMMDD') as ncnt,
trim(id_etab)||'-'::text||trim(hist_salarie.id_sala)||'-'::text||trim(matr)||'-'::text||to_char(to_date(COALESCE(hist_salarie.date_debu_cont,hist_salarie.date_emba),'DD/MM/YYYY'), 'YYYYMMDD') as ncnt_ori,
COALESCE(hist_salarie.date_debu_cont,hist_salarie.date_emba)::date AS date_debu_cont,
(max(array[hist_salarie.peri::date, date_fin_cont::date]))[2] as date_fin_cont,
MAX(sala_supp) AS sala_supp,
(max(array[hist_salarie.peri::date, date_anci::date]))[2] as date_anci
from w_HIST_SALARIE AS HIST_SALARIE
LEFT JOIN w_HIST_RUBR_SALA_T ON
w_HIST_RUBR_SALA_T.ID_SALA = HIST_SALARIE.ID_SALA AND
w_HIST_RUBR_SALA_T.PERI = HIST_SALARIE.PERI
where true
and (hist_salarie.SALA_SUPP <> '' OR w_HIST_RUBR_SALA_T.ID_SALA IS NOT NULL)
and id_etab in (select id_etab from w_ets group by 1)
and hist_salarie.id_sala not in (select id_sala from w_sal2excl) -- suppression des salariés de démo.
group by 1,2,3,4,5,6)
select
id_etab,
id_sala,
matr,
ncnt,
ncnt_ori,
date_debu_cont,
coalesce(date_fin_cont, lead(date_debu_cont) over w - '1 day'::interval, '2099-12-31'::date)::date as date_fin_cont,
sala_supp,
case when date_anci > date_debu_cont then date_debu_cont else date_anci end as date_anci
from cnt_agg
window w as (partition by id_etab, id_sala order by date_debu_cont)
;
DROP TABLE IF EXISTS w_cnt_bul
;
CREATE TEMP TABLE w_cnt_bul AS
with histo_rub as (
SELECT
id_etab_rub,
id_sala_rub,
id_empl_rub,
peri_rub
FROM
(select
id_etab as id_etab_rub,
id_sala as id_sala_rub,
id_empl as id_empl_rub,
peri as peri_rub,
COUNT(*) OVER (PARTITION BY id_sala, id_etab, peri) AS nb_lignes
from MATERIAL_HIST_RUBR_SALA_T HIST_RUBR_SALA_T
group by 1,2,3,4
) AS subview
-- Permet d'éviter le problème de rubriques en doubles dans certains cas
WHERE subview.nb_lignes = 1 OR (subview.nb_lignes > 1 AND id_empl_rub IS NOT NULL)
)
, w_emplois as (
select
trim(id_empl) as id_empl,
trim(libe) as libe,
trim(code_inse) as code_inse
from prod_nibelis.emplois
where id_soci::bigint = (select id_soci from w_ets limit 1)
group by 1,2,3)
, w_coeff as (
select
id_sala as coeff_id_sala,
peri as coeff_peri,
coalesce(vale, '0') as coeff
from MATERIAL_HIST_CONS_SALA hist_cons_sala
where code_cons = 'COEFFIC'
group by 1,2,3)
select
hist_salarie.id_etab::bigint,
hist_salarie.id_sala::bigint,
trim(hist_salarie.matr) as matr,
trim(hist_salarie.matr)||'-'::text||to_char(to_date(hist_salarie.date_debu_cont,'DD/MM/YYYY'), 'YYYYMMDD') as ncnt,
trim(hist_salarie.id_etab)||'-'::text||trim(hist_salarie.id_sala)||'-'::text||trim(hist_salarie.matr)||'-'::text||to_char(to_date(hist_salarie.date_debu_cont,'DD/MM/YYYY'), 'YYYYMMDD') as ncnt_ori,
w_cnt.date_debu_cont,
w_cnt.date_fin_cont,
w_cnt.date_anci,
hist_salarie.peri::date,
to_char(hist_salarie.peri::date, 'YYYYMM')::int as mois_paie,
trim(hist_salarie.nume_secu_soci) as nume_secu_soci,
trim(hist_salarie.cle_secu_soci) as cle_secu_soci,
trim(hist_salarie.titr) as titr,
trim(hist_salarie.nom) as nom,
trim(hist_salarie.nom_jeun_fill) as nom_jeun_fill,
trim(hist_salarie.pren) as pren,
trim(hist_salarie.code_post) as code_post,
trim(hist_salarie.nati) as nati,
hist_salarie.date_nais::date,
trim(hist_salarie.situ_fami) as situ_fami,
hist_salarie.date_emba::date,
trim(hist_salarie.code_moti_recr_cdd) as code_moti_recr_cdd,
coalesce(hist_salarie.date_depa::date, '2099-12-31'::date) as date_depa,
trim(hist_salarie.moti_depa) as moti_depa,
w_emplois.id_empl as id_empl,
w_emplois.code_inse as code_inse,
trim(hist_salarie.cate_prof) as cate_prof,
trim(hist_salarie.natu_cont) as natu_cont,
trim(hist_salarie.serv) as serv,
trim(hist_salarie.equi) as equi,
trim(hist_salarie.regr) as regr,
trim(hist_salarie.cate_conv) as cate_conv,
trim(hist_salarie.fili_conv) as fili_conv,
REPLACE(hist_salarie.hora_mens_fich, ',', '.')::numeric AS hora_mens_fich,
w_coeff.coeff,
case when replace(hist_salarie.hora_mens_fich, ',', '.')::numeric = 0 then 1.0 else replace(hist_salarie.hora_mens_fich, ',', '.')::numeric / 151.67 end as ratio_theo,
'':: text as ttt,
'':: text as ttt_libelle,
'':: text as ttt_libelle_court,
array_remove(ARRAY[
CASE WHEN (hist_salarie.code_anal IS NOT NULL AND hist_salarie.code_anal != '') THEN hist_salarie.code_anal ELSE 'NO_CODE_ANAL' END,
CASE WHEN (hist_salarie.code_anal_axe2 IS NOT NULL AND hist_salarie.code_anal_axe2 != '') THEN hist_salarie.code_anal_axe2 ELSE 'NO_CODE_ANAL' END,
CASE WHEN (hist_salarie.code_anal_axe3 IS NOT NULL AND hist_salarie.code_anal_axe3 != '') THEN hist_salarie.code_anal_axe3 ELSE 'NO_CODE_ANAL' END,
CASE WHEN (hist_salarie.code_anal_axe4 IS NOT NULL AND hist_salarie.code_anal_axe4 != '') THEN hist_salarie.code_anal_axe4 ELSE 'NO_CODE_ANAL' END,
CASE
WHEN
(hist_salarie.code_anal IS NULL OR hist_salarie.code_anal = '') AND
(hist_salarie.code_anal_axe2 IS NULL OR hist_salarie.code_anal = '') AND
(hist_salarie.code_anal_axe3 IS NULL OR hist_salarie.code_anal = '') AND
(hist_salarie.code_anal_axe4 IS NULL OR hist_salarie.code_anal = '')
THEN chr(1)||'*'
ELSE 'NO_CODE_ANAL'
END
], 'NO_CODE_ANAL') AS codes_anal,
array_remove(ARRAY[
CASE WHEN (hist_salarie.code_anal IS NOT NULL AND hist_salarie.code_anal != '') THEN REPLACE(hist_salarie.pour_affe_anal, ',', '.') ELSE 'NO_CODE_ANAL' END,
CASE WHEN (hist_salarie.code_anal_axe2 IS NOT NULL AND hist_salarie.code_anal_axe2 != '') THEN REPLACE(hist_salarie.pour_affe_anal_axe2, ',', '.') ELSE 'NO_CODE_ANAL' END,
CASE WHEN (hist_salarie.code_anal_axe3 IS NOT NULL AND hist_salarie.code_anal_axe3 != '') THEN REPLACE(hist_salarie.pour_affe_anal_axe3, ',', '.') ELSE 'NO_CODE_ANAL' END,
CASE WHEN (hist_salarie.code_anal_axe4 IS NOT NULL AND hist_salarie.code_anal_axe4 != '') THEN REPLACE(hist_salarie.pour_affe_anal_axe4, ',', '.') ELSE 'NO_CODE_ANAL' END,
CASE
WHEN
(hist_salarie.code_anal IS NULL OR hist_salarie.code_anal = '') AND
(hist_salarie.code_anal_axe2 IS NULL OR hist_salarie.code_anal = '') AND
(hist_salarie.code_anal_axe3 IS NULL OR hist_salarie.code_anal = '') AND
(hist_salarie.code_anal_axe4 IS NULL OR hist_salarie.code_anal = '')
THEN '100'
ELSE 'NO_CODE_ANAL'
END
], 'NO_CODE_ANAL') AS codes_anal_ratio
from w_HIST_SALARIE AS HIST_SALARIE
join w_cnt on w_cnt.ncnt_ori = trim(hist_salarie.id_etab)||'-'::text||trim(hist_salarie.id_sala)||'-'::text||trim(hist_salarie.matr)||'-'::text||to_char(to_date(hist_salarie.date_debu_cont,'DD/MM/YYYY'), 'YYYYMMDD')
left join histo_rub on true
and histo_rub.id_etab_rub = hist_salarie.id_etab
and histo_rub.id_sala_rub = hist_salarie.id_sala
and histo_rub.peri_rub = hist_salarie.peri
left join w_emplois on w_emplois.id_empl = histo_rub.id_empl_rub
left join w_coeff on true
and w_coeff.coeff_id_sala = hist_salarie.id_sala
and w_coeff.coeff_peri = hist_salarie.peri
where true
and hist_salarie.id_etab in (select id_etab from w_ets group by 1)
and hist_salarie.id_sala not in (select id_sala from w_sal2excl) -- suppression des salariés de démo.
;
update w_cnt_bul set
ttt = case when ratio_theo = 1 then 'TC100' else 'TP'||lpad((ratio_theo * 100)::int::text, 3, '0') end,
ttt_libelle = case when ratio_theo = 1 then 'Temps Complet' else 'Temps Partiel '||lpad((ratio_theo * 100)::int::text, 3, '0')|| ' %' end,
ttt_libelle_court = case when ratio_theo = 1 then 'TC' else 'TP '||lpad((ratio_theo * 100)::int::text, 3, '0')|| ' %' end
;
DROP TABLE IF EXISTS w_hp_0
;
CREATE TEMP TABLE w_hp_0 AS
select
id_etab::bigint,
id_sala::bigint,
trim(HIST_RUBR_SALA_T.id_rubr) as id_rubr,
peri::date,
to_char(peri::date, 'YYYYMM')::int as mois_paie,
-- cate_prof,
-- serv,
id_modbull::bigint,
id_cais::bigint,
neut_code,
round(replace(nomb, ',', '.')::numeric, 2) as nombre,
round(replace(base, ',', '.')::numeric, 2) as base,
replace(taux_sala, ',', '.')::numeric as tx_sal,
round(replace(mont_sala, ',', '.')::numeric, 2) as mt_sal,
replace(taux_patr, ',', '.')::numeric as tx_pat,
round(replace(mont_patr, ',', '.')::numeric, 2) as mt_pat
from MATERIAL_HIST_RUBR_SALA_T HIST_RUBR_SALA_T
left join rh.t_rubriques on t_rubriques.code_original = HIST_RUBR_SALA_T.id_rubr
where true
and id_etab in (select id_etab from w_ets group by 1)
and id_sala not in (select id_sala from w_sal2excl) -- suppression des salariés de démo.
and (false
or t_rubriques.p_cumul -- il faut remonter toutes les rubriques de totalisation, même celles à 0.
or replace(nomb, ',', '.')::numeric != 0
or replace(base, ',', '.')::numeric != 0
or replace(mont_sala, ',', '.')::numeric != 0
or replace(mont_patr, ',', '.')::numeric != 0)
;
with ets_sal as (
select
id_etab,
id_sala as ets_id_sala,
peri as ets_peri
from w_hp_0
group by 1,2,3)
INSERT INTO w_hp_0
select
id_etab::bigint,
id_sala::bigint,
code_cons as id_rubr,
peri::date,
to_char(peri::date, 'YYYYMM')::int as mois_paie,
-- cate_prof,
-- serv,
0,
0,
'',
round(replace(vale, ',', '.')::numeric, 2) as nombre,
round(replace(vale, ',', '.')::numeric, 2) as base,
0 as tx_sal,
0 as mt_sal,
0 as tx_pat,
0 as mt_pat
from MATERIAL_HIST_CONS_SALA hist_cons_sala
join ets_sal on true
and ets_sal.ets_id_sala = hist_cons_sala.id_sala::bigint
and ets_sal.ets_peri = hist_cons_sala.peri::date
where code_cons in ('PRESENCE', 'TOTALH', 'TOTALHTRAV')
;
]]></sqlcmd>
</NODE>
<NODE name="INIT" type="common" />
<NODE label="Mise é jour des informations permanentes">
<sqlcmd><![CDATA[
-- Forcage paramétrage des rubriques nouvelle version
UPDATE rh.t_divers
SET valeur = '1'
WHERE code = 'OPT_STD_HP' AND
valeur <> '1'
;
-- Màj des Entreprises.
INSERT INTO rh.t_entreprises(code_original, code, texte, texte_court)
select
id_soci,
MAX(substr(sire, 1, 9)),
MAX(nom),
MAX(substr(nom, 1, 50))
from prod_nibelis.etablissement_t
where 1=1
AND id_soci NOT IN (SELECT code_original FROM rh.t_entreprises WHERE code_original IS NOT NULL)
AND id_etab in (select id_etab from w_ets group by 1)
GROUP BY 1
;
-- Màj des Etablissements.
INSERT INTO rh.t_etablissements(code_original, code, texte, texte_court, entreprise_id)
SELECT
id_etab,
sire,
nom,
substr(nom, 1, 50),
t_entreprises.oid
from prod_nibelis.etablissement_t
JOIN rh.t_entreprises ON t_entreprises.code_original = etablissement_t.id_soci
where 1=1
AND id_etab NOT IN (SELECT code_original FROM rh.t_etablissements WHERE code_original IS NOT NULL)
and id_etab in (select id_etab from w_ets group by 1)
;
-- Màj des catégories socio-professionnelles
INSERT INTO rh.t_categories_socio_professionnelle (code_original, code, texte, texte_court)
SELECT lower(code_inse), lower(code_inse), lower(code_inse), substr(lower(code_inse), 1, 50)
FROM prod_nibelis.emplois
WHERE true
and lower(code_inse) NOT IN (SELECT code_original FROM rh.t_categories_socio_professionnelle WHERE code_original IS NOT NULL)
and id_soci::bigint = (select id_soci from w_ets limit 1)
GROUP BY 1,2,3,4
;
-- Màj des sections analytiques comptables.
INSERT INTO rh.t_sections_analytiques(code_original, code, texte, texte_court)
SELECT code_anal, code_anal, libe_code_anal, substr(libe_code_anal, 1, 50)
FROM prod_nibelis.code_analytique
WHERE code_anal NOT IN (SELECT code_original FROM rh.t_sections_analytiques WHERE code_original IS NOT NULL)
;
-- Màj des sections analytiques paie.
INSERT INTO rh.t_sections_analytiques_paie(code_original, code, texte, texte_court)
SELECT code_anal, code_anal, libe_code_anal, substr(libe_code_anal, 1, 50)
FROM prod_nibelis.code_analytique
WHERE code_anal NOT IN (SELECT code_original FROM rh.t_sections_analytiques_paie WHERE code_original IS NOT NULL)
;
-- Màj des motifs de début de contrat.
INSERT INTO rh.t_motifs_debut_contrat(code_original, code, texte, texte_court)
SELECT code_moti_recr_cdd, code_moti_recr_cdd, code_moti_recr_cdd, substr(code_moti_recr_cdd, 1, 50)
FROM w_cnt_bul
WHERE code_moti_recr_cdd NOT IN (SELECT code_original FROM rh.t_motifs_debut_contrat WHERE code_original IS NOT NULL)
GROUP BY 1,2,3,4
;
-- Màj des motifs de fin de contrat.
INSERT INTO rh.t_motifs_fin_contrat(code_original, code, texte, texte_court)
SELECT moti_depa, moti_depa, moti_depa, substr(moti_depa, 1, 50)
FROM w_cnt_bul
WHERE moti_depa NOT IN (SELECT code_original FROM rh.t_motifs_fin_contrat WHERE code_original IS NOT NULL)
GROUP BY 1,2,3,4
;
-- Màj des nationalités.
INSERT INTO rh.t_nationalites(code_original, code, texte, texte_court)
SELECT nati, nati, nati, substr(nati, 1, 50)
FROM w_cnt_bul
WHERE nati NOT IN (SELECT code_original FROM rh.t_nationalites WHERE code_original IS NOT NULL)
GROUP BY 1,2,3,4
;
-- Màj des qualifications
INSERT INTO rh.t_qualifications(code_original, code, texte, texte_court)
SELECT id_empl, id_empl, libe, substr(libe, 1, 50)
FROM prod_nibelis.emplois
WHERE true
and id_empl NOT IN (SELECT code_original FROM rh.t_qualifications WHERE code_original IS NOT NULL)
and id_soci::bigint = (select id_soci from w_ets limit 1)
GROUP BY 1,2,3,4
;
-- Rubriques
DROP TABLE IF EXISTS w_RUBRIQUE_HIST;
CREATE TEMP TABLE w_RUBRIQUE_HIST AS
SELECT ID_RUBR,
MAX(CODE_RUBR) AS CODE_RUBR,
MAX(LIBELLE) AS LIBELLE,
MAX(base.cti_to_number(CODE_RUBR)) AS ORDR
FROM MATERIAL_HIST_RUBR_SALA_T HIST_RUBR_SALA_T
GROUP BY 1
;
INSERT INTO w_RUBRIQUE_HIST
SELECT
CODE_CONS,
CODE_CONS,
CODE_CONS,
-1
FROM MATERIAL_HIST_CONS_SALA HIST_CONS_SALA
WHERE CODE_CONS IN ('PRESENCE', 'TOTALH', 'TOTALHTRAV')
GROUP BY 1
;
UPDATE rh.t_rubriques SET
code = CODE_RUBR,
texte = LIBELLE,
texte_court = substr(LIBELLE, 1, 50)
FROM w_RUBRIQUE_HIST
WHERE t_rubriques.code_original = ID_RUBR AND
(
code IS DISTINCT FROM CODE_RUBR OR
texte IS DISTINCT FROM LIBELLE OR
texte_court IS DISTINCT FROM substr(LIBELLE, 1, 50)
)
;
INSERT INTO rh.t_rubriques(code_original, code, texte, texte_court, rang_edition)
SELECT
ID_RUBR,
CODE_RUBR,
LIBELLE,
substr(LIBELLE, 1, 50),
ORDR
FROM w_RUBRIQUE_HIST
WHERE ID_RUBR NOT IN (SELECT code_original FROM rh.t_rubriques WHERE code_original IS NOT NULL)
GROUP BY 1,2,3,4,5
;
-- Màj des situations de famille
INSERT INTO rh.t_situations_famille(code_original, code, texte, texte_court)
SELECT situ_fami, situ_fami, situ_fami, substr(situ_fami,1,50)
FROM w_cnt_bul
WHERE situ_fami NOT IN (SELECT code_original FROM rh.t_situations_famille WHERE code_original IS NOT NULL)
GROUP BY 1,2,3,4
;
-- Màj des types de contrat
INSERT INTO rh.t_types_contrat(code_original, code, texte, texte_court)
SELECT natu_cont, natu_cont, natu_cont, substr(natu_cont, 1, 50)
FROM w_cnt_bul
WHERE natu_cont NOT IN (SELECT code_original FROM rh.t_types_contrat WHERE code_original IS NOT NULL)
GROUP BY 1,2,3,4
;
-- Màj des statuts
INSERT INTO rh.t_statuts(code_original, code, texte, texte_court)
SELECT cate_prof, cate_prof, cate_prof, substr(cate_prof, 1, 50)
FROM w_cnt_bul
WHERE cate_prof NOT IN (SELECT code_original FROM rh.t_statuts WHERE code_original IS NOT NULL)
GROUP BY 1,2,3,4
;
-- Màj des types de temps de travail
INSERT INTO rh.t_types_temps_travail(code_original, code, texte, texte_court)
select ttt, ttt, ttt_libelle, ttt_libelle_court
from w_cnt_bul
where ttt NOT IN (SELECT code_original FROM rh.t_types_temps_travail WHERE code_original IS NOT NULL)
group by 1,2,3,4
;
-- Màj des services
INSERT INTO rh.t_services(code_original, code, texte, texte_court)
SELECT serv, serv, serv, substr(serv, 1, 50)
FROM w_cnt_bul
WHERE serv NOT IN (SELECT code_original FROM rh.t_services WHERE code_original IS NOT NULL)
GROUP BY 1,2,3,4
;
-- Màj des types horaires.
INSERT INTO rh.t_types_horaire(code_original, code, texte, texte_court)
SELECT equi, substr(equi,1,30), substr(equi,1,255), substr(equi, 1, 50)
FROM w_cnt_bul
WHERE equi NOT IN (SELECT code_original FROM rh.t_types_horaire WHERE code_original IS NOT NULL)
GROUP BY 1,2,3,4
;
-- Màj des codes emploi
INSERT INTO rh.t_codes_emploi(code_original, code, texte, texte_court)
SELECT regr, regr, regr, substr(regr, 1, 50)
FROM w_cnt_bul
WHERE regr NOT IN (SELECT code_original FROM rh.t_codes_emploi WHERE code_original IS NOT NULL)
GROUP BY 1,2,3,4
;
-- Màj des groupes de grilles
INSERT INTO rh.t_grilles_groupes(code_original, code, texte, texte_court)
SELECT cate_conv, cate_conv, cate_conv, substr(cate_conv, 1, 50)
FROM w_cnt_bul
WHERE cate_conv NOT IN (SELECT code_original FROM rh.t_grilles_groupes WHERE code_original IS NOT NULL)
GROUP BY 1,2,3,4
;
-- Màj des grilles
INSERT INTO rh.t_grilles(code_original, code, texte, texte_court)
SELECT fili_conv, fili_conv, fili_conv, substr(fili_conv, 1, 50)
FROM w_cnt_bul
WHERE fili_conv NOT IN (SELECT code_original FROM rh.t_grilles WHERE code_original IS NOT NULL)
GROUP BY 1,2,3,4
;
-- Màj des spécialités (coefficient nibélis).
INSERT INTO rh.t_specialites(code_original, code, texte, texte_court)
SELECT coeff, coeff, coeff, substr(coeff, 1, 50)
FROM w_cnt_bul
WHERE coeff NOT IN (SELECT code_original FROM rh.t_specialites WHERE code_original IS NOT NULL)
GROUP BY 1,2,3,4
;
]]></sqlcmd>
</NODE>
<NODE label="Paramétrage des rubriques">
<sqlcmd><![CDATA[
-- Pré-paramétrage automatique des rubriques (au mieux).
-- Cette requéte n'intervient pas sur les rubriques paramétrées é la main.
-- s_* (source_) :
-- - 0 = nombre
-- - 1 = base
-- - 2 = taux salarial
-- - 3 = montant salarial
-- - 4 = taux patronal
-- - 5 = montant patronal
-- - 6 = montant salarial + montant patronal
WITH rub_param AS (
SELECT
ID_RUBR,
MAX(TYPE_RUBR) AS TYPE_RUBR,
MAX(LIBELLE) AS LIBELLE
FROM MATERIAL_HIST_RUBR_SALA_T HIST_RUBR_SALA_T
GROUP BY 1)
UPDATE rh.t_rubriques SET
p_cumul = subq.p_cumul,
p_detail = subq.p_detail,
p_nombre = subq.p_nombre,
s_nombre = 0,
c_nombre = 1,
p_base = subq.p_base,
s_base = 1,
c_base = 1,
p_heures_contrat = subq.p_heures_contrat,
s_heures_contrat = 0,
c_heures_contrat = 1,
p_heures_payees = subq.p_heures_payees,
s_heures_payees = 0,
c_heures_payees = 1,
p_heures_travaillees = subq.p_heures_travaillees,
s_heures_travaillees = 0,
c_heures_travaillees = 1,
p_masse_salariale = subq.p_masse_salariale,
s_masse_salariale = case when subq.p_cotisation_patronale or subq.p_od_net_patronale then 5 else 3 end,
c_masse_salariale = 1,
p_brut = subq.p_brut,
s_brut = 3,
c_brut = 1,
p_avantage_nature = subq.p_avantage_nature,
s_avantage_nature = 3,
c_avantage_nature = 1,
p_frais_imposables = subq.p_frais_imposables,
s_frais_imposables = 3,
c_frais_imposables = 1,
p_cotisation_salarie = subq.p_cotisation_salarie,
s_cotisation_salarie = 3,
c_cotisation_salarie = -1,
p_cotisation_patronale = subq.p_cotisation_patronale,
s_cotisation_patronale = 5,
c_cotisation_patronale = 1,
p_od_net_salarie = subq.p_od_net_salarie,
s_od_net_salarie = 3,
c_od_net_salarie = -1,
p_od_net_patronale = subq.p_od_net_patronale,
s_od_net_patronale = 5,
c_od_net_patronale = 1,
p_net_imposable = subq.p_net_imposable,
s_net_imposable = 3,
c_net_imposable = case when subq.p_cotisation_salarie then -1 else 1 end,
p_net_a_payer = subq.p_net_a_payer,
s_net_a_payer = 3,
c_net_a_payer = case when subq.p_cotisation_salarie or subq.p_od_net_salarie then -1 else 1 end
FROM (
SELECT
oid,
code,
rub_param.TYPE_RUBR = '4' AS p_cumul,
rub_param.TYPE_RUBR != '4' AS p_detail,
rub_param.TYPE_RUBR != '4'AS p_nombre,
rub_param.TYPE_RUBR != '4' AS p_base,
false AS p_heures_contrat,
false AS p_heures_payees,
false AS p_heures_travaillees,
TYPE_RUBR IN ('1', '2') OR TYPE_RUBR = '4' AND LIBELLE ILIKE 'TOTAL BRUT' OR rub_param.TYPE_RUBR = '4' AND LIBELLE ILIKE 'TOTAL COTISATIONS' AS p_masse_salariale,
TYPE_RUBR = '1' OR TYPE_RUBR = '4' AND LIBELLE ILIKE 'TOTAL BRUT' AS p_brut,
false AS p_avantage_nature,
false AS p_frais_imposables,
TYPE_RUBR = '2' OR rub_param.TYPE_RUBR = '4' AND LIBELLE ILIKE 'TOTAL COTISATIONS' AS p_cotisation_salarie,
TYPE_RUBR = '2' OR rub_param.TYPE_RUBR = '4' AND LIBELLE ILIKE 'TOTAL COTISATIONS' AS p_cotisation_patronale,
TYPE_RUBR = '3' OR rub_param.TYPE_RUBR = '4' AND LIBELLE ILIKE 'TOTAL BRUT' OR rub_param.TYPE_RUBR = '4' AND LIBELLE ILIKE 'TOTAL COTISATIONS' AS p_od_net_salarie,
false AS p_od_net_patronale,
TYPE_RUBR IN ('1', '2') AS p_net_imposable,
rub_param.TYPE_RUBR != '4' AS p_net_a_payer
FROM rh.t_rubriques
join rub_param ON rub_param.id_rubr = t_rubriques.code_original
WHERE 1=1
AND t_rubriques.oid != 0
AND t_rubriques.user_modified = false
AND t_rubriques.code not ilike 'C%'
AND (
rub_param.TYPE_RUBR != '4' OR
rub_param.TYPE_RUBR = '4' AND LIBELLE ILIKE 'TOTAL BRUT' OR
rub_param.TYPE_RUBR = '4' AND LIBELLE ILIKE 'TOTAL COTISATIONS'
)
) AS subq
WHERE 1=1
AND t_rubriques.oid = subq.oid
AND NOT t_rubriques.user_modified
;
]]></sqlcmd>
</NODE>
</NODE>
<NODE name="PROD" label="RECUPERATION DES DONNEES DE PRODUCTION">
<NODE label="Profils">
<sqlcmd><![CDATA[
DROP TABLE IF EXISTS w_profils;
CREATE TEMP TABLE w_profils AS
select
row_number() over () as row_id,
0 as profil_id,
0 as contrat_id,
0 as contrat_mois_id,
0 as salarie_id,
w_cnt_bul.id_etab,
w_cnt_bul.id_sala,
w_cnt_bul.matr,
w_cnt_bul.ncnt_ori,
w_cnt_bul.peri,
w_cnt_bul.ratio_theo,
w_cnt_bul.date_debu_cont,
w_cnt_bul.date_fin_cont,
w_cnt_bul.date_anci,
case when to_char(w_cnt_bul.peri, 'YYYYMM') = to_char(w_cnt_bul.date_debu_cont, 'YYYYMM') then w_cnt_bul.date_debu_cont else base.cti_first_day((to_char(w_cnt_bul.peri, 'YYYYMM')||'01')::date) end as date_debut,
case when to_char(w_cnt_bul.peri, 'YYYYMM') = to_char(w_cnt_bul.date_fin_cont, 'YYYYMM') then w_cnt_bul.date_fin_cont else base.cti_last_day((to_char(w_cnt_bul.peri, 'YYYYMM')||'01')::date) end as date_fin,
w_cnt_bul.date_nais,
w_cnt_bul.mois_paie,
w_cnt_bul.peri as date_paie,
case when to_char(w_cnt_bul.peri, 'YYYYMM') between to_char(w_cnt_bul.date_debu_cont, 'YYYYMM') and to_char(w_cnt_bul.date_fin_cont, 'YYYYMM') then '0' else '1' end as est_hors_periode,
-- **** code original ****
coalesce(code_moti_recr_cdd, chr(1)||'*') as motif_debut_code_original,
coalesce(moti_depa, chr(1)||'*') as motif_fin_code_original,
coalesce(code_inse, chr(1)||'*') AS categorie_socio_professionnelle_code_original,
coalesce(id_empl, chr(1)||'*') AS qualification_code_original,
coalesce(serv, chr(1)||'*') AS service_code_original,
coalesce(regr, chr(1)||'*') AS code_emploi_code_original,
coalesce(fili_conv, chr(1)||'*') AS grille_code_original,
coalesce(cate_conv, chr(1)||'*') AS grille_groupe_code_original,
coalesce(coeff, chr(1)||'*') AS specialite_code_original,
chr(1)||'*' AS groupe_cotisant_code_original,
chr(1)||'*' AS section_analytique_code_original,
chr(1)||'*' AS section_analytique_paie_code_original,
chr(1)||'*' AS societe_interim_code_original,
w_cnt_bul.codes_anal,
w_cnt_bul.codes_anal_ratio,
hora_mens_fich,
coalesce(cate_prof, chr(1)||'*') AS statut_code_original,
coalesce(natu_cont, chr(1)||'*') as type_contrat_code_original,
coalesce(equi, chr(1)||'*') AS type_horaire_code_original,
coalesce(ttt, chr(1)||'*') AS type_temps_travail_code_original,
-- Champs réservés au public.
chr(1)||'*' AS cadre_emploi_code_original, -- public
chr(1)||'*' AS categorie_conge_code_original, -- public
chr(1)||'*' AS categorie_statutaire_code_original, -- public
chr(1)||'*' AS commission_paritaire_code_original, -- public
chr(1)||'*' AS compte_salarie_code_original, -- public
chr(1)||'*' AS filiere_code_original, -- public
chr(1)||'*' AS lettre_budgetaire_code_original, -- public
chr(1)||'*' AS unite_fonctionnelle_code_original -- public
from w_cnt_bul
;
UPDATE w_profils SET
salarie_id = p_salaries.oid
FROM rh.p_salaries
WHERE w_profils.matr = p_salaries.code_original
;
]]>
</sqlcmd>
</NODE>
<NODE name="PROFIL" type="common" />
<NODE label="Profils par code analytique">
<sqlcmd><![CDATA[
-- Création des profils
DROP TABLE IF EXISTS w_profils_anal
;
CREATE TEMP TABLE w_profils_anal AS
WITH contrats_mois AS (
SELECT
salarie_id,
mois_paie,
date_fin_cont,
code_anal,
REPLACE(code_anal_ratio, ',', '.')::numeric AS code_anal_ratio
FROM w_profils, unnest(codes_anal, codes_anal_ratio) as x(code_anal, code_anal_ratio)
),
codes_anal AS (
SELECT
salarie_id,
mois_paie,
date_fin_cont,
code_anal,
SUM(code_anal_ratio) AS code_anal_ratio
FROM contrats_mois
GROUP BY 1,2,3,4
)
SELECT
row_number() over () as row_id,
profil_id,
contrat_id,
contrat_mois_id,
w_profils.salarie_id,
w_profils.id_etab,
w_profils.id_sala,
w_profils.matr,
w_profils.ncnt_ori,
w_profils.peri,
w_profils.date_debu_cont,
w_profils.date_fin_cont,
w_profils.date_anci,
w_profils.date_debut,
w_profils.date_fin,
w_profils.date_nais,
w_profils.mois_paie,
w_profils.date_paie,
w_profils.est_hors_periode,
w_profils.motif_debut_code_original,
w_profils.motif_fin_code_original,
w_profils.categorie_socio_professionnelle_code_original,
w_profils.qualification_code_original,
w_profils.service_code_original,
w_profils.code_emploi_code_original,
w_profils.grille_code_original,
w_profils.grille_groupe_code_original,
w_profils.specialite_code_original,
w_profils.groupe_cotisant_code_original,
w_profils.societe_interim_code_original,
w_profils.hora_mens_fich,
w_profils.statut_code_original,
w_profils.type_contrat_code_original,
w_profils.type_horaire_code_original,
w_profils.type_temps_travail_code_original,
w_profils.cadre_emploi_code_original, -- public
w_profils.categorie_conge_code_original, -- public
w_profils.categorie_statutaire_code_original, -- public
w_profils.commission_paritaire_code_original, -- public
w_profils.compte_salarie_code_original, -- public
w_profils.filiere_code_original, -- public
w_profils.lettre_budgetaire_code_original, -- public
w_profils.unite_fonctionnelle_code_original, -- public,
codes_anal.code_anal AS section_analytique_code_original,
codes_anal.code_anal AS section_analytique_paie_code_original,
codes_anal.code_anal_ratio
FROM w_profils
JOIN codes_anal ON codes_anal.salarie_id = w_profils.salarie_id AND codes_anal.mois_paie = w_profils.mois_paie AND codes_anal.date_fin_cont = w_profils.date_fin_cont
;
]]></sqlcmd>
</NODE>
<NODE label="Salariés">
<sqlcmd><![CDATA[
DROP TABLE IF EXISTS w_salaries
;
CREATE TEMP TABLE w_salaries AS
select
rhp('finess') AS finess,
trim(w_cnt_bul.matr) as matricule,
trim(w_cnt_bul.matr) as matricule_planning,
trim(w_cnt_bul.matr) as code,
trim(w_cnt_bul.matr) as code_original,
t_etablissements.entreprise_id,
(max(array[w_cnt_bul.peri::text , nom]))[2] as nom,
(max(array[w_cnt_bul.peri::text , nom_jeun_fill]))[2] as nom_naissance,
(max(array[w_cnt_bul.peri::text , pren]))[2] as prenom,
(max(array[w_cnt_bul.peri, w_cnt_bul.date_nais]))[2]::date as date_naissance,
case when (max(array[w_cnt_bul.peri::text , titr]))[2] = 'Mr' then 'M' else 'F' end as sexe,
coalesce((max(array[extract(epoch from w_cnt_bul.peri) , t_nationalites.oid]))[2], 0) as nationalite_id,
coalesce((max(array[extract(epoch from w_cnt_bul.peri) , t_codes_postaux.oid]))[2], 0) as code_postal_id,
coalesce((max(array[extract(epoch from w_cnt_bul.peri) , t_situations_famille.oid]))[2], 0) AS situation_famille_id,
coalesce((max(array[extract(epoch from w_cnt_bul.peri) , w_profils.profil_id]))[2], 0) AS profil_id,
max(w_cnt_bul.date_debu_cont) AS date_debut,
max(w_cnt_bul.date_fin_cont) AS date_fin,
min(w_cnt_bul.date_emba) as date_entree_ets,
max(w_cnt_bul.date_depa) as date_sortie_ets,
-- Champs dédiés au public.
null::date AS date_entree_fp,
null::date AS date_entree_fph,
0 AS no_adeli,
0 AS code_cotisation_id,
0 AS matricule_retraite
from w_cnt_bul
JOIN rh.t_etablissements ON t_etablissements.code_original = w_cnt_bul.id_etab
LEFT JOIN rh.t_situations_famille on t_situations_famille.code_original = w_cnt_bul.situ_fami
LEFT JOIN rh.t_nationalites on t_nationalites.code_original = w_cnt_bul.nati
LEFT JOIN rh.t_codes_postaux on t_codes_postaux.code = w_cnt_bul.code_post
LEFT JOIN w_profils on w_profils.matr = w_cnt_bul.matr
group by 1,2,3,4,5,6, 20,21,22,23,24
;
]]></sqlcmd>
</NODE>
<NODE name="SALARIE" type="common" />
<NODE label="Salariés (Màj oid)">
<sqlcmd><![CDATA[
UPDATE w_profils SET
salarie_id = p_salaries.oid
FROM rh.p_salaries
WHERE w_profils.matr = p_salaries.code_original
;
]]></sqlcmd>
</NODE>
<NODE label="Contrats">
<sqlcmd><![CDATA[
TRUNCATE rh.p_contrats
;
ALTER SEQUENCE rh.s_contrats RESTART WITH 1
;
INSERT INTO rh.p_contrats(
salarie_id,
date_debut,
date_fin,
numero_contrat,
code_original,
etablissement_id,
profil_id)
SELECT
p_salaries.oid AS salarie_id,
w_cnt.date_debu_cont AS date_debut,
w_cnt.date_fin_cont AS date_fin,
w_cnt.ncnt AS numero_contrat,
w_cnt.ncnt_ori AS code_original,
t_etablissements.oid AS etablissement_id,
0 as profil_id
FROM w_cnt
JOIN rh.p_salaries ON p_salaries.code_original = w_cnt.matr
JOIN rh.t_etablissements ON t_etablissements.code_original = w_cnt.id_etab
GROUP BY 1,2,3,4,5,6,7
;
UPDATE rh.p_contrats
SET
anciennete_anterieure_jours = subq.anciennete_anterieure_jours,
anciennete_anterieure_calculee_mois = subq.anciennete_anterieure_calculee_mois
FROM (
select
ncnt_ori,
coalesce(sum(date_fin_cont - date_debu_cont + 1) over w, 0) AS anciennete_anterieure_jours,
coalesce(sum(date_fin_cont - date_debu_cont + 1) over w / 30::numeric, 0) AS anciennete_anterieure_calculee_mois
from w_cnt
window w as (partition by id_etab, id_sala order by date_debu_cont rows between UNBOUNDED PRECEDING and 1 preceding)) AS subq
WHERE 1=1
AND p_contrats.code_original = subq.ncnt_ori
;
TRUNCATE rh.p_contrats_mois
;
ALTER SEQUENCE rh.s_contrats_mois RESTART WITH 1
;
INSERT INTO rh.p_contrats_mois(
salarie_id,
contrat_id,
profil_id,
code_original,
mois_activite,
date_debut,
date_fin,
nombre_entrees,
nombre_departs,
nombre_debut_contrat,
nombre_fin_contrat,
est_hors_periode, -- bulletins de paie hors période de contrat.
present_debut_mois,
present_fin_mois,
equivalent_temps_plein,
age_id,
age_jours,
anciennete_jours,
anciennete_mois,
anciennete_annee_id,
etablissement_id)
SELECT
p_contrats.salarie_id,
p_contrats.oid as contrat_id,
w_profils.profil_id,
w_profils.row_id,
w_profils.mois_paie as mois_activite,
w_profils.date_debut,
w_profils.date_fin,
case when p_salaries.date_entree_ets between w_profils.date_debut and w_profils.date_fin then 1 else 0 end as nombre_entrees,
case when p_salaries.date_sortie_ets between w_profils.date_debut and w_profils.date_fin then 1 else 0 end as nombre_departs,
case when p_contrats.date_debut between w_profils.date_debut and w_profils.date_fin then 1 else 0 end as nombre_debut_contrat,
case when p_contrats.date_fin between w_profils.date_debut and w_profils.date_fin then 1 else 0 end as nombre_fin_contrat,
w_profils.est_hors_periode,
case when w_profils.date_debut = base.cti_first_day(w_profils.date_debut) then 1 else 0 end as present_debut_mois,
case when w_profils.date_fin = base.cti_last_day(w_profils.date_fin) then 1 else 0 end as present_fin_mois,
1 as equivalent_temps_plein, -- ! Mettre le bon ETP.
base.cti_age(w_profils.date_fin, coalesce(w_profils.date_nais, '1962-04-18'::date), 'ny') AS age_id,
w_profils.date_fin - coalesce(w_profils.date_nais, '1962-04-18'::date) AS age_jours,
p_contrats.anciennete_anterieure_jours
+ (w_profils.date_fin - w_profils.date_debu_cont)
+ 1
AS anciennete_jours,
base.cti_age(date_trunc('month', w_profils.date_fin)::date, date_trunc('month', w_profils.date_debu_cont)::date, 'nm')
+ p_contrats.anciennete_anterieure_calculee_mois + 1
AS anciennete_mois,
floor((base.cti_age(date_trunc('month', w_profils.date_fin)::date, date_trunc('month', w_profils.date_debu_cont)::date, 'nm')
+ p_contrats.anciennete_anterieure_calculee_mois + 1) / 12)
AS anciennete_annee_id,
p_contrats.etablissement_id
FROM w_profils
JOIN rh.p_contrats on p_contrats.code_original = w_profils.ncnt_ori
JOIN rh.p_salaries on p_salaries.oid = p_contrats.salarie_id
;
-- Association contrat selon code orginal
UPDATE w_profils
SET contrat_id = p_contrats_mois.contrat_id,
contrat_mois_id = p_contrats_mois.oid
FROM rh.p_contrats_mois
JOIN rh.p_contrats ON p_contrats_mois.contrat_id = p_contrats.oid
WHERE ncnt_ori = p_contrats.code_original AND
p_contrats_mois.mois_activite = w_profils.mois_paie
;
UPDATE w_profils_anal
SET contrat_id = p_contrats_mois.contrat_id,
contrat_mois_id = p_contrats_mois.oid
FROM rh.p_contrats_mois
JOIN rh.p_contrats ON p_contrats_mois.contrat_id = p_contrats.oid
WHERE ncnt_ori = p_contrats.code_original AND
p_contrats_mois.mois_activite = w_profils_anal.mois_paie
;
-- Ancienne version par securite
UPDATE w_profils SET
contrat_id = p_contrats_mois.contrat_id,
contrat_mois_id = p_contrats_mois.oid
FROM rh.p_contrats_mois
WHERE w_profils.contrat_id = 0 AND
p_contrats_mois.salarie_id = w_profils.salarie_id AND p_contrats_mois.mois_activite = w_profils.mois_paie
;
-- Ancienne version par securite
UPDATE w_profils_anal
SET contrat_id = p_contrats_mois.contrat_id,
contrat_mois_id = p_contrats_mois.oid
FROM rh.p_contrats_mois
WHERE w_profils_anal.contrat_id = 0 AND
p_contrats_mois.salarie_id = w_profils_anal.salarie_id AND p_contrats_mois.mois_activite = w_profils_anal.mois_paie
;
]]></sqlcmd>
</NODE>
<NODE label="Pre-traitement de la paie">
<sqlcmd><![CDATA[
DROP TABLE IF EXISTS w_hp
;
CREATE TEMP TABLE w_hp AS
SELECT
trim(w_hp_0.id_sala)||'-'::text||w_hp_0.peri as id_bul,
w_hp_0.id_etab,
w_hp_0.id_sala,
w_profils.matr,
w_profils.contrat_mois_id,
w_profils.contrat_id,
w_profils.salarie_id,
w_profils.profil_id,
case when to_char(w_profils.date_debu_cont, 'YYYYMM') = to_char(w_hp_0.peri, 'YYYYMM') then w_profils.date_debu_cont else base.cti_first_day(w_hp_0.peri) end as date_debut,
case when to_char(w_profils.date_fin_cont, 'YYYYMM') = to_char(w_hp_0.peri, 'YYYYMM') then w_profils.date_fin_cont else base.cti_last_day(w_hp_0.peri) end as date_fin,
w_hp_0.peri as date_paie,
w_hp_0.mois_paie,
t_rubriques.oid AS rubrique_id,
t_rubriques.p_detail,
t_rubriques.p_cumul,
t_rubriques.c_base
* case when @t_rubriques.c_base != 1 then coalesce(case when proratiser_conversion then w_profils.ratio_theo else 1.0 end, 1.0) else 1.0 end
* CASE WHEN p_base THEN (CASE s_base
WHEN 0 THEN w_hp_0.nombre
WHEN 1 THEN w_hp_0.base
WHEN 2 THEN w_hp_0.tx_sal
WHEN 3 THEN w_hp_0.mt_sal
WHEN 4 THEN w_hp_0.tx_pat
WHEN 5 THEN w_hp_0.mt_pat
WHEN 6 THEN w_hp_0.mt_sal + w_hp_0.mt_pat
WHEN 7 THEN w_hp_0.mt_sal - w_hp_0.mt_pat
WHEN 8 THEN w_hp_0.mt_pat - w_hp_0.mt_sal
END) else 0 end AS base,
t_rubriques.c_nombre
* case when @t_rubriques.c_nombre != 1 then coalesce(case when proratiser_conversion then w_profils.ratio_theo else 1.0 end, 1.0) else 1.0 end
* CASE WHEN p_nombre THEN (CASE s_nombre
WHEN 0 THEN w_hp_0.nombre
WHEN 1 THEN w_hp_0.base
WHEN 2 THEN w_hp_0.tx_sal
WHEN 3 THEN w_hp_0.mt_sal
WHEN 4 THEN w_hp_0.tx_pat
WHEN 5 THEN w_hp_0.mt_pat
WHEN 6 THEN w_hp_0.mt_sal + w_hp_0.mt_pat
WHEN 7 THEN w_hp_0.mt_sal - w_hp_0.mt_pat
WHEN 8 THEN w_hp_0.mt_pat - w_hp_0.mt_sal
END) else 0 end AS nombre,
t_rubriques.c_heures_contrat
* case when @t_rubriques.c_heures_contrat != 1 then coalesce(case when proratiser_conversion then w_profils.ratio_theo else 1.0 end, 1.0) else 1.0 end
* CASE WHEN p_heures_contrat
then (CASE s_heures_contrat
WHEN 0 THEN w_hp_0.nombre
WHEN 1 THEN w_hp_0.base
WHEN 2 THEN w_hp_0.tx_sal
WHEN 3 THEN w_hp_0.mt_sal
WHEN 4 THEN w_hp_0.tx_pat
WHEN 5 THEN w_hp_0.mt_pat
WHEN 6 THEN w_hp_0.mt_sal + w_hp_0.mt_pat
WHEN 7 THEN w_hp_0.mt_sal - w_hp_0.mt_pat
WHEN 8 THEN w_hp_0.mt_pat - w_hp_0.mt_sal
END)
else 0 end
AS heure_contrat,
t_rubriques.c_heures_payees
* case when @t_rubriques.c_heures_payees != 1 then coalesce(case when proratiser_conversion then w_profils.ratio_theo else 1.0 end, 1.0) else 1.0 end
* CASE WHEN p_heures_payees
then (CASE s_heures_payees
WHEN 0 THEN w_hp_0.nombre
WHEN 1 THEN w_hp_0.base
WHEN 2 THEN w_hp_0.tx_sal
WHEN 3 THEN w_hp_0.mt_sal
WHEN 4 THEN w_hp_0.tx_pat
WHEN 5 THEN w_hp_0.mt_pat
WHEN 6 THEN w_hp_0.mt_sal + w_hp_0.mt_pat
WHEN 7 THEN w_hp_0.mt_sal - w_hp_0.mt_pat
WHEN 8 THEN w_hp_0.mt_pat - w_hp_0.mt_sal
END) else 0 end AS heure_payee,
t_rubriques.c_heures_travaillees
* case when @t_rubriques.c_heures_travaillees != 1 then coalesce(case when proratiser_conversion then w_profils.ratio_theo else 1.0 end, 1.0) else 1.0 end
* CASE WHEN p_heures_travaillees
then (CASE s_heures_travaillees
WHEN 0 THEN w_hp_0.nombre
WHEN 1 THEN w_hp_0.base
WHEN 2 THEN w_hp_0.tx_sal
WHEN 3 THEN w_hp_0.mt_sal
WHEN 4 THEN w_hp_0.tx_pat
WHEN 5 THEN w_hp_0.mt_pat
WHEN 6 THEN w_hp_0.mt_sal + w_hp_0.mt_pat
WHEN 7 THEN w_hp_0.mt_sal - w_hp_0.mt_pat
WHEN 8 THEN w_hp_0.mt_pat - w_hp_0.mt_sal
END) else 0 end AS heure_travaillee,
t_rubriques.c_masse_salariale
* (CASE WHEN p_masse_salariale THEN
(CASE s_masse_salariale
WHEN 0 THEN w_hp_0.nombre
WHEN 1 THEN w_hp_0.base
WHEN 2 THEN w_hp_0.tx_sal
WHEN 3 THEN w_hp_0.mt_sal
WHEN 4 THEN w_hp_0.tx_pat
WHEN 5 THEN w_hp_0.mt_pat
WHEN 6 THEN w_hp_0.mt_sal + w_hp_0.mt_pat
WHEN 7 THEN w_hp_0.mt_sal - w_hp_0.mt_pat
WHEN 8 THEN w_hp_0.mt_pat - w_hp_0.mt_sal
END)
else 0 end) AS masse_salariale,
t_rubriques.c_brut
* (CASE WHEN p_brut THEN
(CASE s_brut
WHEN 0 THEN w_hp_0.nombre
WHEN 1 THEN w_hp_0.base
WHEN 2 THEN w_hp_0.tx_sal
WHEN 3 THEN w_hp_0.mt_sal
WHEN 4 THEN w_hp_0.tx_pat
WHEN 5 THEN w_hp_0.mt_pat
WHEN 6 THEN w_hp_0.mt_sal + w_hp_0.mt_pat
WHEN 7 THEN w_hp_0.mt_sal - w_hp_0.mt_pat
WHEN 8 THEN w_hp_0.mt_pat - w_hp_0.mt_sal
END)
else 0 end) AS montant_brut,
t_rubriques.c_frais_imposables
* (case when p_frais_imposables then
(CASE s_frais_imposables
WHEN 0 THEN w_hp_0.nombre
WHEN 1 THEN w_hp_0.base
WHEN 2 THEN w_hp_0.tx_sal
WHEN 3 THEN w_hp_0.mt_sal
WHEN 4 THEN w_hp_0.tx_pat
WHEN 5 THEN w_hp_0.mt_pat
WHEN 6 THEN w_hp_0.mt_sal + w_hp_0.mt_pat
WHEN 7 THEN w_hp_0.mt_sal - w_hp_0.mt_pat
WHEN 8 THEN w_hp_0.mt_pat - w_hp_0.mt_sal
END)
else 0 end) AS montant_frais_imposables,
t_rubriques.coefficient_txs * (case when p_cotisation_salarie then w_hp_0.tx_sal else 0 end) AS taux_sal,
t_rubriques.c_cotisation_salarie
* (case when p_cotisation_salarie then
(CASE s_cotisation_salarie
WHEN 0 THEN w_hp_0.nombre
WHEN 1 THEN w_hp_0.base
WHEN 2 THEN w_hp_0.tx_sal
WHEN 3 THEN w_hp_0.mt_sal
WHEN 4 THEN w_hp_0.tx_pat
WHEN 5 THEN w_hp_0.mt_pat
WHEN 6 THEN w_hp_0.mt_sal + w_hp_0.mt_pat
WHEN 7 THEN w_hp_0.mt_sal - w_hp_0.mt_pat
WHEN 8 THEN w_hp_0.mt_pat - w_hp_0.mt_sal
END)
else 0 end) AS montant_cot_sal,
t_rubriques.coefficient_txp * (case when p_cotisation_patronale then w_hp_0.tx_pat else 0 end) AS taux_pat,
t_rubriques.c_cotisation_patronale
* (case when p_cotisation_patronale then
(CASE s_cotisation_patronale
WHEN 0 THEN w_hp_0.nombre
WHEN 1 THEN w_hp_0.base
WHEN 2 THEN w_hp_0.tx_sal
WHEN 3 THEN w_hp_0.mt_sal
WHEN 4 THEN w_hp_0.tx_pat
WHEN 5 THEN w_hp_0.mt_pat
WHEN 6 THEN w_hp_0.mt_sal + w_hp_0.mt_pat
WHEN 7 THEN w_hp_0.mt_sal - w_hp_0.mt_pat
WHEN 8 THEN w_hp_0.mt_pat - w_hp_0.mt_sal
END)
else 0 end) AS montant_cot_pat,
t_rubriques.c_od_net_salarie
* (CASE WHEN p_od_net_salarie THEN
(CASE s_od_net_salarie
WHEN 0 THEN w_hp_0.nombre
WHEN 1 THEN w_hp_0.base
WHEN 2 THEN w_hp_0.tx_sal
WHEN 3 THEN w_hp_0.mt_sal
WHEN 4 THEN w_hp_0.tx_pat
WHEN 5 THEN w_hp_0.mt_pat
WHEN 6 THEN w_hp_0.mt_sal + w_hp_0.mt_pat
WHEN 7 THEN w_hp_0.mt_sal - w_hp_0.mt_pat
WHEN 8 THEN w_hp_0.mt_pat - w_hp_0.mt_sal
END)
ELSE 0 END) AS od_net,
t_rubriques.c_od_net_patronale
* (CASE WHEN p_od_net_patronale THEN
(CASE s_od_net_patronale
WHEN 0 THEN w_hp_0.nombre
WHEN 1 THEN w_hp_0.base
WHEN 2 THEN w_hp_0.tx_sal
WHEN 3 THEN w_hp_0.mt_sal
WHEN 4 THEN w_hp_0.tx_pat
WHEN 5 THEN w_hp_0.mt_pat
WHEN 6 THEN w_hp_0.mt_sal + w_hp_0.mt_pat
WHEN 7 THEN w_hp_0.mt_sal - w_hp_0.mt_pat
WHEN 8 THEN w_hp_0.mt_pat - w_hp_0.mt_sal
END)
ELSE 0 END) AS od_net_p,
t_rubriques.c_avantage_nature
* (CASE WHEN p_avantage_nature THEN
(CASE s_avantage_nature
WHEN 0 THEN w_hp_0.nombre
WHEN 1 THEN w_hp_0.base
WHEN 2 THEN w_hp_0.tx_sal
WHEN 3 THEN w_hp_0.mt_sal
WHEN 4 THEN w_hp_0.tx_pat
WHEN 5 THEN w_hp_0.mt_pat
WHEN 6 THEN w_hp_0.mt_sal + w_hp_0.mt_pat
WHEN 7 THEN w_hp_0.mt_sal - w_hp_0.mt_pat
WHEN 8 THEN w_hp_0.mt_pat - w_hp_0.mt_sal
END)
ELSE 0 END) AS avt_nat,
t_rubriques.c_net_imposable
* (CASE WHEN p_net_imposable THEN
(CASE s_net_imposable
WHEN 0 THEN w_hp_0.nombre
WHEN 1 THEN w_hp_0.base
WHEN 2 THEN w_hp_0.tx_sal
WHEN 3 THEN w_hp_0.mt_sal
WHEN 4 THEN w_hp_0.tx_pat
WHEN 5 THEN w_hp_0.mt_pat
WHEN 6 THEN w_hp_0.mt_sal + w_hp_0.mt_pat
WHEN 7 THEN w_hp_0.mt_sal - w_hp_0.mt_pat
WHEN 8 THEN w_hp_0.mt_pat - w_hp_0.mt_sal
END)
ELSE 0 END) AS net_imposable,
t_rubriques.c_net_a_payer
* (CASE WHEN p_net_a_payer THEN
(CASE s_net_a_payer
WHEN 0 THEN w_hp_0.nombre
WHEN 1 THEN w_hp_0.base
WHEN 2 THEN w_hp_0.tx_sal
WHEN 3 THEN w_hp_0.mt_sal
WHEN 4 THEN w_hp_0.tx_pat
WHEN 5 THEN w_hp_0.mt_pat
WHEN 6 THEN w_hp_0.mt_sal + w_hp_0.mt_pat
WHEN 7 THEN w_hp_0.mt_sal - w_hp_0.mt_pat
WHEN 8 THEN w_hp_0.mt_pat - w_hp_0.mt_sal
END)
ELSE 0 END) AS net_a_payer
FROM w_hp_0
JOIN w_profils ON true
and w_profils.id_etab = w_hp_0.id_etab
and w_profils.id_sala = w_hp_0.id_sala
and w_profils.peri = w_hp_0.peri
JOIN rh.t_rubriques ON t_rubriques.code_original = w_hp_0.id_rubr
where 1=1
AND w_hp_0.peri >= 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 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)
;
]]></sqlcmd>
</NODE>
<NODE label="Chiffrier">
<sqlcmd><![CDATA[
TRUNCATE rh.p_chiffrier_production
;
INSERT INTO rh.p_chiffrier_production (entreprise_id, etablissement_id, mois, nombre_salaries, montant_brut, nombre_heures)
SELECT
t_etablissements.entreprise_id,
t_etablissements.oid as etablissement_id,
w_hp.mois_paie,
count(DISTINCT matr),
sum(CASE WHEN p_cumul THEN montant_brut ELSE 0 END),
sum(CASE WHEN p_cumul THEN heure_payee ELSE 0 END)
FROM w_hp
JOIN rh.t_etablissements ON t_etablissements.code_original = w_hp.id_etab
WHERE true
and w_hp.mois_paie >= to_char(rhp('rhprovider_start')::date, 'YYYYMM')::int
GROUP BY 1,2,3
;
]]></sqlcmd>
</NODE>
<NODE label="Historique de la paie">
<sqlcmd><![CDATA[
-- 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)
SELECT
w_hp.id_bul as code_original,
date_part('year', age(w_hp.date_fin, date_naissance)) AS age_id,
w_hp.base,
w_hp.nombre,
w_hp.contrat_id,
w_hp.contrat_mois_id,
w_hp.date_debut,
w_hp.date_fin,
w_hp.date_paie AS date_paie,
w_hp.mois_paie AS mois_activite,
w_hp.mois_paie AS mois_paie,
w_hp.heure_contrat,
w_hp.heure_payee,
w_hp.heure_travaillee,
w_hp.avt_nat AS montant_avantage_nature,
w_hp.montant_brut AS montant_brut,
w_hp.masse_salariale as montant_masse_salariale,
w_hp.montant_cot_pat AS montant_cotisation_patronale,
w_hp.montant_cot_sal AS montant_cotisation_salarie,
w_hp.montant_frais_imposables,
w_hp.net_a_payer AS montant_net_a_payer_salarie,
w_hp.net_imposable AS montant_net_imposable_salarie,
w_hp.od_net AS montant_od_net_salarie,
0 AS organisme_cotisation_id,
w_hp.profil_id,
w_hp.rubrique_id,
0 AS compte_id,
w_hp.salarie_id,
w_hp.taux_pat AS taux_cotisation_patronale,
w_hp.taux_sal AS taux_cotisation_salarie
FROM w_hp
JOIN rh.p_salaries ON p_salaries.oid = w_hp.salarie_id
WHERE p_detail
;
SELECT base.cti_stash_pop_table_indexes('rh', 'p_historique_paie')
;
-- Création d'une table récapitulative des écarts é calculer par indicateur de paie (1 seule ligne).
DROP TABLE IF EXISTS w_cumul
;
CREATE TEMP TABLE w_cumul AS
SELECT
bool_or(p_cumul and p_avantage_nature) as total_avantage_nature,
bool_or(p_cumul and p_brut) as total_brut,
bool_or(p_cumul and p_masse_salariale) as total_masse_salariale,
bool_or(p_cumul and p_cotisation_patronale) as total_cot_pat,
bool_or(p_cumul and p_cotisation_salarie) as total_cot_sal,
bool_or(p_cumul and p_net_a_payer) as total_payer,
bool_or(p_cumul and p_net_imposable) as total_imposable,
bool_or(p_cumul and p_heures_contrat) as total_h_contrat,
bool_or(p_cumul and p_heures_payees) as total_h_payees,
bool_or(p_cumul and p_heures_travaillees) as total_h_travaillees
FROM rh.t_rubriques
;
-- Création d'une table temp qui regroupe tous les totaux é atteindre pour calculer l'écart
DROP TABLE IF EXISTS w_totaux
;
CREATE TEMP TABLE w_totaux AS
SELECT
w_hp.id_bul as code_original,
w_hp.id_etab,
w_hp.id_sala,
w_hp.date_paie as date,
w_hp.mois_paie,
round(sum(case when p_cumul then avt_nat else 0 end), 2) AS hcum_avantage_nature,
round(sum(case when p_cumul then montant_brut else 0 end), 2) AS hcum_brut,
round(sum(case when p_cumul then masse_salariale else 0 end), 2) AS hcum_masse_salariale,
round(sum(case when p_cumul then montant_cot_pat else 0 end), 2) AS hcum_cotisation_patronale,
round(sum(case when p_cumul then montant_cot_sal else 0 end), 2) AS hcum_cotisation_salarie,
0::numeric AS hcum_frais_imposables,
round(sum(case when p_cumul then net_a_payer else 0 end), 2) AS hcum_net_a_payer_salarie,
round(sum(case when p_cumul then net_imposable else 0 end), 2) AS hcum_net_imposable_salarie,
sum(case when p_cumul then heure_contrat else 0 end) AS hcum_heures_contrat,
sum(case when p_cumul then heure_payee else 0 end) AS hcum_heures_payees,
sum(case when p_cumul then heure_travaillee else 0 end) AS hcum_heures_travaillees,
0::numeric AS montant_od_net_salarie
FROM w_hp
WHERE p_cumul
GROUP BY 1,2,3,4,5
;
-- 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 (
code_original,
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_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)
SELECT
subq.code_original,
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,
case when total_h_contrat then COALESCE(hcum_heures_contrat, 0) - subq.heure_contrat else 0.0 end AS heure_contrat,
case when total_h_payees then COALESCE(hcum_heures_payees,0) - subq.heure_payee else 0.0 end AS heure_payee,
case when total_h_travaillees then COALESCE(hcum_heures_travaillees,0) - subq.heure_travaillee else 0.0 end AS heure_travaillee,
case when total_avantage_nature then COALESCE(hcum_avantage_nature,0) - subq.montant_avantage_nature else 0.0 end AS montant_avantage_nature,
case when total_brut then COALESCE(hcum_brut,0) - subq.montant_brut else 0.0 end AS montant_brut,
case when total_masse_salariale then COALESCE(hcum_masse_salariale, 0) - subq.montant_masse_salariale else 0.0 end AS montant_masse_salariale,
case when total_cot_pat then COALESCE(hcum_cotisation_patronale,0) - subq.montant_cotisation_patronale else 0.0 end AS montant_cotisation_patronale,
case when total_cot_sal then COALESCE(hcum_cotisation_salarie,0) - subq.montant_cotisation_salarie else 0.0 end AS montant_cotisation_salarie,
0 AS montant_frais_imposables,
case when total_payer then COALESCE(hcum_net_a_payer_salarie,0) - subq.montant_net_a_payer_salarie else 0.0 end AS montant_net_a_payer_salarie,
case when total_imposable then COALESCE(hcum_net_imposable_salarie,0) - subq.montant_net_imposable_salarie else 0.0 end 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
FROM (
SELECT
p_historique_paie.code_original,
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,
0 AS base,
0 AS nombre,
sum(heure_contrat) AS heure_contrat,
sum(heure_payee) AS heure_payee,
sum(heure_travaillee) 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,
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
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,9,10,11, 24,25,26,27) AS subq
JOIN w_totaux ON w_totaux.code_original = subq.code_original
JOIN w_cumul ON true
WHERE 1!=1
OR case when total_avantage_nature then COALESCE(hcum_avantage_nature,0) - subq.montant_avantage_nature != 0 else false end
OR case when total_brut then COALESCE(hcum_brut,0) - subq.montant_brut != 0 else false end
OR case when total_masse_salariale then COALESCE(hcum_masse_salariale,0) - subq.montant_masse_salariale != 0 else false end
OR case when total_payer then COALESCE(hcum_net_a_payer_salarie,0) - subq.montant_net_a_payer_salarie != 0 else false end
OR case when total_imposable then COALESCE(hcum_net_imposable_salarie,0) - subq.montant_net_imposable_salarie != 0 else false end
OR case when total_cot_pat then COALESCE(hcum_cotisation_patronale,0) - subq.montant_cotisation_patronale != 0 else false end
OR case when total_cot_sal then COALESCE(hcum_cotisation_salarie,0) - subq.montant_cotisation_salarie != 0 else false end
OR case when total_h_contrat then COALESCE(hcum_heures_contrat, 0) - subq.heure_contrat != 0 else false end
OR case when total_h_payees then COALESCE(hcum_heures_payees,0) - subq.heure_payee != 0 else false end
OR case when total_h_travaillees then COALESCE(hcum_heures_travaillees,0) - subq.heure_travaillee != 0 else false end
;
ANALYSE rh.p_historique_paie
;
]]></sqlcmd>
</NODE>
<NODE label="Ventilation des profils">
<sqlcmd><![CDATA[
-- Ajout des nouveaux profils analytiques
INSERT INTO rh.p_profils
(
cadre_emploi_code_original,
categorie_conge_code_original,
categorie_socio_professionnelle_code_original,
categorie_statutaire_code_original,
code_emploi_code_original,
commission_paritaire_code_original,
compte_salarie_code_original,
filiere_code_original,
grille_code_original,
grille_groupe_code_original,
groupe_cotisant_code_original,
lettre_budgetaire_code_original,
motif_debut_code_original,
motif_fin_code_original,
qualification_code_original,
section_analytique_code_original,
section_analytique_paie_code_original,
service_code_original,
societe_interim_code_original,
specialite_code_original,
statut_code_original,
type_contrat_code_original,
type_horaire_code_original,
type_temps_travail_code_original,
unite_fonctionnelle_code_original
)
SELECT
w_profils_anal.cadre_emploi_code_original,
w_profils_anal.categorie_conge_code_original,
w_profils_anal.categorie_socio_professionnelle_code_original,
w_profils_anal.categorie_statutaire_code_original,
w_profils_anal.code_emploi_code_original,
w_profils_anal.commission_paritaire_code_original,
w_profils_anal.compte_salarie_code_original,
w_profils_anal.filiere_code_original,
w_profils_anal.grille_code_original,
w_profils_anal.grille_groupe_code_original,
w_profils_anal.groupe_cotisant_code_original,
w_profils_anal.lettre_budgetaire_code_original,
w_profils_anal.motif_debut_code_original,
w_profils_anal.motif_fin_code_original,
w_profils_anal.qualification_code_original,
w_profils_anal.section_analytique_code_original,
w_profils_anal.section_analytique_paie_code_original,
w_profils_anal.service_code_original,
w_profils_anal.societe_interim_code_original,
w_profils_anal.specialite_code_original,
w_profils_anal.statut_code_original,
w_profils_anal.type_contrat_code_original,
w_profils_anal.type_horaire_code_original,
w_profils_anal.type_temps_travail_code_original,
w_profils_anal.unite_fonctionnelle_code_original
FROM w_profils_anal
LEFT JOIN rh.p_profils ON
w_profils_anal.cadre_emploi_code_original = p_profils.cadre_emploi_code_original AND
w_profils_anal.categorie_conge_code_original = p_profils.categorie_conge_code_original AND
w_profils_anal.categorie_socio_professionnelle_code_original = p_profils.categorie_socio_professionnelle_code_original AND
w_profils_anal.categorie_statutaire_code_original = p_profils.categorie_statutaire_code_original AND
w_profils_anal.code_emploi_code_original = p_profils.code_emploi_code_original AND
w_profils_anal.commission_paritaire_code_original = p_profils.commission_paritaire_code_original AND
w_profils_anal.compte_salarie_code_original = p_profils.compte_salarie_code_original AND
w_profils_anal.filiere_code_original = p_profils.filiere_code_original AND
w_profils_anal.grille_code_original = p_profils.grille_code_original AND
w_profils_anal.grille_groupe_code_original = p_profils.grille_groupe_code_original AND
w_profils_anal.groupe_cotisant_code_original = p_profils.groupe_cotisant_code_original AND
w_profils_anal.lettre_budgetaire_code_original = p_profils.lettre_budgetaire_code_original AND
w_profils_anal.motif_debut_code_original = p_profils.motif_debut_code_original AND
w_profils_anal.motif_fin_code_original = p_profils.motif_fin_code_original AND
w_profils_anal.qualification_code_original = p_profils.qualification_code_original AND
w_profils_anal.section_analytique_code_original = p_profils.section_analytique_code_original AND
w_profils_anal.section_analytique_paie_code_original = p_profils.section_analytique_paie_code_original AND
w_profils_anal.service_code_original = p_profils.service_code_original AND
w_profils_anal.societe_interim_code_original = p_profils.societe_interim_code_original AND
w_profils_anal.specialite_code_original = p_profils.specialite_code_original AND
w_profils_anal.statut_code_original = p_profils.statut_code_original AND
w_profils_anal.type_contrat_code_original = p_profils.type_contrat_code_original AND
w_profils_anal.type_horaire_code_original = p_profils.type_horaire_code_original AND
w_profils_anal.type_temps_travail_code_original = p_profils.type_temps_travail_code_original AND
w_profils_anal.unite_fonctionnelle_code_original = p_profils.unite_fonctionnelle_code_original
WHERE p_profils.oid IS NULL
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
;
-- Màj les oids et textes des profils
SELECT rh.cti_reorganize_profils()
;
-- Màj des profil_id dans la table temporaire
UPDATE w_profils_anal
SET profil_id = p_profils.oid
FROM rh.p_profils
WHERE 1=1
AND p_profils.cadre_emploi_code_original = w_profils_anal.cadre_emploi_code_original
AND p_profils.categorie_conge_code_original = w_profils_anal.categorie_conge_code_original
AND p_profils.categorie_socio_professionnelle_code_original = w_profils_anal.categorie_socio_professionnelle_code_original
AND p_profils.categorie_statutaire_code_original = w_profils_anal.categorie_statutaire_code_original
AND p_profils.code_emploi_code_original = w_profils_anal.code_emploi_code_original
AND p_profils.commission_paritaire_code_original = w_profils_anal.commission_paritaire_code_original
AND p_profils.compte_salarie_code_original = w_profils_anal.compte_salarie_code_original
AND p_profils.filiere_code_original = w_profils_anal.filiere_code_original
AND p_profils.grille_code_original = w_profils_anal.grille_code_original
AND p_profils.grille_groupe_code_original = w_profils_anal.grille_groupe_code_original
AND p_profils.groupe_cotisant_code_original = w_profils_anal.groupe_cotisant_code_original
AND p_profils.lettre_budgetaire_code_original = w_profils_anal.lettre_budgetaire_code_original
AND p_profils.motif_debut_code_original = w_profils_anal.motif_debut_code_original
AND p_profils.motif_fin_code_original = w_profils_anal.motif_fin_code_original
AND p_profils.qualification_code_original = w_profils_anal.qualification_code_original
AND p_profils.section_analytique_code_original = w_profils_anal.section_analytique_code_original
AND p_profils.section_analytique_paie_code_original = w_profils_anal.section_analytique_paie_code_original
AND p_profils.service_code_original = w_profils_anal.service_code_original
AND p_profils.societe_interim_code_original = w_profils_anal.societe_interim_code_original
AND p_profils.specialite_code_original = w_profils_anal.specialite_code_original
AND p_profils.statut_code_original = w_profils_anal.statut_code_original
AND p_profils.type_contrat_code_original = w_profils_anal.type_contrat_code_original
AND p_profils.type_horaire_code_original = w_profils_anal.type_horaire_code_original
AND p_profils.type_temps_travail_code_original = w_profils_anal.type_temps_travail_code_original
AND p_profils.unite_fonctionnelle_code_original = w_profils_anal.unite_fonctionnelle_code_original
;
-- On renseigne le dernier profil connu (= dernière situation) pour chaque contrat.
WITH toto AS (
SELECT
contrat_id,
(max(ARRAY[extract(EPOCH from date_debut), profil_id]))[2] as profil_id
FROM rh.p_contrats_mois
GROUP BY 1
)
UPDATE rh.p_contrats SET
profil_id = toto.profil_id
FROM toto
WHERE p_contrats.oid = toto.contrat_id
;
-- Regroupement des codes analytiques par mois
DROP TABLE IF EXISTS w_profil_contrat_mois_anal
;
CREATE TEMP TABLE w_profil_contrat_mois_anal AS (
SELECT
profil_id,
contrat_mois_id,
SUM(code_anal_ratio) / 100 AS ratio_theo
FROM w_profils_anal
GROUP BY profil_id, contrat_mois_id
)
;
-- Correction si somme différente de 1
UPDATE w_profil_contrat_mois_anal
SET ratio_theo = ratio_theo * coeff
FROM
(
SELECT contrat_mois_id, sum(ratio_theo), base.cti_division(1,sum(ratio_theo)) AS coeff
FROM w_profil_contrat_mois_anal
GROUP BY 1
HAVING sum(ratio_theo) <> 1 AND sum(ratio_theo) <> 0
) AS subview
WHERE w_profil_contrat_mois_anal.contrat_mois_id = subview.contrat_mois_id
;
UPDATE w_profil_contrat_mois_anal
SET ratio_theo = ratio_corr
FROM
(
SELECT contrat_mois_id, sum(ratio_theo), base.cti_division(1,count(*)) AS ratio_corr
FROM w_profil_contrat_mois_anal
GROUP BY 1
HAVING sum(ratio_theo) = 0
) AS subview
WHERE w_profil_contrat_mois_anal.contrat_mois_id = subview.contrat_mois_id
;
-- Alimentation des profils simultanés.
TRUNCATE rh.p_profil_contrat_mois
;
INSERT INTO rh.p_profil_contrat_mois (
profil_id,
contrat_mois_id,
salarie_id,
ratio,
mois)
SELECT
w_profil_contrat_mois_anal.profil_id,
p_contrats_mois.oid AS contrat_mois_id,
p_contrats_mois.salarie_id,
w_profil_contrat_mois_anal.ratio_theo AS ratio,
p_contrats_mois.mois_activite
FROM rh.p_contrats_mois
JOIN w_profil_contrat_mois_anal ON w_profil_contrat_mois_anal.contrat_mois_id = p_contrats_mois.oid
GROUP BY 1,2,3,4,5
;
]]></sqlcmd>
</NODE>
</NODE>
<NODE name="POST" label="POST-TRAITEMENTS">
<NODE name="DIVERS" type="common"/>
<NODE label="Mise é jour de la table Divers (mois en cours)">
<sqlcmd><![CDATA[
-- Màj du mois non cléturé.
-- DELETE FROM rh.t_divers
-- WHERE code = 'MOIS_EN_COURS'
-- ;
-- INSERT INTO rh.t_divers(
-- code,
-- texte,
-- valeur,
-- valeur_date,
-- description)
-- VALUES(
-- 'MOIS_EN_COURS',
-- 'Mois en cours (non cléturé).',
-- (SELECT to_char(date_paie_encours, 'YYYYMM') FROM w_periode),
-- (SELECT date_paie_encours FROM w_periode),
-- 'Mois en cours (non cléturé).'
-- )
-- ;
]]></sqlcmd>
</NODE>
<NODE name="POST" type="common"/>
</NODE>
<NODE name="VACUUM" label="REORGANISATION BASE DE DONNEES">
<NODE name="VACUUM" type="common" />
</NODE>
<NODE name="RAZ" label="RAZ BASE">
<NODE name="RAZ" type="common" />
</NODE>
<NODE name="RAZ_ALL" label="RAZ ALL">
<NODE name="RAZ_ALL" type="common" />
</NODE>
</ROOT>