|
|
return: text
|
|
|
lang: plpgsql
|
|
|
src: |
|
|
|
DECLARE
|
|
|
_sqlcmd TEXT;
|
|
|
result TEXT;
|
|
|
BEGIN
|
|
|
-- Initialisation du nouveau champ
|
|
|
UPDATE rh.p_salaries
|
|
|
SET salarie_fusionne_id = 0
|
|
|
WHERE salarie_fusionne_id IS NULL;
|
|
|
UPDATE rh.p_salaries
|
|
|
SET salarie_fusionne_id = 0
|
|
|
WHERE salarie_fusionne_id <> 0 AND
|
|
|
salarie_fusionne_id NOT IN (SELECT oid FROM rh.p_salaries);
|
|
|
|
|
|
-- Paramétrés
|
|
|
INSERT INTO rh.t_divers (code, texte, valeur, description)
|
|
|
SELECT
|
|
|
'FUSIONSALARIE',
|
|
|
'Fusion des salariés',
|
|
|
'0',
|
|
|
'1 = Fusion des salariés activée'
|
|
|
WHERE 'FUSIONSALARIE' NOT IN (SELECT code FROM rh.t_divers);
|
|
|
IF NOT EXISTS (SELECT *
|
|
|
FROM rh.t_divers
|
|
|
WHERE t_divers.code = 'FUSIONSALARIE' AND
|
|
|
t_divers.valeur = '1'
|
|
|
LIMIT 1) THEN
|
|
|
return 'Fusion non activée';
|
|
|
END IF;
|
|
|
-- Stockage des salaries par nom
|
|
|
DROP TABLE IF EXISTS w_fusion_salaries;
|
|
|
CREATE TEMP TABLE w_fusion_salaries AS
|
|
|
SELECT *,
|
|
|
'0'::text AS origine,
|
|
|
base.cti_soundex_nom(nom) AS nom_soundex,
|
|
|
base.cti_soundex_prenom(prenom) AS prenom_soundex
|
|
|
FROM rh.p_salaries
|
|
|
WHERE nom <> '' AND
|
|
|
(nom_naissance = nom OR nom_naissance = '') AND
|
|
|
oid IN (SELECT salarie_id FROM rh.p_contrats);
|
|
|
-- Stockage des salaries par nom de naissance
|
|
|
INSERT INTO w_fusion_salaries
|
|
|
SELECT *,
|
|
|
'1'::text AS origine,
|
|
|
base.cti_soundex_nom(nom_naissance) AS nom_soundex,
|
|
|
base.cti_soundex_prenom(prenom) AS prenom_soundex
|
|
|
FROM rh.p_salaries
|
|
|
WHERE nom <> '' AND
|
|
|
nom_naissance <> '' AND
|
|
|
nom_naissance <> nom AND
|
|
|
oid IN (SELECT salarie_id FROM rh.p_contrats);
|
|
|
|
|
|
-- Détection salariés à regrouper et regrouper sur le plus récent
|
|
|
UPDATE rh.p_salaries
|
|
|
SET salarie_fusionne_id = CASE WHEN p_salaries.oid <> subview.salarie_fusionne_id THEN subview.salarie_fusionne_id ELSE 0 END
|
|
|
FROM
|
|
|
(
|
|
|
SELECT
|
|
|
w_fusion_salaries.oid,
|
|
|
subview.salarie_fusionne_id,
|
|
|
w_fusion_salaries.entreprise_id,
|
|
|
w_fusion_salaries.nom_soundex,
|
|
|
w_fusion_salaries.prenom_soundex,
|
|
|
w_fusion_salaries.date_naissance,
|
|
|
w_fusion_salaries.sexe
|
|
|
FROM w_fusion_salaries
|
|
|
JOIN
|
|
|
(
|
|
|
SELECT
|
|
|
entreprise_id,
|
|
|
nom_soundex,
|
|
|
prenom_soundex,
|
|
|
date_naissance,
|
|
|
sexe,
|
|
|
count(*) AS nb,
|
|
|
(MAX(ARRAY[date_debut::text,oid::text]))[2]::bigint AS salarie_fusionne_id,
|
|
|
base.cti_array_accum(w_fusion_salaries.oid) AS salaries_array
|
|
|
FROM w_fusion_salaries
|
|
|
GROUP BY 1,2,3,4,5
|
|
|
HAVING count(*) > 1
|
|
|
) subview ON
|
|
|
w_fusion_salaries.oid = ANY(salaries_array)
|
|
|
ORDER BY 1,2,3,4,5,6
|
|
|
) subview
|
|
|
WHERE subview.oid = p_salaries.oid
|
|
|
;
|
|
|
|
|
|
-- Mise à jour du salarié cible
|
|
|
UPDATE rh.p_salaries SET
|
|
|
date_debut = subview.date_debut,
|
|
|
date_fin = subview.date_fin,
|
|
|
date_entree_ets = subview.date_entree_ets,
|
|
|
date_entree_fp = subview.date_entree_fp,
|
|
|
date_entree_fph = subview.date_entree_fph,
|
|
|
date_sortie_ets = subview.date_sortie_ets
|
|
|
FROM
|
|
|
(
|
|
|
SELECT
|
|
|
CASE WHEN salarie_fusionne_id <> 0 THEN salarie_fusionne_id ELSE oid END,
|
|
|
MIN(date_debut) AS date_debut,
|
|
|
MAX(date_fin) AS date_fin,
|
|
|
MIN(date_entree_ets) AS date_entree_ets,
|
|
|
MIN(date_entree_fp) AS date_entree_fp,
|
|
|
MIN(date_entree_fph) AS date_entree_fph,
|
|
|
MAX(date_sortie_ets) AS date_sortie_ets
|
|
|
FROM rh.p_salaries
|
|
|
GROUP BY 1
|
|
|
HAVING COUNT(*) > 1
|
|
|
) subview
|
|
|
WHERE p_salaries.oid = subview.oid;
|
|
|
-- Mise à jour référence salarié dans contrats
|
|
|
UPDATE rh.p_contrats
|
|
|
SET salarie_id = p_salaries.salarie_fusionne_id
|
|
|
FROM rh.p_salaries
|
|
|
WHERE p_contrats.salarie_id = p_salaries.oid AND
|
|
|
salarie_fusionne_id <> 0 AND
|
|
|
salarie_fusionne_id <> salarie_id;
|
|
|
UPDATE rh.p_contrats
|
|
|
SET salarie_remplace_id = p_salaries.salarie_fusionne_id
|
|
|
FROM rh.p_salaries
|
|
|
WHERE p_contrats.salarie_remplace_id <> 0 AND
|
|
|
p_contrats.salarie_remplace_id = p_salaries.oid AND
|
|
|
salarie_fusionne_id <> 0 AND
|
|
|
salarie_fusionne_id <> salarie_remplace_id;
|
|
|
--fusion ancienneté sans prendre en compte l'entreprise
|
|
|
INSERT INTO rh.t_divers (code, texte, valeur, description)
|
|
|
SELECT
|
|
|
'FUSIONENTREESALARIE',
|
|
|
'Fusion des dates entrées salariés (quelque soit entreprise)',
|
|
|
'0',
|
|
|
'1 = Fusion des dates entrée salariés activée'
|
|
|
WHERE 'FUSIONENTREESALARIE' NOT IN (SELECT code FROM rh.t_divers);
|
|
|
-- Mise à jour du salarié cible
|
|
|
UPDATE rh.p_salaries SET
|
|
|
date_entree_ets = subview.date_entree_ets
|
|
|
FROM
|
|
|
(
|
|
|
SELECT
|
|
|
w_fusion_salaries.nom_soundex,
|
|
|
w_fusion_salaries.prenom_soundex,
|
|
|
w_fusion_salaries.date_naissance,
|
|
|
w_fusion_salaries.sexe,
|
|
|
(MAX(ARRAY[date_debut::text,oid::text]))[2]::bigint AS salarie_fusionne_id,
|
|
|
base.cti_array_accum(w_fusion_salaries.oid) AS salaries_array,
|
|
|
MIN(date_debut) AS date_debut,
|
|
|
MAX(date_fin) AS date_fin,
|
|
|
MIN(date_entree_ets) AS date_entree_ets,
|
|
|
MIN(date_entree_fp) AS date_entree_fp,
|
|
|
MIN(date_entree_fph) AS date_entree_fph,
|
|
|
MAX(date_sortie_ets) AS date_sortie_ets
|
|
|
FROM w_fusion_salaries
|
|
|
GROUP BY 1,2,3,4
|
|
|
HAVING COUNT(*) > 1
|
|
|
) subview
|
|
|
WHERE p_salaries.oid = ANY(salaries_array)
|
|
|
AND (SELECT valeur = 1 FROM rh.t_divers WHERE code = 'FUSIONENTREESALARIE');
|
|
|
|
|
|
UPDATE rh.p_contrats SET
|
|
|
anciennete_anterieure_jours = subview.anciennete_anterieure_jours,
|
|
|
anciennete_anterieure_calculee_mois = subview.anciennete_anterieure_calculee_mois
|
|
|
FROM
|
|
|
(
|
|
|
SELECT p_contrats.oid,
|
|
|
SUM(p_contrats_anterieurs.date_fin-p_contrats_anterieurs.date_debut+1) AS anciennete_anterieure_jours,
|
|
|
floor(SUM(p_contrats_anterieurs.date_fin-p_contrats_anterieurs.date_debut+1)/30.00) AS anciennete_anterieure_calculee_mois
|
|
|
FROM rh.p_contrats
|
|
|
JOIN rh.p_contrats p_contrats_anterieurs ON
|
|
|
p_contrats_anterieurs.salarie_id = p_contrats.salarie_id AND
|
|
|
p_contrats_anterieurs.etablissement_id = p_contrats.etablissement_id AND
|
|
|
p_contrats_anterieurs.date_debut < p_contrats.date_debut
|
|
|
WHERE p_contrats.salarie_id <> 0 AND
|
|
|
p_contrats.salarie_id IN (SELECT salarie_fusionne_id FROM rh.p_salaries)
|
|
|
|
|
|
GROUP BY 1
|
|
|
) subview
|
|
|
WHERE p_contrats.oid = subview.oid;
|
|
|
-- Mise à jour référence salarié dans contrats mois
|
|
|
UPDATE rh.p_contrats_mois
|
|
|
SET salarie_id = p_salaries.salarie_fusionne_id
|
|
|
FROM rh.p_salaries
|
|
|
WHERE p_contrats_mois.salarie_id = p_salaries.oid AND
|
|
|
salarie_fusionne_id <> 0 AND
|
|
|
salarie_fusionne_id <> p_contrats_mois.salarie_id;
|
|
|
UPDATE rh.p_contrats_mois SET
|
|
|
anciennete_jours = p_contrats_mois.date_fin - p_contrats.date_debut + 1 + p_contrats.anciennete_anterieure_jours,
|
|
|
anciennete_mois = floor((p_contrats_mois.date_fin - p_contrats.date_debut + 1 + p_contrats.anciennete_anterieure_jours)/30.00),
|
|
|
anciennete_annee_id = floor((p_contrats_mois.date_fin - p_contrats.date_debut + 1 + p_contrats.anciennete_anterieure_jours)/365.25),
|
|
|
nombre_entrees = CASE WHEN date_entree_ets BETWEEN p_contrats_mois.date_debut AND p_contrats_mois.date_fin THEN 1 ELSE 0 END
|
|
|
FROM rh.p_contrats
|
|
|
JOIN rh.p_salaries ON p_contrats.salarie_id = p_salaries.oid
|
|
|
WHERE p_contrats_mois.contrat_id = p_contrats.oid AND
|
|
|
p_contrats.salarie_id IN (SELECT salarie_fusionne_id FROM rh.p_salaries)
|
|
|
;
|
|
|
UPDATE rh.p_contrats_mois
|
|
|
SET nombre_entrees = 0
|
|
|
FROM
|
|
|
(SELECT salarie_id, (MIN(Array[date_debut::text, oid::text]))[2] AS oid_ok FROM rh.p_contrats_mois WHERE nombre_entrees = 1 GROUP BY 1 HAVING count(*) > 1) subview
|
|
|
WHERE p_contrats_mois.salarie_id = subview.salarie_id AND
|
|
|
p_contrats_mois.nombre_entrees = 1 AND
|
|
|
p_contrats_mois.oid <> oid_ok
|
|
|
;
|
|
|
|
|
|
UPDATE rh.p_profil_contrat_mois
|
|
|
SET salarie_id = p_salaries.salarie_fusionne_id
|
|
|
FROM rh.p_salaries
|
|
|
WHERE p_profil_contrat_mois.salarie_id = p_salaries.oid AND
|
|
|
salarie_fusionne_id <> 0 AND
|
|
|
salarie_fusionne_id <> p_profil_contrat_mois.salarie_id;
|
|
|
-- Mise à jour référence salarié dans autres tables
|
|
|
UPDATE rh.p_historique_paie
|
|
|
SET salarie_id = p_salaries.salarie_fusionne_id
|
|
|
FROM rh.p_salaries
|
|
|
WHERE p_historique_paie.salarie_id = p_salaries.oid AND
|
|
|
salarie_fusionne_id <> 0 AND
|
|
|
salarie_fusionne_id <> p_historique_paie.salarie_id;
|
|
|
UPDATE rh.p_accident_travail
|
|
|
SET salarie_id = p_salaries.salarie_fusionne_id
|
|
|
FROM rh.p_salaries
|
|
|
WHERE p_accident_travail.salarie_id = p_salaries.oid AND
|
|
|
salarie_fusionne_id <> 0 AND
|
|
|
salarie_fusionne_id <> p_accident_travail.salarie_id;
|
|
|
UPDATE rh.p_arrets_travail
|
|
|
SET salarie_id = p_salaries.salarie_fusionne_id
|
|
|
FROM rh.p_salaries
|
|
|
WHERE p_arrets_travail.salarie_id = p_salaries.oid AND
|
|
|
salarie_fusionne_id <> 0 AND
|
|
|
salarie_fusionne_id <> p_arrets_travail.salarie_id;
|
|
|
UPDATE rh.p_arrets_travail_mois
|
|
|
SET salarie_id = p_salaries.salarie_fusionne_id
|
|
|
FROM rh.p_salaries
|
|
|
WHERE p_arrets_travail_mois.salarie_id = p_salaries.oid AND
|
|
|
salarie_fusionne_id <> 0 AND
|
|
|
salarie_fusionne_id <> p_arrets_travail_mois.salarie_id;
|
|
|
UPDATE rh.p_formations
|
|
|
SET salarie_id = p_salaries.salarie_fusionne_id
|
|
|
FROM rh.p_salaries
|
|
|
WHERE p_formations.salarie_id = p_salaries.oid AND
|
|
|
salarie_fusionne_id <> 0 AND
|
|
|
salarie_fusionne_id <> p_formations.salarie_id;
|
|
|
UPDATE rh.p_handicap
|
|
|
SET salarie_id = p_salaries.salarie_fusionne_id
|
|
|
FROM rh.p_salaries
|
|
|
WHERE p_handicap.salarie_id = p_salaries.oid AND
|
|
|
salarie_fusionne_id <> 0 AND
|
|
|
salarie_fusionne_id <> p_handicap.salarie_id;
|
|
|
UPDATE rh.p_visites_medicales
|
|
|
SET salarie_id = p_salaries.salarie_fusionne_id
|
|
|
FROM rh.p_salaries
|
|
|
WHERE p_visites_medicales.salarie_id = p_salaries.oid AND
|
|
|
salarie_fusionne_id <> 0 AND
|
|
|
salarie_fusionne_id <> p_visites_medicales.salarie_id;
|
|
|
|
|
|
RETURN 'OK';
|
|
|
END;
|