0 and typhsp_cumh = 0) OR (typhsp_spla = 1 AND TYPHSP_SCOR = 1 AND typhsp_cump =0 AND typhsp_cumh =0 ))) OR (rub_id = 0) AS est_comptabilise, -- hors Ast non travaillée et heure non comptab en heures ou planning (dépendant de REU peut être réduit à la deuxième condition) GNTYPHSP.* FROM prod_cegi.gntyphsp ORDER by typhsp_code ; DROP TABLE IF EXISTS w_corct ; CREATE TEMP TABLE w_corct AS SELECT 'AR' as code, -1.0 as signe, 0.0 as surcharge -- Arrivée en retard. UNION ALL SELECT 'AV' as code, 1.0 as signe, 0.0 as surcharge -- Arrivée en avance. UNION ALL SELECT 'AW' as code, 1.0 as signe, 0.0 as surcharge -- Astreinte travaillée. UNION ALL SELECT 'DA' as code, -1.0 as signe, 0.0 as surcharge -- Départ en avance. UNION ALL SELECT 'DR' as code, 1.0 as signe, 0.0 as surcharge -- Départ en retard. UNION ALL SELECT 'M1' as code, 1.0 as signe, 1.0 as surcharge -- Modification complète type 1. UNION ALL SELECT 'M2' as code, 1.0 as signe, 1.0 as surcharge -- Modification complète type 2. UNION ALL SELECT 'OAW' as code, 1.0 as signe, 0.0 as surcharge -- Astreinte travaillée. ; DROP TABLE IF EXISTS w_structure ; CREATE TEMP TABLE w_structure AS SELECT GNEQP.site_id, eqp_id, planning_code, CASE WHEN COALESCE(cegi_site_service.valeur,'0') = '0' THEN site_code || '|' || COALESCE(GNTYPEQP.typeqp_code,'NR') || '|' || eqp_code ELSE planning_code || '|' || site_code || '|' || eqp_code END AS code, MAX(CASE WHEN COALESCE(cegi_site_service.valeur,'0') = '0' THEN site_lib || '|' || CASE WHEN typeqp_lib IS NOT NULL THEN ' - ' || COALESCE(typeqp_lib,' ') ELSE '' END || '-' || eqp_lib ELSE t_etablissements.texte || '-' || site_lib || '|' || eqp_lib END) AS texte FROM prod_cegi.GNEQP LEFT JOIN prod_cegi.GNTYPEQP ON GNEQP.typeqp_code = GNTYPEQP.typeqp_code LEFT JOIN (SELECT valeur FROM rh.t_divers WHERE code = 'CEGI_SITE_SERVICE') AS cegi_site_service ON 1=1 JOIN prod_cegi.GNSITE on GNSITE.site_id = GNEQP.site_id JOIN rh.t_etablissements ON t_etablissements.planning_code = CASE WHEN COALESCE(cegi_site_service.valeur,'0') = '0' THEN site_code ELSE planning_code END WHERE planning_code != '*' GROUP BY 1,2,3,4 ; DROP TABLE IF EXISTS w_gnpla ; CREATE TEMP TABLE w_gnpla AS WITH planning_override AS ( SELECT per_id, pla_date, pla_ordre FROM prod_cegi.GNPLADC WHERE GNPLADC.pladc_ordre = 0 GROUP BY 1,2,3 ) , ar_da as ( -- Calcul des temps en +/-. SELECT per_id, pla_date, pla_ordre, sum(pladc_duree * signe) as pladc_duree FROM prod_cegi.GNPLADC join w_corct on w_corct.code = GNPLADC.corct_code WHERE corct_code in ('AR', 'AV', 'DA', 'DR') GROUP BY 1,2,3 ) SELECT gnpla.pla_type, gnpla.pla_date, gnpla.pla_heud, gnpla.pla_heuf, gnpla.SER_CODE, 0::numeric as pla_duree, coalesce( case when (CASE WHEN gnpla.pla_heuf > gnpla.pla_heud THEN (gnpla.pla_heuf - gnpla.pla_heud) ELSE ('1899-12-30 24:00:00' - gnpla.pla_heud) + (gnpla.pla_heuf - '1899-12-30 00:00:00') END) + (coalesce(ar_da.pladc_duree, 0)::text || ' minutes')::interval < '6 hours'::interval then 0.0 -- #HINT02 Les pauses ne doivent pas être décomptées lorsque le temps de travail est < 6h (légal). else case when coalesce(typhsp_plapause, ''::text) in (select unnest(string_to_array(replace(valeur, ' ', ''), ',')) from rh.t_divers where code = 'CEGI_PAUSE_EXCL') -- #HINT03 Les pauses payées ne doivent pas être décomptées du temps travaillées (ex : sandwitch mangé tout en restant à l'accueil le dimanche). then 0.0 else gnpla.pla_pause end end, gnpla.pla_pause ) as pla_pause, gnpla.prs_code, gnpla.typhsp_code, --GNPLA.*, salarie_id, sal_matricule, sal_matricule AS salarie_corr, cnt_id, COALESCE(est_absence,false) AS est_absence, COALESCE(est_h_planif_sup,false) AS est_h_planif_sup, COALESCE(est_h_planif_moins,false) AS est_h_planif_moins, w_structure.planning_code, w_structure.code, w_structure.texte, w_structure.code AS code_original FROM prod_cegi.GNPLA JOIN prod_cegi.PYSALARIE ON GNPLA.per_id = PYSALARIE.per_id left JOIN planning_override ON 1=1 AND planning_override.per_id = GNPLA.per_id AND planning_override.pla_date = GNPLA.pla_date AND planning_override.pla_ordre = GNPLA.pla_ordre left JOIN ar_da ON 1=1 AND ar_da.per_id = GNPLA.per_id AND ar_da.pla_date = GNPLA.pla_date AND ar_da.pla_ordre = GNPLA.pla_ordre JOIN w_structure ON GNPLA.eqp_id = w_structure.eqp_id AND GNPLA.site_id = w_structure.site_id LEFT JOIN w_gntyphsp ON GNPLA.typhsp_code = w_gntyphsp.typhsp_code LEFT JOIN (SELECT valeur FROM rh.t_divers WHERE code = 'CEGI_SITE_SERVICE') AS cegi_site_service ON 1=1 JOIN w_sal_pla ON w_sal_pla.salarie_corr = sal_matricule AND etablissement_planning_code = planning_code WHERE 1=1 AND planning_override.per_id IS NULL AND (1!=1 OR pla_heuf < pla_heud OR EXTRACT(epoch from (pla_heuf - pla_heud) - (pla_pause::text || ' minutes')::interval) > 60) -- les mouvements d'une minute sont destinés à la paoe AND (1!=1 OR est_comptabilise IS NULL OR est_comptabilise) ; DROP TABLE IF EXISTS w_gnpladc ; CREATE TEMP TABLE w_gnpladc AS SELECT pla_type, gnpladc.pla_date, case when GNPLADC.corct_code = 'AW' then pla_heud -- #HINT01 Recalcul de la borne de fin lorsque motif Astreinte Travaillées (AW) car elle ne sont pas forcément renseignées ou mal (cas astreinte travaillée fragmentée) --> recalcul de la borne de fin à partir de la durée qui elle est juste. else pladc_heudeb end as pladc_heudeb, case when GNPLADC.corct_code = 'AW' then pla_heud + (pladc_duree::text || ' minutes')::interval -- cf. #HINT01. else pladc_heufin end as pladc_heufin, pla_heud, pla_heuf, pladc_duree as pladc_duree, gnpla.pla_pause AS pla_pause, prs_code, SER_CODE, gnpladc.typhsp_code, GNPLADC.corct_code, salarie_id, sal_matricule, sal_matricule AS salarie_corr, cnt_id, COALESCE(est_absence, false) AS est_absence, COALESCE(est_h_planif_sup_at,false) AS est_h_planif_sup_at, CASE WHEN est_absence AND pladc_heudeb BETWEEN pla_heud AND pla_heuf THEN true ELSE false END AS est_h_planif_sup_absence, w_structure.planning_code, w_structure.code, w_structure.texte, w_structure.code AS code_original FROM prod_cegi.GNPLADC JOIN prod_cegi.GNPLA ON GNPLA.per_id = GNPLADC.per_id AND GNPLA.pla_date = GNPLADC.pla_date AND GNPLA.pla_ordre = GNPLADC.pla_ordre AND pla_type = 0 JOIN prod_cegi.PYSALARIE ON GNPLA.per_id = PYSALARIE.per_id JOIN w_structure ON GNPLA.eqp_id = w_structure.eqp_id AND GNPLA.site_id = w_structure.site_id LEFT JOIN w_gntyphsp ON GNPLADC.typhsp_code = w_gntyphsp.typhsp_code JOIN w_sal_pla ON w_sal_pla.salarie_corr = sal_matricule AND etablissement_planning_code = planning_code WHERE (est_comptabilise IS NULL OR est_comptabilise) ; DROP SEQUENCE IF EXISTS w_cptres1_seq ; CREATE TEMP SEQUENCE w_cptres1_seq ; DROP TABLE IF EXISTS w_cptres1 ; -- heures travaillees = temps valide CREATE TEMP TABLE w_cptres1 AS SELECT nextval('w_cptres1_seq') as cptres1_id, w_gnpla.salarie_corr, salarie_id, cnt_id, null::bigint AS contrat_id, null::bigint AS contrat_mois_id, date(pla_date) AS date, date(pla_date) AS date_orig, EXTRACT(epoch FROM CASE WHEN pla_heuf > pla_heud THEN (pla_heuf - pla_heud) - (pla_pause::text || ' minutes')::interval ELSE (pla_heuf + interval '1 day' - pla_heud) - (pla_pause::text || ' minutes')::interval END)/3600 AS temps_orig, prs_code, code_original AS niveau_code_original, code_original AS service_code_original, planning_code AS entets_code, SER_CODE::text, typhsp_code AS type_horaire, CASE WHEN est_absence AND NOT est_h_planif_sup THEN typhsp_code ELSE ''::text END AS abs_cod, 0::numeric AS temps_du_initial, CASE WHEN est_h_planif_sup THEN EXTRACT(epoch FROM CASE WHEN pla_heuf > pla_heud THEN (pla_heuf - pla_heud) - (pla_pause::text || ' minutes')::interval ELSE ('1899-12-30 24:00:00' - pla_heud) - (pla_pause::text || ' minutes')::interval END)/3600 WHEN est_h_planif_moins THEN -EXTRACT(epoch FROM CASE WHEN pla_heuf > pla_heud THEN (pla_heuf - pla_heud) - (pla_pause::text || ' minutes')::interval ELSE ('1899-12-30 24:00:00' - pla_heud) - (pla_pause::text || ' minutes')::interval END)/3600 ELSE 0:: numeric END AS temps_du, CASE WHEN NOT est_absence THEN EXTRACT(epoch FROM CASE WHEN pla_heuf > pla_heud THEN (pla_heuf - pla_heud) - (pla_pause::text || ' minutes')::interval ELSE ('1899-12-30 24:00:00' - pla_heud) - (pla_pause::text || ' minutes')::interval END)/3600 ELSE 0:: numeric END AS temps_valide, CASE WHEN est_absence AND NOT est_h_planif_sup THEN EXTRACT(epoch FROM CASE WHEN pla_heuf > pla_heud THEN (pla_heuf - pla_heud) - (pla_pause::text || ' minutes')::interval ELSE ('1899-12-30 24:00:00' - pla_heud) - (pla_pause::text || ' minutes')::interval END)/3600 ELSE 0:: numeric END AS temps_absence FROM w_gnpla WHERE 1=1 AND pla_type = 0 -- effectué AND EXTRACT(epoch FROM (pla_heuf - pla_heud) - (pla_pause::text || ' minutes')::interval) != 0 -- pour la paie ORDER BY 2,7 ; INSERT INTO w_cptres1 SELECT nextval('w_cptres1_seq') as cptres1_id, w_gnpla.salarie_corr, salarie_id, cnt_id, null::bigint AS contrat_id, null::bigint AS contrat_mois_id, date(pla_date) + interval '1 day' AS date, date(pla_date) AS date_orig, EXTRACT(epoch FROM CASE WHEN pla_heuf > pla_heud THEN (pla_heuf - pla_heud) ELSE (pla_heuf + interval '1 day' - pla_heud) END)/3600 AS temps_orig, prs_code, code_original AS niveau_code_original, code_original AS service_code_original, planning_code AS entets_code, SER_CODE, typhsp_code AS type_horaire, CASE WHEN est_absence AND NOT est_h_planif_sup THEN typhsp_code ELSE ''::text END AS abs_cod, 0 AS temps_du_initial, CASE WHEN est_h_planif_sup THEN EXTRACT(epoch FROM (pla_heuf - '1899-12-30 00:00:00'))/3600 WHEN est_h_planif_moins THEN -EXTRACT(epoch FROM (pla_heuf - '1899-12-30 00:00:00'))/3600 ELSE 0::numeric END AS temps_du, CASE WHEN NOT est_absence THEN EXTRACT(epoch FROM (pla_heuf - '1899-12-30 00:00:00'))/3600 ELSE 0::numeric END AS temps_valide, CASE WHEN est_absence AND NOT est_h_planif_sup THEN EXTRACT(epoch FROM (pla_heuf - '1899-12-30 00:00:00'))/3600 ELSE 0::numeric END AS temps_absence FROM w_gnpla WHERE 1=1 AND pla_type = 0 -- effectué --AND NOT est_absence --AND NOT est_h_planif_sup AND (EXTRACT(epoch FROM (pla_heuf - pla_heud) - (pla_pause::text || ' minutes')::interval) < 0 OR pla_duree > 1440)-- journée dépassant les minuit AND EXTRACT(epoch FROM (pla_heuf - pla_heud) - (pla_pause::text || ' minutes')::interval) != 0 -- pour la paie ORDER BY 2,7 ; -- heures travaillees supplémentaires INSERT INTO w_cptres1 SELECT nextval('w_cptres1_seq') as cptres1_id, w_gnpladc.salarie_corr, salarie_id, cnt_id, null::bigint AS contrat_id, null::bigint AS contrat_mois_id, date(pla_date) AS date, date(pla_date) AS date_orig, SUM(CASE WHEN NOT est_absence THEN pladc_duree/60.0 ELSE -pladc_duree/60.0 END)AS temps_orig, prs_code, code_original AS niveau_code_original, code_original AS service_code_original, planning_code AS entets_code, SER_CODE, typhsp_code AS type_horaire, ''::text AS abs_cod, 0::numeric AS temps_du_initial, SUM(CASE WHEN est_h_planif_sup_at THEN -EXTRACT(epoch FROM CASE WHEN pladc_heufin > pladc_heudeb OR pladc_duree > 1440 THEN (pladc_heufin - pladc_heudeb) ELSE ('1899-12-30 24:00:00' - pladc_heudeb) END)/3600::numeric WHEN est_h_planif_sup_absence THEN EXTRACT(epoch FROM CASE WHEN pladc_heufin > pladc_heudeb OR pladc_duree > 1440 THEN (pladc_heufin - pladc_heudeb) ELSE ('1899-12-30 24:00:00' - pladc_heudeb) END)/3600::numeric ELSE 0::numeric END * coalesce(w_corct.signe, 1.0)) AS temps_du, SUM(CASE WHEN NOT est_absence THEN EXTRACT(epoch FROM CASE WHEN pladc_heufin > pladc_heudeb OR pladc_duree > 1440 THEN (pladc_heufin - pladc_heudeb) ELSE ('1899-12-30 24:00:00' - pladc_heudeb) END)/3600 - ((pla_pause / 60.0) * coalesce(w_corct.surcharge, 0.0))-- Les pauses ne sont retirées qu'une fois sur le jour 1 lorsque code de modification M1/M2. ELSE -EXTRACT(epoch FROM CASE WHEN pladc_heufin > pladc_heudeb OR pladc_duree > 1440 THEN (pladc_heufin - pladc_heudeb) ELSE ('1899-12-30 24:00:00' - pladc_heudeb) END)/3600 END * coalesce(w_corct.signe, 1.0)) AS temps_valide, 0::numeric AS temps_absence FROM w_gnpladc left join w_corct on w_corct.code = w_gnpladc.corct_code WHERE 1=1 GROUP BY 1,2,3,4,5,6,7,8,10,11,12,13,14,15,16,17 ORDER BY 2,7 ; -- Traitement du deuxième jour lorsqu'évènement salarié chevauchant 2 jours. INSERT INTO w_cptres1 SELECT nextval('w_cptres1_seq') as cptres1_id, w_gnpladc.salarie_corr, salarie_id, cnt_id, null::bigint AS contrat_id, null::bigint AS contrat_mois_id, date(pla_date) + interval '1 day' AS date, date(pla_date) AS date_orig, SUM(CASE WHEN est_absence THEN pladc_duree/60.0 ELSE -pladc_duree/60.0 END)AS temps_orig, prs_code, code_original AS niveau_code_original, code_original AS service_code_original, planning_code AS entets_code, SER_CODE, typhsp_code AS type_horaire, ''::text AS abs_cod, 0 AS temps_du_initial, SUM( CASE WHEN est_h_planif_sup_at THEN -EXTRACT(epoch FROM (pladc_heufin - '1899-12-30 00:00:00'))/3600 WHEN est_h_planif_sup_absence THEN EXTRACT(epoch FROM (pladc_heufin - '1899-12-30 00:00:00'))/3600 ELSE 0 END * coalesce(w_corct.signe, 1.0)) AS temps_du, SUM(CASE WHEN NOT est_absence THEN EXTRACT(epoch FROM (pladc_heufin - '1899-12-30 00:00:00'))/3600 ELSE -EXTRACT(epoch FROM (pladc_heufin - '1899-12-30 00:00:00'))/3600 END * coalesce(w_corct.signe, 1.0)) AS temps_valide, 0::numeric AS temps_absence FROM w_gnpladc left join w_corct on w_corct.code = w_gnpladc.corct_code WHERE 1=1 AND EXTRACT(epoch FROM (pladc_heufin - pladc_heudeb)) < 0 OR pladc_duree > 1440 -- journée dépassant les minuit GROUP BY 1,2,3,4,5,6,7,8,10,11,12,13,14,15,16,17 ORDER BY 2,7 ; -- heures planifiées INSERT INTO w_cptres1 SELECT nextval('w_cptres1_seq') as cptres1_id, w_gnpla.salarie_corr, salarie_id, cnt_id, null::bigint AS contrat_id, null::bigint AS contrat_mois_id, date(pla_date) AS date, date(pla_date) AS date_orig, EXTRACT(epoch FROM CASE WHEN pla_heuf > pla_heud THEN (pla_heuf - pla_heud) - (pla_pause::text || ' minutes')::interval ELSE (pla_heuf + interval '1 day' - pla_heud) - (pla_pause::text || ' minutes')::interval END)/3600 AS temps_orig, prs_code, code_original AS niveau_code_original, code_original AS service_code_original, planning_code AS entets_code, SER_CODE, typhsp_code AS type_horaire, ''::text AS abs_cod, EXTRACT(epoch FROM CASE WHEN pla_heuf > pla_heud THEN (pla_heuf - pla_heud) - (pla_pause::text || ' minutes')::interval ELSE ('1899-12-30 24:00:00' - pla_heud) - (pla_pause::text || ' minutes')::interval END)/3600 AS temps_du_initial, 0 AS temps_du, 0 AS temps_valide, 0::numeric AS temps_absence FROM w_gnpla WHERE 1=1 AND pla_type = 1 -- planifié prev AND NOT est_absence AND EXTRACT(epoch FROM (pla_heuf - pla_heud) - (pla_pause::text || ' minutes')::interval) != 0 -- pour la paie ORDER BY 2,7 ; INSERT INTO w_cptres1 SELECT nextval('w_cptres1_seq') as cptres1_id, w_gnpla.salarie_corr, salarie_id, cnt_id, null::bigint AS contrat_id, null::bigint AS contrat_mois_id, date(pla_date + interval '1 day') AS date, date(pla_date) AS date_orig, EXTRACT(epoch FROM CASE WHEN pla_heuf > pla_heud THEN (pla_heuf - pla_heud) - (pla_pause::text || ' minutes')::interval ELSE (pla_heuf + interval '1 day' - pla_heud) - (pla_pause::text || ' minutes')::interval END)/3600 AS temps_orig, prs_code, code_original AS niveau_code_original, code_original AS service_code_original, planning_code AS entets_code, SER_CODE, typhsp_code AS type_horaire, ''::text AS abs_cod, EXTRACT(epoch FROM (pla_heuf - '1899-12-30 00:00:00'))/3600 AS temps_du_initial, 0 AS temps_du, 0 AS temps_valide, 0::numeric AS temps_absence FROM w_gnpla WHERE 1=1 AND pla_type = 1 -- planifié prev AND NOT est_absence AND EXTRACT(epoch FROM (pla_heuf - pla_heud) - (pla_pause::text || ' minutes')::interval) < 0 -- journée dépassant les minuit AND EXTRACT(epoch FROM (pla_heuf - pla_heud) - (pla_pause::text || ' minutes')::interval) != 0 -- pour la paie ORDER BY 2,7 ; -- Code d'absence paramétrés en heure DROP TABLE IF EXISTS w_codes_absences_unite_heure ; CREATE TEMP TABLE w_codes_absences_unite_heure AS SELECT abspar_code FROM prod_cegi.PYABSENCEPARAM WHERE ( un_id IN (708, 709 ,710, 711) OR un_id IN (SELECT UNNEST(STRING_TO_ARRAY(REPLACE(valeur, ' ', ''), ',')) FROM rh.t_divers WHERE code = 'CEGI_UNITE_HEURE') -- Absences paramétrées dans CTI comme étant exprimées en heures. ) AND abspar_code NOT IN (SELECT UNNEST(STRING_TO_ARRAY(REPLACE(valeur, ' ', ''), ',')) FROM rh.t_divers WHERE code = 'CEGI_PLANNING_ABSENCE_HEURE') ORDER BY abspar_code ; -- Modulation des présence avec les absences -- Recencement des absences exprimées en jours et en heures. DROP TABLE IF EXISTS w_abs_bul ; CREATE TEMP TABLE w_abs_bul AS SELECT pyabsence.per_id, cnt_id, sal_matricule, detabs_deb as dphl_debabs, detabs_fin as dphl_finabs, sum(detabs_val) as dphl_valabs, abspar_code as dphl_code, abspar_libelle as dphl_lib, un_id FROM prod_cegi.PYABSENCE JOIN prod_cegi.PYDETABSENCE ON PYABSENCE.abs_id = PYDETABSENCE.abs_id JOIN prod_cegi.PYSALARIE ON PYABSENCE.per_id = PYSALARIE.per_id JOIN prod_cegi.PYABSENCEPARAM ON PYABSENCEPARAM.abspar_id = PYABSENCE.abspar_id WHERE 1=1 AND CASE WHEN (select valeur = '1' from rh.t_divers where code = 'CEGI_ABS_VALIDE') THEN abs_valide = 1 ELSE true END AND abspar_code not in (select unnest(string_to_array(replace(valeur, ' ', ''), ',')) from rh.t_divers where code = 'CEGI_ABS_EXCL') AND detabs_val IS NOT NULL GROUP BY 1,2,3,4,5,7,8,9 ; -- CAS des absence en jours : on transvase l'intégralité du temps validé dans le temps d'absence et on met le temps validé à 0. UPDATE w_cptres1 SET abs_cod = dphl_code, temps_absence = temps_valide, temps_valide = 0 FROM w_abs_bul WHERE 1=1 AND w_abs_bul.sal_matricule = salarie_corr AND date_orig BETWEEN dphl_debabs AND dphl_finabs AND dphl_code NOT IN (SELECT abspar_code FROM w_codes_absences_unite_heure) -- Hors absences exprimées en heures. AND temps_valide != 0 ; -- Table temporaire qui va permettre de décompter les heures d'absences étalées sur plusieurs jours. DROP TABLE IF EXISTS w_abs_h ; CREATE TEMP TABLE w_abs_h AS SELECT w_cptres1.*, dphl_code, dphl_lib, dphl_valabs, SUM(temps_valide) OVER (PARTITION BY salarie_corr, w_abs_bul.cnt_id, dphl_debabs, dphl_code ORDER by date_orig, date, cptres1_id) as somme, dphl_valabs + temps_valide - SUM(temps_valide) OVER (PARTITION BY salarie_corr, w_abs_bul.cnt_id, dphl_debabs, dphl_code ORDER by date_orig, date, cptres1_id) as restant FROM w_abs_bul JOIN w_cptres1 ON w_abs_bul.sal_matricule = salarie_corr and w_abs_bul.cnt_id = w_cptres1.cnt_id AND date_orig BETWEEN dphl_debabs AND dphl_finabs WHERE 1=1 AND dphl_code IN (SELECT abspar_code FROM w_codes_absences_unite_heure) -- Hors absences exprimées en heures. ; -- Absences en heures UPDATE w_cptres1 SET temps_valide = w_cptres1.temps_valide - LEAST(w_cptres1.temps_valide, restant) FROM (SELECT salarie_corr, cnt_id, date_orig, sum(restant) as restant FROM w_abs_h WHERE restant > 0 -- a deplacer vers la creation GROUP BY 1,2,3 ) as w_abs_h_group WHERE w_cptres1.salarie_corr = w_abs_h_group.salarie_corr AND w_cptres1.cnt_id = w_abs_h_group.cnt_id AND w_cptres1.date_orig = w_abs_h_group.date_orig AND --w_cptres1.date = w_abs_h.date AND w_cptres1.temps_valide > 0 ; --todo ajouter cas eventuel non present d'absences longue mais ne constituant pas un nombre de jours exactes INSERT INTO w_cptres1 SELECT nextval('w_cptres1_seq') as cptres1_id, salarie_corr, salarie_id, cnt_id, null::bigint AS contrat_id, null::bigint AS contrat_mois_id, date, date_orig, 0 as temps_orig, prs_code, niveau_code_original, service_code_original, entets_code, SER_CODE, ''::text AS type_horaire, dphl_code AS abs_cod, 0 AS temps_du_initial, 0 AS temps_du, 0 AS temps_valide, LEAST(temps_valide,restant) AS temps_absence --bug observé sur cette rubrique FROM w_abs_h WHERE dphl_valabs != 0 and restant > 0 ; --correctif rrh et amith qui s'ils sont seuls prennet la valeur travaillée même si leur valeur d'absence ne couvre pas la journée DROP TABLE IF EXISTS w_tot_absence; CREATE TEMP TABLE w_tot_absence AS SELECT salarie_corr, date_orig, CASE WHEN 'AMITH' = ANY(array_agg(abs_cod)) THEN 'AMITH' WHEN 'RRH' = ANY(array_agg(abs_cod)) THEN 'RRH' END AS code, sum(temps_absence) as tot_absence FROM w_cptres1 GROUP BY salarie_corr,date_orig HAVING array_agg(abs_cod) && ARRAY['RRH','AMITH'] ; UPDATE w_cptres1 SET temps_absence = temps_valide, temps_valide = 0, abs_cod = code FROM w_tot_absence WHERE w_cptres1.salarie_corr = w_tot_absence.salarie_corr AND w_cptres1.date_orig = w_tot_absence.date_orig AND temps_valide != 0 ; -- Transformation de certains types horaires de temps validé en temps d'absence UPDATE w_cptres1 SET abs_cod = type_horaire, temps_absence = temps_valide, temps_valide = 0 - temps_valide WHERE string_to_array((SELECT replace(valeur, ' ', '') FROM rh.t_divers WHERE code = 'CEGI_PLANNING_FORCE_TYPE_HORAIRE_ABSENCE'),',') <> '{}' AND type_horaire = ANY (ARRAY(SELECT string_to_array((SELECT replace(valeur, ' ', '') FROM rh.t_divers WHERE code = 'CEGI_PLANNING_FORCE_TYPE_HORAIRE_ABSENCE'),','))) ; -- Transfert du temps comptabilisé comme du temps_validé vers le temps_du UPDATE w_cptres1 SET temps_du = temps_valide, temps_valide = 0 WHERE string_to_array((SELECT replace(valeur, ' ', '') FROM rh.t_divers WHERE code = 'CEGI_PLANNING_TYPE_HORAIRE_TEMPS_VALIDE_VERS_TEMPS_DU'),',') <> '{}' AND type_horaire = ANY (ARRAY(SELECT STRING_TO_ARRAY((SELECT replace(valeur, ' ', '') FROM rh.t_divers WHERE code = 'CEGI_PLANNING_TYPE_HORAIRE_TEMPS_VALIDE_VERS_TEMPS_DU'),','))) ; VACUUM ANALYSE w_cptres1 ; -- Association aux contrats et contrat_mois. -- En général, les heures planning sont effectuées AVANT un contrat/paie à cause du décallage avec la paie : -- => les heures effectuées en fin de mois sont à associer avec le mois suivant. with w_asso as ( select cptres1_id, (max(array[extract(epoch from p_contrats_mois.date_debut), p_contrats_mois.contrat_id]))[2] as contrat_id, (max(array[extract(epoch from p_contrats_mois.date_debut), p_contrats_mois.oid]))[2] as contrat_mois_id from w_cptres1 join rh.p_contrats_mois on 1=1 and p_contrats_mois.salarie_id = w_cptres1.salarie_id and w_cptres1.date between p_contrats_mois.date_debut and p_contrats_mois.date_fin -- Sélection des contrats pendant heures planning. WHERE 1=1 OR w_cptres1.contrat_id is null OR w_cptres1.contrat_mois_id is null group by 1) UPDATE w_cptres1 SET contrat_id = w_asso.contrat_id, contrat_mois_id = w_asso.contrat_mois_id FROM w_asso WHERE w_cptres1.cptres1_id = w_asso.cptres1_id ; with w_asso as ( select cptres1_id, (min(array[extract(epoch from p_contrats_mois.date_debut), p_contrats_mois.contrat_id]))[2] as contrat_id, (min(array[extract(epoch from p_contrats_mois.date_debut), p_contrats_mois.oid]))[2] as contrat_mois_id from w_cptres1 join rh.p_contrats_mois on 1=1 and p_contrats_mois.salarie_id = w_cptres1.salarie_id and p_contrats_mois.date_debut > w_cptres1.date -- Sélection des contrats APRES heures planning. WHERE 1=1 OR w_cptres1.contrat_id is null OR w_cptres1.contrat_mois_id is null group by 1) UPDATE w_cptres1 SET contrat_id = w_asso.contrat_id, contrat_mois_id = w_asso.contrat_mois_id FROM w_asso WHERE w_cptres1.cptres1_id = w_asso.cptres1_id ; with w_asso as ( select cptres1_id, (max(array[extract(epoch from p_contrats_mois.date_debut), p_contrats_mois.contrat_id]))[2] as contrat_id, (max(array[extract(epoch from p_contrats_mois.date_debut), p_contrats_mois.oid]))[2] as contrat_mois_id from w_cptres1 join rh.p_contrats_mois on 1=1 and p_contrats_mois.salarie_id = w_cptres1.salarie_id and p_contrats_mois.date_debut < w_cptres1.date -- Sélection des contrats AVANT heures planning. WHERE 1=1 OR w_cptres1.contrat_id is null OR w_cptres1.contrat_mois_id is null group by 1) UPDATE w_cptres1 SET contrat_id = w_asso.contrat_id, contrat_mois_id = w_asso.contrat_mois_id FROM w_asso WHERE w_cptres1.cptres1_id = w_asso.cptres1_id ; -- Création d'index. CREATE INDEX w_cptres1_i_contrat_id ON w_cptres1 USING btree (contrat_id) ; CREATE INDEX w_cptres1_i_contrat_mois_id ON w_cptres1 USING btree (contrat_mois_id) ; CREATE INDEX w_cptres1_i_date ON w_cptres1 USING btree (date) ; CREATE INDEX w_cptres1_i_salarie_id ON w_cptres1 USING btree (salarie_id) ; -- Alimentation des tables de paramètres. -- Màj des Services du Planning. INSERT INTO rh.t_planning_service(code_original, code, texte, texte_court, service_id) SELECT code_original, code, texte, substr(texte,1,50), 0 FROM w_GNPLA WHERE code_original NOT IN (SELECT code_original FROM rh.t_planning_service WHERE code_original IS NOT NULL) GROUP BY 1,2,3,4 ; -- Màj des Niveaux du Planning. INSERT INTO rh.t_planning_niveau(code_original, code, texte, texte_court) SELECT code_original, code, texte, substr(texte,1,50) FROM w_GNPLA WHERE code_original NOT IN (SELECT code_original FROM rh.t_planning_niveau WHERE code_original IS NOT NULL) GROUP BY 1,2,3,4 ; -- Màj des Qualifications du Planning. INSERT INTO rh.t_planning_qualification(code_original, code, texte, texte_court) SELECT prs_code, prs_code, prs_lib, prs_lib FROM prod_cegi.GNPRS WHERE 1=1 AND prs_code IN (SELECT prs_code FROM w_cptres1) AND prs_code NOT IN (SELECT code_original FROM rh.t_planning_qualification WHERE code_original IS NOT NULL) ; -- Màj des Types d'absences du Planning. INSERT INTO rh.t_planning_type_absence(code_original, code, texte, texte_court) SELECT abspar_id, abspar_code, abspar_libelle, abspar_libelle FROM prod_cegi.PYABSENCEPARAM WHERE 1=1 AND abspar_id NOT IN (SELECT code_original FROM rh.t_planning_type_absence WHERE code_original IS NOT NULL) AND abspar_code IN (SELECT abs_cod FROM w_cptres1 GROUP BY 1) AND abspar_code != '' GROUP BY 1,2,3,4 ; -- Conversion code absence selon PYABSENCEPARAM UPDATE w_cptres1 SET abs_cod = ABSPAR_ID FROM prod_cegi.PYABSENCEPARAM JOIN rh.t_planning_type_absence ON t_planning_type_absence.code_original = PYABSENCEPARAM.ABSPAR_ID WHERE ABS_COD = ABSPAR_CODE AND abs_cod <> '' ; INSERT INTO rh.t_planning_type_absence(code_original, code, texte, texte_court) SELECT dphl_code, dphl_code, MAX(dphl_lib), MAX(dphl_lib) FROM prod_cegi.GNDPHL WHERE 1=1 AND dphl_code NOT IN (SELECT code_original FROM rh.t_planning_type_absence WHERE code_original IS NOT NULL) AND dphl_code IN (SELECT abs_cod FROM w_cptres1 GROUP BY 1) AND dphl_code != '' GROUP BY 1,2 ; -- Codes horaires INSERT INTO rh.t_planning_code_horaire(code_original, code, texte, texte_court) SELECT SER_CODE, SER_CODE, SER_CODE, SER_CODE FROM w_cptres1 WHERE 1=1 AND SER_CODE NOT IN (SELECT code_original FROM rh.t_planning_code_horaire WHERE code_original IS NOT NULL) GROUP BY 1 ; -- Création d'une table Entreprise/Etablissement. DROP TABLE IF EXISTS w_entets ; CREATE TEMP TABLE w_entets AS select MIN(ets.oid) as etablissement_id, ent.planning_code||ets.planning_code as entets_code from rh.t_entreprises as ent join rh.t_etablissements as ets on ets.entreprise_id = ent.oid Where 1=1 and ent.oid != 0 and ets.oid != 0 GROUP BY 2 ; -- Alimentation de la table de mouvement. SELECT base.cti_execute('TRUNCATE rh.p_planning_mouvement',1) WHERE '[ENV_PLANNING_DATEDEBUT]' = '0001-01-01' AND '[ENV_PLANNING_DATEFIN]' = '2099-12-31' ; 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, CASE WHEN COALESCE(VENTIL_JOUR.valeur,'0') = '1' THEN date ELSE date_orig END, to_char(CASE WHEN COALESCE(VENTIL_JOUR.valeur,'0') = '1' THEN date ELSE date_orig END, 'IYYYIW'::text)::numeric AS semaine, to_char(CASE WHEN COALESCE(VENTIL_JOUR.valeur,'0') = '1' THEN date ELSE date_orig END, 'YYYYMM'::text)::numeric AS mois, coalesce(w_entets.etablissement_id, 0) as etablissement_id, coalesce(t_planning_service.oid, 0) AS service_id, coalesce(t_planning_qualification.oid, 0) AS qualification_id, coalesce(t_planning_type_absence.oid, 0) AS type_absence_id, coalesce(t_planning_niveau.oid, 0) as niveau_id, coalesce(t_planning_code_horaire.oid, 0) as code_horaire_id, temps_valide + temps_absence + temps_du, temps_du_initial, temps_valide, temps_absence FROM w_cptres1 LEFT JOIN rh.t_planning_niveau ON t_planning_niveau.code_original = w_cptres1.niveau_code_original LEFT JOIN rh.t_planning_service ON t_planning_service.code_original = w_cptres1.service_code_original LEFT JOIN rh.t_planning_qualification ON t_planning_qualification.code_original = w_cptres1.prs_code LEFT JOIN rh.t_planning_type_absence ON t_planning_type_absence.code_original = w_cptres1.abs_cod LEFT JOIN rh.t_planning_code_horaire ON t_planning_code_horaire.code_original = w_cptres1.SER_CODE LEFT JOIN w_entets ON w_entets.entets_code = w_cptres1.entets_code LEFT JOIN rh.t_divers VENTIL_JOUR ON VENTIL_JOUR.code = 'VENTIL_JOUR' where w_cptres1.date between '[ENV_PLANNING_DATEDEBUT]'::date and '[ENV_PLANNING_DATEFIN]'::date ; VACUUM ANALYSE rh.p_planning_mouvement ; ]]> 7h -- Ramener à 7 UPDATE rh.p_planning_mouvement SET temps_du = CASE WHEN temps_du > 7 THEN 7 ELSE temps_du END, temps_du_initial = CASE WHEN temps_du_initial > 7 THEN 7 ELSE temps_du_initial END, temps_valide = CASE WHEN temps_valide > 7 THEN 7 ELSE temps_valide END, temps_absence = CASE WHEN temps_absence > 7 THEN 7 ELSE temps_absence END FROM rh.t_planning_code_horaire, base.t_finess where t_finess.code = '690793468' AND code_horaire_id = t_planning_code_horaire.oid AND t_planning_code_horaire.code = 'EN' AND ( temps_du > 7 OR temps_du_initial > 7 OR temps_valide > 7 OR temps_absence > 7 ) ; -- Lorsqu'il n'y a pas de liaison entre les Qualifications Paie/Planning, -- essayer de faire un rapprochement par le code ET le libellé. UPDATE rh.t_planning_qualification SET qualification_id = t_qualifications.oid FROM rh.t_qualifications WHERE 1=1 AND t_qualifications.code = t_planning_qualification.code AND t_planning_qualification.qualification_id = 0 AND substr(t_planning_qualification.texte, 1, 10) = substr(t_qualifications.texte, 1, 10) ; -- Report des Qualification Paie sur Qualification Planning. UPDATE rh.t_planning_qualification SET qualification_code = t_qualifications.code, qualification_texte = t_qualifications.texte_court, qualification_section_id = t_qualifications.section_id, qualification_section_code = t_qualifications.section_code, qualification_section_texte = t_qualifications.section_texte FROM rh.t_qualifications WHERE 1=1 AND t_planning_qualification.qualification_id = t_qualifications.oid AND (1!=1 OR qualification_code IS DISTINCT FROM t_qualifications.code OR qualification_texte IS DISTINCT FROM t_qualifications.texte_court OR qualification_section_id IS DISTINCT FROM t_qualifications.section_id OR qualification_section_code IS DISTINCT FROM t_qualifications.section_code OR qualification_section_texte IS DISTINCT FROM t_qualifications.section_texte) ; -- Report des Services Paie sur Services Planning. UPDATE rh.t_planning_service SET service_code = t_services.code, service_texte = t_services.texte_court, service_section_id = t_services.section_id, service_section_code = t_services.section_code, service_section_texte = t_services.section_texte FROM rh.t_services WHERE 1=1 AND t_planning_service.service_id = t_services.oid AND (1!=1 OR service_code IS DISTINCT FROM t_services.code OR service_texte IS DISTINCT FROM t_services.texte_court OR service_section_id IS DISTINCT FROM t_services.section_id OR service_section_code IS DISTINCT FROM t_services.section_code OR service_section_texte IS DISTINCT FROM t_services.section_texte) ; -- Création des 3 classes de niveaux. DROP TABLE IF EXISTS w_classes ; CREATE TEMP TABLE w_classes AS with classe_table as ( select 'PLANIV1' as code, '[DICT.RH.NIVEAU1#1]' as texte, 1 as sequence UNION ALL select 'PLANIV2' as code, '[DICT.RH.NIVEAU2#1]' as texte, 2 as sequence UNION ALL select 'PLANIV3' as code, '[DICT.RH.NIVEAU3#1]' as texte, 3 as sequence) SELECT code, texte, table_id, 0 as is_cti, sequence FROM classe_table, (select oid as table_id from rh.t_listes_tables where code = 'PNI' LIMIT 1) as subq ; insert into rh.t_classes (code, texte, table_id, is_cti, sequence) select code, texte, table_id, is_cti, sequence FROM w_classes where code NOT in (select code from rh.t_classes where code is not null) ; update rh.t_classes set texte = w_classes.texte FROM w_classes WHERE true and w_classes.code = t_classes.code and w_classes.texte is distinct from t_classes.texte ; -- Nettoyage du contenu delete from rh.t_classes_sections_elements where section_id in ( select s.oid from rh.t_classes as c join rh.t_classes_sections as s on s.classe_id = c.oid where c.code IN ('PLANIV1', 'PLANIV2', 'PLANIV3')) ; -- Création des 3 classes de niveaux. DROP TABLE IF EXISTS w_classes ; CREATE TEMP TABLE w_classes AS with classe_table as ( select 'PLANIV1' as code, '[DICT.RH.NIVEAU1#1]' as texte, 1 as sequence UNION ALL select 'PLANIV2' as code, '[DICT.RH.NIVEAU2#1]' as texte, 2 as sequence UNION ALL select 'PLANIV3' as code, '[DICT.RH.NIVEAU3#1]' as texte, 3 as sequence) SELECT code, texte, table_id, 0 as is_cti, sequence FROM classe_table, (select oid as table_id from rh.t_listes_tables where code = 'PNI' LIMIT 1) as subq ; insert into rh.t_classes (code, texte, table_id, is_cti, sequence) select code, texte, table_id, is_cti, sequence FROM w_classes where code NOT in (select code from rh.t_classes where code is not null) ; update rh.t_classes set texte = w_classes.texte FROM w_classes WHERE true and w_classes.code = t_classes.code and w_classes.texte is distinct from t_classes.texte ; -- Nettoyage du contenu delete from rh.t_classes_sections_elements where section_id in ( select s.oid from rh.t_classes as c join rh.t_classes_sections as s on s.classe_id = c.oid where c.code IN ('PLANIV1', 'PLANIV2', 'PLANIV3')) ; -- Mise à jour des sections Niveau 1. DROP TABLE IF EXISTS w_clasec_1 ; CREATE TEMP TABLE w_clasec_1 AS SELECT site_code as code, site_lib as texte, (select oid from rh.t_classes where code = 'PLANIV1') as classe_id FROM prod_cegi.GNSITE JOIN rh.t_divers ON t_divers.code = 'CEGI_SITE_SERVICE' AND t_divers.valeur = '0' GROUP BY 1,2,3 UNION ALL SELECT t_etablissements.planning_code as code, t_etablissements.planning_code as texte, (select oid from rh.t_classes where code = 'PLANIV1') as classe_id FROM rh.t_etablissements JOIN rh.t_divers ON t_divers.code = 'CEGI_SITE_SERVICE' AND t_divers.valeur = '1' WHERE planning_code != '*' GROUP BY 1,2,3 ; INSERT INTO rh.t_classes_sections(code, texte, classe_id) SELECT code, texte, classe_id from w_clasec_1 where 1=1 and classe_id = (select oid from rh.t_classes where code = 'PLANIV1') and code not in (select code from rh.t_classes_sections where t_classes_sections.classe_id = w_clasec_1.classe_id and code is not null) group by 1,2,3 ; UPDATE rh.t_classes_sections set texte = w_clasec_1.texte FROM w_clasec_1 WHERE true AND w_clasec_1.classe_id = t_classes_sections.classe_id AND w_clasec_1.code = t_classes_sections.code AND w_clasec_1.texte is distinct from t_classes_sections.texte ; -- Mise à jour du contenu des sections Niveau 1. INSERT INTO rh.t_classes_sections_elements (section_id, to_id) SELECT t_classes_sections.oid AS section_id, t_planning_niveau.oid AS to_id FROM rh.t_classes join rh.t_classes_sections on t_classes_sections.classe_id = t_classes.oid join rh.t_planning_niveau on split_part(code_original, '|', 1) = t_classes_sections.code WHERE t_classes.code = 'PLANIV1' group by 1,2 ; -- Mise à jour des sections Niveau 2. DROP TABLE IF EXISTS w_clasec_2 ; SELECT base.cti_execute(' CREATE TEMP TABLE w_clasec_2 AS WITH nb_niv AS ( SELECT typeqp_code, count(DISTINCT typeqp_lib) as niv_count FROM prod_cegi.GNTYPEQP GROUP BY 1 ) SELECT CASE WHEN niv_count = 1 THEN GNEQP.typeqp_code else site_code || ''|'' || GNEQP.typeqp_code END as code, site_code || ''|'' || GNEQP.typeqp_code as code_original, typeqp_lib as texte, (select oid from rh.t_classes where code = ''PLANIV2'') as classe_id from prod_cegi.GNEQP JOIN prod_cegi.GNSITE ON GNEQP.site_id = GNSITE.site_id LEFT JOIN prod_cegi.GNTYPEQP ON GNEQP.typeqp_code = GNTYPEQP.typeqp_code JOIN nb_niv ON nb_niv.typeqp_code = GNTYPEQP.typeqp_code group by 1,2,3 UNION ALL SELECT site_code || ''|'' || ''NR'', site_code || ''|'' || ''NR'', ''Non renseigné'', (select oid from rh.t_classes where code = ''PLANIV2'') as classe_id FROM prod_cegi.GNSITE',1) WHERE (SELECT code FROM rh.t_divers WHERE code = 'CEGI_SITE_SERVICE' and valeur = '0') IS NOT NULL; ; SELECT base.cti_execute(' CREATE TEMP TABLE w_clasec_2 AS SELECT planning_code || ''|'' || site_code as code, planning_code || ''|'' || site_code as code_original, site_lib as texte, (select oid from rh.t_classes where code = ''PLANIV2'') as classe_id FROM prod_cegi.GNSITE JOIN rh.t_etablissements ON t_etablissements.planning_code != ''*'' group by 1,2,3 UNION ALL SELECT planning_code || ''|'' || ''NR'', planning_code || ''|'' || ''NR'', ''Non renseigné'', (select oid from rh.t_classes where code = ''PLANIV2'') as classe_id FROM rh.t_etablissements',1) WHERE (SELECT code FROM rh.t_divers WHERE code = 'CEGI_SITE_SERVICE' and valeur = '1') IS NOT NULL; ; INSERT INTO rh.t_classes_sections(code, texte, classe_id) SELECT code, texte, classe_id from w_clasec_2 where 1=1 and classe_id = (select oid from rh.t_classes where code = 'PLANIV2') and code not in (select code from rh.t_classes_sections where t_classes_sections.classe_id = w_clasec_2.classe_id and code is not null) group by 1,2,3 ; update rh.t_classes_sections set texte = w_clasec_2.texte FROM w_clasec_2 WHERE true and w_clasec_2.classe_id = t_classes_sections.classe_id and w_clasec_2.code = t_classes_sections.code and w_clasec_2.texte is distinct from t_classes_sections.texte ; -- Mise à jour du contenu des sections Niveau 2. INSERT INTO rh.t_classes_sections_elements (section_id, to_id) SELECT t_classes_sections.oid AS section_id, t_planning_niveau.oid AS to_id FROM rh.t_classes join rh.t_classes_sections on t_classes_sections.classe_id = t_classes.oid join w_clasec_2 on true and w_clasec_2.classe_id = t_classes.oid and w_clasec_2.code = t_classes_sections.code join rh.t_planning_niveau on split_part(t_planning_niveau.code_original, '|', 1)||'|'||split_part(t_planning_niveau.code_original, '|', 2) = w_clasec_2.code_original WHERE t_classes.code = 'PLANIV2' group by 1,2 ; -- Mise à jour des sections Niveau 3. DROP TABLE IF EXISTS w_clasec_3 ; SELECT base.cti_execute('CREATE TEMP TABLE w_clasec_3 AS with nb_niv as ( select eqp_code, count(DISTINCT eqp_lib) as niv_count from prod_cegi.GNEQP group by 1 ) SELECT CASE WHEN niv_count = 1 THEN GNEQP.eqp_code ELSE site_code || ''|'' || COALESCE(GNTYPEQP.typeqp_code,''NR'') || ''|'' || GNEQP.eqp_code END as code, site_code || ''|'' || COALESCE(GNTYPEQP.typeqp_code,''NR'') || ''|'' || GNEQP.eqp_code as code_original, eqp_lib as texte, (select oid from rh.t_classes where code = ''PLANIV3'') as classe_id FROM prod_cegi.GNSITE JOIN prod_cegi.GNEQP ON GNSITE.site_id = GNEQP.site_id LEFT JOIN prod_cegi.GNTYPEQP ON GNEQP.typeqp_code = GNTYPEQP.typeqp_code JOIN nb_niv ON nb_niv.eqp_code = GNEQP.eqp_code group by 1,2,3',1) WHERE (SELECT code FROM rh.t_divers WHERE code = 'CEGI_SITE_SERVICE' and valeur = '0') IS NOT NULL; ; SELECT base.cti_execute('CREATE TEMP TABLE w_clasec_3 AS SELECT planning_code || ''|'' || site_code || ''|'' || GNEQP.eqp_code as code, planning_code || ''|'' || site_code || ''|'' || GNEQP.eqp_code as code_original, eqp_lib as texte, (select oid from rh.t_classes where code = ''PLANIV3'') as classe_id FROM prod_cegi.GNSITE JOIN prod_cegi.GNEQP ON GNSITE.site_id = GNEQP.site_id JOIN rh.t_etablissements ON t_etablissements.planning_code != ''*'' group by 1,2,3',1) WHERE (SELECT code FROM rh.t_divers WHERE code = 'CEGI_SITE_SERVICE' and valeur = '1') IS NOT NULL; ; INSERT INTO rh.t_classes_sections(code, texte, classe_id) SELECT code, texte, classe_id from w_clasec_3 where 1=1 and classe_id = (select oid from rh.t_classes where code = 'PLANIV3') and code not in (select code from rh.t_classes_sections where t_classes_sections.classe_id = w_clasec_3.classe_id and code is not null) group by 1,2,3 ; update rh.t_classes_sections set texte = w_clasec_3.texte FROM w_clasec_3 WHERE true and w_clasec_3.classe_id = t_classes_sections.classe_id and w_clasec_3.code = t_classes_sections.code and w_clasec_3.texte is distinct from t_classes_sections.texte ; -- Mise à jour du contenu des sections Niveau 3. INSERT INTO rh.t_classes_sections_elements (section_id, to_id) SELECT t_classes_sections.oid AS section_id, t_planning_niveau.oid AS to_id FROM rh.t_classes join rh.t_classes_sections on t_classes_sections.classe_id = t_classes.oid join w_clasec_3 on true and w_clasec_3.classe_id = t_classes.oid and w_clasec_3.code = t_classes_sections.code join rh.t_planning_niveau on t_planning_niveau.code_original = w_clasec_3.code_original WHERE t_classes.code = 'PLANIV3' group by 1,2 ; SELECT rh.cti_update_schema_classes('*ALL') ; -- Poles SELECT rh.cti_reorganize_pole() ; -- Recensement des oid utilisés. INSERT INTO rh.p_oids (code_table, oid) SELECT 'planning_service', service_id FROM rh.p_planning_mouvement WHERE service_id NOT IN (SELECT oid FROM rh.p_oids WHERE code_table = 'planning_service') GROUP BY 1,2 ; INSERT INTO rh.p_oids (code_table, oid) SELECT 'planning_qualification', qualification_id FROM rh.p_planning_mouvement WHERE qualification_id NOT IN (SELECT oid FROM rh.p_oids WHERE code_table = 'planning_qualification') GROUP BY 1,2 ; INSERT INTO rh.p_oids (code_table, oid) SELECT 'planning_niveau', niveau_id FROM rh.p_planning_mouvement WHERE niveau_id NOT IN (SELECT oid FROM rh.p_oids WHERE code_table = 'planning_niveau') GROUP BY 1,2 ; INSERT INTO rh.p_oids (code_table, oid) SELECT 'planning_type_absence', type_absence_id FROM rh.p_planning_mouvement WHERE type_absence_id NOT IN (SELECT oid FROM rh.p_oids WHERE code_table = 'planning_type_absence') GROUP BY 1,2 ; ]]>