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;