Loading doc/release-notes/8.1.0/01_individu_role_etablissement.sql +121 −0 Changes for doc/release-notes/8.1.0/01_individu_role_etablissement.sql: 121 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -77,6 +77,127 @@ select privilege__grant_privilege_to_profile('acteur', 'modifier-acteur-de-toute select privilege__grant_privilege_to_profile('acteur', 'modifier-acteur-de-toutes-theses', 'ADMIN_TECH'); -- drop function substit_fetch_data_for_substituant_individu; create or replace function substit_fetch_data_for_substituant_individu(p_npd character varying) returns TABLE(type character varying, civilite character varying, nom_patronymique character varying, nom_usuel character varying, prenom1 character varying, prenom2 character varying, prenom3 character varying, email character varying, date_naissance timestamp without time zone, nationalite character varying, supann_id character varying, pays_id_nationalite bigint) language plpgsql as $$begin -- -- Détermination des meilleures valeurs d'attributs des enregistrements en doublon en vue de les affecter à -- l'enregistrement substituant. -- -- Pour chaque attribut, la stratégie de choix de la "meilleure" valeur est la fonction 'mode()' -- (cf. https://www.postgresql.org/docs/current/functions-aggregate). -- -- NB : les enregistrements en doublon sont ceux ayant le même NPD et n'appartenant pas à la source -- correspondnant à l'application. -- NB : Les historisés ne sont pas écartés puisqu'ils peuvent être des enregistrements déjà subsitués. -- raise notice 'Calcul des meilleures valeurs d''attributs parmi les doublons dont le NPD est %...', p_npd; return query select mode() within group (order by i.type) as type, mode() within group (order by i.civilite) as civilite, mode() within group (order by trim(i.nom_patronymique)::varchar) as nom_patronymique, mode() within group (order by trim(i.nom_usuel)::varchar) as nom_usuel, mode() within group (order by trim(i.prenom1)::varchar) as prenom1, mode() within group (order by trim(i.prenom2)::varchar) as prenom2, mode() within group (order by trim(i.prenom3)::varchar) as prenom3, mode() within group (order by trim(i.email)::varchar) as email, mode() within group (order by i.date_naissance) as date_naissance, mode() within group (order by i.nationalite) as nationalite, mode() within group (order by i.supann_id) as supann_id, mode() within group (order by i.pays_id_nationalite) as pays_id_nationalite from individu i join v_individu_doublon v on v.id = i.id and v.npd = p_npd group by v.npd; end; $$; create or replace function public.substit_create_substituant_individu(data record) returns bigint language plpgsql as $$declare substituant_id bigint; begin -- -- Création d'un enregistrement "susbtituant", càd se substituant à plusieurs enregistrements considérés en doublon, -- à partir des valeurs d'attributs spécifiées. -- raise notice 'Insertion du substituant à partir des données %', data; insert into individu (id, source_id, source_code, histo_createur_id, type, civilite, nom_patronymique, nom_usuel, prenom1, prenom2, prenom3, email, date_naissance, nationalite, supann_id, pays_id_nationalite) select nextval('individu_id_seq') as id, app_source_id() as source_id, app_source_source_code() as source_code, app_utilisateur_id(), data.type, data.civilite, data.nom_patronymique, data.nom_usuel, data.prenom1, data.prenom2, data.prenom3, data.email, data.date_naissance, data.nationalite, data.supann_id, data.pays_id_nationalite returning id into substituant_id; raise notice '=> Substituant %', substituant_id; return substituant_id; end $$; create or replace function public.substit_update_substituant_individu(p_substituant_id bigint, data record) returns void language plpgsql as $$begin -- -- Mise à jour des attributs de l'enregistrement substituant spécifié, à partir des valeurs spécifiées. -- update individu set histo_modification = current_timestamp, histo_modificateur_id = app_utilisateur_id(), type = data.type, civilite = data.civilite, nom_patronymique = data.nom_patronymique, nom_usuel = data.nom_usuel, prenom1 = data.prenom1, prenom2 = data.prenom2, prenom3 = data.prenom3, email = data.email, date_naissance = data.date_naissance, nationalite = data.nationalite, supann_id = data.supann_id, pays_id_nationalite = data.pays_id_nationalite where id = p_substituant_id; end $$; -- -- Vue utile quand il faudra créer à la main les 'individu_role_etablissement' pour remplacer le bricolage des Loading doc/release-notes/8.1.0/05_substitutions.sql 0 → 100644 +59 −0 Changes for doc/release-notes/8.1.0/05_substitutions.sql: 59 added lines, 0 removed lines. Original line number Diff line number Diff line -- -- Petite amélioration en évitant un calcul inutile du NPD. -- create or replace function substit_update_substitution_if_exists(type character varying, p_substitue record) returns boolean language plpgsql as $$declare v_npd varchar(256); v_count int; v_data record; v_substit_record record; begin -- -- Recherche et mise à jour de la substitution existante spécifiée par l'enregistrement substitué. -- -- Retourne `true` s'il n'y a plus rien à faire (càd que le cas de l'enregistrement est traité) ; -- ou `false` dans le cas où il faudra rechercher si l'enregistrement est en doublon et doit faire l'objet -- d'une nouvelle substitution. -- raise notice 'Recherche si l''enregistrement % est substitué...', p_substitue.id; execute format('select * from substit_%s where from_id = %s', type, p_substitue.id) into v_substit_record; if v_substit_record.to_id is null then raise notice '=> Aucune substitution trouvée.'; return false; end if; if p_substitue.source_id = app_source_id() then raise notice '=> Oui mais l''enregistrement est dans la source application.'; raise notice '=> Retrait de l''enregistrement et mise à jour du substituant...'; perform substit_remove_from_substitution(type, v_substit_record.from_id, v_substit_record.to_id); return true; else -- -- calcul du npd de l'enregistrement (sauf si le npd est forcé). -- execute format('select coalesce($1, substit_npd_%s($2))', type) using p_substitue.npd_force, p_substitue into v_npd; if v_substit_record.npd <> v_npd then raise notice '=> Oui mais le NPD de l''enregistrement (%) a changé par rapport à celui de la substitution (%).', v_npd, v_substit_record.npd; raise notice '=> Retrait de l''enregistrement et mise à jour du substituant...'; perform substit_remove_from_substitution(type, v_substit_record.from_id, v_substit_record.to_id); return false; elseif v_substit_record.npd = v_npd then raise notice '=> Oui et le NPD de l''enregistrement égale celui de la substitution (%).', v_npd; raise notice '=> Mise à jour de l''enregistrement substituant...'; execute format('select count(*) from substit_fetch_data_for_substituant_%s(%L) limit 1', type, v_npd) into v_count; if v_count = 0 then raise exception 'Impossible de mettre à jour le substituant car aucun doublon de type % trouvé avec le NPD %', type, v_npd; end if; execute format('select * from substit_fetch_data_for_substituant_%s(%L) limit 1', type, v_npd) into v_data; perform substit_update_substituant(type, v_substit_record.to_id, v_data); return true; end if; end if; return false; end $$; Loading
doc/release-notes/8.1.0/01_individu_role_etablissement.sql +121 −0 Changes for doc/release-notes/8.1.0/01_individu_role_etablissement.sql: 121 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -77,6 +77,127 @@ select privilege__grant_privilege_to_profile('acteur', 'modifier-acteur-de-toute select privilege__grant_privilege_to_profile('acteur', 'modifier-acteur-de-toutes-theses', 'ADMIN_TECH'); -- drop function substit_fetch_data_for_substituant_individu; create or replace function substit_fetch_data_for_substituant_individu(p_npd character varying) returns TABLE(type character varying, civilite character varying, nom_patronymique character varying, nom_usuel character varying, prenom1 character varying, prenom2 character varying, prenom3 character varying, email character varying, date_naissance timestamp without time zone, nationalite character varying, supann_id character varying, pays_id_nationalite bigint) language plpgsql as $$begin -- -- Détermination des meilleures valeurs d'attributs des enregistrements en doublon en vue de les affecter à -- l'enregistrement substituant. -- -- Pour chaque attribut, la stratégie de choix de la "meilleure" valeur est la fonction 'mode()' -- (cf. https://www.postgresql.org/docs/current/functions-aggregate). -- -- NB : les enregistrements en doublon sont ceux ayant le même NPD et n'appartenant pas à la source -- correspondnant à l'application. -- NB : Les historisés ne sont pas écartés puisqu'ils peuvent être des enregistrements déjà subsitués. -- raise notice 'Calcul des meilleures valeurs d''attributs parmi les doublons dont le NPD est %...', p_npd; return query select mode() within group (order by i.type) as type, mode() within group (order by i.civilite) as civilite, mode() within group (order by trim(i.nom_patronymique)::varchar) as nom_patronymique, mode() within group (order by trim(i.nom_usuel)::varchar) as nom_usuel, mode() within group (order by trim(i.prenom1)::varchar) as prenom1, mode() within group (order by trim(i.prenom2)::varchar) as prenom2, mode() within group (order by trim(i.prenom3)::varchar) as prenom3, mode() within group (order by trim(i.email)::varchar) as email, mode() within group (order by i.date_naissance) as date_naissance, mode() within group (order by i.nationalite) as nationalite, mode() within group (order by i.supann_id) as supann_id, mode() within group (order by i.pays_id_nationalite) as pays_id_nationalite from individu i join v_individu_doublon v on v.id = i.id and v.npd = p_npd group by v.npd; end; $$; create or replace function public.substit_create_substituant_individu(data record) returns bigint language plpgsql as $$declare substituant_id bigint; begin -- -- Création d'un enregistrement "susbtituant", càd se substituant à plusieurs enregistrements considérés en doublon, -- à partir des valeurs d'attributs spécifiées. -- raise notice 'Insertion du substituant à partir des données %', data; insert into individu (id, source_id, source_code, histo_createur_id, type, civilite, nom_patronymique, nom_usuel, prenom1, prenom2, prenom3, email, date_naissance, nationalite, supann_id, pays_id_nationalite) select nextval('individu_id_seq') as id, app_source_id() as source_id, app_source_source_code() as source_code, app_utilisateur_id(), data.type, data.civilite, data.nom_patronymique, data.nom_usuel, data.prenom1, data.prenom2, data.prenom3, data.email, data.date_naissance, data.nationalite, data.supann_id, data.pays_id_nationalite returning id into substituant_id; raise notice '=> Substituant %', substituant_id; return substituant_id; end $$; create or replace function public.substit_update_substituant_individu(p_substituant_id bigint, data record) returns void language plpgsql as $$begin -- -- Mise à jour des attributs de l'enregistrement substituant spécifié, à partir des valeurs spécifiées. -- update individu set histo_modification = current_timestamp, histo_modificateur_id = app_utilisateur_id(), type = data.type, civilite = data.civilite, nom_patronymique = data.nom_patronymique, nom_usuel = data.nom_usuel, prenom1 = data.prenom1, prenom2 = data.prenom2, prenom3 = data.prenom3, email = data.email, date_naissance = data.date_naissance, nationalite = data.nationalite, supann_id = data.supann_id, pays_id_nationalite = data.pays_id_nationalite where id = p_substituant_id; end $$; -- -- Vue utile quand il faudra créer à la main les 'individu_role_etablissement' pour remplacer le bricolage des Loading
doc/release-notes/8.1.0/05_substitutions.sql 0 → 100644 +59 −0 Changes for doc/release-notes/8.1.0/05_substitutions.sql: 59 added lines, 0 removed lines. Original line number Diff line number Diff line -- -- Petite amélioration en évitant un calcul inutile du NPD. -- create or replace function substit_update_substitution_if_exists(type character varying, p_substitue record) returns boolean language plpgsql as $$declare v_npd varchar(256); v_count int; v_data record; v_substit_record record; begin -- -- Recherche et mise à jour de la substitution existante spécifiée par l'enregistrement substitué. -- -- Retourne `true` s'il n'y a plus rien à faire (càd que le cas de l'enregistrement est traité) ; -- ou `false` dans le cas où il faudra rechercher si l'enregistrement est en doublon et doit faire l'objet -- d'une nouvelle substitution. -- raise notice 'Recherche si l''enregistrement % est substitué...', p_substitue.id; execute format('select * from substit_%s where from_id = %s', type, p_substitue.id) into v_substit_record; if v_substit_record.to_id is null then raise notice '=> Aucune substitution trouvée.'; return false; end if; if p_substitue.source_id = app_source_id() then raise notice '=> Oui mais l''enregistrement est dans la source application.'; raise notice '=> Retrait de l''enregistrement et mise à jour du substituant...'; perform substit_remove_from_substitution(type, v_substit_record.from_id, v_substit_record.to_id); return true; else -- -- calcul du npd de l'enregistrement (sauf si le npd est forcé). -- execute format('select coalesce($1, substit_npd_%s($2))', type) using p_substitue.npd_force, p_substitue into v_npd; if v_substit_record.npd <> v_npd then raise notice '=> Oui mais le NPD de l''enregistrement (%) a changé par rapport à celui de la substitution (%).', v_npd, v_substit_record.npd; raise notice '=> Retrait de l''enregistrement et mise à jour du substituant...'; perform substit_remove_from_substitution(type, v_substit_record.from_id, v_substit_record.to_id); return false; elseif v_substit_record.npd = v_npd then raise notice '=> Oui et le NPD de l''enregistrement égale celui de la substitution (%).', v_npd; raise notice '=> Mise à jour de l''enregistrement substituant...'; execute format('select count(*) from substit_fetch_data_for_substituant_%s(%L) limit 1', type, v_npd) into v_count; if v_count = 0 then raise exception 'Impossible de mettre à jour le substituant car aucun doublon de type % trouvé avec le NPD %', type, v_npd; end if; execute format('select * from substit_fetch_data_for_substituant_%s(%L) limit 1', type, v_npd) into v_data; perform substit_update_substituant(type, v_substit_record.to_id, v_data); return true; end if; end if; return false; end $$;