'[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; ]]> '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 ; ]]> 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 ; ]]> '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 ; ]]> 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 ; ]]> é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 ; ]]> 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 ; ]]>