|
|
return: text
|
|
|
lang: plpgsql
|
|
|
src: |
|
|
|
DECLARE
|
|
|
_sqlcmd TEXT;
|
|
|
result TEXT;
|
|
|
BEGIN
|
|
|
-- Le nom_naissance dans certains prestataires est récupéré sous le format NULL pour indiquer la non saisie de ce champ
|
|
|
-- Historiquement dans les prestataires, le nom_naissance non renseigné était enregistré au format chaîne vide ('')
|
|
|
-- Les requêtes suivantes et la table p_personne attendent que la colonne nom_naissance soit au format chaîne lorsque vide
|
|
|
UPDATE rh.p_salaries
|
|
|
SET nom_naissance = ''
|
|
|
WHERE nom_naissance IS NULL
|
|
|
;
|
|
|
|
|
|
-- Extraction 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);
|
|
|
-- Extraction 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);
|
|
|
|
|
|
-- Table temporaire des personnes avec
|
|
|
-- regroupement par nom/nom_naissance, prénom, date_naissance, sexe
|
|
|
-- identifiant md5 (clé de la personne) utilisant nom de naissance
|
|
|
DROP TABLE IF EXISTS w_personne;
|
|
|
CREATE TEMP TABLE w_personne AS
|
|
|
SELECT COALESCE(salarie_courant_id, w_fusion_salaries.oid) AS salarie_courant_id,
|
|
|
md5(
|
|
|
MAX(
|
|
|
CASE WHEN w_fusion_salaries.oid = salarie_courant_id OR subview.salarie_courant_id IS NULL
|
|
|
THEN base.cti_soundex_nom(CASE WHEN nom_naissance <> '' THEN nom_naissance ELSE nom END)
|
|
|
|| base.cti_soundex_prenom(prenom)
|
|
|
|| w_fusion_salaries.date_naissance
|
|
|
|| w_fusion_salaries.sexe
|
|
|
ELSE NULL END)
|
|
|
) AS cle_interne,
|
|
|
MAX(CASE WHEN w_fusion_salaries.oid = salarie_courant_id OR subview.salarie_courant_id IS NULL THEN w_fusion_salaries.nom ELSE NULL END) AS nom,
|
|
|
MAX(CASE WHEN w_fusion_salaries.oid = salarie_courant_id OR subview.salarie_courant_id IS NULL THEN w_fusion_salaries.nom_naissance ELSE NULL END) AS nom_naissance,
|
|
|
MAX(CASE WHEN w_fusion_salaries.oid = salarie_courant_id OR subview.salarie_courant_id IS NULL THEN w_fusion_salaries.prenom ELSE NULL END) AS prenom,
|
|
|
MAX(w_fusion_salaries.date_naissance) AS date_naissance,
|
|
|
MAX(w_fusion_salaries.sexe) AS sexe,
|
|
|
MAX(CASE WHEN w_fusion_salaries.oid = salarie_courant_id OR subview.salarie_courant_id IS NULL THEN w_fusion_salaries.matricule ELSE NULL END) AS matricule_courant,
|
|
|
MAX(
|
|
|
CASE
|
|
|
WHEN w_fusion_salaries.oid = subview.salarie_courant_id THEN salarie_array_id
|
|
|
WHEN subview.salarie_courant_id IS NULL THEN Array[w_fusion_salaries.oid]
|
|
|
ELSE NULL END
|
|
|
) AS salarie_array_id
|
|
|
FROM w_fusion_salaries
|
|
|
LEFT JOIN
|
|
|
(
|
|
|
SELECT
|
|
|
nom_soundex,
|
|
|
prenom_soundex,
|
|
|
date_naissance,
|
|
|
sexe,
|
|
|
count(*) AS nb,
|
|
|
(MAX(ARRAY[date_debut::text,oid::text]))[2]::bigint AS salarie_courant_id,
|
|
|
base.cti_array_accum(w_fusion_salaries.oid) AS salarie_array_id
|
|
|
FROM w_fusion_salaries
|
|
|
GROUP BY 1,2,3,4
|
|
|
HAVING count(*) > 1
|
|
|
) subview ON
|
|
|
w_fusion_salaries.oid = ANY(salarie_array_id)
|
|
|
GROUP BY 1
|
|
|
;
|
|
|
|
|
|
-- Mise à jour table p_personnes
|
|
|
UPDATE rh.p_personne SET
|
|
|
nom = w_personne.nom,
|
|
|
nom_naissance = w_personne.nom_naissance,
|
|
|
prenom = w_personne.prenom,
|
|
|
salarie_courant_id = w_personne.salarie_courant_id,
|
|
|
salarie_array_id = w_personne.salarie_array_id,
|
|
|
matricule_courant = w_personne.matricule_courant
|
|
|
FROM w_personne
|
|
|
WHERE p_personne.cle_interne = w_personne.cle_interne AND
|
|
|
(
|
|
|
p_personne.nom IS DISTINCT FROM w_personne.nom OR
|
|
|
p_personne.nom_naissance IS DISTINCT FROM w_personne.nom_naissance OR
|
|
|
p_personne.prenom IS DISTINCT FROM w_personne.prenom OR
|
|
|
p_personne.salarie_courant_id IS DISTINCT FROM w_personne.salarie_courant_id OR
|
|
|
p_personne.salarie_array_id IS DISTINCT FROM w_personne.salarie_array_id OR
|
|
|
p_personne.matricule_courant IS DISTINCT FROM w_personne.matricule_courant
|
|
|
)
|
|
|
;
|
|
|
|
|
|
INSERT INTO rh.p_personne (cle_interne, nom, nom_naissance, prenom, date_naissance, sexe, salarie_courant_id, salarie_array_id, matricule_courant)
|
|
|
SELECT cle_interne, nom, nom_naissance, prenom, date_naissance, sexe, salarie_courant_id, salarie_array_id, matricule_courant
|
|
|
FROm w_personne
|
|
|
WHERE cle_interne NOT IN
|
|
|
(SELECT cle_interne FROM rh.p_personne)
|
|
|
;
|
|
|
|
|
|
-- Mise à jour table p_salaries
|
|
|
UPDATE rh.p_salaries SET
|
|
|
personne_id = p_personne.oid
|
|
|
FROM rh.p_personne
|
|
|
WHERE p_salaries.oid = ANY(p_personne.salarie_array_id)
|
|
|
;
|
|
|
|
|
|
RETURN 'OK';
|
|
|
END;
|