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
;
]]>