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.
 
 
 

1805 lines
76 KiB

<?xml version="1.0" encoding="ISO-8859-1"?>
<ROOT>
<NODE name="INIT" type="common" />
<NODE name="PROD" label="Préparattion données">
<NODE label="Salariés">
<sqlcmd><![CDATA[
-- définition des personnes
DROP TABLE IF EXISTS prod_kelio_pers
;
CREATE TEMP TABLE prod_kelio_pers AS
SELECT
matricule_,
personne.*
FROM prod_kelio.salarie
JOIN prod_kelio.personne ON salarie.personne_ = personne.personne_
;
DROP TABLE IF EXISTS prod_kelio_absence
;
CREATE TEMP TABLE prod_kelio_absence AS
SELECT affectation_absence.*, libelle_,abrege_,calc_hspe_ as est_presence, mode_cumul_, ''::text AS salarie_corr
FROM prod_kelio.affectation_absence
LEFT JOIN prod_kelio.motif_calcul ON absence_motif_absence_ = motif_calcul_
WHERE absence_date_fin_ > '[ENV_PLANNING_DATEDEBUT]'::date
;
-- surcharge de types d'absence
UPDATE prod_kelio_absence
SET est_presence = CASE WHEN to_id IS NOT NULL THEN 1 ELSE 0 END
FROM rh.t_planning_type_absence
LEFT JOIN (
SELECT
to_id,
t_planning_type_absence.code
FROM rh.t_listes
JOIN rh.t_listes_contenu ON liste_id = t_listes.oid
JOIN rh.t_planning_type_absence ON to_id = t_planning_type_absence.oid
WHERE t_listes.code = 'CTI_ABS_TRAVAILLEES'
) sub ON sub.code = t_planning_type_absence.code
WHERE 1=1
AND abrege_ = t_planning_type_absence.code;
]]></sqlcmd>
</NODE>
<NODE label="Kelio type HP Metz">
<condition><![CDATA[
SELECT 1=1
FROM information_schema.columns
WHERE column_name = 'affectation_horaire_journalie_'
AND table_name = 'affectation_horaire_journalier'
AND table_schema = 'prod_kelio'
-- sans base, ventilation par population_salarie, utilisation de datamart pour absences et heures spéciales (pauses annulées)
;
]]></condition>
<NODE label="Préparation des affectation">
<sqlcmd><![CDATA[
-- Technique : reconstitution d'une table d'ajustement en partant des horaire et en modulant par la planification et les jours fériés pour obtenir le réalisé
DROP TABLE IF EXISTS prod_kelio_affectation_horaire_journalier
;
CREATE TEMP TABLE prod_kelio_affectation_horaire_journalier AS
SELECT affectation_horaire_journalier.*,
false AS plage_updated,
periode_travail.debut_/3600.0 AS debut_th,
periode_travail.fin_/3600.0 as fin_th,
(periode_travail.fin_-periode_travail.debut_)/3600.0 AS duree_th,
CASE WHEN periode_realise.debut_ IS NULL THEN periode_travail.debut_/3600.0 ELSE periode_realise.debut_/3600.0 END AS debut,
CASE WHEN periode_realise.fin_ IS NULL THEN periode_travail.fin_/3600.0 ELSE periode_realise.fin_/3600.0 END AS fin,
CASE WHEN periode_realise.debut_ IS NULL THEN (periode_travail.fin_-periode_travail.debut_)/3600.0 ELSE (periode_realise.fin_-periode_realise.debut_)/3600.0 END As duree,
COALESCE(-dh_4,0)/3600.0 AS pause_th,
COALESCE(h72_1,0)/3600.0 AS pause_deb_th,
COALESCE(dh_2,0)/3600.0 AS pause_fin_th,
0::numeric AS pause,
''::text AS salarie_corr
FROM prod_kelio.affectation_horaire_journalier
LEFT JOIN prod_kelio.periode_travail ON affectation_horaire_journalier.horaire_journalier_ = periode_travail.horaire_journalier_
LEFT JOIN prod_kelio.periode_travail periode_realise ON affectation_horaire_journalier.affectation_horaire_journalie_ = periode_realise.affectation_horaire_journalie_
LEFT JOIN prod_kelio.plage_horaire ON affectation_horaire_journalier.horaire_journalier_ = plage_horaire.horaire_journalier_
AND plage_horaire.dh_4 < 0
LEFT JOIN (
SELECT distinct date_application_ AS ferie FROM prod_kelio.jour_ferie) feries ON ferie = date_application_
LEFT JOIN prod_kelio.jour_ferie ON affectation_horaire_journalier.salarie_ = jour_ferie.salarie_
AND jour_ferie.date_application_ = affectation_horaire_journalier.date_application_
WHERE affectation_horaire_journalier.date_application_ > '2015-01-01'
AND (ferie IS NULL OR (ferie IS NOT NULL AND jour_travaille_ = 1))
-- AND (periode_realise.debut_ IS NULL OR (periode_realise.debut_ BETWEEN periode_travail.debut_ AND periode_travail.fin_
-- OR periode_travail.debut_ BETWEEN periode_realise.debut_ AND periode_realise.fin_
-- ))
;
-- cas 0 2 devient 2 ou 1 devient ou 2 devient 1
UPDATE prod_kelio_affectation_horaire_journalier to_update
SET
plage_updated = true,
debut = CASE WHEN to_update.debut_th = debut_th_max THEN 0 ELSE to_update.debut END,
fin = CASE WHEN to_update.debut_th = debut_th_max THEN 0 ELSE to_update.fin END,
duree = CASE WHEN to_update.debut_th = debut_th_max THEN 0 ELSE to_update.duree END,
debut_th = CASE WHEN to_update.debut = debut_max THEN 0 ELSE to_update.debut END,
fin_th = CASE WHEN to_update.debut = debut_max THEN 0 ELSE to_update.fin_th END,
duree_th = CASE WHEN to_update.debut = debut_max THEN 0 ELSE to_update.duree END
FROM (
SELECT
affectation_horaire_journalie_, debut, fin, MAX(debut_th) AS debut_th_max
FROM prod_kelio_affectation_horaire_journalier GROUP BY 1,2,3
HAVING count(*) > 1
) sub,
(
SELECT
affectation_horaire_journalie_, debut_th, fin_th, MAX(debut) AS debut_max
FROM prod_kelio_affectation_horaire_journalier GROUP BY 1,2,3
HAVING count(*) > 1
) sub2
WHERE
to_update.affectation_horaire_journalie_ = sub.affectation_horaire_journalie_
AND to_update.affectation_horaire_journalie_ = sub2.affectation_horaire_journalie_
;
-- cas 1 période th devient 2 rea
UPDATE prod_kelio_affectation_horaire_journalier
SET
debut_th = 0,
fin_th = 0,
duree_th = 0,
pause_th = 0,
pause_deb_th = 0,
pause_fin_th = 0
FROM (
SELECT
affectation_horaire_journalie_, debut_th, fin_th, MAX(debut) AS debut_max
FROM prod_kelio_affectation_horaire_journalier GROUP BY 1,2,3
HAVING count(*) > 1
) sub
WHERE
prod_kelio_affectation_horaire_journalier.affectation_horaire_journalie_ = sub.affectation_horaire_journalie_
AND debut_max = debut
AND plage_updated = false
;
-- cas 2 périodes th deviennent 1 rea
UPDATE prod_kelio_affectation_horaire_journalier
SET
debut = 0,
fin = 0,
duree = 0
FROM (
SELECT
affectation_horaire_journalie_, debut, fin, MAX(debut_th) AS debut_max
FROM prod_kelio_affectation_horaire_journalier GROUP BY 1,2,3
HAVING count(*) > 1
) sub
WHERE
prod_kelio_affectation_horaire_journalier.affectation_horaire_journalie_ = sub.affectation_horaire_journalie_
AND debut_max = debut_th
AND plage_updated = false
;
]]></sqlcmd>
</NODE>
<NODE label="Préparation des données">
<sqlcmd><![CDATA[
-- calcul pause reelle
UPDATE prod_kelio_affectation_horaire_journalier
SET
pause = CASE
WHEN pause_deb_th BETWEEN debut AND fin AND pause_deb_th + pause_th BETWEEN debut AND fin THEN pause_th
--WHEN pause_deb_th BETWEEN debut AND fin AND pause_deb_th + pause_th NOT BETWEEN debut AND fin THEN LEAST(pause_th,fin - pause_deb_th)
WHEN pause_fin_th BETWEEN debut AND fin AND pause_fin_th - pause_th BETWEEN debut AND fin THEN pause_th
--WHEN pause_fin_th BETWEEN debut AND fin AND pause_fin_th - pause_th NOT BETWEEN debut AND fin THEN LEAST(pause_th,pause_fin_th - debut)
ELSE 0 END
;
-- reconstitution de l'organigramme
DROP TABLE IF EXISTS prod_kelio_organigramme
;
CREATE TEMP TABLE prod_kelio_organigramme AS
SELECT
organigramme.organigramme_ AS service_,
organigramme.organigramme_ AS code_original,
COALESCE(code_, organigramme.organigramme_::text) AS codeNiv3,
organigramme.libelle_ AS libNiv3,
niv2.organigramme_ AS codeNiv2,
niv2.libelle_ AS libNiv2,
niv1.organigramme_ AS codeNiv1,
niv1.libelle_ AS libNiv1
FROM prod_kelio.organigramme
LEFT JOIN (SELECT service_, centre_de_charge_ FROM prod_kelio.activite_par_defaut GROUP BY 1,2) sub ON sub.service_ = organigramme_
JOIN prod_kelio.organigramme niv2 ON organigramme.parent_ = niv2.organigramme_
JOIN prod_kelio.organigramme niv1 ON niv2.parent_ = niv1.organigramme_
LEFT JOIN prod_kelio.motif_calcul ON motif_calcul.libelle_ = organigramme.libelle_
ORDER BY organigramme.organigramme_
;
;
-- affectation des salariés au service avec remplissage des trou et gestion des overlap sur une journée
-- affectation des salariés au service avec remplissage des trou et gestion des overlap sur une journée
DROP TABLE IF EXISTS w_histo_ser;
CREATE TEMP TABLE w_histo_ser AS
SELECT
salarie_,
debut_,
fin_,
0 AS heure_debut_periode_,
24 AS heure_fin_periode_,
service_,
''::text AS niv_cod1,
''::text AS niv_cod2,
''::text AS niv_cod3,
''::text AS niv_cod4,
''::text AS niv_cod5,
1 AS src
FROM prod_kelio.population_salarie
GROUP BY 1,2,3,4,5,6,7,8
;
UPDATE w_histo_ser
SET fin_ = w_histo_ser_ref.debut_ - '1 day'::interval
FROM w_histo_ser w_histo_ser_ref
WHERE w_histo_ser.salarie_ = w_histo_ser_ref.salarie_ AND w_histo_ser_ref.debut_ between w_histo_ser.debut_ AND w_histo_ser.fin_ AND
(w_histo_ser.debut_ != w_histo_ser_ref.debut_ OR w_histo_ser.fin_ != w_histo_ser_ref.fin_) AND
w_histo_ser.fin_ != w_histo_ser.debut_
;
DROP SEQUENCE IF EXISTS w_periode_seq
;
CREATE TEMP SEQUENCE w_periode_seq
;
DROP TABLE IF EXISTS w_histo_ser_overlap;
CREATE TEMP TABLE w_histo_ser_overlap AS
SELECT
affectation_activite.salarie_,
service_,
jour_ as debut_,
jour_ as fin_,
heure_debut_periode_ as heure_debut_periode_,
CASE WHEN heure_fin_periode_ = 0 THEN 24 ELSE heure_fin_periode_ END AS heure_fin_periode_
FROM prod_kelio.affectation_activite
JOIN prod_kelio.activite_par_defaut ON affectation_activite.centre_de_charge_ = activite_par_defaut.centre_de_charge_
WHERE heure_debut_periode_ != 0 AND affectation_activite.salarie_ != 0
;
-- insert overlap
INSERT INTO w_histo_ser (salarie_, debut_, fin_, heure_debut_periode_, heure_fin_periode_, service_, src)
SELECT
salarie_,
debut_,
fin_,
heure_debut_periode_,
heure_fin_periode_,
service_,
2
FROM w_histo_ser_overlap
;
-- ajout de la periodes supplementaires
INSERT INTO w_histo_ser (salarie_, debut_, fin_, heure_debut_periode_, heure_fin_periode_, service_, src)
SELECT
w_histo_ser.salarie_,
w_histo_ser.fin_ + CASE WHEN w_histo_ser.fin_ = 24 THEN interval '1 day' ELSE interval '0 day' END,
w_histo.fin_,
CASE WHEN MAX(w_histo_ser.fin_) = 24 THEN 0 ELSE MAX(w_histo_ser.heure_fin_periode_) END as heure_debut_periode_,
24 as heure_fin_periode_,
w_histo.service_,
3
FROM w_histo_ser
JOIN w_histo_ser w_histo ON
w_histo.salarie_ = w_histo_ser.salarie_ AND
w_histo_ser.src != 1 AND
w_histo.src = 1 AND
w_histo_ser.debut_ BETWEEN w_histo.debut_ AND w_histo.fin_
--and w_histo_ser.salarie_ = 4181
GROUP BY 1,2,3,5,6,7
;
-- maj des dates de fin si overlap
UPDATE w_histo_ser
SET
fin_ = next_day - CASE WHEN next_hour = 0 THEN interval '1 day' ELSE interval '0 day' END,
heure_fin_periode_ = CASE WHEN next_hour = 0 THEN 24 ELSE next_hour END
FROM (
SELECT
salarie_ AS sal,
debut_ AS deb,
fin_ AS fin,
service_ AS ser,
lead(heure_debut_periode_) OVER (PARTITION BY salarie_ ORDER BY debut_, heure_debut_periode_) as next_hour,
lead(debut_) OVER (PARTITION BY salarie_ ORDER BY debut_, heure_debut_periode_) as next_day
FROM w_histo_ser
) sub
WHERE
salarie_ = sal AND
src = 3 AND
debut_ = deb AND
fin_ = fin AND
service_ = ser AND
next_day IS NOT NULL;
DELETE FROM w_histo_ser
USING w_histo_ser ref
WHERE 1=1 AND
w_histo_ser.salarie_ = ref.salarie_ AND
w_histo_ser.src = 3 AND
ref.src != 3 AND
w_histo_ser.debut_ = ref.debut_ AND
w_histo_ser.fin_ = ref.fin_
;
-- maj des dates de fin d'origin
UPDATE w_histo_ser
SET
fin_ = next_day - CASE WHEN next_hour = 0 THEN interval '1 day' ELSE interval '0 day' END,
heure_fin_periode_ = CASE WHEN next_hour = 0 THEN 24 ELSE next_hour-1 END
FROM (
SELECT
salarie_ AS sal,
debut_ AS deb,
fin_ AS fin,
service_ AS ser,
lead(heure_debut_periode_) OVER (PARTITION BY salarie_ ORDER BY debut_, fin_) as next_hour,
lead(debut_) OVER (PARTITION BY salarie_ ORDER BY debut_, fin_) as next_day
FROM w_histo_ser
) sub
WHERE
salarie_ = sal AND
src = 1 AND
debut_ = deb AND
(fin_ = fin OR (fin_ IS NULL AND fin IS NULL)) AND
service_ = ser AND
heure_debut_periode_ = 0 AND
next_day IS NOT NULL;
--UPDATE w_histo_ser SET src = 1;
-- insertion de prets
INSERT INTO w_histo_ser (salarie_, debut_, fin_, heure_debut_periode_, heure_fin_periode_, service_, src)
SELECT
salarie_,
debut_pret_,
fin_pret_,
0 as heure_debut_periode_,
24 as heure_fin_periode_,
service_,
4
FROM prod_kelio.pret_salarie
;
DELETE FROM w_histo_ser
USING w_histo_ser ref
WHERE 1=1 AND
w_histo_ser.salarie_ = ref.salarie_ AND
w_histo_ser.src != 4 AND
ref.src = 4 AND
w_histo_ser.debut_ between ref.debut_ AND ref.fin_ AND
w_histo_ser.fin_ between ref.debut_ AND ref.fin_
;
-- ajout de la periodes supplementaires
INSERT INTO w_histo_ser (salarie_, debut_, fin_, heure_debut_periode_, heure_fin_periode_, service_, src)
SELECT
w_histo_ser.salarie_,
w_histo_ser.fin_ + interval '1 day',
w_histo.fin_,
0 as heure_debut_periode_,
24 as heure_fin_periode_,
w_histo.service_,
5
FROM w_histo_ser
JOIN w_histo_ser w_histo ON
w_histo.salarie_ = w_histo_ser.salarie_ AND
w_histo_ser.src = 4 AND
w_histo.src != 4 AND
w_histo_ser.fin_ BETWEEN w_histo.debut_ AND w_histo.fin_ AND
w_histo_ser.fin_ + interval '1 day' < w_histo.fin_
GROUP BY 1,2,3,5,6,7
;
-- maj des dates de fin si overlap
UPDATE w_histo_ser
SET
fin_ = next - interval '1 day'
FROM (
SELECT
salarie_ AS sal,
debut_ AS deb,
fin_ AS fin,
service_ AS ser,
lead(debut_) OVER (PARTITION BY salarie_ ORDER BY debut_, fin_) as next
FROM w_histo_ser
) sub
WHERE
salarie_ = sal AND
src = 5 AND
debut_ = deb AND
fin_ = fin AND
service_ = ser AND
heure_debut_periode_ = 0 AND
next IS NOT NULL;
DELETE FROM w_histo_ser
USING w_histo_ser ref
WHERE 1=1 AND
w_histo_ser.salarie_ = ref.salarie_ AND
w_histo_ser.src = 5 AND
ref.src != 5 AND
(w_histo_ser.debut_ = ref.debut_ AND
w_histo_ser.fin_ = ref.fin_)
;
-- maj des dates de fin si overlap
UPDATE w_histo_ser
SET
fin_ = next_day - CASE WHEN next_hour = 0 THEN interval '1 day' ELSE interval '0 day' END,
heure_fin_periode_ = CASE WHEN next_hour = 0 THEN 24 ELSE next_hour END
FROM (
SELECT
salarie_ AS sal,
debut_ AS deb,
fin_ AS fin,
service_ AS ser,
lead(heure_debut_periode_) OVER (PARTITION BY salarie_ ORDER BY debut_, heure_debut_periode_) as next_hour,
lead(debut_) OVER (PARTITION BY salarie_ ORDER BY debut_, heure_debut_periode_) as next_day
FROM w_histo_ser
order by debut_ desc
) sub
WHERE
salarie_ = sal AND
debut_ = deb AND
fin_ = fin AND
service_ = ser AND
next_day IS NOT NULL;
DELETE FROM w_histo_ser
USING w_histo_ser ref
WHERE 1=1 AND
w_histo_ser.salarie_ = ref.salarie_ AND
w_histo_ser.src = 5 AND
ref.src != 5 AND
w_histo_ser.debut_ = ref.debut_ AND
w_histo_ser.fin_ = ref.fin_
;
DELETE FROM w_histo_ser
WHERE 1=1 AND
w_histo_ser.src = 5 AND
fin_ < debut_
;
]]></sqlcmd>
</NODE>
<NODE label="Constitution planning">
<sqlcmd><![CDATA[
-- Maintenance table temporaire prod_kelio_affectation_horaire_journalier.
VACUUM ANALYSE prod_kelio_affectation_horaire_journalier
;
CREATE INDEX prod_kelio_affectation_horaire_journalier_ik_salarie_ ON prod_kelio_affectation_horaire_journalier USING btree (salarie_)
;
-- Alimenter le champ prod_kelio_affectation_horaire_journalier.salarie_corr. cas avec SHS
UPDATE prod_kelio_affectation_horaire_journalier SET
salarie_corr = matricule_
FROM prod_kelio_pers
WHERE prod_kelio_pers.personne_ = prod_kelio_affectation_horaire_journalier.salarie_
;
UPDATE prod_kelio_absence SET
salarie_corr = matricule_
FROM prod_kelio_pers
WHERE prod_kelio_pers.personne_ = prod_kelio_absence.salarie_
;
--UPDATE prod_kelio_affectation_horaire_journalier
-- SET
-- debut = periode_travail.debut_/3600.0,
-- fin = periode_travail.fin_/3600.0,
-- duree = (periode_travail.fin_-periode_travail.debut_)/3600.0
--FROM prod_kelio.periode_travail
--WHERE periode_travail.affectation_horaire_journalie_ = prod_kelio_affectation_horaire_journalier.affectation_horaire_journalie_
--AND (
--prod_kelio_affectation_horaire_journalier.debut BETWEEN periode_travail.debut_/3600.0 AND periode_travail.fin_/3600.0
-- OR periode_travail.debut_/3600.0 BETWEEN prod_kelio_affectation_horaire_journalier.debut AND prod_kelio_affectation_horaire_journalier.fin
-- )
-- AND periodes_redefinies_ = 1;
--
--UPDATE prod_kelio_affectation_horaire_journalier
--SET
-- debut = 0,
-- fin = 0,
-- duree = 0
--FROM (
-- SELECT
-- affectation_horaire_journalie_, debut, fin, MAX(debut_th) AS debut_max
-- FROM prod_kelio_affectation_horaire_journalier GROUP BY 1,2,3
-- HAVING count(*) > 1
-- ) sub
--WHERE
-- prod_kelio_affectation_horaire_journalier.affectation_horaire_journalie_ = sub.affectation_horaire_journalie_
-- AND debut_max = debut_th
--;
-- 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.matricule,
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,
right(t_etablissements.code,3) as etablissement_planning_code,
''::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 gestor 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
WHERE 1=1
AND salarie_fusionne_id = 0
GROUP BY 1,2,3,4,5,6,7,8,9
ORDER BY 1,2,3
;
-- Alimenter le champ w_sal_pla.salarie_corr.
UPDATE w_sal_pla SET
salarie_corr = matricule;
-- Création d'index.
CREATE INDEX w_sal_pla_i_matricule ON w_sal_pla USING btree (matricule)
;
DROP SEQUENCE IF EXISTS w_affectation_horaire_journalier_seq
;
CREATE TEMP SEQUENCE w_affectation_horaire_journalier_seq
;
DROP TABLE IF EXISTS w_affectation_horaire_journalier
;
-- consitution des compteurs heures travaillées en ommetant les pauses
CREATE TEMP TABLE w_affectation_horaire_journalier AS
SELECT
nextval('w_affectation_horaire_journalier_seq') as affectation_horaire_journalier_id,
prod_kelio_affectation_horaire_journalier.salarie_corr,
null::bigint AS salarie_id,
null::bigint AS contrat_id,
null::bigint AS contrat_mois_id,
date(date_application_) AS date,
debut,
fin,
debut_th,
fin_th,
pause_th,
pause_deb_th,
pause_fin_th,
codeNiv1 || '|' || codeNiv2 || '|' || prod_kelio_organigramme.service_ AS niveaux_code_original,
codeNiv1 || '|' || codeNiv2 || '|' || prod_kelio_organigramme.service_ AS service_code_original,
libNiv2 AS entets_code,
''::text AS abs_cod,
CASE
WHEN heure_debut_periode_ = 0 THEN duree_th - pause_th
WHEN heure_debut_periode_ < fin_th THEN fin_th - heure_debut_periode_ - pause_th
ELSE duree_th - pause_th END AS temps_du_initial,
CASE
WHEN heure_debut_periode_ = 0 THEN duree - pause
WHEN heure_debut_periode_ < fin THEN fin - heure_debut_periode_ - pause
ELSE duree - pause END
AS temps_du,
CASE
--WHEN theorique_applique_ = 1 AND heure_debut_periode_ = 0 THEN temps_theorique_/3600.0 - pause_th-- cas simple
--WHEN theorique_applique_ = 1 AND heure_debut_periode_ < fin THEN fin_th- heure_debut_periode_/3600.0 - pause_th-- re affectation
WHEN periodes_redefinies_ = 0 AND heure_debut_periode_ = 0 THEN duree_th - pause_th -- redefinition
WHEN periodes_redefinies_ = 0 AND heure_debut_periode_ < fin_th THEN fin_th- heure_debut_periode_/3600.0 - pause_th-- redefinition et reaff
WHEN periodes_redefinies_ = 1 AND heure_debut_periode_ = 0 THEN duree - pause-- redefinition
WHEN periodes_redefinies_ = 1 AND heure_debut_periode_ < fin THEN fin- heure_debut_periode_/3600.0 - pause-- redefinition et reaff
ELSE duree - pause END
AS temps_valide,
0::numeric AS temps_absence
FROM prod_kelio_affectation_horaire_journalier
LEFT JOIN w_histo_ser ON w_histo_ser.salarie_ = prod_kelio_affectation_horaire_journalier.salarie_ AND date_application_ BETWEEN w_histo_ser.debut_ AND w_histo_ser.fin_
LEFT JOIN prod_kelio_organigramme ON prod_kelio_organigramme.service_ = w_histo_ser.service_
;
-- absence en jours
UPDATE w_affectation_horaire_journalier
SET
abs_cod = abrege_,
temps_absence = temps_valide * (CASE WHEN absence_date_debut_ = date THEN absence_commence_matin_ ELSE 1 END + CASE WHEN absence_date_fin_ = date THEN absence_termine_ap_midi_ ELSE 1 END) / 2,
temps_valide = temps_valide - temps_valide * (CASE WHEN absence_date_debut_ = date THEN absence_commence_matin_ ELSE 1 END + CASE WHEN absence_date_fin_ = date THEN absence_termine_ap_midi_ ELSE 1 END) / 2
FROM
prod_kelio_absence
WHERE 1=1 AND
prod_kelio_absence.salarie_corr = w_affectation_horaire_journalier.salarie_corr AND
date BETWEEN absence_date_debut_ AND CASE WHEN absence_date_fin_ IS NOT NULL THEN absence_date_fin_ ELSE absence_date_debut_ + (absence_nbre_jours_abs_ || 'days')::interval END AND
absence_heure_fin1_ = 0 AND absence_duree_abs_heures_ = 0 AND mode_cumul_ < 2 AND abrege_ != 'CA' AND
temps_valide != 0 AND est_presence = 0
;
-- maj des jours d'absence avec présence
UPDATE w_affectation_horaire_journalier
SET
abs_cod = abrege_
FROM
prod_kelio_absence
WHERE 1=1 AND
prod_kelio_absence.salarie_corr = w_affectation_horaire_journalier.salarie_corr AND
date BETWEEN absence_date_debut_ AND CASE WHEN absence_date_fin_ IS NOT NULL THEN absence_date_fin_ ELSE absence_date_debut_ + (absence_nbre_jours_abs_ || 'days')::interval END AND
absence_heure_fin1_ = 0 AND absence_duree_abs_heures_ = 0 AND mode_cumul_ = 2 AND
temps_valide != 0 AND est_presence = 1
;
-- suppression des hoarires travaillés restants correspondant aux absences en jours
DELETE FROM w_affectation_horaire_journalier
USING
prod_kelio_absence
WHERE 1=1 AND
prod_kelio_absence.salarie_corr = w_affectation_horaire_journalier.salarie_corr AND
date BETWEEN absence_date_debut_ AND CASE WHEN absence_date_fin_ IS NOT NULL THEN absence_date_fin_ ELSE absence_date_debut_ + (absence_nbre_jours_abs_ || 'days')::interval END AND
absence_heure_fin1_ = 0 AND absence_duree_abs_heures_ = 0 AND (mode_cumul_ = 2 OR abrege_ = 'CA') AND
temps_valide != 0 AND est_presence = 0
;
--nettoyage des horaires vides
DELETE FROM w_affectation_horaire_journalier
WHERE 1=1 AND
COALESCE(temps_du,0) = 0 AND
COALESCE(temps_du_initial,0) = 0 AND
COALESCE(temps_valide,0) = 0 AND
COALESCE(temps_absence,0) = 0 ;
-- absences en heures
DROP TABLE IF EXISTS w_abs_h;
CREATE TEMP TABLE w_abs_h AS
SELECT
affectation_horaire_journalier_id,
abrege_,
libelle_,
absence_duree_abs_heures_, -- pause_th AS absence_duree_abs_heures_,
absence_heure_deb1_,
absence_heure_deb2_,
absence_heure_fin1_,
absence_heure_fin2_,
pause_deb_th,
pause_fin_th,
SUM(temps_valide) OVER (PARTITION BY prod_kelio_absence.salarie_corr,date ORDER by date,absence_heure_deb1_,affectation_horaire_journalier_id) as somme,
CASE
WHEN heure_debut_periode_ = 0 OR heure_debut_periode_ IS NULL THEN
CASE
WHEN absence_heure_deb1_ != 0 THEN (least(absence_heure_fin2_,fin*3600) - absence_heure_deb2_)/3600.0 + (least(absence_heure_fin1_,fin*3600) - absence_heure_deb1_)/3600.0
- CASE WHEN (pause_deb_th IS NOT NULL AND ((pause_fin_th > absence_heure_deb1_/3600.0 AND pause_deb_th < absence_heure_fin1_/3600.0)
OR (pause_fin_th > absence_heure_deb2_/3600.0 AND pause_deb_th < absence_heure_fin2_/3600.0)))
AND absence_heure_deb1_ < fin_th
AND rank() OVER (PARTITION BY prod_kelio_absence.salarie_corr,date,abrege_,absence_heure_deb1_ ORDER by date,absence_heure_deb1_,affectation_horaire_journalier_id) = 1 THEN pause_th ELSE 0 END
WHEN absence_duree_abs_heures_ > 0 THEN absence_duree_abs_heures_
ELSE 0 END
ELSE
CASE
WHEN absence_heure_deb1_ != 0 THEN
CASE WHEN heure_debut_periode_ < absence_heure_fin1_ THEN (least(absence_heure_fin1_,fin*3600) - absence_heure_deb1_)/3600.0 ELSE 0 END
+ CASE WHEN heure_debut_periode_ < absence_heure_fin2_ AND heure_debut_periode_ > absence_heure_fin1_ THEN (least(absence_heure_fin2_,fin*3600) - absence_heure_deb2_)/3600.0 ELSE 0 END
- CASE WHEN (pause_deb_th IS NOT NULL AND ((pause_fin_th > absence_heure_deb1_/3600.0 AND pause_deb_th < absence_heure_fin1_/3600.0) OR (pause_fin_th > absence_heure_deb2_/3600.0
AND pause_deb_th < absence_heure_fin2_/3600.0))) AND absence_heure_deb1_ < fin_th
AND rank() OVER (PARTITION BY prod_kelio_absence.salarie_corr,date,abrege_,absence_heure_deb1_ ORDER by date,absence_heure_deb1_,affectation_horaire_journalier_id) = 1
THEN pause_th ELSE 0 END
WHEN absence_duree_abs_heures_ > 0 THEN absence_duree_abs_heures_ -- répartition tres tres tres basique et dangeureuse si plusieurs plages horaires
ELSE 0 END
END
+ temps_valide - SUM(temps_valide) OVER (PARTITION BY prod_kelio_absence.salarie_corr,date,abrege_,absence_heure_deb1_ ORDER by date,absence_heure_deb1_,affectation_horaire_journalier_id) as restant,
est_presence
FROM prod_kelio_absence
JOIN w_affectation_horaire_journalier ON w_affectation_horaire_journalier.salarie_corr = prod_kelio_absence.salarie_corr
AND date BETWEEN absence_date_debut_ AND
CASE WHEN absence_date_fin_ IS NOT NULL THEN absence_date_fin_ ELSE absence_date_debut_ + (absence_nbre_jours_abs_ || 'days')::interval END
AND ((absence_heure_fin1_/3600.0 > debut AND absence_heure_deb1_/3600.0< fin) OR (absence_heure_fin2_/3600.0 > debut AND absence_heure_deb2_/3600.0< fin))
LEFT JOIN w_histo_ser ON w_histo_ser.salarie_ = prod_kelio_absence.salarie_ AND date BETWEEN w_histo_ser.debut_ and w_histo_ser.fin_
LEFT JOIN prod_kelio_organigramme ON prod_kelio_organigramme.service_ = w_histo_ser.service_
WHERE NOT(absence_heure_fin1_ = 0 AND absence_duree_abs_heures_ = 0) --OR (absence_commence_matin_ + absence_termine_ap_midi_) != 2
;
--modification des horaires travaillés par les absences en heures
UPDATE w_affectation_horaire_journalier
SET
temps_du = temps_du - LEAST(temps_du,restant),
temps_valide = temps_valide - LEAST(temps_valide,restant)
FROM
(SELECT
affectation_horaire_journalier_id,
SUM(restant) AS restant
FROM w_abs_h
GROUP BY 1
HAVING COUNT(*) = 1
) w_abs_h
WHERE
w_affectation_horaire_journalier.affectation_horaire_journalier_id = w_abs_h.affectation_horaire_journalier_id
--and est_presence = 0
;
UPDATE w_affectation_horaire_journalier
SET
temps_du = temps_du - LEAST(temps_du,restant),
temps_valide = temps_valide - LEAST(temps_valide,restant)
FROM
(SELECT
affectation_horaire_journalier_id,
SUM(restant) AS restant
FROM w_abs_h
GROUP BY 1
HAVING COUNT(*) > 1
) w_abs_h
WHERE
w_affectation_horaire_journalier.affectation_horaire_journalier_id = w_abs_h.affectation_horaire_journalier_id
--and est_presence = 0
;
--modification des horaires travaillés par les absences en heures
-- UPDATE w_affectation_horaire_journalier
-- SET
-- abs_code = abrege_,
-- temps_du = GREATEST(temps_du,restant),
-- temps_valide = temps_valide - GREATEST(temps_valide,restant)
-- FROM
-- w_abs_h
-- WHERE
-- w_affectation_horaire_journalier.affectation_horaire_journalier_id = w_abs_h.affectation_horaire_journalier_id
-- AND est_presence = 1 and mode_cumul_ = 2
-- ;
-- insetion des absences en heures celles sans horaire
INSERT INTO w_affectation_horaire_journalier
SELECT
nextval('w_affectation_horaire_journalier_seq') as affectation_horaire_journalier_id,
prod_kelio_absence.salarie_corr,
null::bigint AS salarie_id,
null::bigint AS contrat_id,
null::bigint AS contrat_mois_id,
COALESCE(date(date_application_), p_calendrier.date) AS date,
debut,
fin,
debut_th,
fin_th,
pause_th,
pause_deb_th,
pause_fin_th,
codeNiv1 || '|' || codeNiv2 || '|' || prod_kelio_organigramme.service_ AS niveaux_code_original,
codeNiv1 || '|' || codeNiv2 || '|' || prod_kelio_organigramme.service_ AS service_code_original,
libNiv2 AS entets_code,
abrege_ AS abs_cod,
0 AS temps_du_initial,
CASE
WHEN heure_debut_periode_ = 0 OR heure_debut_periode_ IS NULL THEN
CASE
WHEN absence_heure_deb1_ != 0 THEN (absence_heure_fin2_ - absence_heure_deb2_)/3600.0 + (absence_heure_fin1_ - absence_heure_deb1_)/3600.0
- CASE WHEN (pause_deb_th IS NOT NULL AND ((pause_fin_th > absence_heure_deb1_/3600.0 AND pause_deb_th < absence_heure_fin1_/3600.0) OR (pause_fin_th > absence_heure_deb2_/3600.0 AND pause_deb_th < absence_heure_fin2_/3600.0))) THEN pause_th ELSE 0 END
WHEN absence_duree_abs_heures_ > 0 THEN absence_duree_abs_heures_
ELSE duree_th - pause_th END
ELSE
CASE
WHEN absence_heure_deb1_ != 0 THEN
CASE WHEN heure_debut_periode_ < absence_heure_fin1_ THEN (absence_heure_fin1_ - absence_heure_deb1_)/3600.0 ELSE 0 END
+ CASE WHEN heure_debut_periode_ < absence_heure_fin2_ AND heure_debut_periode_ > absence_heure_fin1_ THEN (absence_heure_fin2_ - absence_heure_deb2_)/3600.0 ELSE 0 END
- CASE WHEN (pause_deb_th IS NOT NULL AND ((pause_fin_th > absence_heure_deb1_/3600.0 AND pause_deb_th < absence_heure_fin1_/3600.0) OR (pause_fin_th > absence_heure_deb2_/3600.0 AND pause_deb_th < absence_heure_fin2_/3600.0))) THEN pause_th ELSE 0 END
WHEN absence_duree_abs_heures_ > 0 THEN absence_duree_abs_heures_ -- répartition tres tres tres basique et dangeureuse
ELSE heure_fin_periode_ - heure_debut_periode_ END
END AS temps_du,
CASE WHEN est_presence = 1 THEN CASE
WHEN heure_debut_periode_ = 0 OR heure_debut_periode_ IS NULL THEN
CASE
WHEN absence_heure_deb1_ != 0 THEN (absence_heure_fin2_ - absence_heure_deb2_)/3600.0 + (absence_heure_fin1_ - absence_heure_deb1_)/3600.0
- CASE WHEN (pause_deb_th IS NOT NULL AND ((pause_fin_th > absence_heure_deb1_/3600.0 AND pause_deb_th < absence_heure_fin1_/3600.0) OR (pause_fin_th > absence_heure_deb2_/3600.0 AND pause_deb_th < absence_heure_fin2_/3600.0))) THEN pause_th ELSE 0 END
WHEN absence_duree_abs_heures_ > 0 THEN absence_duree_abs_heures_
ELSE duree_th END
ELSE
CASE
WHEN absence_heure_deb1_ != 0 THEN
CASE WHEN heure_debut_periode_ < absence_heure_fin1_ THEN (absence_heure_fin1_ - absence_heure_deb1_)/3600.0 ELSE 0 END
+ CASE WHEN heure_debut_periode_ < absence_heure_fin2_ AND heure_debut_periode_ > absence_heure_fin1_ THEN (absence_heure_fin2_ - absence_heure_deb2_)/3600.0 ELSE 0 END
- CASE WHEN (pause_deb_th IS NOT NULL AND ((pause_fin_th > absence_heure_deb1_/3600.0 AND pause_deb_th < absence_heure_fin1_/3600.0) OR (pause_fin_th > absence_heure_deb2_/3600.0 AND pause_deb_th < absence_heure_fin2_/3600.0))) THEN pause_th ELSE 0 END
WHEN absence_duree_abs_heures_ > 0 THEN absence_duree_abs_heures_ -- répartition tres tres tres basique et dangeureuse
ELSE heure_fin_periode_ - heure_debut_periode_ END
END ELSE 0 END AS temps_valide,
CASE WHEN est_presence = 0 THEN CASE
WHEN heure_debut_periode_ = 0 OR heure_debut_periode_ IS NULL THEN
CASE
WHEN absence_heure_deb1_ != 0 THEN (absence_heure_fin2_ - absence_heure_deb2_)/3600.0 + (absence_heure_fin1_ - absence_heure_deb1_)/3600.0
- CASE WHEN (pause_deb_th IS NOT NULL AND ((pause_fin_th > absence_heure_deb1_/3600.0 AND pause_deb_th < absence_heure_fin1_/3600.0) OR (pause_fin_th > absence_heure_deb2_/3600.0 AND pause_deb_th < absence_heure_fin2_/3600.0))) THEN pause_th ELSE 0 END
WHEN absence_duree_abs_heures_ > 0 THEN absence_duree_abs_heures_
ELSE duree_th END
ELSE
CASE
WHEN absence_heure_deb1_ != 0 THEN
CASE WHEN heure_debut_periode_ < absence_heure_fin1_ THEN (absence_heure_fin1_ - absence_heure_deb1_)/3600.0 ELSE 0 END
+ CASE WHEN heure_debut_periode_ < absence_heure_fin2_ AND heure_debut_periode_ > absence_heure_fin1_ THEN (absence_heure_fin2_ - absence_heure_deb2_)/3600.0 ELSE 0 END
- CASE WHEN (pause_deb_th IS NOT NULL AND ((pause_fin_th > absence_heure_deb1_/3600.0 AND pause_deb_th < absence_heure_fin1_/3600.0) OR (pause_fin_th > absence_heure_deb2_/3600.0 AND pause_deb_th < absence_heure_fin2_/3600.0))) THEN pause_th ELSE 0 END
WHEN absence_duree_abs_heures_ > 0 THEN absence_duree_abs_heures_ -- répartition tres tres tres basique et dangeureuse
ELSE heure_fin_periode_ - heure_debut_periode_ END
END ELSE 0 END
AS temps_absence
FROM prod_kelio_absence
JOIN base.p_calendrier ON p_calendrier.date BETWEEN absence_date_debut_ AND
CASE WHEN absence_date_fin_ IS NOT NULL THEN absence_date_fin_ ELSE absence_date_debut_ + (absence_nbre_jours_abs_ || 'days')::interval END
LEFT JOIN prod_kelio_affectation_horaire_journalier ON prod_kelio_affectation_horaire_journalier.salarie_ = prod_kelio_absence.salarie_
AND prod_kelio_affectation_horaire_journalier.date_application_ BETWEEN absence_date_debut_ AND
CASE WHEN absence_date_fin_ IS NOT NULL THEN absence_date_fin_ ELSE absence_date_debut_ + (absence_nbre_jours_abs_ || 'days')::interval END
AND ((absence_heure_fin1_ > 0 AND (absence_heure_fin1_/3600.0 > debut AND absence_heure_deb1_/3600.0< fin))
OR (absence_heure_fin2_ > 0 AND (absence_heure_fin2_/3600.0 > debut AND absence_heure_deb2_/3600.0< fin)))
LEFT JOIN w_histo_ser ON w_histo_ser.salarie_ = prod_kelio_absence.salarie_ AND COALESCE(date_application_,p_calendrier.date) BETWEEN w_histo_ser.debut_ and w_histo_ser.fin_
LEFT JOIN prod_kelio_organigramme ON prod_kelio_organigramme.service_ = w_histo_ser.service_
WHERE mode_cumul_ < 2 AND NOT(absence_heure_fin1_ = 0 AND absence_duree_abs_heures_ = 0) -- prise en charge au niveau du jour
;
-- absence sans affectation d'horaire en jours ou sans code d'absence dans Kelio
INSERT INTO w_affectation_horaire_journalier
SELECT
nextval('w_affectation_horaire_journalier_seq') as affectation_horaire_journalier_id,
employee_identification_number,
null::bigint AS salarie_id,
null::bigint AS contrat_id,
null::bigint AS contrat_mois_id,
COALESCE(w_affectation_horaire_journalier.date, total_date) AS date,
debut,
fin,
debut_th,
fin_th,
pause_th,
pause_deb_th,
pause_fin_th,
codeNiv1 || '|' || codeNiv2 || '|' || prod_kelio_organigramme.service_ AS niveaux_code_original,
codeNiv1 || '|' || codeNiv2 || '|' || prod_kelio_organigramme.service_ AS service_code_original,
libNiv2 AS entets_code,
abs_type_abbreviation AS abs_cod,
0 AS temps_du_initial,
hours AS temps_du,
CASE WHEN COALESCE(est_presence,0) = 1 THEN hours ELSE 0 END AS temps_valide,
CASE WHEN COALESCE(est_presence,0) != 1 THEN hours ELSE 0 END AS temps_absence
FROM prod_keliod.estimated_daily_absence
LEFT JOIN w_affectation_horaire_journalier ON
total_date = date
AND w_affectation_horaire_journalier.salarie_corr = employee_identification_number
--LEFT JOIN prod_kelio_organigramme ON prod_kelio_organigramme.service_ = estimated_daily_absence.section_key
LEFT JOIN w_histo_ser ON w_histo_ser.salarie_ = employee_key AND total_date BETWEEN w_histo_ser.debut_ and w_histo_ser.fin_
LEFT JOIN prod_kelio_organigramme ON prod_kelio_organigramme.service_ = w_histo_ser.service_
LEFT JOIN (
SELECT CASE WHEN to_id IS NOT NULL THEN 1 ELSE 0 END AS est_presence, t_planning_type_absence.code FROM
rh.t_listes JOIN rh.t_listes_contenu ON liste_id = t_listes.oid
JOIN rh.t_planning_type_absence ON to_id = t_planning_type_absence.oid
WHERE
t_listes.code = 'CTI_ABS_TRAVAILLEES'
) sub ON sub.code = abs_type_abbreviation
WHERE (w_affectation_horaire_journalier.date IS NULL OR COALESCE(abs_cod, '') != abs_type_abbreviation)
AND (TOTAL_DATE != ALL (ARRAY(SELECT DISTINCT date_application_ FROM prod_kelio.jour_ferie)::date[]) OR est_presence = 1)
;
--INSERT INTO w_affectation_horaire_journalier
--SELECT
-- nextval('w_affectation_horaire_journalier_seq') as affectation_horaire_journalier_id,
-- prod_kelio_absence.salarie_corr,
-- null::bigint AS salarie_id,
-- null::bigint AS contrat_id,
-- null::bigint AS contrat_mois_id,
-- COALESCE(w_affectation_horaire_journalier.date, p_calendrier.date) AS date,
-- debut,
-- fin,
-- debut_th,
-- fin_th,
-- pause_th,
-- pause_deb_th,
-- pause_fin_th,
-- codeNiv1 || '|' || codeNiv2 || '|' || prod_kelio_organigramme.service_ AS niveaux_code_original,
-- codeNiv1 || '|' || codeNiv2 || '|' || prod_kelio_organigramme.service_ AS service_code_original,
-- libNiv2 AS entets_code,
-- abrege_ AS abs_cod,
-- (tx_temps / 100.0) * (CASE
-- WHEN mode_cumul_ < 2 AND nb_jour_ouvre = 1 THEN base_horaire_ / (5 * 3600.0)
-- WHEN mode_cumul_ = 2 THEN base_horaire_ / (7 * 3600.0)
-- ELSE 0 END) AS temps_du_initial,
-- (tx_temps / 100.0) * (CASE
-- WHEN mode_cumul_ < 2 AND nb_jour_ouvre = 1 THEN base_horaire_ / (5 * 3600.0)
-- WHEN mode_cumul_ = 2 THEN base_horaire_ / (7 * 3600.0)
-- ELSE 0 END) AS temps_du,
-- 0 AS temps_valide,
-- (tx_temps / 100.0) * (CASE
-- WHEN mode_cumul_ < 2 AND nb_jour_ouvre = 1 THEN base_horaire_ / (5 * 3600.0)
-- WHEN mode_cumul_ = 2 THEN base_horaire_ / (7 * 3600.0)
-- ELSE 0 END) AS temps_absence
-- FROM prod_kelio_absence
-- JOIN base.p_calendrier ON p_calendrier.date BETWEEN absence_date_debut_ AND
-- CASE WHEN absence_date_fin_ IS NOT NULL THEN absence_date_fin_ ELSE absence_date_debut_ + (absence_nbre_jours_abs_ || 'days')::interval END
-- JOIN base.v_calendrier_indicateurs_1 ON v_calendrier_indicateurs_1.date = p_calendrier.date
-- LEFT JOIN w_affectation_horaire_journalier ON
-- CASE WHEN mode_cumul_ = 2 THEN p_calendrier.date = w_affectation_horaire_journalier.date
-- ELSE w_affectation_horaire_journalier.date BETWEEN absence_date_debut_ AND
-- CASE WHEN absence_date_fin_ IS NOT NULL THEN absence_date_fin_ ELSE absence_date_debut_ + (absence_nbre_jours_abs_ || 'days')::interval END
-- END
-- AND w_affectation_horaire_journalier.salarie_corr = prod_kelio_absence.salarie_corr
-- LEFT JOIN w_histo_ser ON w_histo_ser.salarie_ = prod_kelio_absence.salarie_ AND p_calendrier.date BETWEEN w_histo_ser.debut_ and w_histo_ser.fin_
-- LEFT JOIN prod_kelio_organigramme ON prod_kelio_organigramme.service_ = w_histo_ser.service_
-- JOIN prod_kelio.affectation_duree_travail ON salarie_g_t_p_ = prod_kelio_absence.salarie_ and p_calendrier.date BETWEEN affectation_duree_travail.date_debut_ AND COALESCE(affectation_duree_travail.date_fin_,'2099-12-31')
-- LEFT JOIN prod_keliod.SCHEDULE_ASSIGNMENT ON employee_identification_number = prod_kelio_absence.salarie_corr
-- AND p_calendrier.date BETWEEN assignment_date and assignment_end_date
-- LEFT JOIN (
-- SELECT
-- schedule_abbreviation AS tx_code,
-- replace(split_part(regexp_replace(regexp_replace(schedule_description,'[^0-9\.%]','','g'),'[0-9\.]*%([0-9\.]*)%$','\1'),'%',1),'..','')::numeric AS tx_temps
-- FROM
-- prod_keliod.SCHEDULE_ASSIGNMENT GROUP BY 1,2) sub ON tx_code = schedule_abbreviation
-- WHERE absence_heure_fin1_ = 0 AND absence_duree_abs_heures_ = 0 AND w_affectation_horaire_journalier.date IS NULL AND mode_cumul_ < 2
--
--;
--
--INSERT INTO w_affectation_horaire_journalier
--SELECT
-- nextval('w_affectation_horaire_journalier_seq') as affectation_horaire_journalier_id,
-- prod_kelio_absence.salarie_corr,
-- null::bigint AS salarie_id,
-- null::bigint AS contrat_id,
-- null::bigint AS contrat_mois_id,
-- p_calendrier.date AS date,
-- 0 AS debut,
-- 0 AS fin,
-- 0 AS debut_th,
-- 0 AS fin_th,
-- 0 AS pause_th,
-- 0 AS pause_deb_th,
-- 0 AS pause_fin_th,
-- codeNiv1 || '|' || codeNiv2 || '|' || prod_kelio_organigramme.service_ AS niveaux_code_original,
-- codeNiv1 || '|' || codeNiv2 || '|' || prod_kelio_organigramme.service_ AS service_code_original,
-- libNiv2 AS entets_code,
-- abrege_ AS abs_cod,
-- (tx_temps / 100.0) * (CASE
-- WHEN mode_cumul_ < 2 AND nb_jour_ouvre = 1 THEN base_horaire_ / (5 * 3600.0)
-- WHEN mode_cumul_ = 2 THEN base_horaire_ / (7 * 3600.0)
-- ELSE 0 END) AS temps_du_initial,
-- (tx_temps / 100.0) * (CASE
-- WHEN mode_cumul_ < 2 AND nb_jour_ouvre = 1 THEN base_horaire_ / (5 * 3600.0)
-- WHEN mode_cumul_ = 2 THEN base_horaire_ / (7 * 3600.0)
-- ELSE 0 END) AS temps_du,
-- 0 AS temps_valide,
-- (tx_temps / 100.0) * (CASE
-- WHEN mode_cumul_ < 2 AND nb_jour_ouvre = 1 THEN base_horaire_ / (5 * 3600.0)
-- WHEN mode_cumul_ = 2 THEN base_horaire_ / (7 * 3600.0)
-- ELSE 0 END) AS temps_absence
-- FROM prod_kelio_absence
-- JOIN base.p_calendrier ON p_calendrier.date BETWEEN absence_date_debut_ AND
-- CASE WHEN absence_date_fin_ IS NOT NULL THEN absence_date_fin_ ELSE absence_date_debut_ + (absence_nbre_jours_abs_ || 'days')::interval END
-- JOIN base.v_calendrier_indicateurs_1 ON v_calendrier_indicateurs_1.date = p_calendrier.date
-- LEFT JOIN w_histo_ser ON w_histo_ser.salarie_ = prod_kelio_absence.salarie_ AND p_calendrier.date BETWEEN w_histo_ser.debut_ and w_histo_ser.fin_
-- LEFT JOIN prod_kelio_organigramme ON prod_kelio_organigramme.service_ = w_histo_ser.service_
-- JOIN prod_kelio.affectation_duree_travail ON salarie_g_t_p_ = prod_kelio_absence.salarie_ and p_calendrier.date BETWEEN affectation_duree_travail.date_debut_ AND COALESCE(affectation_duree_travail.date_fin_,'2099-12-31')
-- LEFT JOIN prod_keliod.SCHEDULE_ASSIGNMENT ON employee_identification_number = prod_kelio_absence.salarie_corr
-- AND p_calendrier.date BETWEEN assignment_date and assignment_end_date
-- LEFT JOIN (
-- SELECT
-- schedule_abbreviation AS tx_code,
-- replace(split_part(regexp_replace(regexp_replace(schedule_description,'[^0-9\.%]','','g'),'[0-9\.]*%([0-9\.]*)%$','\1'),'%',1),'..','')::numeric AS tx_temps
-- FROM
-- prod_keliod.SCHEDULE_ASSIGNMENT GROUP BY 1,2) sub ON tx_code = schedule_abbreviation
-- WHERE absence_heure_fin1_ = 0 AND absence_duree_abs_heures_ = 0 AND mode_cumul_ = 2
;
-- ajout des heures spéciales (pour l'instant heures de pause annulées)
INSERT INTO w_affectation_horaire_journalier
SELECT
nextval('w_affectation_horaire_journalier_seq') as affectation_horaire_journalier_id,
employee_identification_number,
null::bigint AS salarie_id,
null::bigint AS contrat_id,
null::bigint AS contrat_mois_id,
total_date AS date,
0,
0,
0,
0,
0,
0,
0,
codeNiv1 || '|' || codeNiv2 || '|' || prod_kelio_organigramme.service_ AS niveaux_code_original,
codeNiv1 || '|' || codeNiv2 || '|' || prod_kelio_organigramme.service_ AS service_code_original,
libNiv2 AS entets_code,
special_hour_type_abbreviation AS abs_cod,
0 AS temps_du_initial,
hours AS temps_du,
hours AS temps_valide,
0 AS temps_absence
FROM prod_keliod.ESTIMATED_DAILY_SPEC_HOUR
--LEFT JOIN prod_kelio_organigramme ON prod_kelio_organigramme.code_original = ESTIMATED_DAILY_SPEC_HOUR.section_key
LEFT JOIN w_histo_ser ON w_histo_ser.salarie_ = employee_key AND total_date BETWEEN w_histo_ser.debut_ and w_histo_ser.fin_
LEFT JOIN prod_kelio_organigramme ON prod_kelio_organigramme.service_ = w_histo_ser.service_
WHERE
special_hour_type_abbreviation = 'NBHPA'
;
-- Ajout des jours d'absence "blanc" (pas de theorique ni de temps d'absence; typiquement les jours fériés; permet de compter correctement le nombre de jours d'absence).
INSERT INTO w_affectation_horaire_journalier
SELECT
nextval('w_affectation_horaire_journalier_seq') as affectation_horaire_journalier_id,
prod_kelio_absence.salarie_corr as employee_identification_number,
null::bigint AS salarie_id,
null::bigint AS contrat_id,
null::bigint AS contrat_mois_id,
cal.date AS date,
0,
0,
0,
0,
0,
0,
0,
codeNiv1 || '|' || codeNiv2 || '|' || prod_kelio_organigramme.service_ AS niveaux_code_original,
codeNiv1 || '|' || codeNiv2 || '|' || prod_kelio_organigramme.service_ AS service_code_original,
libNiv2 AS entets_code,
abrege_ AS abs_cod,
0 AS temps_du_initial,
0 AS temps_du,
0 AS temps_valide,
0 AS temps_absence
from prod_kelio_absence
join base.p_calendrier as cal on cal.date between prod_kelio_absence.absence_date_debut_ and prod_kelio_absence.absence_date_fin_
left join w_affectation_horaire_journalier on true
and w_affectation_horaire_journalier.salarie_corr = prod_kelio_absence.salarie_corr
and w_affectation_horaire_journalier.date = cal.date
LEFT JOIN w_histo_ser ON w_histo_ser.salarie_ = prod_kelio_absence.salarie_ AND cal.date BETWEEN w_histo_ser.debut_ and w_histo_ser.fin_
LEFT JOIN prod_kelio_organigramme ON prod_kelio_organigramme.service_ = w_histo_ser.service_
where true
and w_affectation_horaire_journalier.date is null
;
DROP TABLE IF EXISTS w_ser;
CREATE TEMP TABLE w_ser AS
SELECT
codeNiv1 || '|' || codeNiv2 || '|' || code_original AS service_code_original,
codeNiv1,
codeNiv2,
codeNiv3,
libNiv1 as niv_cod1,
libNiv2 AS niv_cod2,
codeniv3 AS niv_cod3,
libNiv1 || '-' || libNiv2 || '-' || libniv3 AS texte,
libNiv1 || '-' || libNiv2 || '-' || libniv3 AS texte_court
FROM
prod_kelio_organigramme
;
INSERT INTO rh.t_planning_type_absence(code_original, code, texte, texte_court)
SELECT
special_hour_type_key,
special_hour_type_abbreviation,
special_hour_type_description,
substr(special_hour_type_description,1,50)
FROM prod_keliod.ESTIMATED_DAILY_SPEC_HOUR
WHERE 1=1
AND special_hour_type_abbreviation IN (SELECT abs_cod FROM w_affectation_horaire_journalier)
AND special_hour_type_key NOT IN (SELECT code_original FROM rh.t_planning_type_absence WHERE code_original IS NOT NULL)
GROUP BY 1,2,3,4
;
]]></sqlcmd>
</NODE>
</NODE>
<NODE label="Kelio type Gaston metivet">
<condition><![CDATA[
SELECT 1=1
FROM information_schema.tables
WHERE table_name = 'horaire_journalier_base'
AND table_schema = 'prod_kelio'
-- avec base, ventilation par activite et table resulats utilisable pour indicateurs
;
]]></condition>
<NODE label="Préparation des affectation">
<sqlcmd><![CDATA[
-- Technique : reconstitution d'une table d'ajustement en partant des horaire et en modulant par la planification et les jours fériés pour obtenir le réalisé
DROP TABLE IF EXISTS prod_kelio_affectation_horaire_journalier
;
CREATE TEMP TABLE prod_kelio_affectation_horaire_journalier AS
SELECT
resultats_,
periode_travail.horaire_journalier_,
calcule_horairehoraire_journal,
date_ as date_application_,
resultats.salarie_,
false AS plage_updated,
periode_travail.debut_/3600.0 AS debut_th,
periode_travail.fin_/3600.0 as fin_th,
(periode_travail.fin_-periode_travail.debut_)/3600.0 AS duree_th,
0 as debut,--periode_realise.debut_/3600.0 AS debut,
0 as fin,--periode_realise.fin_/3600.0 AS fin,
0 as duree,--(periode_realise.fin_-periode_realise.debut_)/3600.0 As duree,
COALESCE(-dh_3,0)/3600.0 AS pause_th,
COALESCE(h72_1,0)/3600.0 AS pause_deb_th,
COALESCE(dh_2,0)/3600.0 AS pause_fin_th,
ferie,
jour_travaille_,
''::text AS salarie_corr
FROM prod_kelio.resultats
LEFT JOIN prod_kelio.periode_travail ON calcule_horairehor_jour_prevu = periode_travail.horaire_journalier_
--LEFT JOIN prod_kelio.periode_travail periode_realise ON calcule_horairehoraire_journal = periode_realise.horaire_journalier_
LEFT JOIN prod_kelio.plage_horaire ON calcule_horairehor_jour_prevu = plage_horaire.horaire_journalier_
AND plage_horaire.dh_3 < 0
AND groupe_ = 1
LEFT JOIN (
SELECT distinct date_application_ AS ferie FROM prod_kelio.jour_ferie) feries ON ferie = date_
LEFT JOIN prod_kelio.jour_ferie ON resultats.salarie_ = jour_ferie.salarie_
AND jour_ferie.date_application_ = resultats.date_
WHERE 1=1
AND type_calcul_ = 2
AND date_ > '2015-01-01'
--AND (ferie IS NULL OR (ferie IS NOT NULL AND jour_travaille_ = 1))
-- AND (periode_realise.debut_ IS NULL OR (periode_realise.debut_ BETWEEN periode_travail.debut_ AND periode_travail.fin_
-- OR periode_travail.debut_ BETWEEN periode_realise.debut_ AND periode_realise.fin_
-- ))
;
UPDATE prod_kelio_affectation_horaire_journalier
SET
debut_th = 9,
fin_th = 17,
duree_th = 8,
pause_th = 1,
pause_deb_th = 12,
pause_fin_th = 13
WHERE
horaire_journalier_ = 35
;
UPDATE prod_kelio_affectation_horaire_journalier
SET
debut = 9,
fin = 17,
duree = 8
WHERE
calcule_horairehoraire_journal = 35
;
]]></sqlcmd>
</NODE>
<NODE label="Préparation des données">
<sqlcmd><![CDATA[
-- Alimenter le champ prod_kelio_affectation_horaire_journalier.salarie_corr. cas avec SHS
UPDATE prod_kelio_affectation_horaire_journalier SET
salarie_corr = matricule_
FROM prod_kelio_pers
WHERE prod_kelio_pers.personne_ = prod_kelio_affectation_horaire_journalier.salarie_
;
-- reconstitution de l'organigramme
DROP TABLE IF EXISTS prod_kelio_organigramme
;
CREATE TEMP TABLE prod_kelio_organigramme AS
SELECT
organigramme.organigramme_ AS service_,
organigramme.organigramme_ AS code_original,
COALESCE(code_, organigramme.organigramme_::text) AS codeNiv3,
organigramme.libelle_ AS libNiv3,
niv2.organigramme_ AS codeNiv2,
niv2.libelle_ AS libNiv2,
niv1.organigramme_ AS codeNiv1,
niv1.libelle_ AS libNiv1
FROM prod_kelio.organigramme
LEFT JOIN (SELECT service_, centre_de_charge_ FROM prod_kelio.activite_par_defaut GROUP BY 1,2) sub ON sub.service_ = organigramme_
JOIN prod_kelio.organigramme niv2 ON organigramme.parent_ = niv2.organigramme_
JOIN prod_kelio.organigramme niv1 ON niv2.parent_ = niv1.organigramme_
LEFT JOIN prod_kelio.motif_calcul ON motif_calcul.libelle_ = organigramme.libelle_
ORDER BY organigramme.organigramme_
;
DROP TABLE IF EXISTS w_histo_ser;
CREATE TEMP TABLE w_histo_ser AS
SELECT
salarie_,
date_debut_::date as debut_,
(CASE WHEN date_fin_ = '0' THEN '2099-12-31' ELSE date_fin_ END)::date as fin_,
0 AS heure_debut_periode_,
24 AS heure_fin_periode_,
activite_ as service_,
''::text AS niv_cod1,
''::text AS niv_cod2,
''::text AS niv_cod3,
''::text AS niv_cod4,
''::text AS niv_cod5,
1 AS src
FROM prod_kelio.activite_par_defaut
GROUP BY 1,2,3,4,5,6,7
;
-- maj des dates de fin si overlap
UPDATE w_histo_ser
SET fin_ = w_histo_ser_ref.debut_::date - '1 day'::interval
FROM w_histo_ser w_histo_ser_ref
WHERE w_histo_ser.salarie_ = w_histo_ser_ref.salarie_ AND w_histo_ser_ref.debut_ between w_histo_ser.debut_ AND w_histo_ser.fin_ AND
(w_histo_ser.debut_ != w_histo_ser_ref.debut_ OR w_histo_ser.fin_ != w_histo_ser_ref.fin_) AND
w_histo_ser.fin_ != w_histo_ser.debut_
;
-- ajout de la periodes supplementaires
INSERT INTO w_histo_ser (salarie_, debut_, fin_, heure_debut_periode_, heure_fin_periode_, service_, src)
SELECT
affectation_activite.salarie_,
affectation_activite.jour_::date,
affectation_activite.jour_::date,
0 as heure_debut_periode_,
24 as heure_fin_periode_,
affectation_activite.activite_,
2 as src
FROM prod_kelio.affectation_activite
JOIN w_histo_ser ON
affectation_activite.salarie_ = w_histo_ser.salarie_ AND
affectation_activite.jour_ BETWEEN w_histo_ser.debut_ AND w_histo_ser.fin_
--and w_histo_ser.salarie_ = 4181
GROUP BY 1,2,3,5,6,7
;
UPDATE w_histo_ser
SET
fin_ = next_day::date - CASE WHEN next_hour = 0 THEN interval '1 day' ELSE interval '0 day' END,
heure_fin_periode_ = CASE WHEN next_hour = 0 THEN 24 ELSE next_hour END
FROM (
SELECT
salarie_ AS sal,
debut_ AS deb,
fin_ AS fin,
service_ AS ser,
lead(heure_debut_periode_) OVER (PARTITION BY salarie_ ORDER BY debut_, heure_debut_periode_) as next_hour,
lead(debut_) OVER (PARTITION BY salarie_ ORDER BY debut_, heure_debut_periode_) as next_day
FROM w_histo_ser
) sub
WHERE
salarie_ = sal AND
debut_ = deb AND
fin_ = fin AND
service_ = ser AND
next_day IS NOT NULL;
-- ajout de la periodes supplementaires
INSERT INTO w_histo_ser (salarie_, debut_, fin_, heure_debut_periode_, heure_fin_periode_, service_, src)
SELECT
w_histo_ser.salarie_,
w_histo_ser.fin_ + interval '1 day',
w_histo.fin_,
0 as heure_debut_periode_,
24 as heure_fin_periode_,
w_histo.service_,
3
FROM w_histo_ser
JOIN w_histo_ser w_histo ON
w_histo.salarie_ = w_histo_ser.salarie_ AND
w_histo_ser.src = 2 AND
w_histo.src != 2 AND
w_histo_ser.fin_ BETWEEN w_histo.debut_ AND w_histo.fin_
GROUP BY 1,2,3,5,6,7
;
-- maj des dates de fin si overlap
UPDATE w_histo_ser
SET
fin_ = next - interval '1 day'
FROM (
SELECT
salarie_ AS sal,
debut_ AS deb,
fin_ AS fin,
service_ AS ser,
lead(debut_) OVER (PARTITION BY salarie_ ORDER BY debut_, fin_) as next
FROM w_histo_ser
) sub
WHERE
salarie_ = sal AND
src = 1 AND
debut_ = deb AND
fin_ = fin AND
service_ = ser AND
heure_debut_periode_ = 0 AND
next IS NOT NULL;
-- reconstitution de l'organigramme
DROP TABLE IF EXISTS prod_kelio_organigramme
;
CREATE TEMP TABLE prod_kelio_organigramme AS
SELECT
service_,
service_ AS code_original,
code_ AS codeNiv3,
'' AS libNiv3,
'' AS codeNiv2,
'' AS libNiv2,
'' AS codeNiv1,
libelle_ AS libNiv1
FROM w_histo_ser
LEFT JOIN prod_kelio.motif_calcul ON motif_calcul.motif_calcul_ = w_histo_ser.service_
GROUP BY 1,2,3,4,5,6,7,8
ORDER BY code_
;
]]></sqlcmd>
</NODE>
<NODE label="Constitution planning">
<sqlcmd><![CDATA[
-- Maintenance table temporaire prod_kelio_affectation_horaire_journalier.
VACUUM ANALYSE prod_kelio_affectation_horaire_journalier
;
CREATE INDEX prod_kelio_affectation_horaire_journalier_ik_salarie_ ON prod_kelio_affectation_horaire_journalier USING btree (salarie_)
;
UPDATE prod_kelio_absence SET
salarie_corr = matricule_
FROM prod_kelio_pers
WHERE prod_kelio_pers.personne_ = prod_kelio_absence.salarie_
;
-- 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.matricule,
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,
right(t_etablissements.code,3) as etablissement_planning_code,
''::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 gestor 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
WHERE 1=1
AND salarie_fusionne_id = 0
GROUP BY 1,2,3,4,5,6,7,8,9
ORDER BY 1,2,3
;
-- Alimenter le champ w_sal_pla.salarie_corr.
UPDATE w_sal_pla SET
salarie_corr = matricule;
-- Création d'index.
CREATE INDEX w_sal_pla_i_matricule ON w_sal_pla USING btree (matricule)
;
DROP SEQUENCE IF EXISTS w_affectation_horaire_journalier_seq
;
CREATE TEMP SEQUENCE w_affectation_horaire_journalier_seq
;
DROP TABLE IF EXISTS w_affectation_horaire_journalier
;
-- consitution des compteurs heures travaillées en ommetant les pauses
CREATE TEMP TABLE w_affectation_horaire_journalier AS
SELECT
nextval('w_affectation_horaire_journalier_seq') as affectation_horaire_journalier_id,
prod_kelio_affectation_horaire_journalier.salarie_corr,
null::bigint AS salarie_id,
null::bigint AS contrat_id,
null::bigint AS contrat_mois_id,
date(date_application_) AS date,
debut,
fin,
debut_th,
fin_th,
pause_th,
pause_deb_th,
pause_fin_th,
codeNiv1 || '|' || codeNiv2 || '|' || prod_kelio_organigramme.service_ AS niveaux_code_original,
codeNiv1 || '|' || codeNiv2 || '|' || prod_kelio_organigramme.service_ AS service_code_original,
libNiv2 AS entets_code,
''::text AS motif_,
''::text AS abs_cod,
duree_th - pause_th AS temps_du_initial,
CASE
WHEN 1=1 or horaire_journalier_ != 35 THEN heures_jour_/3600.0
--WHEN heure_debut_periode_ = 0 THEN duree - pause_th
--WHEN heure_debut_periode_ < fin_ THEN fin - heure_debut_periode_ - pause_th
ELSE duree - pause_th END
AS temps_du,
duree - pause_th AS temps_valide,
CALCULE_ACTIVITE.heures_jour_/3600.0 as temps_effectif,
0::numeric as temps_absences,
0::numeric AS temps_absence,
ferie,
jour_travaille_
FROM prod_kelio_affectation_horaire_journalier
LEFT JOIN prod_kelio.CALCULE_ACTIVITE ON prod_kelio_affectation_horaire_journalier.resultats_ = CALCULE_ACTIVITE.resultats_
LEFT JOIN prod_kelio_organigramme ON prod_kelio_organigramme.service_ = CALCULE_ACTIVITE.motif_
;
-- insetion des absences en heures celles sans horaire
INSERT INTO w_affectation_horaire_journalier
SELECT
nextval('w_affectation_horaire_journalier_seq') as affectation_horaire_journalier_id,
prod_kelio_affectation_horaire_journalier.salarie_corr,
null::bigint AS salarie_id,
null::bigint AS contrat_id,
null::bigint AS contrat_mois_id,
date(date_application_) AS date,
debut,
fin,
debut_th,
fin_th,
pause_th,
pause_deb_th,
pause_fin_th,
codeNiv1 || '|' || codeNiv2 || '|' || prod_kelio_organigramme.service_ AS niveaux_code_original,
codeNiv1 || '|' || codeNiv2 || '|' || prod_kelio_organigramme.service_ AS service_code_original,
libNiv2 AS entets_code,
''::text AS motif_,
abrege_ AS abs_cod,
0 AS temps_du_initial,
heures_jour_/3600.0 AS temps_du,
0 AS temps_valide,
0 AS temps_effectif,
heures_jour_/3600.0 AS temps_absences,
0,
0,
0
FROM prod_kelio_affectation_horaire_journalier
JOIN prod_kelio.CALCULE_ABSENCE ON prod_kelio_affectation_horaire_journalier.resultats_ = CALCULE_ABSENCE.resultats_ AND heures_jour_ != 0 AND heures_jour_ IS NOT NULL
LEFT JOIN prod_kelio.motif_calcul ON motif_ = motif_calcul_
LEFT JOIN w_histo_ser ON w_histo_ser.salarie_ = prod_kelio_affectation_horaire_journalier.salarie_ AND date_application_ BETWEEN w_histo_ser.debut_ AND w_histo_ser.fin_
LEFT JOIN prod_kelio_organigramme ON prod_kelio_organigramme.service_ = w_histo_ser.service_
WHERE heures_jour_ IS NOT NULL
;
DROP TABLE IF EXISTS w_ser;
CREATE TEMP TABLE w_ser AS
SELECT
codeNiv1 || '|' || codeNiv2 || '|' || code_original AS service_code_original,
codeNiv1,
codeNiv2,
codeNiv3,
libNiv1 as niv_cod1,
libNiv2 AS niv_cod2,
codeniv3 AS niv_cod3,
libNiv1 || '-' || libNiv2 || '-' || libniv3 AS texte,
left(libNiv1,15) || '-' || left(libNiv2,15) || '-' || left(libniv3,15) AS texte_court
FROM
prod_kelio_organigramme
;
]]></sqlcmd>
</NODE>
</NODE>
<NODE label="Préparation de l'insertion">
<sqlcmd><![CDATA[
UPDATE w_affectation_horaire_journalier
SET
salarie_id = w_sal_pla.salarie_id
FROM
w_sal_pla
WHERE 1=1
AND UPPER(w_sal_pla.salarie_corr) = UPPER(w_affectation_horaire_journalier.salarie_corr)
-- désactivé pour test
-- AND entets_code = etablissement_planning_code
;
VACUUM ANALYSE w_affectation_horaire_journalier
;
-- 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
affectation_horaire_journalier_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_affectation_horaire_journalier
join rh.p_contrats_mois on 1=1
and p_contrats_mois.salarie_id = w_affectation_horaire_journalier.salarie_id
and w_affectation_horaire_journalier.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_affectation_horaire_journalier.contrat_id is null
OR w_affectation_horaire_journalier.contrat_mois_id is null
group by 1)
UPDATE w_affectation_horaire_journalier SET
contrat_id = w_asso.contrat_id,
contrat_mois_id = w_asso.contrat_mois_id
FROM w_asso
WHERE w_affectation_horaire_journalier.affectation_horaire_journalier_id = w_asso.affectation_horaire_journalier_id
;
with w_asso as (
select
affectation_horaire_journalier_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_affectation_horaire_journalier
join rh.p_contrats_mois on 1=1
and p_contrats_mois.salarie_id = w_affectation_horaire_journalier.salarie_id
and p_contrats_mois.date_debut > w_affectation_horaire_journalier.date -- Sélection des contrats APRES heures planning.
where 1!=1
OR w_affectation_horaire_journalier.contrat_id is null
OR w_affectation_horaire_journalier.contrat_mois_id is null
group by 1)
UPDATE w_affectation_horaire_journalier SET
contrat_id = w_asso.contrat_id,
contrat_mois_id = w_asso.contrat_mois_id
FROM w_asso
WHERE w_affectation_horaire_journalier.affectation_horaire_journalier_id = w_asso.affectation_horaire_journalier_id
;
with w_asso as (
select
affectation_horaire_journalier_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_affectation_horaire_journalier
join rh.p_contrats_mois on 1=1
and p_contrats_mois.salarie_id = w_affectation_horaire_journalier.salarie_id
and p_contrats_mois.date_debut < w_affectation_horaire_journalier.date -- Sélection des contrats AVANT heures planning.
where 1!=1
OR w_affectation_horaire_journalier.contrat_id is null
OR w_affectation_horaire_journalier.contrat_mois_id is null
group by 1)
UPDATE w_affectation_horaire_journalier SET
contrat_id = w_asso.contrat_id,
contrat_mois_id = w_asso.contrat_mois_id
FROM w_asso
WHERE w_affectation_horaire_journalier.affectation_horaire_journalier_id = w_asso.affectation_horaire_journalier_id
;
-- Création d'index.
CREATE INDEX w_affectation_horaire_journalier_i_contrat_id ON w_affectation_horaire_journalier USING btree (contrat_id)
;
CREATE INDEX w_affectation_horaire_journalier_i_contrat_mois_id ON w_affectation_horaire_journalier USING btree (contrat_mois_id)
;
CREATE INDEX w_affectation_horaire_journalier_i_date ON w_affectation_horaire_journalier USING btree (date)
;
CREATE INDEX w_affectation_horaire_journalier_i_salarie_id ON w_affectation_horaire_journalier USING btree (salarie_id)
;
-- Màj des niveauxx du Planning.
INSERT INTO rh.t_planning_niveau(code_original, code, texte, texte_court)
SELECT
service_code_original,
service_code_original,
texte,
texte_court
FROM w_ser
WHERE service_code_original NOT IN (SELECT code_original FROM rh.t_planning_niveau WHERE code_original IS NOT NULL)
GROUP BY 1,2,3,4
;
-- 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)
SELECT
service_code_original,
service_code_original,
texte,
texte_court,
0 as service_id
FROM w_ser
WHERE 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 Types d'absences du Planning.
INSERT INTO rh.t_planning_type_absence(code_original, code, texte, texte_court)
SELECT
absence_motif_absence_,
abrege_,
libelle_,
substr(libelle_,1,50)
FROM prod_kelio_absence AS absence
WHERE 1=1
AND abrege_ IN (SELECT abs_cod FROM w_affectation_horaire_journalier)
AND absence_motif_absence_ NOT IN (SELECT code_original FROM rh.t_planning_type_absence WHERE code_original IS NOT NULL)
GROUP BY 1,2,3,4
;
-- Création d'une table Entreprise/Etablissement.
DROP TABLE IF EXISTS w_entets
;
CREATE TEMP TABLE w_entets AS -- manque SSI, DG et HAD à reventiler correctement
select
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
;
-- suppression du planning si employé parti
DELETE FROM w_affectation_horaire_journalier
USING rh.p_salaries
WHERE p_salaries.oid = salarie_id
AND date > date_sortie_ets
;
]]></sqlcmd>
</NODE>
<NODE label="Insertion de mouvements (Metz)">
<condition><![CDATA[
SELECT 1=1
FROM information_schema.columns
WHERE column_name = 'affectation_horaire_journalie_'
AND table_name = 'affectation_horaire_journalier'
AND table_schema = 'prod_kelio'
-- sans base, ventilation par population_salarie, utilisation de datamart pour absences et heures spéciales (pauses annulées)
;
]]></condition>
<sqlcmd><![CDATA[
-- Transcodage service (à tort sur niveau 2) => établissement.
UPDATE w_affectation_horaire_journalier SET
entets_code = 'HSB'
WHERE entets_code in ('DG', 'HAD', 'SSIAB')
;
-- 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,
temps_du,
temps_du_initial,
temps_valide,
temps_absence)
SELECT
salarie_id,
contrat_id,
contrat_mois_id,
date,
to_char(w_affectation_horaire_journalier.date, 'IYYYIW'::text)::numeric AS semaine,
to_char(w_affectation_horaire_journalier.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,
CASE WHEN date < now() THEN temps_du ELSE 0 END,
temps_du_initial::numeric,
CASE WHEN date < now() THEN temps_valide ELSE 0 END,
CASE WHEN date < now() THEN temps_absence ELSE 0 END
FROM w_affectation_horaire_journalier
LEFT JOIN rh.t_planning_niveau ON t_planning_niveau.code_original = w_affectation_horaire_journalier.niveaux_code_original
LEFT JOIN rh.t_planning_service ON t_planning_service.code_original = w_affectation_horaire_journalier.service_code_original
LEFT JOIN rh.t_planning_qualification ON t_planning_qualification.code_original = 0
LEFT JOIN rh.t_planning_type_absence ON t_planning_type_absence.code = w_affectation_horaire_journalier.abs_cod
LEFT JOIN w_entets ON w_entets.entets_code = w_affectation_horaire_journalier.entets_code
WHERE salarie_id IS NOT NULL
;
]]></sqlcmd>
</NODE>
<NODE label="Insertion de mouvements (Metivet)">
<condition><![CDATA[
SELECT 1=1
FROM information_schema.tables
WHERE table_name = 'horaire_journalier_base'
AND table_schema = 'prod_kelio'
-- avec base et table resulats utilisable pour indicateurs
;
]]></condition>
<sqlcmd><![CDATA[
-- Alimentation de la table de mouvement.
delete from rh.p_planning_mouvement
where date between '[ENV_PLANNING_DATEDEBUT]'::date and '[ENV_PLANNING_DATEFIN]'::date
;
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)
SELECT
salarie_id,
contrat_id,
contrat_mois_id,
date,
to_char(w_affectation_horaire_journalier.date, 'IYYYIW'::text)::numeric AS semaine,
to_char(w_affectation_horaire_journalier.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,
0::bigint as code_horaire_id,
temps_effectif + temps_absences,
CASE WHEN (ferie IS NULL OR jour_travaille_ = 1 OR temps_absences != 0) THEN temps_du_initial::numeric ELSE 0 END,
temps_effectif,
temps_absences
FROM w_affectation_horaire_journalier
LEFT JOIN rh.t_planning_niveau ON t_planning_niveau.code_original = w_affectation_horaire_journalier.niveaux_code_original
LEFT JOIN rh.t_planning_service ON t_planning_service.code_original = w_affectation_horaire_journalier.service_code_original
LEFT JOIN rh.t_planning_qualification ON t_planning_qualification.code_original = 0
LEFT JOIN rh.t_planning_type_absence ON t_planning_type_absence.code = w_affectation_horaire_journalier.abs_cod
LEFT JOIN w_entets ON w_entets.entets_code = w_affectation_horaire_journalier.entets_code
WHERE 1=1
and salarie_id IS NOT NULL
and date between '[ENV_PLANNING_DATEDEBUT]'::date and '[ENV_PLANNING_DATEFIN]'::date
;
]]></sqlcmd>
</NODE>
<NODE label="Post Traitements">
<sqlcmd><![CDATA[
VACUUM ANALYSE rh.p_planning_mouvement
;
-- Pas de qualification kelio trouvée => on prend celles de la rh
INSERT INTO rh.t_planning_qualification (code, code_original, texte, texte_court)
SELECT code, 'K_'||code_original, texte, texte_court
FROM rh.t_qualifications
WHERE 1=1
AND 'K_'||t_qualifications.code_original NOT IN (SELECT code_original FROM rh.t_planning_qualification)
AND t_qualifications.oid != 0
;
UPDATE rh.p_planning_mouvement SET
qualification_id = t_planning_qualification.oid
FROM
(SELECT
p_contrats_mois.salarie_id,
date_debut,
date_fin,
'K_'||qualification_code_original as planning_qualification_code_original
FROM
rh.p_contrats_mois
join rh.p_profil_contrat_mois on contrat_mois_id = p_contrats_mois.oid
join rh.p_profils on p_profil_contrat_mois.profil_id = p_profils.oid
GROUP BY 1,2,3,4
) sub,
rh.t_planning_qualification
WHERE 1=1
AND sub.planning_qualification_code_original = t_planning_qualification.code_original
AND p_planning_mouvement.salarie_id = sub.salarie_id
AND date BETWEEN date_debut AND date_fin
;
]]></sqlcmd>
</NODE>
</NODE>
<NODE name="POST" type="common" />
<NODE name="VACUUM" type="common" />
</ROOT>