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.
 
 
 

2974 lines
127 KiB

<?xml version="1.0" encoding="ISO-8859-1"?>
<ROOT>
<NODE name="INIT" type="common" />
<NODE name="PROD" label="Synchronisation données">
<NODE label="Initialisation tables">
<condition><![CDATA[
SELECT count(*) > 0
FROM information_schema.tables
WHERE 1=1
AND table_schema = 'prod_octime'
;
]]></condition>
<NODE label="Initialisation table niveaux">
<condition><![CDATA[
select count(*) = 0
from information_schema.tables
where 1=1
AND table_schema = 'prod_octime'
AND table_name = 'niveaux'
;
]]></condition>
<NODE label="Paramétres et Profils">
<sqlcmd><![CDATA[
CREATE TABLE prod_octime.niveaux AS
SELECT
0::bigint as nar_id,
''::text as niv_cod1,
''::text as niv_cod2,
''::text as niv_cod3,
''::text as niv_cod4,
''::text as niv_lib4
LIMIT 0
;
-- changement description table pour que le putrecrée la table
COMMENT ON TABLE prod_octime.niveaux IS 'table created';
]]></sqlcmd>
</NODE>
</NODE>
<NODE label="Compatibilité HS/HC colonne CAL_VAL62">
<condition><![CDATA[
select count(*) = 0
from information_schema.columns
where 1=1
AND table_schema = 'prod_octime'
AND table_name = 'cptres1'
AND lower(column_name) = 'cal_val62'
;
]]></condition>
<NODE label="Paramétres et Profils">
<sqlcmd><![CDATA[
ALTER TABLE prod_octime.cptres1 add column cal_val62 numeric
;
update prod_octime.cptres1 set
cal_val62 = 0
;
-- changement description table pour que le putrecrée la table
COMMENT ON TABLE prod_octime.cptres1 IS 'column added';
]]></sqlcmd>
</NODE>
</NODE>
<NODE label="Compatibilité HS/HC colonne CAL_VAL97">
<condition><![CDATA[
select count(*) = 0
from information_schema.columns
where 1=1
AND table_schema = 'prod_octime'
AND table_name = 'cptres1'
AND lower(column_name) = 'cal_val97'
;
]]></condition>
<NODE label="Paramétres et Profils">
<sqlcmd><![CDATA[
ALTER TABLE prod_octime.cptres1 add column cal_val97 numeric
;
update prod_octime.cptres1 set
cal_val97 = 0
;
-- changement description table pour que le putrecrée la table
COMMENT ON TABLE prod_octime.cptres1 IS 'column added';
]]></sqlcmd>
</NODE>
</NODE>
<NODE label="Compatibilité HS/HC colonne CAL_VAL387">
<condition><![CDATA[
select count(*) = 0
from information_schema.columns
where 1=1
AND table_schema = 'prod_octime'
AND table_name = 'cptres1'
AND lower(column_name) = 'cal_val387'
;
]]></condition>
<NODE label="Paramétres et Profils">
<sqlcmd><![CDATA[
ALTER TABLE prod_octime.cptres1 add column cal_val387 numeric
;
update prod_octime.cptres1 set
cal_val387 = 0
;
-- changement description table pour que le putrecrée la table
COMMENT ON TABLE prod_octime.cptres1 IS 'column added';
]]></sqlcmd>
</NODE>
</NODE>
<NODE label="Compatibilité HS/HC colonne CAL_VAL388">
<condition><![CDATA[
select count(*) = 0
from information_schema.columns
where 1=1
AND table_schema = 'prod_octime'
AND table_name = 'cptres1'
AND lower(column_name) = 'cal_val388'
;
]]></condition>
<NODE label="Paramétres et Profils">
<sqlcmd><![CDATA[
ALTER TABLE prod_octime.cptres1 add column cal_val388 numeric
;
update prod_octime.cptres1 set
cal_val388 = 0
;
-- changement description table pour que le putrecrée la table
COMMENT ON TABLE prod_octime.cptres1 IS 'column added';
]]></sqlcmd>
</NODE>
</NODE>
<NODE label="Compatibilité colonne nar_id">
<condition><![CDATA[
select count(*) = 0
from information_schema.columns
where 1=1
AND table_schema = 'prod_octime'
AND table_name = 'cptres1'
AND lower(column_name) = 'nar_id'
;
]]></condition>
<NODE label="Paramétres et Profils">
<sqlcmd><![CDATA[
ALTER TABLE prod_octime.cptres1 add column nar_id bigint
;
update prod_octime.cptres1 set
nar_id = 0
;
-- changement description table pour que le put recrée la table
COMMENT ON TABLE prod_octime.cptres1 IS 'column added'
;
]]></sqlcmd>
</NODE>
</NODE>
<NODE label="Compatibilité colonne niv_cod4">
<condition><![CDATA[
select count(*) = 0
from information_schema.columns
where 1=1
AND table_schema = 'prod_octime'
AND table_name = 'cptres1'
AND lower(column_name) = 'niv_cod4'
;
]]></condition>
<NODE label="Paramétres et Profils">
<sqlcmd><![CDATA[
ALTER TABLE prod_octime.cptres1 add column niv_cod4 text
;
update prod_octime.cptres1 set
niv_cod4 = '0'
;
-- changement description table pour que le put recrée la table
COMMENT ON TABLE prod_octime.cptres1 IS 'column added'
;
]]></sqlcmd>
</NODE>
</NODE>
</NODE>
<NODE>
<condition><![CDATA[
SELECT count(*) > 0
FROM information_schema.tables
WHERE 1=1
AND table_schema = 'prod_octime2'
AND table_name LIKE 'cptres1%'
;
]]></condition>
<NODE>
<NODE label="Compatibilité HS/HC colonne CAL_VAL62 (octime2)">
<condition><![CDATA[
select count(*) = 0
from information_schema.columns
where 1=1
AND table_schema = 'prod_octime2'
AND table_name = 'cptres1'
AND lower(column_name) = 'cal_val62'
;
]]></condition>
<NODE label="Paramétres et Profils">
<sqlcmd><![CDATA[
ALTER TABLE prod_octime2.cptres1 add column cal_val62 numeric
;
update prod_octime2.cptres1 set
cal_val62 = 0
;
-- changement description table pour que le putrecrée la table
COMMENT ON TABLE prod_octime2.cptres1 IS 'column added';
]]></sqlcmd>
</NODE>
</NODE>
<NODE label="Compatibilité HS/HC colonne CAL_VAL97 (octime2)">
<condition><![CDATA[
select count(*) = 0
from information_schema.columns
where 1=1
AND table_schema = 'prod_octime2'
AND table_name = 'cptres1'
AND lower(column_name) = 'cal_val97'
;
]]></condition>
<NODE label="Paramétres et Profils">
<sqlcmd><![CDATA[
ALTER TABLE prod_octime2.cptres1 add column cal_val97 numeric
;
update prod_octime2.cptres1 set
cal_val97 = 0
;
-- changement description table pour que le putrecrée la table
COMMENT ON TABLE prod_octime2.cptres1 IS 'column added';
]]></sqlcmd>
</NODE>
</NODE>
<NODE label="Compatibilité HS/HC colonne CAL_VAL387 (octime2)">
<condition><![CDATA[
select count(*) = 0
from information_schema.columns
where 1=1
AND table_schema = 'prod_octime2'
AND table_name = 'cptres1'
AND lower(column_name) = 'cal_val387'
;
]]></condition>
<NODE label="Paramétres et Profils">
<sqlcmd><![CDATA[
ALTER TABLE prod_octime2.cptres1 add column cal_val387 numeric
;
update prod_octime2.cptres1 set
cal_val387 = 0
;
-- changement description table pour que le putrecrée la table
COMMENT ON TABLE prod_octime2.cptres1 IS 'column added';
]]></sqlcmd>
</NODE>
</NODE>
<NODE label="Compatibilité HS/HC colonne CAL_VAL388 (octime2)">
<condition><![CDATA[
select count(*) = 0
from information_schema.columns
where 1=1
AND table_schema = 'prod_octime2'
AND table_name = 'cptres1'
AND lower(column_name) = 'cal_val388'
;
]]></condition>
<NODE label="Paramétres et Profils">
<sqlcmd><![CDATA[
ALTER TABLE prod_octime2.cptres1 add column cal_val388 numeric
;
update prod_octime2.cptres1 set
cal_val388 = 0
;
-- changement description table pour que le putrecrée la table
COMMENT ON TABLE prod_octime2.cptres1 IS 'column added';
]]></sqlcmd>
</NODE>
</NODE>
<NODE label="Compatibilité colonne nar_id">
<condition><![CDATA[
select count(*) = 0
from information_schema.columns
where 1=1
AND table_schema = 'prod_octime2'
AND table_name = 'cptres1'
AND lower(column_name) = 'nar_id'
;
]]></condition>
<NODE label="Paramétres et Profils">
<sqlcmd><![CDATA[
ALTER TABLE prod_octime2.cptres1 add column nar_id bigint
;
update prod_octime2.cptres1 set
nar_id = 0
;
-- changement description table pour que le put recrée la table
COMMENT ON TABLE prod_octime2.cptres1 IS 'column added'
;
]]></sqlcmd>
</NODE>
</NODE>
<NODE label="Compatibilité colonne niv_cod4">
<condition><![CDATA[
select count(*) = 0
from information_schema.columns
where 1=1
AND table_schema = 'prod_octime2'
AND table_name = 'cptres1'
AND lower(column_name) = 'niv_cod4'
;
]]></condition>
<NODE label="Paramétres et Profils">
<sqlcmd><![CDATA[
ALTER TABLE prod_octime2.cptres1 add column niv_cod4 text
;
update prod_octime2.cptres1 set
niv_cod4 = '0'
;
-- changement description table pour que le put recrée la table
COMMENT ON TABLE prod_octime2.cptres1 IS 'column added'
;
]]></sqlcmd>
</NODE>
</NODE>
</NODE>
</NODE>
<NODE>
<condition><![CDATA[
SELECT count(*) > 0
FROM information_schema.tables
WHERE 1=1
AND table_schema = 'prod_octime_saas'
AND table_name LIKE 'cptres1%'
;
]]></condition>
<NODE>
<NODE label="Compatibilité HS/HC colonne CAL_VAL62 (octime_saas)">
<condition><![CDATA[
select count(*) = 0
from information_schema.columns
where 1=1
AND table_schema = 'prod_octime_saas'
AND table_name = 'cptres1'
AND lower(column_name) = 'cal_val62'
;
]]></condition>
<NODE label="Paramétres et Profils">
<sqlcmd><![CDATA[
ALTER TABLE prod_octime_saas.cptres1 add column cal_val62 text
;
update prod_octime_saas.cptres1 set
cal_val62 = 0
;
-- changement description table pour que le putrecrée la table
COMMENT ON TABLE prod_octime_saas.cptres1 IS 'column added';
]]></sqlcmd>
</NODE>
</NODE>
<NODE label="Compatibilité HS/HC colonne CAL_VAL97 (octime_saas)">
<condition><![CDATA[
select count(*) = 0
from information_schema.columns
where 1=1
AND table_schema = 'prod_octime_saas'
AND table_name = 'cptres1'
AND lower(column_name) = 'cal_val97'
;
]]></condition>
<NODE label="Paramétres et Profils">
<sqlcmd><![CDATA[
ALTER TABLE prod_octime_saas.cptres1 add column cal_val97 text
;
update prod_octime_saas.cptres1 set
cal_val97 = 0
;
-- changement description table pour que le putrecrée la table
COMMENT ON TABLE prod_octime_saas.cptres1 IS 'column added';
]]></sqlcmd>
</NODE>
</NODE>
<NODE label="Compatibilité HS/HC colonne CAL_VAL387 (octime_saas)">
<condition><![CDATA[
select count(*) = 0
from information_schema.columns
where 1=1
AND table_schema = 'prod_octime_saas'
AND table_name = 'cptres1'
AND lower(column_name) = 'cal_val387'
;
]]></condition>
<NODE label="Paramétres et Profils">
<sqlcmd><![CDATA[
ALTER TABLE prod_octime_saas.cptres1 add column cal_val387 text
;
update prod_octime_saas.cptres1 set
cal_val387 = 0
;
-- changement description table pour que le putrecrée la table
COMMENT ON TABLE prod_octime_saas.cptres1 IS 'column added';
]]></sqlcmd>
</NODE>
</NODE>
<NODE label="Compatibilité HS/HC colonne CAL_VAL388 (octime_saas)">
<condition><![CDATA[
select count(*) = 0
from information_schema.columns
where 1=1
AND table_schema = 'prod_octime_saas'
AND table_name = 'cptres1'
AND lower(column_name) = 'cal_val388'
;
]]></condition>
<NODE label="Paramétres et Profils">
<sqlcmd><![CDATA[
ALTER TABLE prod_octime_saas.cptres1 add column cal_val388 text
;
update prod_octime_saas.cptres1 set
cal_val388 = 0
;
-- changement description table pour que le putrecrée la table
COMMENT ON TABLE prod_octime_saas.cptres1 IS 'column added';
]]></sqlcmd>
</NODE>
</NODE>
<NODE label="Compatibilité colonne nar_id">
<condition><![CDATA[
select count(*) = 0
from information_schema.columns
where 1=1
AND table_schema = 'prod_octime_saas'
AND table_name = 'cptres1'
AND lower(column_name) = 'nar_id'
;
]]></condition>
<NODE label="Paramétres et Profils">
<sqlcmd><![CDATA[
ALTER TABLE prod_octime_saas.cptres1 add column nar_id bigint
;
update prod_octime_saas.cptres1 set
nar_id = 0
;
-- changement description table pour que le put recrée la table
COMMENT ON TABLE prod_octime_saas.cptres1 IS 'column added'
;
]]></sqlcmd>
</NODE>
</NODE>
<NODE label="Compatibilité colonne niv_cod4">
<condition><![CDATA[
select count(*) = 0
from information_schema.columns
where 1=1
AND table_schema = 'prod_octime_saas'
AND table_name = 'cptres1'
AND lower(column_name) = 'niv_cod4'
;
]]></condition>
<NODE label="Paramétres et Profils">
<sqlcmd><![CDATA[
ALTER TABLE prod_octime_saas.cptres1 add column niv_cod4 text
;
update prod_octime_saas.cptres1 set
niv_cod4 = '0'
;
-- changement description table pour que le put recrée la table
COMMENT ON TABLE prod_octime_saas.cptres1 IS 'column added'
;
]]></sqlcmd>
</NODE>
</NODE>
</NODE>
</NODE>
<NODE>
<condition><![CDATA[
SELECT count(*) > 0
FROM information_schema.tables
WHERE 1=1
AND table_schema = 'prod_octime'
;
]]></condition>
<NODE label="Matérialisation des tables OCTIME">
<sqlcmd><![CDATA[
-- Technique : reconstitution d'une table parente à partir des tables filles contenant les données pour chaque année.
DROP TABLE IF EXISTS prod_octime_cptres1
;
CREATE TEMP TABLE prod_octime_cptres1 AS
SELECT
pers_mat,
cal_dat,
nar_id,
niv_cod1,
niv_cod2,
niv_cod3,
niv_cod4,
pos_cod,
cont_cod,
hor_theo,
cyc_cod,
cyc_codmod,
cyc_ndep,
cal_hcyc,
rot_cod,
rot_ndep,
hor_cod,
cal_val1,
cal_val2,
cal_val3,
cal_val4,
cal_val5,
cal_val6,
cal_val7,
cal_val8,
cal_val9,
cal_val10,
cal_val11,
cal_val12,
cal_val13,
cal_val14,
cal_val15,
cal_val16,
cal_val17,
cal_val18,
cal_val19,
cal_val20,
cal_val21,
cal_val22,
cal_val23,
cal_val24,
cal_val25,
cal_val26,
cal_val27,
cal_val28,
cal_val29,
cal_val62,
cal_val97,
cal_val201,
cal_val202,
cal_val203,
cal_val204,
cal_val205,
cal_val206,
cal_val387,
cal_val388,
''::text AS salarie_corr
FROM prod_octime.cptres1
;
DROP TABLE IF EXISTS prod_octime_niveau1
;
CREATE TEMP TABLE prod_octime_niveau1 AS
SELECT
niv_cod1,
niv_lib1
FROM prod_octime.niveau1
;
DROP TABLE IF EXISTS prod_octime_niveau2
;
CREATE TEMP TABLE prod_octime_niveau2 AS
SELECT
niv_cod1,
niv_cod2,
niv_lib2
FROM prod_octime.niveau2
;
DROP TABLE IF EXISTS prod_octime_niveau3
;
CREATE TEMP TABLE prod_octime_niveau3 AS
SELECT
niv_cod1,
niv_cod2,
niv_cod3,
niv_lib3
FROM prod_octime.niveau3
;
DROP TABLE IF EXISTS prod_octime_niveau4
;
CREATE TEMP TABLE prod_octime_niveau4 AS
SELECT
nar_id,
niv_cod1,
niv_cod2,
niv_cod3,
niv_cod4,
niv_lib4
FROM prod_octime.niveaux
;
DROP TABLE IF EXISTS prod_octime_cjourn
;
CREATE TEMP TABLE prod_octime_cjourn AS
SELECT
hor_cod,
hor_abr,
hor_dmis,
hor_fmis,
hor_tmis
FROM prod_octime.cjourn
;
DROP TABLE IF EXISTS prod_octime_poste
;
CREATE TEMP TABLE prod_octime_poste AS
SELECT
pos_cod,
pos_lib
FROM prod_octime.poste
;
DROP TABLE IF EXISTS prod_octime_absence
;
CREATE TEMP TABLE prod_octime_absence AS
SELECT
abs_cod,
abs_lib
FROM prod_octime.absence
;
DROP TABLE IF EXISTS prod_octime_contrat
;
CREATE TEMP TABLE prod_octime_contrat AS
SELECT
cont_cod,
cont_lib,
cont_cdi
FROM prod_octime.contrat
;
DROP TABLE IF EXISTS prod_octime_contprev
;
CREATE TEMP TABLE prod_octime_contprev AS
SELECT
pers_mat,
cont_datd,
cont_datf,
cont_cod
FROM prod_octime.contprev
;
DROP TABLE IF EXISTS prod_octime_pers
;
CREATE TEMP TABLE prod_octime_pers AS
SELECT
pers_cp,
pers_dnai,
pers_mat,
pers_matp,
pers_idweb,
pers_nom,
pers_nomjf,
pers_nsecu,
pers_pre,
pers_sexe,
pers_dent,
pers_dsor
FROM prod_octime.pers
;
]]></sqlcmd>
</NODE>
</NODE>
<NODE label="Matérialisation des tables OCTIME2">
<condition><![CDATA[
SELECT count(*) > 0
FROM information_schema.tables
WHERE 1=1
AND table_schema = 'prod_octime2'
AND table_name LIKE 'cptres1%'
;
]]></condition>
<sqlcmd><![CDATA[
INSERT INTO prod_octime_cptres1
SELECT
pers_mat,
cal_dat,
nar_id,
niv_cod1,
niv_cod2,
niv_cod3,
niv_cod4,
pos_cod,
cont_cod,
hor_theo,
cyc_cod,
cyc_codmod,
cyc_ndep,
cal_hcyc,
rot_cod,
rot_ndep,
hor_cod,
cal_val1,
cal_val2,
cal_val3,
cal_val4,
cal_val5,
cal_val6,
cal_val7,
cal_val8,
cal_val9,
cal_val10,
cal_val11,
cal_val12,
cal_val13,
cal_val14,
cal_val15,
cal_val16,
cal_val17,
cal_val18,
cal_val19,
cal_val20,
cal_val21,
cal_val22,
cal_val23,
cal_val24,
cal_val25,
cal_val26,
cal_val27,
cal_val28,
cal_val29,
cal_val62,
cal_val97,
cal_val201,
cal_val202,
cal_val203,
cal_val204,
cal_val205,
cal_val206,
cal_val387,
cal_val388,
''::text AS salarie_corr
FROM prod_octime2.cptres1;
INSERT INTO prod_octime_niveau1
SELECT
niv_cod1,
niv_lib1
FROM prod_octime2.niveau1
;
INSERT INTO prod_octime_niveau2
SELECT
niv_cod1,
niv_cod2,
niv_lib2
FROM prod_octime2.niveau2
;
INSERT INTO prod_octime_niveau3
SELECT
niv_cod1,
niv_cod2,
niv_cod3,
niv_lib3
FROM prod_octime2.niveau3
;
INSERT INTO prod_octime_niveau4
SELECT
nar_id,
niv_cod1,
niv_cod2,
niv_cod3,
niv_cod4,
niv_lib4
FROM prod_octime2.niveaux
;
INSERT INTO prod_octime_cjourn
SELECT
hor_cod,
hor_abr,
hor_dmis,
hor_fmis,
hor_tmis
FROM prod_octime2.cjourn
WHERE hor_cod NOT IN (SELECT hor_cod FROM prod_octime_cjourn)
;
INSERT INTO prod_octime_poste
SELECT
pos_cod,
pos_lib
FROM prod_octime2.poste
WHERE pos_cod NOT IN (SELECT pos_cod FROM prod_octime_poste)
;
INSERT INTO prod_octime_absence
SELECT
abs_cod,
abs_lib
FROM prod_octime2.absence
WHERE abs_cod NOT IN (SELECT abs_cod FROM prod_octime_absence)
;
INSERT INTO prod_octime_contrat
SELECT
cont_cod,
cont_lib,
cont_cdi
FROM prod_octime2.contrat
WHERE cont_cod NOT IN (SELECT cont_cod FROM prod_octime_contrat)
;
INSERT INTO prod_octime_contprev
SELECT
pers_mat,
cont_datd,
cont_datf,
cont_cod
FROM prod_octime2.contprev
;
INSERT INTO prod_octime_pers
SELECT
pers_cp,
pers_dnai,
pers_mat,
pers_matp,
pers_idweb,
pers_nom,
pers_nomjf,
pers_nsecu,
pers_pre,
pers_sexe,
pers_dent,
pers_dsor
FROM prod_octime2.pers
WHERE pers_mat NOT IN (SELECT pers_mat FROM prod_octime_pers)
;
]]></sqlcmd>
</NODE>
<NODE label="Matérialisation des tables OCTIME SaaS">
<condition><![CDATA[
SELECT count(*) > 0
FROM information_schema.tables
WHERE 1=1
AND table_schema = 'prod_octime_saas'
AND table_name LIKE 'cptres1%'
;
]]></condition>
<sqlcmd><![CDATA[
-- Technique : reconstitution d'une table parente à partir des tables filles contenant les données pour chaque année.
DROP TABLE IF EXISTS prod_octime_cptres1
;
CREATE TEMP TABLE prod_octime_cptres1 AS
SELECT
pers_mat,
cal_dat::date,
nar_id::bigint,
niv_cod1,
niv_cod2,
niv_cod3,
niv_cod4,
pos_cod,
cont_cod,
hor_theo::bigint,
cyc_cod::bigint,
cyc_codmod::bigint,
cyc_ndep::bigint,
cal_hcyc,
rot_cod::bigint,
rot_ndep::bigint,
hor_cod::bigint,
cal_val1::bigint,
cal_val2::bigint,
cal_val3::bigint,
cal_val4::bigint,
cal_val5::bigint,
cal_val6::bigint,
cal_val7::bigint,
cal_val8::bigint,
cal_val9::bigint,
cal_val10::bigint,
cal_val11::bigint,
cal_val12::bigint,
cal_val13::bigint,
cal_val14::bigint,
cal_val15::bigint,
cal_val16::bigint,
cal_val17::bigint,
cal_val18::bigint,
cal_val19::bigint,
cal_val20::bigint,
cal_val21::bigint,
cal_val22::bigint,
cal_val23::bigint,
cal_val24,
cal_val25,
cal_val26,
cal_val27,
cal_val28,
cal_val29,
cal_val62::bigint,
cal_val97::bigint,
cal_val201,
cal_val202,
cal_val203,
cal_val204::bigint,
cal_val205::bigint,
cal_val206::bigint,
cal_val387::bigint,
cal_val388::bigint,
''::text AS salarie_corr
FROM prod_octime_saas.cptres1
;
DROP TABLE IF EXISTS prod_octime_niveau1
;
CREATE TEMP TABLE prod_octime_niveau1 AS
SELECT
niv_cod1,
niv_lib1
FROM prod_octime_saas.niveau1
;
INSERT INTO prod_octime_niveau1
SELECT
niveaux.niv_cod1,
niveaux.niv_lib1
FROM prod_octime_saas.niveaux
LEFT JOIN prod_octime_niveau1 ON prod_octime_niveau1.niv_cod1 = niveaux.niv_cod1
WHERE prod_octime_niveau1.niv_cod1 IS NULL
;
DROP TABLE IF EXISTS prod_octime_niveau2
;
CREATE TEMP TABLE prod_octime_niveau2 AS
SELECT
niv_cod1,
niv_cod2,
niv_lib2
FROM prod_octime_saas.niveau2
;
INSERT INTO prod_octime_niveau2
SELECT
niveaux.niv_cod1,
niveaux.niv_cod2,
niveaux.niv_lib2
FROM prod_octime_saas.niveaux
LEFT JOIN prod_octime_niveau2 ON prod_octime_niveau2.niv_cod1 = niveaux.niv_cod1 AND prod_octime_niveau2.niv_cod2 = niveaux.niv_cod2
WHERE prod_octime_niveau2.niv_cod1 IS NULL
;
DROP TABLE IF EXISTS prod_octime_niveau3
;
CREATE TEMP TABLE prod_octime_niveau3 AS
SELECT
niv_cod1,
niv_cod2,
niv_cod3,
niv_lib3
FROM prod_octime_saas.niveau3
;
INSERT INTO prod_octime_niveau3
SELECT
niveaux.niv_cod1,
niveaux.niv_cod2,
niveaux.niv_cod3,
niveaux.niv_lib3
FROM prod_octime_saas.niveaux
LEFT JOIN prod_octime_niveau3 ON prod_octime_niveau3.niv_cod1 = niveaux.niv_cod1 AND prod_octime_niveau3.niv_cod2 = niveaux.niv_cod2 AND prod_octime_niveau3.niv_cod3 = niveaux.niv_cod3
WHERE prod_octime_niveau3.niv_cod1 IS NULL
;
DROP TABLE IF EXISTS prod_octime_niveau4
;
CREATE TEMP TABLE prod_octime_niveau4 AS
SELECT
nar_id::bigint,
niv_cod1,
niv_cod2,
niv_cod3,
niv_cod4,
niv_lib4
FROM prod_octime_saas.niveaux
;
DROP TABLE IF EXISTS prod_octime_cjourn
;
CREATE TEMP TABLE prod_octime_cjourn AS
SELECT
hor_cod::bigint,
hor_abr,
hor_dmis,
hor_fmis,
hor_tmis
FROM prod_octime_saas.cjourn
;
DROP TABLE IF EXISTS prod_octime_poste
;
CREATE TEMP TABLE prod_octime_poste AS
SELECT
pos_cod,
pos_lib
FROM prod_octime_saas.poste
;
DROP TABLE IF EXISTS prod_octime_absence
;
CREATE TEMP TABLE prod_octime_absence AS
SELECT
abs_cod,
abs_lib
FROM prod_octime_saas.absence
;
DROP TABLE IF EXISTS prod_octime_contrat
;
CREATE TEMP TABLE prod_octime_contrat AS
SELECT
cont_cod,
cont_lib,
cont_cdi
FROM prod_octime_saas.contrat
;
DROP TABLE IF EXISTS prod_octime_contprev
;
CREATE TEMP TABLE prod_octime_contprev AS
SELECT
pers_mat,
cont_datd::date,
cont_datf::date,
cont_cod
FROM prod_octime_saas.contprev
;
DROP TABLE IF EXISTS prod_octime_pers
;
CREATE TEMP TABLE prod_octime_pers AS
SELECT
pers_cp,
pers_dnai::date,
pers_mat,
pers_matp,
pers_idweb,
pers_nom,
pers_nomjf,
pers_nsecu,
pers_pre,
pers_sexe,
pers_dent::date,
pers_dsor::date
FROM prod_octime_saas.pers
;
]]></sqlcmd>
</NODE>
<NODE label="Intérim">
<condition><![CDATA[
-- Remontée de l'intérim.
select valeur = 1
from rh.t_divers
where code = 'OPT_INTERIM_PLANNING'
;
-- TOUS LES INTERIMAIRES, quelque soit la stratégie, ont un code [original]/matricule préfixé par 'INT'.
]]></condition>
<NODE label="Paramétres et Profils">
<sqlcmd><![CDATA[
-- Vérification des séquences.
-- Utile dans la cas où il y a fusion RH.
SELECT base.cti_verify_sequences('rh')
;
-- Màj des types de contrat
INSERT INTO rh.t_types_contrat(code_original, code, texte, texte_court)
SELECT cont_cod, cont_cod, cont_lib, substr(cont_lib, 1, 50)
FROM prod_octime_contrat
WHERE true
AND cont_cod NOT IN (SELECT code_original FROM rh.t_types_contrat)
AND cont_cod = (select valeur from rh.t_divers where code = 'INTERIM_CNT_CODE') -- Par défaut à 'INT'.
GROUP BY 1,2,3,4
;
DROP TABLE IF EXISTS w_profils
;
CREATE TEMP TABLE w_profils AS
select
0::bigint as profil_id,
chr(1)||'*' AS cadre_emploi_code_original,
chr(1)||'*' AS categorie_conge_code_original,
chr(1)||'*' AS categorie_socio_professionnelle_code_original,
chr(1)||'*' AS categorie_statutaire_code_original,
chr(1)||'*' AS code_emploi_code_original,
chr(1)||'*' AS commission_paritaire_code_original,
chr(1)||'*' AS compte_salarie_code_original,
chr(1)||'*' AS filiere_code_original,
chr(1)||'*' AS grille_code_original,
chr(1)||'*' AS grille_groupe_code_original,
chr(1)||'*' AS groupe_cotisant_code_original,
chr(1)||'*' AS lettre_budgetaire_code_original,
chr(1)||'*' AS motif_debut_code_original,
chr(1)||'*' AS motif_fin_code_original,
chr(1)||'*' AS qualification_code_original,
chr(1)||'*' AS section_analytique_code_original,
chr(1)||'*' AS section_analytique_paie_code_original,
chr(1)||'*' AS service_code_original,
chr(1)||'*' AS societe_interim_code_original,
chr(1)||'*' AS specialite_code_original,
chr(1)||'*' AS statut_code_original,
(select valeur from rh.t_divers where code = 'INTERIM_CNT_CODE')::text AS type_contrat_code_original,
chr(1)||'*' AS type_horaire_code_original,
chr(1)||'*' AS type_temps_travail_code_original,
chr(1)||'*' AS unite_fonctionnelle_code_original
;
-- Alimentation de la table CTI des profils
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.cadre_emploi_code_original,
w_profils.categorie_conge_code_original,
w_profils.categorie_socio_professionnelle_code_original,
w_profils.categorie_statutaire_code_original,
w_profils.code_emploi_code_original,
w_profils.commission_paritaire_code_original,
w_profils.compte_salarie_code_original,
w_profils.filiere_code_original,
w_profils.grille_code_original,
w_profils.grille_groupe_code_original,
w_profils.groupe_cotisant_code_original,
w_profils.lettre_budgetaire_code_original,
w_profils.motif_debut_code_original,
w_profils.motif_fin_code_original,
w_profils.qualification_code_original,
w_profils.section_analytique_code_original,
w_profils.section_analytique_paie_code_original,
w_profils.service_code_original,
w_profils.societe_interim_code_original,
w_profils.specialite_code_original,
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.unite_fonctionnelle_code_original
FROM w_profils
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
SET profil_id = p_profils.oid
FROM rh.p_profils
WHERE 1=1
AND p_profils.cadre_emploi_code_original = w_profils.cadre_emploi_code_original
AND p_profils.categorie_conge_code_original = w_profils.categorie_conge_code_original
AND p_profils.categorie_socio_professionnelle_code_original = w_profils.categorie_socio_professionnelle_code_original
AND p_profils.categorie_statutaire_code_original = w_profils.categorie_statutaire_code_original
AND p_profils.code_emploi_code_original = w_profils.code_emploi_code_original
AND p_profils.commission_paritaire_code_original = w_profils.commission_paritaire_code_original
AND p_profils.compte_salarie_code_original = w_profils.compte_salarie_code_original
AND p_profils.filiere_code_original = w_profils.filiere_code_original
AND p_profils.grille_code_original = w_profils.grille_code_original
AND p_profils.grille_groupe_code_original = w_profils.grille_groupe_code_original
AND p_profils.groupe_cotisant_code_original = w_profils.groupe_cotisant_code_original
AND p_profils.lettre_budgetaire_code_original = w_profils.lettre_budgetaire_code_original
AND p_profils.motif_debut_code_original = w_profils.motif_debut_code_original
AND p_profils.motif_fin_code_original = w_profils.motif_fin_code_original
AND p_profils.qualification_code_original = w_profils.qualification_code_original
AND p_profils.section_analytique_code_original = w_profils.section_analytique_code_original
AND p_profils.section_analytique_paie_code_original = w_profils.section_analytique_paie_code_original
AND p_profils.service_code_original = w_profils.service_code_original
AND p_profils.societe_interim_code_original = w_profils.societe_interim_code_original
AND p_profils.specialite_code_original = w_profils.specialite_code_original
AND p_profils.statut_code_original = w_profils.statut_code_original
AND p_profils.type_contrat_code_original = w_profils.type_contrat_code_original
AND p_profils.type_horaire_code_original = w_profils.type_horaire_code_original
AND p_profils.type_temps_travail_code_original = w_profils.type_temps_travail_code_original
AND p_profils.unite_fonctionnelle_code_original = w_profils.unite_fonctionnelle_code_original
;
]]></sqlcmd>
</NODE>
<NODE label="Salariés">
<sqlcmd><![CDATA[
-- Identifier les intérimaires pour lesquels on va remonter TOUS les contrats.
-- On considère qu'un intérimaire travaille dans un seul établissement d'un point de vue de ses contrats.
-- D'où le max(entest.etablissement_id) as etablissement_id ci-dessous.
DROP TABLE IF EXISTS w_salaries
;
CREATE TEMP TABLE w_salaries AS
WITH entest as (
SELECT
t_entreprises.planning_code||t_etablissements.planning_code as planning_code,
min(t_etablissements.entreprise_id) as entreprise_id,
min(t_etablissements.oid) as etablissement_id
FROM rh.t_entreprises
JOIN rh.t_etablissements on t_etablissements.entreprise_id = t_entreprises.oid
GROUP BY 1
)
SELECT
0::bigint as salarie_id,
rhp('finess') AS finess,
pers_nom as nom,
pers_pre as prenom,
pers_nomjf as nom_naissance,
pers_dnai::date as date_naissance,
case when pers_sexe = 'H' then 'M' else 'F' end as sexe,
pers.pers_mat,
'INTERIM-'||CASE octime_interim_str.valeur -- Prefixe rajouté par CTI pour identifier les intérimaires.
WHEN '1' THEN right(pers.pers_mat, 5) -- On supprime le préfixe ent/ets.
ELSE pers.pers_mat END as code,
'INTERIM-'|| pers.pers_mat as code_original, -- Prefixe rajouté par CTI pour identifier les intérimaires.
'INTERIM-'|| coalesce(nullif(pers.pers_matp, ''), pers.pers_mat) as nir, -- Prefixe rajouté par CTI pour identifier les intérimaires.
'INTERIM-'|| CASE octime_interim_str.valeur -- Prefixe rajouté par CTI pour identifier les intérimaires.
WHEN '1' THEN right(pers.pers_mat, 5) -- On supprime le préfixe ent/ets.
ELSE pers.pers_mat END as matricule,
'INTERIM-'||lower(coalesce(nullif(pers_idweb, ''), nullif(pers.pers_mat, ''), pers.pers_matp)) as matricule_planning,
max(entest.entreprise_id) as entreprise_id,
0 AS nationalite_id,
coalesce(t_codes_postaux.oid, 0) AS code_postal_id,
0 AS situation_famille_id,
w_profils.profil_id AS profil_id,
pers_dent::date AS date_debut,
pers_dsor::date AS date_fin,
pers_dent::date as date_entree_ets,
pers_dsor::date 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,
max(entest.etablissement_id) as etablissement_id
from prod_octime_pers as pers
JOIN prod_octime_contprev as contprev on contprev.pers_mat = pers.pers_mat
JOIN prod_octime_cptres1 as cptres1 on cptres1.pers_mat = pers.pers_mat
JOIN w_profils on true
JOIN (SELECT valeur FROM rh.t_divers WHERE code = 'OCTIME_ETS_ID') AS octime_ets_id ON 1=1
JOIN (SELECT valeur FROM rh.t_divers WHERE code = 'OCTIME_ETS_MANUEL') AS octime_ets_manuel ON 1=1
JOIN (SELECT valeur FROM rh.t_divers WHERE code = 'OCTIME_INTERIM_STR') AS octime_interim_str ON 1=1 -- Stratégie d'idenfication des intérimaires
JOIN (SELECT valeur FROM rh.t_divers WHERE code = 'OCTIME_MAX_NIVEAU') AS octime_max_niveau ON 1=1
JOIN entest ON entest.planning_code =
CASE octime_ets_id.valeur
WHEN 0 THEN octime_ets_manuel.valeur
WHEN 1 THEN cptres1.niv_cod1
WHEN 2 THEN cptres1.niv_cod2
WHEN 3 THEN cptres1.niv_cod3
WHEN 4 THEN CASE WHEN octime_max_niveau.valeur = '3' THEN substr((SELECT trim(valeur) FROM rh.t_divers WHERE code = 'OCTIME_INTERIM_PREFIXE')||coalesce(nullif(pers.pers_matp, ''), pers.pers_mat), 1, 6) ELSE cptres1.niv_cod4 END -- Cas SHS.
WHEN 9 THEN substr((SELECT trim(valeur) FROM rh.t_divers WHERE code = 'OCTIME_INTERIM_PREFIXE')||coalesce(nullif(pers.pers_matp, ''), pers.pers_mat), 1, 6) -- Cas SHS.
END
LEFT JOIN rh.t_codes_postaux ON t_codes_postaux.code = pers.pers_cp
WHERE 1=1
AND contprev.cont_cod = (select valeur from rh.t_divers where code = 'INTERIM_CNT_CODE')
AND CASE octime_interim_str.valeur
WHEN '1' THEN strpos(coalesce(nullif(pers.pers_matp, ''), pers.pers_mat), 'INT') > 0 -- il faut que le matricule de paie Octime contienne INT.
ELSE true END
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13, 15,16,17,18,19,20,21,22,23,24,25,26
;
-- Alimenter le champ prod_octime_cptres1.salarie_corr pour les intérim qui n'auraient pas été préfixés par le code ent/ets comme les matricules salariés.
UPDATE prod_octime_cptres1 SET
salarie_corr = (SELECT trim(valeur) FROM rh.t_divers WHERE code = 'OCTIME_INTERIM_PREFIXE')||coalesce(nullif(pers.pers_matp, ''), pers.pers_mat)
FROM prod_octime_pers AS pers, w_salaries
WHERE 1=1
AND prod_octime_cptres1.pers_mat = pers.pers_mat
AND prod_octime_cptres1.pers_mat = w_salaries.pers_mat -- uniquement les intérimaires.
AND salarie_corr = '' -- uniquement les données pas déjà mis à jour.
AND (SELECT trim(valeur) != '' FROM rh.t_divers WHERE code = 'OCTIME_INTERIM_PREFIXE') -- uniquement si un paramétrage a été fait.
;
]]></sqlcmd>
</NODE>
<NODE name="SALARIE" type="common2" />
<NODE label="Màj id salariés">
<sqlcmd><![CDATA[
update w_salaries SET
salarie_id = p_salaries.oid
from rh.p_salaries
where p_salaries.code_original = w_salaries.code_original
;
]]></sqlcmd>
</NODE>
<NODE label="Contrats">
<sqlcmd><![CDATA[
-- Suppression des profils contrats mois liés aux intérimaires.
DELETE FROM rh.p_profil_contrat_mois
USING rh.p_contrats_mois, rh.p_contrats
WHERE 1=1
AND p_profil_contrat_mois.contrat_mois_id = p_contrats_mois.oid
AND p_contrats_mois.contrat_id = p_contrats.oid
AND substr(p_contrats.code_original, 1, 8) = 'INTERIM-' -- Prefixe rajouté par CTI pour identifier les contrats intérim.
;
SELECT base.cti_stash_table_indexes('rh.p_contrats_mois')
;
-- Pas de repositionnement de la séquence à l'oid max connu (pas utile car peu de contrats générés).
-- ALTER SEQUENCE rh.s_contrats_mois RESTART WITH 1
-- ;
-- Suppression des contrats mois liés aux intérimaires.
DELETE FROM rh.p_contrats_mois
USING rh.p_contrats
WHERE 1=1
AND p_contrats_mois.contrat_id = p_contrats.oid
AND substr(p_contrats.code_original, 1, 8) = 'INTERIM-' -- Prefixe rajouté par CTI pour identifier les contrats intérim.
;
-- Suppression des contrats liés aux intérimaires.
DELETE FROM rh.p_contrats
WHERE substr(p_contrats.code_original, 1, 8) = 'INTERIM-' -- Prefixe rajouté par CTI pour identifier les contrats intérim.
;
-- Pas de repositionnement de la séquence à l'oid max connu (pas utile car peu de contrats générés).
-- 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
w_salaries.salarie_id,
contprev.cont_datd::date AS date_debut,
contprev.cont_datf::date AS date_fin,
w_salaries.matricule||'-'::text||lpad(rank() over w, 3, '0') AS numero_contrat,
w_salaries.matricule||to_char(contprev.cont_datd, 'YYYYMMDD') AS code_original, -- La matricule a un préfixe rajouté par CTI pour identifier les contrats intérim.
w_salaries.etablissement_id,
w_profils.profil_id AS profil_id
FROM prod_octime_contprev as contprev
JOIN w_salaries on w_salaries.pers_mat = contprev.pers_mat
JOIN w_profils on true
WHERE contprev.cont_cod = (select valeur from rh.t_divers where code = 'INTERIM_CNT_CODE')
GROUP BY 1,2,3, 5,6,7, w_salaries.matricule, contprev.cont_datd
window w as (PARTITION BY w_salaries.salarie_id ORDER BY cont_datd)
;
INSERT INTO rh.p_contrats_mois(
salarie_id,
contrat_id,
mois_activite,
date_debut,
date_fin,
nombre_entrees,
nombre_departs,
nombre_debut_contrat,
nombre_fin_contrat,
est_hors_periode,
present_debut_mois,
present_fin_mois,
equivalent_temps_plein,
nombre_heures,
age_id,
age_jours,
anciennete_jours,
anciennete_mois,
anciennete_annee_id,
etablissement_id,
profil_id,
fictif)
SELECT
w_salaries.salarie_id AS salarie_id,
p_contrats.oid AS contrat_id,
p_calendrier.mois AS mois,
min(p_calendrier.date) as date_debut,
max(p_calendrier.date) as date_fin,
0 AS nombre_entrees,
0 AS nombre_departs,
0 AS nombre_debut_contrat,
0 AS nombre_fin_contrat,
1 as est_hors_periode,
0 AS present_debut_mois,
0 AS present_fin_mois,
1 AS equivalent_temps_plein,
1.0 * t_etablissements.base_calcul_etp as nombre_heures,
0 AS age_id,
0 AS age_jours,
0 AS anciennete_jours,
0 AS anciennete_mois,
0 AS anciennete_annee_id,
p_contrats.etablissement_id,
w_profils.profil_id as profil_id,
1 as fictif
FROM prod_octime_contprev as contprev
JOIN w_salaries ON w_salaries.pers_mat = contprev.pers_mat
JOIN w_profils on true
JOIN rh.p_contrats ON p_contrats.code_original = w_salaries.matricule||to_char(contprev.cont_datd, 'YYYYMMDD')
JOIN rh.t_etablissements ON p_contrats.etablissement_id = t_etablissements.oid
join base.p_calendrier on p_calendrier.date between contprev.cont_datd and contprev.cont_datf
WHERE contprev.cont_cod = (select valeur from rh.t_divers where code = 'INTERIM_CNT_CODE')
GROUP BY 1,2,3, 6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22
;
SELECT base.cti_stash_pop_table_indexes('rh.p_contrats_mois')
;
]]></sqlcmd>
</NODE>
<NODE label="Ventilation des profils">
<sqlcmd><![CDATA[
INSERT INTO rh.p_profil_contrat_mois (
profil_id,
contrat_mois_id,
salarie_id,
ratio,
mois)
SELECT
w_profils.profil_id AS profil_id,
p_contrats_mois.oid AS contrat_mois_id,
p_contrats_mois.salarie_id,
1 AS ratio,
p_contrats_mois.mois_activite
FROM rh.p_contrats_mois
JOIN w_salaries ON w_salaries.salarie_id = p_contrats_mois.salarie_id
JOIN w_profils on true
GROUP BY 1,2,3,4,5
;
]]></sqlcmd>
</NODE>
</NODE>
<NODE label="Import planning">
<sqlcmd><![CDATA[
-- Todo Fixme Supression de l'historique planning hors période de paie.
-- Alimentation de niv_cod4 lorsqu'option d'utiliser le niveau 4 est activée.
UPDATE prod_octime_cptres1 SET
niv_cod4 = prod_octime_niveau4.niv_cod4
FROM prod_octime_niveau4, (SELECT valeur FROM rh.t_divers WHERE code = 'OCTIME_MAX_NIVEAU') AS octime_max_niveau
WHERE 1=1
AND prod_octime_cptres1.nar_id = prod_octime_niveau4.nar_id
AND octime_max_niveau.valeur = '4'
AND prod_octime_cptres1.niv_cod4 IS DISTINCT FROM prod_octime_niveau4.niv_cod4
;
-- Maintenance table temporaire prod_octime_cptres1.
VACUUM ANALYSE prod_octime_cptres1
;
CREATE INDEX prod_octime_cptres1_ik_pers_mat ON prod_octime_cptres1 USING btree (pers_mat)
;
-- Alimenter le champ prod_octime_cptres1.salarie_corr.
UPDATE prod_octime_cptres1 SET
salarie_corr = CASE WHEN cont_cod = (select valeur from rh.t_divers where code = 'INTERIM_CNT_CODE') THEN 'INTERIM-'::text ELSE ''::text END||
CASE (SELECT valeur FROM rh.t_divers WHERE code = 'OCTIME_SALARIE')
WHEN 1 THEN ltrim(coalesce(nullif(pers.pers_matp, ''), pers.pers_mat), '0') -- Cas 1 - Parc à Caen/Cegid où il faut retirer les 0 parce qu'entre Octime et Cegid les matricules n'ont pas le même nombre de 0 (à gauche).
WHEN 2 THEN coalesce(nullif(pers.pers_matp, ''), pers.pers_mat) -- Cas 2 - Hopale/SHS où le matricule Octime contient la concaténation Ent.Ets.Mat..
WHEN 3 THEN prod_octime_cptres1.niv_cod1||'|'||coalesce(nullif(pers.pers_matp, ''), pers.pers_mat) -- Cas 3 - AHO/Sage où les matricule sont les mêmes mais il faut faire le lien avec les établissements (pas les entreprises).
WHEN 4 THEN substring(coalesce(nullif(pers.pers_matp, ''), pers.pers_mat) from '(..........).$') -- Cas 4 PCBS (suppression du dernier caractère pour matcher avec Cegid).
WHEN 5 THEN coalesce(nullif(pers.pers_matp, ''), pers.pers_mat) -- Cas 5 - SHS où le matricule Octime contient la concaténation Ent.Ets.Mat..
WHEN 6 THEN coalesce(nullif(pers.pers_matp, ''), pers.pers_mat) -- Cas 6 - SHS Grouple HPL où le matricule Octime contient la concaténation : Niveau1(= ets. sur 2 caractères)||Ent.||Ets.||Mat.. ex : "010000002631K".
WHEN 7 THEN substr(coalesce(nullif(pers.pers_matp, ''), pers.pers_mat), 3) -- Cas 7 - Cador Expert où les 2 premiers caractères doivent être retirés pour faire 10 de taille et correspondre à ceux de la paie.
WHEN 8 THEN right(coalesce(nullif(pers.pers_matp, ''), pers.pers_mat), 6) -- Cas 8 - ELSAN - VHU Sigems où il faut conserver les 6 derniers caractères (un préfixe établissement est éventuellement ajouté mais il ne faut pas en tenir compte. Le niveau 1 est là pour identifier l'ets.)
WHEN 9 THEN lower(coalesce(nullif(pers_idweb, ''), nullif(pers.pers_mat, ''), pers.pers_matp)) -- Cas 9 - Le matricule planning est saisie dans la paie.
WHEN 10 THEN coalesce(nullif(pers.pers_matp, ''), pers.pers_mat) -- Cas 10 - Fusion QuadraRH -> ADP.
WHEN 11 THEN -- Cas 11 - NIR. avec gestion de l'interim sans NIR
CASE WHEN cont_cod = (select valeur from rh.t_divers where code = 'INTERIM_CNT_CODE')
THEN coalesce(nullif(pers.pers_matp, ''), pers.pers_mat)
ELSE pers.pers_nsecu
END
ELSE coalesce(nullif(pers.pers_matp, ''), pers.pers_mat) -- Par défaut.
END
FROM prod_octime_pers AS pers
WHERE 1=1
AND prod_octime_cptres1.pers_mat = pers.pers_mat
AND salarie_corr = '' -- uniquement les données pas déjà mis à jour (cf. interim plus haut).
;
-- Recensement des salariés et établissements.
DROP TABLE IF EXISTS w_sal_pla
;
CREATE TEMP TABLE w_sal_pla AS
SELECT
p_salaries.oid AS salarie_id,
p_salaries.nir,
p_salaries.matricule,
p_salaries.date_debut as sal_date_debut, -- utilisé lorsque
p_salaries.date_fin as sal_date_fin,
p_salaries.matricule_planning as matricule_paie_planning, -- Matricule planning saisi dans la paie.
t_entreprises.code_original AS entreprise_code_original,
t_etablissements.code_original AS etablissement_code_original,
t_entreprises.code AS entreprise_code,
t_entreprises.planning_code AS entreprise_planning_code,
t_etablissements.code AS etablissement_code,
t_etablissements.planning_code as etablissement_planning_code, -- Pour cas 3 Sage
lpad(t_entreprises.code, 3, '0') || lpad(t_etablissements.code, 3, '0') || p_salaries.matricule AS matricule_planning, -- Pour cas 2 SHS
lpad(t_entreprises.planning_code, 3, '0') || lpad(t_etablissements.planning_code, 3, '0') || substr(p_salaries.matricule, 1, 5) AS matricule_planning_conso, -- Pour cas 5 SHS consolidé
ltrim(p_salaries.matricule, '0') AS matricule_trim, -- Pour cas 1 Cegid
rank() over (partition by p_salaries.nir order by p_salaries.date_fin desc) as rang, -- Lorsque stratégie basée sur le NIR, permet d'identifier les doublons.
''::text AS salarie_corr
FROM rh.p_salaries
-- Il faut absoluement faire le produit cartésien matricule/établissement même si un salarié n'a jamais travaillé dans un des établissement.
-- En effet, cela pourrait être le cas dans Octime et ce traitement pourrait ne pas remonter les données associées.
JOIN rh.t_entreprises ON t_entreprises.oid = p_salaries.entreprise_id
JOIN rh.t_etablissements ON t_etablissements.entreprise_id = p_salaries.entreprise_id
JOIN (SELECT valeur FROM rh.t_divers WHERE code = 'OCTIME_ETS_ID') AS octime_ets_id ON 1=1
WHERE 1=1
AND salarie_fusionne_id = 0
-- Uniquement les établissements avec planning_code renseigné dans le cas où l'établissement est en mode manuel.
AND CASE WHEN octime_ets_id.valeur = 0 THEN nullif(trim(t_etablissements.planning_code), '') IS NOT NULL ELSE TRUE END
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
ORDER BY 1,2,3
;
-- Stratégie basée sur le NIR : suppression des salariés en doublons.
DELETE FROM w_sal_pla
WHERE 1=1
and (SELECT valeur FROM rh.t_divers WHERE code = 'OCTIME_SALARIE') = 11
and rang > 1
;
-- Gestion des salariés fusionnés.
INSERT INTO w_sal_pla
SELECT
w_sal_pla.salarie_id,
p_salaries.nir,
p_salaries.matricule,
w_sal_pla.sal_date_debut,
w_sal_pla.sal_date_fin,
p_salaries.matricule_planning as matricule_paie_planning,
w_sal_pla.entreprise_code_original,
w_sal_pla.etablissement_code_original,
w_sal_pla.entreprise_code,
w_sal_pla.entreprise_planning_code,
w_sal_pla.etablissement_code,
w_sal_pla.etablissement_planning_code,
lpad(w_sal_pla.entreprise_code, 3, '0') || lpad(w_sal_pla.etablissement_code, 3, '0') || p_salaries.matricule AS matricule_planning,
lpad(w_sal_pla.entreprise_planning_code, 3, '0') || lpad(w_sal_pla.etablissement_planning_code, 3, '0') || substr(p_salaries.matricule, 1, 5) AS matricule_planning_conso,
ltrim(p_salaries.matricule, '0') AS matricule_trim,
1 as rang,
''::text AS salarie_corr
FROM w_sal_pla
JOIN rh.p_salaries ON salarie_fusionne_id = w_sal_pla.salarie_id
WHERE salarie_fusionne_id != 0
;
-- #CORRECTION SHS lorsque le code établissement contient un tiret, utiliser son code original uniquement pour matricule_planning.
UPDATE w_sal_pla SET
matricule_planning = etablissement_code_original || matricule
WHERE etablissement_code LIKE '%-%'
;
-- Alimenter le champ w_sal_pla.salarie_corr.
UPDATE w_sal_pla SET
salarie_corr =
CASE (SELECT valeur FROM rh.t_divers WHERE code = 'OCTIME_SALARIE')
WHEN 1 THEN matricule_trim
WHEN 2 THEN matricule_planning
WHEN 5 THEN matricule_planning_conso
WHEN 3 THEN etablissement_planning_code||'|'||matricule
-- Le cas 6 nécessite le paramétrage du planning_code pour l'établissement et éventuellement l'entreprise.
-- Pour le cas "010000002631K", on peut paramétrer ent. à "01000" et ets. à "000".
WHEN 6 THEN entreprise_planning_code||etablissement_planning_code||matricule
-- Le cas 9 utilise la matricule planning saisi dans la paie.
WHEN 9 THEN matricule_paie_planning
WHEN 10 THEN case when substr(matricule, 1 , 4) = '0000' then (SELECT valeur FROM rh.t_divers WHERE code = 'OCTIME_OLDMAT_PREFIXE')||matricule_trim else matricule end -- Cas 10 - Fusion QuadraRH -> ADP.
WHEN 11 THEN nir -- Cas 11 : NIR
-- Les cas 4, 7 et 8 ne nécessitent pas de transformation du matricule issu de la paie.
ELSE matricule
END
;
-- Création d'index.
CREATE INDEX w_sal_pla_i_matricule ON w_sal_pla USING btree (matricule)
;
CREATE INDEX w_sal_pla_i_matricule_planning ON w_sal_pla USING btree (matricule_planning)
;
CREATE INDEX w_sal_pla_i_matricule_trim ON w_sal_pla USING btree (matricule_trim)
;
DROP SEQUENCE IF EXISTS w_cptres1_seq
;
CREATE TEMP SEQUENCE w_cptres1_seq
;
DROP TABLE IF EXISTS w_cptres1
;
CREATE TEMP TABLE w_cptres1 AS
SELECT
nextval('w_cptres1_seq') as cptres1_id,
prod_octime_cptres1.salarie_corr,
w_sal_pla.salarie_id,
null::bigint AS contrat_id,
null::bigint AS contrat_mois_id,
date(cal_dat) AS date,
pos_cod,
niv_cod1,
niv_cod2,
niv_cod3,
niv_cod4,
CASE octime_max_niveau.valeur
WHEN 3 THEN niv_cod1 || '|' || niv_cod2 || '|' || niv_cod3
WHEN 4 THEN niv_cod1 || '|' || niv_cod2 || '|' || niv_cod3 || '|' || niv_cod4
END AS niveau_code_original,
CASE octime_service_id.valeur
WHEN 1 THEN niv_cod1
WHEN 2 THEN niv_cod1 || '|' || niv_cod2
WHEN 3 THEN niv_cod1 || '|' || niv_cod2 || '|' || niv_cod3
WHEN 4 THEN niv_cod1 || '|' || niv_cod2 || '|' || niv_cod3 || '|' || niv_cod4
END AS service_code_original,
CASE octime_ets_id.valeur
WHEN 0 THEN octime_ets_manuel.valeur
WHEN 1 THEN niv_cod1 -- cas AHO
WHEN 2 THEN niv_cod2
WHEN 3 THEN niv_cod3
WHEN 4 THEN CASE WHEN octime_max_niveau.valeur = '3' THEN left(prod_octime_cptres1.pers_mat, -5) ELSE niv_cod4 END -- cas Fondation Hopale avec OCTIME_MAX_NIVEAU positionné par défaut sur 3.
WHEN 9 THEN left(prod_octime_cptres1.pers_mat, -5) -- cas Fondation Hopale
END AS entets_code,
''::text AS abs_cod,
hor_cod, -- code horaire.
cal_val2/60.00 AS temps_du_initial,
cal_val3/60.00 AS temps_du,
CASE tps_valide.valeur WHEN '6' THEN cal_val6 ELSE cal_val5 END/60.00 AS temps_valide,
0::numeric AS temps_absence,
0 AS temps_hs,
0 AS temps_hc
FROM prod_octime_cptres1
JOIN w_sal_pla ON w_sal_pla.salarie_corr = prod_octime_cptres1.salarie_corr
JOIN (SELECT valeur FROM rh.t_divers WHERE code = 'OCTIME_TPS_VALIDE') AS tps_valide ON 1=1
JOIN (SELECT valeur FROM rh.t_divers WHERE code = 'OCTIME_SERVICE_ID') AS octime_service_id ON 1=1
JOIN (SELECT valeur FROM rh.t_divers WHERE code = 'OCTIME_ETS_ID') AS octime_ets_id ON 1=1
JOIN (SELECT valeur FROM rh.t_divers WHERE code = 'OCTIME_ETS_MANUEL') AS octime_ets_manuel ON 1=1
JOIN (SELECT valeur FROM rh.t_divers WHERE code = 'OCTIME_MAX_NIVEAU') AS octime_max_niveau ON 1=1
WHERE 1!=1
OR cal_val2 != 0
OR cal_val3 != 0
OR CASE tps_valide.valeur WHEN '6' THEN cal_val6 ELSE cal_val5 END != 0
;
INSERT INTO w_cptres1
SELECT
nextval('w_cptres1_seq') as cptres1_id,
prod_octime_cptres1.salarie_corr,
w_sal_pla.salarie_id,
null::bigint AS contrat_id,
null::bigint AS contrat_mois_id,
date(cal_dat) AS date,
pos_cod,
niv_cod1,
niv_cod2,
niv_cod3,
niv_cod4,
CASE octime_max_niveau.valeur
WHEN 3 THEN niv_cod1 || '|' || niv_cod2 || '|' || niv_cod3
WHEN 4 THEN niv_cod1 || '|' || niv_cod2 || '|' || niv_cod3 || '|' || niv_cod4
END AS niveau_code_original,
CASE octime_service_id.valeur
WHEN 1 THEN niv_cod1
WHEN 2 THEN niv_cod1 || '|' || niv_cod2
WHEN 3 THEN niv_cod1 || '|' || niv_cod2 || '|' || niv_cod3
WHEN 4 THEN niv_cod1 || '|' || niv_cod2 || '|' || niv_cod3 || '|' || niv_cod4
END AS service_code_original,
CASE octime_ets_id.valeur
WHEN 0 THEN octime_ets_manuel.valeur
WHEN 1 THEN niv_cod1 -- cas AHO
WHEN 2 THEN niv_cod2
WHEN 3 THEN niv_cod3
WHEN 4 THEN CASE WHEN octime_max_niveau.valeur = '3' THEN left(prod_octime_cptres1.pers_mat, -5) ELSE niv_cod4 END -- cas Fondation Hopale avec OCTIME_MAX_NIVEAU positionné par défaut sur 3.
WHEN 9 THEN left(prod_octime_cptres1.pers_mat, -5) -- cas Fondation Hopale
END AS entets_code,
cal_val24 AS abs_cod,
hor_cod, -- code horaire.
0 AS temps_du,
0 AS temps_du_initial,
0 AS temps_valide,
cal_val21/60.00 AS temps_absence,
0 AS temps_hs,
0 AS temps_hc
FROM prod_octime_cptres1
JOIN w_sal_pla ON w_sal_pla.salarie_corr = prod_octime_cptres1.salarie_corr
JOIN (SELECT valeur FROM rh.t_divers WHERE code = 'OCTIME_SERVICE_ID') AS octime_service_id ON 1=1
JOIN (SELECT valeur FROM rh.t_divers WHERE code = 'OCTIME_ETS_ID') AS octime_ets_id ON 1=1
JOIN (SELECT valeur FROM rh.t_divers WHERE code = 'OCTIME_ETS_MANUEL') AS octime_ets_manuel ON 1=1
JOIN (SELECT valeur FROM rh.t_divers WHERE code = 'OCTIME_MAX_NIVEAU') AS octime_max_niveau ON 1=1
WHERE cal_val21 != 0
;
INSERT INTO w_cptres1
SELECT
nextval('w_cptres1_seq') as cptres1_id,
prod_octime_cptres1.salarie_corr,
w_sal_pla.salarie_id,
null::bigint AS contrat_id,
null::bigint AS contrat_mois_id,
date(cal_dat) AS date,
pos_cod,
niv_cod1,
niv_cod2,
niv_cod3,
niv_cod4,
CASE octime_max_niveau.valeur
WHEN 3 THEN niv_cod1 || '|' || niv_cod2 || '|' || niv_cod3
WHEN 4 THEN niv_cod1 || '|' || niv_cod2 || '|' || niv_cod3 || '|' || niv_cod4
END AS niveau_code_original,
CASE octime_service_id.valeur
WHEN 1 THEN niv_cod1
WHEN 2 THEN niv_cod1 || '|' || niv_cod2
WHEN 3 THEN niv_cod1 || '|' || niv_cod2 || '|' || niv_cod3
WHEN 4 THEN niv_cod1 || '|' || niv_cod2 || '|' || niv_cod3 || '|' || niv_cod4
END AS service_code_original,
CASE octime_ets_id.valeur
WHEN 0 THEN octime_ets_manuel.valeur
WHEN 1 THEN niv_cod1 -- cas AHO
WHEN 2 THEN niv_cod2
WHEN 3 THEN niv_cod3
WHEN 4 THEN CASE WHEN octime_max_niveau.valeur = '3' THEN left(prod_octime_cptres1.pers_mat, -5) ELSE niv_cod4 END -- cas Fondation Hopale avec OCTIME_MAX_NIVEAU positionné par défaut sur 3.
WHEN 9 THEN left(prod_octime_cptres1.pers_mat, -5) -- cas Fondation Hopale
END AS entets_code,
cal_val25 AS abs_cod,
hor_cod, -- code horaire.
0 AS temps_du,
0 AS temps_du_initial,
0 AS temps_valide,
cal_val22/60.00 AS temps_absence,
0 AS temps_hs,
0 AS temps_hc
FROM prod_octime_cptres1
JOIN w_sal_pla ON w_sal_pla.salarie_corr = prod_octime_cptres1.salarie_corr
JOIN (SELECT valeur FROM rh.t_divers WHERE code = 'OCTIME_SERVICE_ID') AS octime_service_id ON 1=1
JOIN (SELECT valeur FROM rh.t_divers WHERE code = 'OCTIME_ETS_ID') AS octime_ets_id ON 1=1
JOIN (SELECT valeur FROM rh.t_divers WHERE code = 'OCTIME_ETS_MANUEL') AS octime_ets_manuel ON 1=1
JOIN (SELECT valeur FROM rh.t_divers WHERE code = 'OCTIME_MAX_NIVEAU') AS octime_max_niveau ON 1=1
WHERE cal_val22 != 0
;
INSERT INTO w_cptres1
SELECT
nextval('w_cptres1_seq') as cptres1_id,
prod_octime_cptres1.salarie_corr,
w_sal_pla.salarie_id,
null::bigint AS contrat_id,
null::bigint AS contrat_mois_id,
date(cal_dat) AS date,
pos_cod,
niv_cod1,
niv_cod2,
niv_cod3,
niv_cod4,
CASE octime_max_niveau.valeur
WHEN 3 THEN niv_cod1 || '|' || niv_cod2 || '|' || niv_cod3
WHEN 4 THEN niv_cod1 || '|' || niv_cod2 || '|' || niv_cod3 || '|' || niv_cod4
END AS niveau_code_original,
CASE octime_service_id.valeur
WHEN 1 THEN niv_cod1
WHEN 2 THEN niv_cod1 || '|' || niv_cod2
WHEN 3 THEN niv_cod1 || '|' || niv_cod2 || '|' || niv_cod3
WHEN 4 THEN niv_cod1 || '|' || niv_cod2 || '|' || niv_cod3 || '|' || niv_cod4
END AS service_code_original,
CASE octime_ets_id.valeur
WHEN 0 THEN octime_ets_manuel.valeur
WHEN 1 THEN niv_cod1 -- cas AHO
WHEN 2 THEN niv_cod2
WHEN 3 THEN niv_cod3
WHEN 4 THEN CASE WHEN octime_max_niveau.valeur = '3' THEN left(prod_octime_cptres1.pers_mat, -5) ELSE niv_cod4 END -- cas Fondation Hopale avec OCTIME_MAX_NIVEAU positionné par défaut sur 3.
WHEN 9 THEN left(prod_octime_cptres1.pers_mat, -5) -- cas Fondation Hopale
END AS entets_code,
cal_val26 AS abs_cod,
hor_cod, -- code horaire.
0 AS temps_du,
0 AS temps_du_initial,
0 AS temps_valide,
cal_val23/60.00 AS temps_absence,
0 AS temps_hs,
0 AS temps_hc
FROM prod_octime_cptres1
JOIN w_sal_pla ON w_sal_pla.salarie_corr = prod_octime_cptres1.salarie_corr
JOIN (SELECT valeur FROM rh.t_divers WHERE code = 'OCTIME_SERVICE_ID') AS octime_service_id ON 1=1
JOIN (SELECT valeur FROM rh.t_divers WHERE code = 'OCTIME_ETS_ID') AS octime_ets_id ON 1=1
JOIN (SELECT valeur FROM rh.t_divers WHERE code = 'OCTIME_ETS_MANUEL') AS octime_ets_manuel ON 1=1
JOIN (SELECT valeur FROM rh.t_divers WHERE code = 'OCTIME_MAX_NIVEAU') AS octime_max_niveau ON 1=1
WHERE cal_val23 != 0
;
INSERT INTO w_cptres1
SELECT
nextval('w_cptres1_seq') as cptres1_id,
prod_octime_cptres1.salarie_corr,
w_sal_pla.salarie_id,
null::bigint AS contrat_id,
null::bigint AS contrat_mois_id,
date(cal_dat) AS date,
pos_cod,
niv_cod1,
niv_cod2,
niv_cod3,
niv_cod4,
CASE octime_max_niveau.valeur
WHEN 3 THEN niv_cod1 || '|' || niv_cod2 || '|' || niv_cod3
WHEN 4 THEN niv_cod1 || '|' || niv_cod2 || '|' || niv_cod3 || '|' || niv_cod4
END AS niveau_code_original,
CASE octime_service_id.valeur
WHEN 1 THEN niv_cod1
WHEN 2 THEN niv_cod1 || '|' || niv_cod2
WHEN 3 THEN niv_cod1 || '|' || niv_cod2 || '|' || niv_cod3
WHEN 4 THEN niv_cod1 || '|' || niv_cod2 || '|' || niv_cod3 || '|' || niv_cod4
END AS service_code_original,
CASE octime_ets_id.valeur
WHEN 0 THEN octime_ets_manuel.valeur
WHEN 1 THEN niv_cod1 -- cas AHO
WHEN 2 THEN niv_cod2
WHEN 3 THEN niv_cod3
WHEN 4 THEN CASE WHEN octime_max_niveau.valeur = '3' THEN left(prod_octime_cptres1.pers_mat, -5) ELSE niv_cod4 END -- cas Fondation Hopale avec OCTIME_MAX_NIVEAU positionné par défaut sur 3.
WHEN 9 THEN left(prod_octime_cptres1.pers_mat, -5) -- cas Fondation Hopale
END AS entets_code,
cal_val26 AS abs_cod,
hor_cod, -- code horaire.
0 AS temps_du,
0 AS temps_du_initial,
0 AS temps_valide,
0 AS temps_absence,
cal_val387/60.0 AS temps_hs,
0 AS temps_hc
FROM prod_octime_cptres1
JOIN w_sal_pla ON w_sal_pla.salarie_corr = prod_octime_cptres1.salarie_corr
JOIN (SELECT valeur FROM rh.t_divers WHERE code = 'OCTIME_SERVICE_ID') AS octime_service_id ON 1=1
JOIN (SELECT valeur FROM rh.t_divers WHERE code = 'OCTIME_ETS_ID') AS octime_ets_id ON 1=1
JOIN (SELECT valeur FROM rh.t_divers WHERE code = 'OCTIME_ETS_MANUEL') AS octime_ets_manuel ON 1=1
JOIN (SELECT valeur FROM rh.t_divers WHERE code = 'OCTIME_MAX_NIVEAU') AS octime_max_niveau ON 1=1
WHERE cal_val387 != 0
;
INSERT INTO w_cptres1
SELECT
nextval('w_cptres1_seq') as cptres1_id,
prod_octime_cptres1.salarie_corr,
w_sal_pla.salarie_id,
null::bigint AS contrat_id,
null::bigint AS contrat_mois_id,
date(cal_dat) AS date,
pos_cod,
niv_cod1,
niv_cod2,
niv_cod3,
niv_cod4,
CASE octime_max_niveau.valeur
WHEN 3 THEN niv_cod1 || '|' || niv_cod2 || '|' || niv_cod3
WHEN 4 THEN niv_cod1 || '|' || niv_cod2 || '|' || niv_cod3 || '|' || niv_cod4
END AS niveau_code_original,
CASE octime_service_id.valeur
WHEN 1 THEN niv_cod1
WHEN 2 THEN niv_cod1 || '|' || niv_cod2
WHEN 3 THEN niv_cod1 || '|' || niv_cod2 || '|' || niv_cod3
WHEN 4 THEN niv_cod1 || '|' || niv_cod2 || '|' || niv_cod3 || '|' || niv_cod4
END AS service_code_original,
CASE octime_ets_id.valeur
WHEN 0 THEN octime_ets_manuel.valeur
WHEN 1 THEN niv_cod1 -- cas AHO
WHEN 2 THEN niv_cod2
WHEN 3 THEN niv_cod3
WHEN 4 THEN CASE WHEN octime_max_niveau.valeur = '3' THEN left(prod_octime_cptres1.pers_mat, -5) ELSE niv_cod4 END -- cas Fondation Hopale avec OCTIME_MAX_NIVEAU positionné par défaut sur 3.
WHEN 9 THEN left(prod_octime_cptres1.pers_mat, -5) -- cas Fondation Hopale
END AS entets_code,
cal_val26 AS abs_cod,
hor_cod, -- code horaire.
0 AS temps_du,
0 AS temps_du_initial,
0 AS temps_valide,
0 AS temps_absence,
0 AS temps_hs,
cal_val388/60.0 AS temps_hc
FROM prod_octime_cptres1
JOIN w_sal_pla ON w_sal_pla.salarie_corr = prod_octime_cptres1.salarie_corr
JOIN (SELECT valeur FROM rh.t_divers WHERE code = 'OCTIME_SERVICE_ID') AS octime_service_id ON 1=1
JOIN (SELECT valeur FROM rh.t_divers WHERE code = 'OCTIME_ETS_ID') AS octime_ets_id ON 1=1
JOIN (SELECT valeur FROM rh.t_divers WHERE code = 'OCTIME_ETS_MANUEL') AS octime_ets_manuel ON 1=1
JOIN (SELECT valeur FROM rh.t_divers WHERE code = 'OCTIME_MAX_NIVEAU') AS octime_max_niveau ON 1=1
WHERE cal_val388 != 0
;
-- Permet de s'assurer que le Niveau Planning non renseigné sera bien celui avec l'OID 0.
UPDATE w_cptres1 SET
niveau_code_original = ''
WHERE niveau_code_original = '||'
;
VACUUM ANALYSE w_cptres1
;
-- Association aux contrats et contrat_mois.
-- En général, les heures planning sont effectuées AVANT un contrat/paie à cause du décallage avec la paie :
-- => les heures effectuées en fin de mois sont à associer avec le mois suivant.
with w_asso as (
select
cptres1_id,
(max(array[extract(epoch from p_contrats_mois.date_debut), p_contrats_mois.contrat_id]))[2] as contrat_id,
(max(array[extract(epoch from p_contrats_mois.date_debut), p_contrats_mois.oid]))[2] as contrat_mois_id
from w_cptres1
join rh.p_contrats_mois on 1=1
and p_contrats_mois.salarie_id = w_cptres1.salarie_id
and w_cptres1.date between p_contrats_mois.date_debut and p_contrats_mois.date_fin -- Sélection des contrats pendant heures planning.
where 1!=1
OR w_cptres1.contrat_id is null
OR w_cptres1.contrat_mois_id is null
group by 1)
UPDATE w_cptres1 SET
contrat_id = w_asso.contrat_id,
contrat_mois_id = w_asso.contrat_mois_id
FROM w_asso
WHERE w_cptres1.cptres1_id = w_asso.cptres1_id
;
with w_asso as (
select
cptres1_id,
(min(array[extract(epoch from p_contrats_mois.date_debut), p_contrats_mois.contrat_id]))[2] as contrat_id,
(min(array[extract(epoch from p_contrats_mois.date_debut), p_contrats_mois.oid]))[2] as contrat_mois_id
from w_cptres1
join rh.p_contrats_mois on 1=1
and p_contrats_mois.salarie_id = w_cptres1.salarie_id
and p_contrats_mois.date_debut > w_cptres1.date -- Sélection des contrats APRES heures planning.
where 1!=1
OR w_cptres1.contrat_id is null
OR w_cptres1.contrat_mois_id is null
group by 1)
UPDATE w_cptres1 SET
contrat_id = w_asso.contrat_id,
contrat_mois_id = w_asso.contrat_mois_id
FROM w_asso
WHERE w_cptres1.cptres1_id = w_asso.cptres1_id
;
with w_asso as (
select
cptres1_id,
(max(array[extract(epoch from p_contrats_mois.date_debut), p_contrats_mois.contrat_id]))[2] as contrat_id,
(max(array[extract(epoch from p_contrats_mois.date_debut), p_contrats_mois.oid]))[2] as contrat_mois_id
from w_cptres1
join rh.p_contrats_mois on 1=1
and p_contrats_mois.salarie_id = w_cptres1.salarie_id
and p_contrats_mois.date_debut < w_cptres1.date -- Sélection des contrats AVANT heures planning.
where 1!=1
OR w_cptres1.contrat_id is null
OR w_cptres1.contrat_mois_id is null
group by 1)
UPDATE w_cptres1 SET
contrat_id = w_asso.contrat_id,
contrat_mois_id = w_asso.contrat_mois_id
FROM w_asso
WHERE w_cptres1.cptres1_id = w_asso.cptres1_id
;
-- Création d'index.
CREATE INDEX w_cptres1_i_contrat_id ON w_cptres1 USING btree (contrat_id)
;
CREATE INDEX w_cptres1_i_contrat_mois_id ON w_cptres1 USING btree (contrat_mois_id)
;
CREATE INDEX w_cptres1_i_date ON w_cptres1 USING btree (date)
;
CREATE INDEX w_cptres1_i_salarie_id ON w_cptres1 USING btree (salarie_id)
;
-- Alimentation des tables de paramètres.
-- Màj des Services du Planning.
INSERT INTO rh.t_planning_service(code_original, code, texte, texte_court, service_id)
with w_cptres1_tmp as (
select
service_code_original,
niv_cod1,
niv_cod2,
niv_cod3,
niv_cod4,
octime_service_id.valeur
from w_cptres1
JOIN (SELECT valeur FROM rh.t_divers WHERE code = 'OCTIME_SERVICE_ID') AS octime_service_id ON 1=1
group by 1,2,3,4,5,6)
SELECT
w_cptres1.service_code_original,
w_cptres1.service_code_original,
coalesce(niv1.niv_lib1, w_cptres1.niv_cod1)||case when valeur >= 2 THEN ' - '||coalesce(niv2.niv_lib2, w_cptres1.niv_cod2) ELSE '' END||CASE WHEN valeur >= 3 THEN ' - '||coalesce(niv3.niv_lib3, w_cptres1.niv_cod3) ELSE '' END||CASE WHEN valeur >= 4 THEN ' - '||coalesce(niv4.niv_lib4, w_cptres1.niv_cod4) ELSE '' END,
substr(coalesce(niv1.niv_lib1, w_cptres1.niv_cod1)||case when valeur >= 2 THEN ' - '||coalesce(niv2.niv_lib2, w_cptres1.niv_cod2) ELSE '' END||CASE WHEN valeur >= 3 THEN ' - '||coalesce(niv3.niv_lib3, w_cptres1.niv_cod3) ELSE '' END||CASE WHEN valeur >= 4 THEN ' - '||coalesce(niv4.niv_lib4, w_cptres1.niv_cod4) ELSE '' END, 1, 50),
0 as service_id
FROM w_cptres1_tmp as w_cptres1
LEFT JOIN prod_octime_niveau1 as niv1 ON niv1.niv_cod1 = w_cptres1.niv_cod1
LEFT JOIN prod_octime_niveau2 as niv2 ON 1=1
AND niv2.niv_cod1 = w_cptres1.niv_cod1
AND niv2.niv_cod2 = w_cptres1.niv_cod2
LEFT JOIN prod_octime_niveau3 as niv3 ON 1=1
AND niv3.niv_cod1 = w_cptres1.niv_cod1
AND niv3.niv_cod2 = w_cptres1.niv_cod2
AND niv3.niv_cod3 = w_cptres1.niv_cod3
LEFT JOIN prod_octime_niveau4 as niv4 ON 1=1
AND niv4.niv_cod1 = w_cptres1.niv_cod1
AND niv4.niv_cod2 = w_cptres1.niv_cod2
AND niv4.niv_cod3 = w_cptres1.niv_cod3
AND niv4.niv_cod4 = w_cptres1.niv_cod4
WHERE w_cptres1.service_code_original NOT IN (SELECT code_original FROM rh.t_planning_service WHERE code_original IS NOT NULL)
GROUP BY 1,2,3,4
;
-- Màj des Niveaux du Planning.
DROP TABLE IF EXISTS w_nivpla
;
CREATE TEMP TABLE w_nivpla AS
with w_cptres1_tmp as (
select
niveau_code_original,
niv_cod1,
niv_cod2,
niv_cod3,
niv_cod4,
octime_max_niveau.valeur as octime_max_niveau
from w_cptres1
JOIN (SELECT valeur FROM rh.t_divers WHERE code = 'OCTIME_MAX_NIVEAU') AS octime_max_niveau ON 1=1
group by 1,2,3,4,5,6)
SELECT
w_cptres1.niveau_code_original,
coalesce(niv1.niv_lib1, w_cptres1.niv_cod1)||' -|- '||coalesce(niv2.niv_lib2, w_cptres1.niv_cod2)||' -|- '||coalesce(niv3.niv_lib3, w_cptres1.niv_cod3)||case when octime_max_niveau = 4 then ' -|- '||coalesce(niv4.niv_lib4, w_cptres1.niv_cod4) else '' end as niv_txt,
substr(coalesce(niv1.niv_lib1, w_cptres1.niv_cod1)||' -|- '||coalesce(niv2.niv_lib2, w_cptres1.niv_cod2)||' -|- '||coalesce(niv3.niv_lib3, w_cptres1.niv_cod3)||case when octime_max_niveau = 4 then ' -|- '||coalesce(niv4.niv_lib4, w_cptres1.niv_cod4) else '' end, 1, 50) as niv_txt_crt
FROM w_cptres1_tmp as w_cptres1
LEFT JOIN prod_octime_niveau1 as niv1 ON niv1.niv_cod1 = w_cptres1.niv_cod1
LEFT JOIN prod_octime_niveau2 as niv2 ON 1=1
AND niv2.niv_cod1 = w_cptres1.niv_cod1
AND niv2.niv_cod2 = w_cptres1.niv_cod2
LEFT JOIN prod_octime_niveau3 as niv3 ON 1=1
AND niv3.niv_cod1 = w_cptres1.niv_cod1
AND niv3.niv_cod2 = w_cptres1.niv_cod2
AND niv3.niv_cod3 = w_cptres1.niv_cod3
LEFT JOIN prod_octime_niveau4 as niv4 ON 1=1
AND niv4.niv_cod1 = w_cptres1.niv_cod1
AND niv4.niv_cod2 = w_cptres1.niv_cod2
AND niv4.niv_cod3 = w_cptres1.niv_cod3
AND niv4.niv_cod4 = w_cptres1.niv_cod4
WHERE 1=1
AND niveau_code_original != ''
GROUP BY 1,2,3
;
-- Màj des libellés uniquement.
UPDATE rh.t_planning_niveau SET
texte = niv_txt,
texte_court = niv_txt_crt
FROM w_nivpla
WHERE 1=1
AND t_planning_niveau.code_original = w_nivpla.niveau_code_original
AND (1!=1
OR t_planning_niveau.texte IS DISTINCT FROM w_nivpla.niv_txt
OR t_planning_niveau.texte_court IS DISTINCT FROM w_nivpla.niv_txt_crt)
;
-- Insertion des nouveaux niveaux de planning.
INSERT INTO rh.t_planning_niveau(code_original, code, texte, texte_court)
SELECT
w_nivpla.niveau_code_original,
w_nivpla.niveau_code_original,
w_nivpla.niv_txt,
w_nivpla.niv_txt_crt
FROM w_nivpla
JOIN w_cptres1 ON w_cptres1.niveau_code_original = w_nivpla.niveau_code_original
WHERE w_nivpla.niveau_code_original NOT IN (SELECT code_original FROM rh.t_planning_niveau WHERE code_original IS NOT NULL GROUP BY 1)
GROUP BY 1,2,3,4
;
-- Màj des Qualifications du Planning.
INSERT INTO rh.t_planning_qualification(code_original, code, texte, texte_court)
SELECT
pos_cod,
pos_cod,
pos_lib,
pos_lib
FROM prod_octime_poste AS poste
WHERE 1=1
AND pos_cod IN (SELECT pos_cod FROM w_cptres1)
AND pos_cod NOT IN (SELECT code_original FROM rh.t_planning_qualification WHERE code_original IS NOT NULL)
;
-- Màj des Types d'absences du Planning.
INSERT INTO rh.t_planning_type_absence(code_original, code, texte, texte_court)
SELECT
abs_cod,
abs_cod,
abs_lib,
abs_lib
FROM prod_octime_absence AS absence
WHERE 1=1
AND abs_cod IN (SELECT abs_cod FROM w_cptres1)
AND abs_cod NOT IN (SELECT code_original FROM rh.t_planning_type_absence WHERE code_original IS NOT NULL)
;
-- Màj des Codes Horaires du Planning.
INSERT INTO rh.t_planning_code_horaire(code_original, code, texte, texte_court)
SELECT
hor_cod,
hor_abr,
substr(hor_dmis, 1, 2)||'h'||substr(hor_dmis, 3, 2)||'-'||substr(hor_fmis, 1, 2)||'h'||substr(hor_fmis, 3, 2)||' ('||substr(hor_tmis, 1, 2)||':'||substr(hor_tmis, 3, 2)||')',
substr(substr(hor_dmis, 1, 2)||'h'||substr(hor_dmis, 3, 2)||'-'||substr(hor_fmis, 1, 2)||'h'||substr(hor_fmis, 3, 2)||' ('||substr(hor_tmis, 1, 2)||':'||substr(hor_tmis, 3, 2)||')', 1, 50)
FROM prod_octime_cjourn AS cjourn
WHERE 1=1
AND hor_cod IN (SELECT hor_cod FROM w_cptres1)
AND hor_cod NOT IN (SELECT code_original FROM rh.t_planning_code_horaire WHERE code_original IS NOT NULL)
;
-- Forçage des libellés et codes horaires lorsqu'ils sautent
UPDATE rh.t_planning_code_horaire
SET code = hor_abr,
texte = substr(hor_dmis, 1, 2)||'h'||substr(hor_dmis, 3, 2)||'-'||substr(hor_fmis, 1, 2)||'h'||substr(hor_fmis, 3, 2)||' ('||substr(hor_tmis, 1, 2)||':'||substr(hor_tmis, 3, 2)||')',
texte_court = substr(substr(hor_dmis, 1, 2)||'h'||substr(hor_dmis, 3, 2)||'-'||substr(hor_fmis, 1, 2)||'h'||substr(hor_fmis, 3, 2)||' ('||substr(hor_tmis, 1, 2)||':'||substr(hor_tmis, 3, 2)||')', 1, 50)
FROM prod_octime_cjourn AS cjourn
WHERE code_original = hor_cod AND
(code <> hor_abr OR
texte <> substr(hor_dmis, 1, 2)||'h'||substr(hor_dmis, 3, 2)||'-'||substr(hor_fmis, 1, 2)||'h'||substr(hor_fmis, 3, 2)||' ('||substr(hor_tmis, 1, 2)||':'||substr(hor_tmis, 3, 2)||')' OR
texte_court <> substr(substr(hor_dmis, 1, 2)||'h'||substr(hor_dmis, 3, 2)||'-'||substr(hor_fmis, 1, 2)||'h'||substr(hor_fmis, 3, 2)||' ('||substr(hor_tmis, 1, 2)||':'||substr(hor_tmis, 3, 2)||')', 1, 50))
;
-- Création d'une table Entreprise/Etablissement.
DROP TABLE IF EXISTS w_entets
;
CREATE TEMP TABLE w_entets AS
select
max(ent.oid) as entreprise_id,
max(ets.oid) as etablissement_id,
ent.planning_code||ets.planning_code as entets_code
from rh.t_entreprises as ent
join rh.t_etablissements as ets on ets.entreprise_id = ent.oid
Where 1=1
and ent.oid != 0
and ets.oid != 0
GROUP BY ent.planning_code||ets.planning_code
;
-- Ajout de l'établissement en cours si la valeur de OCTIME_REPRISE_HISTO est à 1 (reprise de l'histo paramétré) car le max renvoi l'établissement historique
WITH w_ets_encours_reprise_histo AS
(SELECT ent.oid as entreprise_id,
ets.oid as etablissement_id,
ent.planning_code||ets.planning_code as entets_code
FROM rh.t_entreprises as ent
JOIN rh.t_etablissements as ets on ets.entreprise_id = ent.oid
JOIN rh.t_divers ON t_divers.code IN ('OCTIME_REPRISE_HISTO')
LEFT JOIN w_entets ON w_entets.entreprise_id = ent.oid AND w_entets.etablissement_id = ets.oid
WHERE 1=1
AND ent.oid != 0
AND ets.oid != 0
AND ent.planning_code||ets.planning_code != ''
AND t_divers.valeur = 1
AND w_entets.etablissement_id IS NULL)
INSERT INTO w_entets SELECT * FROM w_ets_encours_reprise_histo;
-- Alimentation de la table de mouvement.
TRUNCATE rh.p_planning_mouvement
;
INSERT INTO rh.p_planning_mouvement(
salarie_id,
contrat_id,
contrat_mois_id,
date,
semaine,
mois,
etablissement_id, -- @todo à renseigner en fonction du paramétrage dans t_divers.
service_id,
qualification_id,
type_absence_id,
niveau_id,
code_horaire_id,
temps_du,
temps_du_initial,
temps_valide,
temps_absence,
temps_du_ajuste,
temps_valide_ajuste,
temps_absence_ajuste)
SELECT
w_cptres1.salarie_id,
w_cptres1.contrat_id,
w_cptres1.contrat_mois_id,
w_cptres1.date,
to_char(w_cptres1.date, 'IYYYIW'::text)::numeric AS semaine,
to_char(w_cptres1.date, 'YYYYMM'::text)::numeric AS mois,
coalesce(w_entets.etablissement_id, 0) as etablissement_id,
coalesce(t_planning_service.oid, 0) AS service_id,
coalesce(t_planning_qualification.oid, 0) AS qualification_id,
coalesce(t_planning_type_absence.oid, 0) AS type_absence_id,
coalesce(t_planning_niveau.oid, 0) as niveau_id,
coalesce(t_planning_code_horaire.oid, 0) as code_horaire_id,
temps_du,
temps_du_initial,
temps_valide,
temps_absence,
temps_du,
temps_valide,
temps_absence
FROM w_cptres1
JOIN rh.p_salaries ON p_salaries.oid = w_cptres1.salarie_id
JOIN w_entets ON true
AND w_entets.entreprise_id = p_salaries.entreprise_id
AND w_entets.entets_code = w_cptres1.entets_code -- Limiter les données au seul établissement paramétré.
LEFT JOIN rh.t_planning_niveau ON t_planning_niveau.code_original = w_cptres1.niveau_code_original
LEFT JOIN rh.t_planning_service ON t_planning_service.code_original = w_cptres1.service_code_original
LEFT JOIN rh.t_planning_qualification ON t_planning_qualification.code_original = w_cptres1.pos_cod
LEFT JOIN rh.t_planning_type_absence ON t_planning_type_absence.code_original = w_cptres1.abs_cod
LEFT JOIN rh.t_planning_code_horaire ON t_planning_code_horaire.code_original = w_cptres1.hor_cod
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19
;
VACUUM ANALYSE rh.p_planning_mouvement
;
-- Ajustement des temps
-- Temps validé sans temps du, alimenter temps du
UPDATE rh.p_planning_mouvement
SET temps_du_ajuste = p_planning_mouvement.temps_valide
FROM
(
SELECT salarie_id, date
FROM rh.p_planning_mouvement
JOIN RH.t_divers ON t_divers.code = 'OCTIME_TPS_VALIDE_A' AND t_divers.valeur = '1'
GROUP BY 1,2
HAVING SUM(temps_du) = 0 AND SUM(temps_valide) > 0
) subview
WHERE p_planning_mouvement.salarie_id = subview.salarie_id AND
p_planning_mouvement.date = subview.date
;
-- Temps du - temps absence différent de temps validé -> temps valide = Temps du - temps absence
UPDATE rh.p_planning_mouvement
SET temps_valide_ajuste = p_planning_mouvement.temps_valide + ecart_temps_valide
FROM
(
SELECT salarie_id, date, SUM(temps_du_ajuste) AS temps_du_ajuste, SUM(temps_valide) AS temps_valide, SUM(temps_absence) AS temps_absence,
MIN(CASE WHEN temps_du_ajuste > 0 THEN p_planning_mouvement.CTID ELSE NULL END) AS upd_ctid, SUM(temps_du_ajuste) - SUM(temps_absence) - SUM(temps_valide) AS ecart_temps_valide
FROM rh.p_planning_mouvement
JOIN RH.t_divers ON t_divers.code = 'OCTIME_TPS_VALIDE_A' AND t_divers.valeur = '1'
GROUP BY 1,2
HAVING SUM(temps_du_ajuste) - SUM(temps_absence) <> SUM(temps_valide)
) subview
WHERE p_planning_mouvement.salarie_id = subview.salarie_id AND
p_planning_mouvement.date = subview.date AND
p_planning_mouvement.ctid = subview.upd_ctid
;
]]></sqlcmd>
</NODE>
</NODE>
<NODE name="POST" type="common" />
<NODE name="VACUUM" type="common" />
<NODE name="VENTILATION" label="Ventilation analytique">
<condition><![CDATA[
SELECT valeur > 0
FROM rh.t_divers
WHERE code = 'OCTIME_VENTILATION'
;
]]></condition>
<NODE name="VENTILATION" label="Calcul des ventilations">
<sqlcmd><![CDATA[
-- Insertion du Plan Analytique.
TRUNCATE rh.t_plan_analytique
;
INSERT INTO rh.t_plan_analytique(oid, code, texte)
VALUES ((SELECT valeur::bigint FROM rh.t_divers WHERE code = 'OCTIME_VENTILATION'), 'OCTIME', 'Ventilation analytique')
;
-- Màj des sections analytiques.
DELETE FROM rh.t_section_analytique
WHERE oid != 0 -- Ne pas supprimer la section analytique N/R
;
INSERT INTO rh.t_section_analytique(oid, code_original, code, texte, texte_court)
select
t_planning_niveau.oid * 1000000 + t_planning_type_absence.oid as oid,
t_planning_niveau.code_original||'|'::text||t_planning_type_absence.code_original as code_original,
t_planning_niveau.code||'|'::text||(case when t_planning_type_absence.oid = 0 then ''::text else t_planning_type_absence.code end) as code,
t_planning_niveau.texte||(case when t_planning_type_absence.oid = 0 then ''::text else ' -|- '::text||t_planning_type_absence.texte end) as texte,
t_planning_niveau.texte_court||(case when t_planning_type_absence.oid = 0 then ''::text else ' -|- '::text||t_planning_type_absence.texte_court end) as texte_court
from rh.t_planning_niveau, rh.t_planning_type_absence
where t_planning_niveau.oid * 1000000 + t_planning_type_absence.oid not in (select oid from rh.t_section_analytique group by 1)
group by 1,2,3,4,5
;
-- Recencement de la ventilation ana.
DROP TABLE IF EXISTS w_ven
;
CREATE TEMP TABLE w_ven AS
with base_hp as (
select
salarie_id,
date_debut,
date_fin
from rh.p_historique_paie
where true
-- and salarie_id in (select oid from rh.p_salaries where matricule = '1019')
-- and mois_paie = 201710
group by 1,2,3
), unused as (
select p_planning_mouvement.*
from rh.p_planning_mouvement
left join base_hp on 1=1
and p_planning_mouvement.salarie_id = base_hp.salarie_id
and p_planning_mouvement.date between base_hp.date_debut and base_hp.date_fin
where true
and base_hp.salarie_id is null
-- and p_planning_mouvement.salarie_id in (select oid from rh.p_salaries where matricule = '1019')
-- and p_planning_mouvement.mois in (201710, 201709)
), base as (
select
base_hp.salarie_id,
base_hp.date_debut,
base_hp.date_fin,
coalesce(t1.niveau_id * 1000000 + t1.type_absence_id, t2.niveau_id * 1000000 + t2.type_absence_id, 0) as section_analytique_id,
coalesce(sum(t1.temps_valide + t1.temps_absence), sum(t2.temps_valide + t2.temps_absence), 0) as temps_du
from base_hp
left join rh.p_planning_mouvement as t1 on 1=1
and t1.salarie_id = base_hp.salarie_id
and t1.date between base_hp.date_debut and base_hp.date_fin
left join unused as t2 on 1=1
and t2.salarie_id = base_hp.salarie_id
and t1.date is null
and to_char(t2.date + '1 month'::interval, 'YYYYMM')::int = to_char(base_hp.date_debut, 'YYYYMM')::int
group by 1,2,3,4
-- having sum(@temps_valide + @temps_absence) != 0 -- Pour avoir les sections ana. non attribuées.
), ven_0 as (
select
salarie_id,
date_debut,
date_fin,
section_analytique_id,
base.cti_division(temps_du, sum(temps_du) over (partition by salarie_id, date_debut, date_fin)) as ratio
from base
), ven as (
select
salarie_id,
date_debut,
date_fin,
section_analytique_id,
ratio
from ven_0
where false -- Filtrage des sections ana. à 0 sauf lorsque section toute seule (future section non renseignée à 100%)
or section_analytique_id = 0 -- on garde les futures sections ana. à 0 futures non renseignées...
or ratio != 0 -- ...ou celles qui ont un ratio.
), corr as (
select
salarie_id,
date_debut,
date_fin,
(max(array[ratio, section_analytique_id]))[2] as section_analytique_id,
1.0 - sum(ratio) as ratio
from ven
group by 1,2,3
having sum(ratio) != 1)
select
salarie_id,
date_debut,
date_fin,
section_analytique_id,
t_section_analytique.code_original as section_analytique_code_original,
sum(ratio) as ratio
from (select * from ven union all select * from corr) as subq
join rh.t_section_analytique on t_section_analytique.oid = section_analytique_id
group by 1,2,3,4,5
;
DROP TABLE IF EXISTS w_ven_agg
;
CREATE TEMP TABLE w_ven_agg AS
select
salarie_id,
date_debut,
date_fin,
dense_rank() over (order by array_agg(section_analytique_id order by section_analytique_id), array_agg(ratio order by section_analytique_id)) as ventilation_id,
array_to_string(array_agg(section_analytique_code_original||'@'||(round(ratio*100)) order by section_analytique_code_original), ', ') as ventilation_texte
FROM w_ven
group by 1,2,3
;
-- Récupération des différents schémas/modèles de ventilation.
TRUNCATE rh.p_ventilation
;
INSERT INTO rh.p_ventilation(oid, code, texte, plan_analytique_id)
select
ventilation_id,
ventilation_id::text,
ventilation_texte,
(SELECT valeur::bigint FROM rh.t_divers WHERE code = 'OCTIME_VENTILATION')
FROM w_ven_agg
group by 1,2,3,4
UNION ALL
SELECT
0,
'N/R',
'Non renseignée',
(SELECT valeur::bigint FROM rh.t_divers WHERE code = 'OCTIME_VENTILATION')
;
TRUNCATE rh.p_ventilation_section
;
INSERT INTO rh.p_ventilation_section(
ventilation_id,
section_analytique_id,
section_analytique_code,
section_analytique_texte,
ratio)
SELECT
ventilation_id,
t_section_analytique.oid,
t_section_analytique.code,
t_section_analytique.texte,
ratio
from w_ven
join w_ven_agg on 1=1
and w_ven_agg.salarie_id = w_ven.salarie_id
and w_ven_agg.date_debut = w_ven.date_debut
and w_ven_agg.date_fin = w_ven.date_fin
JOIN rh.t_section_analytique on t_section_analytique.oid = w_ven.section_analytique_id
group by 1,2,3,4,5
UNION ALL
SELECT
0,
oid,
code,
texte,
1
FROM rh.t_section_analytique
WHERE oid = 0
;
-- Création des 3 classes de niveaux.
DROP TABLE IF EXISTS w_classes
;
CREATE TEMP TABLE w_classes AS
with classe_table as (
select 'PLAANANIV1' as code, '[DICT.RH.NIVEAU1#1]' as texte, 1 as sequence
UNION ALL
select 'PLAANANIV2' as code, '[DICT.RH.NIVEAU2#1]' as texte, 2 as sequence
UNION ALL
select 'PLAANANIV3' as code, '[DICT.RH.NIVEAU3#1]' as texte, 3 as sequence
UNION ALL
select 'PLAANATABS' as code, 'Type d''absence' as texte, 4 as sequence)
SELECT code, texte, table_id, 0 as is_cti, sequence
FROM classe_table, (select oid as table_id from rh.t_listes_tables where code = 'ANA' LIMIT 1) as subq
;
insert into rh.t_classes (code, texte, table_id, is_cti, sequence)
select code, texte, table_id, is_cti, sequence
FROM w_classes
where code NOT in (select code from rh.t_classes where code is not null)
;
update rh.t_classes set
texte = w_classes.texte
FROM w_classes
WHERE true
and w_classes.code = t_classes.code
and w_classes.texte is distinct from t_classes.texte
;
-- Nettoyage du contenu
delete from rh.t_classes_sections_elements
where section_id in (
select s.oid from rh.t_classes as c
join rh.t_classes_sections as s on s.classe_id = c.oid
where c.code IN ('PLAANANIV1', 'PLAANANIV2', 'PLAANANIV3', 'PLAANATABS'))
;
-- Mise à jour des sections Niveau 1.
DROP TABLE IF EXISTS w_clasec_1
;
CREATE TEMP TABLE w_clasec_1 AS
SELECT
niv_cod1 as code,
niv_lib1 as texte,
(select oid from rh.t_classes where code = 'PLAANANIV1') as classe_id
FROM prod_octime_niveau1
GROUP BY 1,2,3
;
INSERT INTO rh.t_classes_sections(code, texte, classe_id)
SELECT code, texte, classe_id
from w_clasec_1
where 1=1
and classe_id = (select oid from rh.t_classes where code = 'PLAANANIV1')
and code not in (select code from rh.t_classes_sections where t_classes_sections.classe_id = w_clasec_1.classe_id and code is not null)
group by 1,2,3
;
update rh.t_classes_sections set
texte = w_clasec_1.texte
FROM w_clasec_1
WHERE true
and w_clasec_1.classe_id = t_classes_sections.classe_id
and w_clasec_1.code = t_classes_sections.code
and w_clasec_1.texte is distinct from t_classes_sections.texte
;
-- Mise à jour du contenu des sections Niveau 1.
INSERT INTO rh.t_classes_sections_elements (section_id, to_id)
SELECT
t_classes_sections.oid AS section_id,
t_section_analytique.oid AS to_id
FROM rh.t_classes
join rh.t_classes_sections on t_classes_sections.classe_id = t_classes.oid
join rh.t_section_analytique on split_part(code_original, '|', 1) = t_classes_sections.code
WHERE t_classes.code = 'PLAANANIV1'
group by 1,2
;
-- Mise à jour des sections Niveau 2.
DROP TABLE IF EXISTS w_clasec_2
;
CREATE TEMP TABLE w_clasec_2 AS
with nb_niv as (
select
niv_cod2, count(DISTINCT niv_lib2) as niv_count
from prod_octime_niveau2
group by 1
)
SELECT
case when niv_count = 1 then niveau2.niv_cod2 else niveau2.niv_cod1 || '|' || niveau2.niv_cod2 end as code,
niveau2.niv_cod1 || '|' || niveau2.niv_cod2 as code_original,
niveau2.niv_lib2 as texte,
(select oid from rh.t_classes where code = 'PLAANANIV2') as classe_id
from prod_octime_niveau2 as niveau2
JOIN nb_niv ON nb_niv.niv_cod2 = niveau2.niv_cod2
group by 1,2,3
;
INSERT INTO rh.t_classes_sections(code, texte, classe_id)
SELECT code, texte, classe_id
from w_clasec_2
where 1=1
and classe_id = (select oid from rh.t_classes where code = 'PLAANANIV2')
and code not in (select code from rh.t_classes_sections where t_classes_sections.classe_id = w_clasec_2.classe_id and code is not null)
group by 1,2,3
;
update rh.t_classes_sections set
texte = w_clasec_2.texte
FROM w_clasec_2
WHERE true
and w_clasec_2.classe_id = t_classes_sections.classe_id
and w_clasec_2.code = t_classes_sections.code
and w_clasec_2.texte is distinct from t_classes_sections.texte
;
-- Mise à jour du contenu des sections Niveau 2.
INSERT INTO rh.t_classes_sections_elements (section_id, to_id)
SELECT
t_classes_sections.oid AS section_id,
t_section_analytique.oid AS to_id
FROM rh.t_classes
join rh.t_classes_sections on t_classes_sections.classe_id = t_classes.oid
join w_clasec_2 on true
and w_clasec_2.classe_id = t_classes.oid
and w_clasec_2.code = t_classes_sections.code
join rh.t_section_analytique on split_part(t_section_analytique.code_original, '|', 1)||'|'||split_part(t_section_analytique.code_original, '|', 2) = w_clasec_2.code_original
WHERE t_classes.code = 'PLAANANIV2'
group by 1,2
;
-- Mise à jour des sections Niveau 3.
DROP TABLE IF EXISTS w_clasec_3
;
CREATE TEMP TABLE w_clasec_3 AS
with nb_niv as (
select
niv_cod3, count(DISTINCT niv_lib3) as niv_count
from prod_octime_niveau3
group by 1
)
SELECT
case when niv_count = 1 then niveau3.niv_cod3 else niveau3.niv_cod1 || '|' || niveau3.niv_cod2|| '|' || niveau3.niv_cod3 end as code,
niveau3.niv_cod1 || '|' || niveau3.niv_cod2|| '|' || niveau3.niv_cod3 as code_original,
niveau3.niv_lib3 as texte,
(select oid from rh.t_classes where code = 'PLAANANIV3') as classe_id
from prod_octime_niveau3 as niveau3
JOIN nb_niv ON nb_niv.niv_cod3 = niveau3.niv_cod3
group by 1,2,3
;
INSERT INTO rh.t_classes_sections(code, texte, classe_id)
SELECT code, texte, classe_id
from w_clasec_3
where 1=1
and classe_id = (select oid from rh.t_classes where code = 'PLAANANIV3')
and code not in (select code from rh.t_classes_sections where t_classes_sections.classe_id = w_clasec_3.classe_id and code is not null)
group by 1,2,3
;
update rh.t_classes_sections set
texte = w_clasec_3.texte
FROM w_clasec_3
WHERE true
and w_clasec_3.classe_id = t_classes_sections.classe_id
and w_clasec_3.code = t_classes_sections.code
and w_clasec_3.texte is distinct from t_classes_sections.texte
;
-- Mise à jour du contenu des sections Niveau 3.
INSERT INTO rh.t_classes_sections_elements (section_id, to_id)
SELECT
t_classes_sections.oid AS section_id,
t_section_analytique.oid AS to_id
FROM rh.t_classes
join rh.t_classes_sections on t_classes_sections.classe_id = t_classes.oid
join w_clasec_3 on true
and w_clasec_3.classe_id = t_classes.oid
and w_clasec_3.code = t_classes_sections.code
join rh.t_section_analytique on
split_part(t_section_analytique.code_original, '|', 1)||'|'||
split_part(t_section_analytique.code_original, '|', 2)||'|'||
split_part(t_section_analytique.code_original, '|', 3) = w_clasec_3.code_original
WHERE t_classes.code = 'PLAANANIV3'
group by 1,2
;
-- Mise à jour des sections Niveau 4.
DROP TABLE IF EXISTS w_clasec_4
;
CREATE TEMP TABLE w_clasec_4 AS
with nb_niv as (
select
niv_cod4, count(DISTINCT niv_lib4) as niv_count
from prod_octime_niveau4
group by 1
)
SELECT
case when niv_count = 1 then niveau4.niv_cod4 else niveau4.niv_cod1 || '|' || niveau4.niv_cod2|| '|' || niveau4.niv_cod3|| '|' || niveau4.niv_cod4 end as code,
niveau4.niv_cod1 || '|' || niveau4.niv_cod2|| '|' || niveau4.niv_cod3|| '|' || niveau4.niv_cod4 as code_original,
niveau4.niv_lib4 as texte,
(select oid from rh.t_classes where code = 'PLAANANIV4') as classe_id
from prod_octime_niveau4 as niveau4
JOIN nb_niv ON nb_niv.niv_cod4 = niveau4.niv_cod4
group by 1,2,3
;
INSERT INTO rh.t_classes_sections(code, texte, classe_id)
SELECT code, texte, classe_id
from w_clasec_4
where 1=1
and classe_id = (select oid from rh.t_classes where code = 'PLAANANIV4')
and code not in (select code from rh.t_classes_sections where t_classes_sections.classe_id = w_clasec_4.classe_id and code is not null)
group by 1,2,3
;
update rh.t_classes_sections set
texte = w_clasec_4.texte
FROM w_clasec_4
WHERE true
and w_clasec_4.classe_id = t_classes_sections.classe_id
and w_clasec_4.code = t_classes_sections.code
and w_clasec_4.texte is distinct from t_classes_sections.texte
;
-- Mise à jour du contenu des sections Niveau 4.
INSERT INTO rh.t_classes_sections_elements (section_id, to_id)
SELECT
t_classes_sections.oid AS section_id,
t_section_analytique.oid AS to_id
FROM rh.t_classes
join rh.t_classes_sections on t_classes_sections.classe_id = t_classes.oid
join w_clasec_4 on true
and w_clasec_4.classe_id = t_classes.oid
and w_clasec_4.code = t_classes_sections.code
join rh.t_section_analytique on
split_part(t_section_analytique.code_original, '|', 1)||'|'||
split_part(t_section_analytique.code_original, '|', 2)||'|'||
split_part(t_section_analytique.code_original, '|', 3)||'|'||
split_part(t_section_analytique.code_original, '|', 4) = w_clasec_4.code_original
WHERE t_classes.code = 'PLAANANIV4'
group by 1,2
;
/**********************
* CLASSES d'ABSENCES *
**********************/
-- Mise à jour des sections Niveau 4.
DROP TABLE IF EXISTS w_clasec_4
;
CREATE TEMP TABLE w_clasec_4 AS
SELECT
abs_cod as code,
abs_cod as code_original,
abs_lib as texte,
(select oid from rh.t_classes where code = 'PLAANATABS') as classe_id
from prod_octime_absence as absence
group by 1,2,3
;
INSERT INTO rh.t_classes_sections(code, texte, classe_id)
SELECT code, texte, classe_id
from w_clasec_4
where 1=1
and classe_id = (select oid from rh.t_classes where code = 'PLAANATABS')
and code not in (select code from rh.t_classes_sections where t_classes_sections.classe_id = w_clasec_4.classe_id and code is not null)
group by 1,2,3
;
update rh.t_classes_sections set
texte = w_clasec_4.texte
FROM w_clasec_4
WHERE true
and w_clasec_4.classe_id = t_classes_sections.classe_id
and w_clasec_4.code = t_classes_sections.code
and w_clasec_4.texte is distinct from t_classes_sections.texte
;
-- Mise à jour du contenu des sections Niveau 4.
INSERT INTO rh.t_classes_sections_elements (section_id, to_id)
SELECT
t_classes_sections.oid AS section_id,
t_section_analytique.oid AS to_id
FROM rh.t_classes
join rh.t_classes_sections on t_classes_sections.classe_id = t_classes.oid
join w_clasec_4 on true
and w_clasec_4.classe_id = t_classes.oid
and w_clasec_4.code = t_classes_sections.code
join rh.t_section_analytique on split_part(t_section_analytique.code_original, '|', 4) = w_clasec_4.code_original
WHERE t_classes.code = 'PLAANATABS'
group by 1,2
;
SELECT rh.cti_update_schema_classes('*ALL')
;
]]></sqlcmd>
</NODE>
<NODE name="VENTILATION" label="Application sur le Plan 1">
<condition><![CDATA[
SELECT valeur = 1
FROM rh.t_divers
WHERE code = 'OCTIME_VENTILATION'
;
]]></condition>
<sqlcmd><![CDATA[
UPDATE rh.p_historique_paie
SET ventilation_1_id = subq.ventilation_id
FROM (
select
p_historique_paie.oid,
coalesce(ventilation_id, 0) as ventilation_id
from rh.p_historique_paie
left join w_ven_agg on 1=1
and w_ven_agg.salarie_id = p_historique_paie.salarie_id
and w_ven_agg.date_debut = p_historique_paie.date_debut
and w_ven_agg.date_fin = p_historique_paie.date_fin
group by 1,2) as subq
WHERE p_historique_paie.oid = subq.oid
;
]]></sqlcmd>
</NODE>
<NODE name="VENTILATION" label="Application sur le Plan 2">
<condition><![CDATA[
SELECT valeur = 2
FROM rh.t_divers
WHERE code = 'OCTIME_VENTILATION'
;
]]></condition>
<sqlcmd><![CDATA[
UPDATE rh.p_historique_paie
SET ventilation_2_id = subq.ventilation_id
FROM (
select
p_historique_paie.oid,
coalesce(ventilation_id, 0) as ventilation_id
from rh.p_historique_paie
left join w_ven_agg on 1=1
and w_ven_agg.salarie_id = p_historique_paie.salarie_id
and w_ven_agg.date_debut = p_historique_paie.date_debut
and w_ven_agg.date_fin = p_historique_paie.date_fin
where true
-- and salarie_id in (select oid from rh.p_salaries where matricule = '0605')
-- and mois_paie = 201710
group by 1,2) as subq
WHERE p_historique_paie.oid = subq.oid
;
]]></sqlcmd>
</NODE>
<NODE name="VENTILATION" label="Application sur le Plan 3">
<condition><![CDATA[
SELECT valeur = 3
FROM rh.t_divers
WHERE code = 'OCTIME_VENTILATION'
;
]]></condition>
<sqlcmd><![CDATA[
UPDATE rh.p_historique_paie
SET ventilation_3_id = subq.ventilation_id
FROM (
select
p_historique_paie.oid,
coalesce(ventilation_id, 0) as ventilation_id
from rh.p_historique_paie
left join w_ven_agg on 1=1
and w_ven_agg.salarie_id = p_historique_paie.salarie_id
and w_ven_agg.date_debut = p_historique_paie.date_debut
and w_ven_agg.date_fin = p_historique_paie.date_fin
group by 1,2) as subq
WHERE p_historique_paie.oid = subq.oid
;
]]></sqlcmd>
</NODE>
</NODE>
</ROOT>