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_planning join rh.p_contrats_mois on 1=1 and p_contrats_mois.salarie_id = w_planning.salarie_id and w_planning.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_planning.contrat_id is null OR w_planning.contrat_mois_id is null group by 1) UPDATE w_planning SET contrat_id = w_asso.contrat_id, contrat_mois_id = w_asso.contrat_mois_id FROM w_asso WHERE w_planning.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_planning join rh.p_contrats_mois on 1=1 and p_contrats_mois.salarie_id = w_planning.salarie_id and p_contrats_mois.date_debut > w_planning.date -- Sélection des contrats APRES heures planning. where 1!=1 OR w_planning.contrat_id is null OR w_planning.contrat_mois_id is null group by 1) UPDATE w_planning SET contrat_id = w_asso.contrat_id, contrat_mois_id = w_asso.contrat_mois_id FROM w_asso WHERE w_planning.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_planning join rh.p_contrats_mois on 1=1 and p_contrats_mois.salarie_id = w_planning.salarie_id and p_contrats_mois.date_debut < w_planning.date -- Sélection des contrats AVANT heures planning. where 1!=1 OR w_planning.contrat_id is null OR w_planning.contrat_mois_id is null group by 1) UPDATE w_planning SET contrat_id = w_asso.contrat_id, contrat_mois_id = w_asso.contrat_mois_id FROM w_asso WHERE w_planning.cptres1_id = w_asso.cptres1_id ; -- Création d'index. CREATE INDEX w_planning_i_contrat_id ON w_planning USING btree (contrat_id) ; CREATE INDEX w_planning_i_contrat_mois_id ON w_planning USING btree (contrat_mois_id) ; CREATE INDEX w_planning_i_date ON w_planning USING btree (date) ; CREATE INDEX w_planning_i_salarie_id ON w_planning USING btree (salarie_id) ; ]]> 1 AND temps_du_initial > 0 THEN temps_du_initial / array_length(absences_codes, 1) ELSE temps_du_initial END AS temps_du_initial_final, CASE WHEN array_length(absences_codes, 1) > 1 AND temps_du > 0 THEN temps_du / array_length(absences_codes, 1) ELSE temps_du END AS temps_du_final, CASE WHEN array_length(absences_codes, 1) > 1 AND temps_valide > 0 THEN temps_valide / array_length(absences_codes, 1) ELSE temps_valide END AS temps_valide_final, temps_absence AS temps_absence_final, temps_presence AS temps_presence_final FROM unnested ; -- Alimentation de la table de mouvement. TRUNCATE rh.p_planning_mouvement ; INSERT INTO rh.p_planning_mouvement( salarie_id, contrat_id, contrat_mois_id, date, semaine, mois, etablissement_id, -- @todo à renseigner en fonction du paramétrage dans t_divers. service_id, qualification_id, type_absence_id, niveau_id, code_horaire_id, temps_du_initial, temps_du, temps_du_ajuste, temps_valide, temps_valide_ajuste, temps_presence, temps_presence_ajuste, temps_absence, temps_absence_ajuste) SELECT w_planning_et_absences.salarie_id, w_planning_et_absences.contrat_id, w_planning_et_absences.contrat_mois_id, w_planning_et_absences.date, w_planning_et_absences.semaine, w_planning_et_absences.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, ROUND(w_planning_et_absences.temps_du_initial_final / 60, 4) AS temps_du_initial, ROUND(w_planning_et_absences.temps_du_final / 60, 4) AS temps_du, ROUND(w_planning_et_absences.temps_du_final / 60, 4) AS temps_du_ajuste, ROUND(w_planning_et_absences.temps_valide_final / 60, 4) AS temps_valide, ROUND(w_planning_et_absences.temps_valide_final / 60, 4) AS temps_valide_ajuste, ROUND(w_planning_et_absences.temps_presence_final / 60, 4) AS temps_presence, ROUND(w_planning_et_absences.temps_presence_final / 60, 4) AS temps_presence_ajuste, ROUND(w_planning_et_absences.temps_absence_final / 60, 4) AS temps_absence, ROUND(w_planning_et_absences.temps_absence_final / 60, 4) AS temps_absence_ajuste FROM w_planning_et_absences JOIN rh.p_salaries ON p_salaries.oid = w_planning_et_absences.salarie_id JOIN w_entets ON w_entets.entreprise_id = p_salaries.entreprise_id LEFT JOIN rh.t_planning_niveau ON t_planning_niveau.code_original = w_planning_et_absences.niveau_code--_original LEFT JOIN rh.t_planning_service ON t_planning_service.code_original = w_planning_et_absences.service_code--_original LEFT JOIN rh.t_planning_qualification ON t_planning_qualification.code_original = w_planning_et_absences.qualification_code LEFT JOIN rh.t_planning_type_absence ON t_planning_type_absence.code_original = w_planning_et_absences.absence_code LEFT JOIN rh.t_planning_code_horaire ON t_planning_code_horaire.code_original = w_planning_et_absences.horaire_code GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21 ; VACUUM ANALYSE rh.p_planning_mouvement ; ]]>