You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

120 lines
4.8 KiB

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;