PnX-SI/UsersHub

Harmonisation avec le référentiel des organismes de l'INPN

pierre56 opened this issue · 1 comments

Harmonisation avec référentiel INPN

Url référentiel

https://inpn.mnhn.fr/telechargement/referentiels/organismes

Contexte

Bonjour,
Ayant beaucoup de partenaires et financeurs, j'ai intégré l'ensemble du référentiel organisme de l'INPN.
Cela est aussi une obligation de l'OFB et des communes, nous demandant de remonter les données avec le bon UUID pour l'organisme.
C'est pourquoi une uniformisation de la BDD geonature via bib_organismes et le référentiel serait intéressant, le reste restant dans additional_data.

Modifications a faire :

Ajout des champs pour améliorer l'harmonisation :

  • date_modification ( extraite du référentiel ou trigger maj si modif manuelle)
  • type_organisme (administration, association, entreprise privée)
  • siret ( obligatoire pour les entreprises)

Ajout des champs pour améliorer l'interface :

  • active (boolean comme dans t_roles, default = false)

Avec un système dans l'interface pour ne pas afficher les organismes inactifs de base et charger les organismes inactifs a la demande.
J'insiste sur ce point, qu'il faudrait également mettre en place pour les utilisateurs.

Car avec 21K utilisateurs et 8k organismes en BDD,
je peine a trouver des admin secondaires pour m'aider dans la gestion des comptes
car juste pour charger, l'interface peut prendre plusieurs minutes, si elle plante pas
(j'ai entamé le taff de suppression des organismes réellement inutiles)

Bonus : Créer un système de maj auto

ou au clic via l'interface, une maj des organismes ou intégration des nouveaux sur un territoire

Utilisation de l'API odata-sinp.mnhn.fr

https://inpn.mnhn.fr/docs-web/docs/download/335154
https://odata-sinp.mnhn.fr/organizations

Exemple avec Bretagne Vivante (pour maj)
https://odata-sinp.mnhn.fr/organizations/5FD1514F-54F1-3E51-E053-2614A8C0F325

possibilité de taper sur le champs modificationDate en utilisant l'uuid en uppercase contenu dans bib_organisme

Exemple avec le département Finistère (pour intégration)
https://odata-sinp.mnhn.fr/organizations?postCodeStart=29

On créé si non présent en bdd, possibilité de taper sur le champs formCreationDate en complément pour vérif

Avenir usershub ?

J'ai vu que usershub allait être intégré dans geonature,
mais ce que je propose reste valable si la bdd reste la même.

Vous me direz ce que vous en pensez,
en bonus je rajoute mon script d'intégration/maj si ça peut servir à d'autres 😄

Bonne journée
Pierre

Geonature - MAJ des organismes

Source

https://inpn.mnhn.fr/telechargement/referentiels/organismes

Memo

tel_organisme -> passage de 14 a 20 en varchar
fax_organisme ->passage de 14 a 20 en varchar
adresse_organisme -> passage en varchar

ALTER TABLE utilisateurs.bib_organismes ALTER COLUMN adresse_organisme TYPE varchar USING adresse_organisme::varchar;

Le référentiel n'est pas forcément bien rempli et contient des adresse très longues ou des num de tel avec des +

CMD

Pour le moment, toutes les informations complémentaires finissent dans additional_data.
Script d'insert et d'upsert


/***************************************************
 *   Ajout des organismes   *
 ***************************************************/

CREATE TABLE utilisateurs.ref_organismes_export (
	id int4 null,
	libelle_court text null,
	libelle_long text null,
	siret text null,
	siret_siege text null,
	date_adhesion text null,
	adresse text null,
	cp text null,
	ville text null,
	pays text null,
	description text null,
	syno text null,
	domaines text null,
	zones text null,
	date_creation text null,
	date_modification text null,
	code uuid null,
	niveau_adhesion text null,
	id_agrement int4 null,
	libelle_org_agrement text null,
	id_parent int4 null,
	org_parent text null,
	perimetre text null,
	statut_organisme text null,
	type_organisme text null,
	mail text null,
	telephone text null,
	url text null,
	zone_detaillees text null
);

-------
DROP materialized view utilisateurs.mv_ref_organismes_bzh;

create materialized view utilisateurs.mv_ref_organismes_bzh as 
select *
from utilisateurs.ref_organismes_export 
where cp like '56%' 
or cp like '44%'
or cp like '35%'
or cp like '29%'
or cp like '22%'
--or perimetre = 'National' and type_organisme IN ('Administration','Etablissement public','Association','Regroupement d''organismes')

-------
INSERT INTO utilisateurs.bib_organismes
(uuid_organisme,
 nom_organisme,
 adresse_organisme,
 cp_organisme,
 ville_organisme,
 tel_organisme,
 email_organisme,
 url_organisme, 
 additional_data)
select code::uuid , 
libelle_long , 
adresse , 
REPLACE(cp, ' ', '')as cp ,
ville , 
REPLACE(telephone , ' ', '')as telephone  ,
mail , 
url , 
    json_build_object(
        'libelle_court',libelle_court,
        'siret',siret,
        'description',description,
        'syno',syno,
        'domaines',domaines,
        'zones',zones,
        'date_creation',date_creation,
        'date_modification',date_modification,
        'niveau_adhesion',niveau_adhesion,
        'id_agrement',id_agrement,
        'libelle_org_agrement',libelle_org_agrement,        
        'perimetre',perimetre,
        'statut_organisme',statut_organisme,
        'type_organisme',type_organisme

    )::jsonb  as additional_data
  
  from utilisateurs.mv_ref_organismes_bzh
;


-------
-- UPSERT

INSERT INTO utilisateurs.bib_organismes
(uuid_organisme,
 nom_organisme,
 adresse_organisme,
 cp_organisme,
 ville_organisme,
 tel_organisme,
 email_organisme,
 url_organisme, 
 additional_data)
(
select code::uuid ,
libelle_long ,
adresse ,
REPLACE(cp, ' ', '')as cp ,
ville ,
REPLACE(telephone , ' ', '')as telephone  ,
mail ,
url ,
 
    json_build_object(
        'libelle_court',libelle_court,
        'siret',siret,
        'description',description,
        'syno',syno,
        'domaines',domaines,
        'zones',zones,
        'date_creation',date_creation,
        'date_modification',date_modification,
        'niveau_adhesion',niveau_adhesion,
        'id_agrement',id_agrement,
        'libelle_org_agrement',libelle_org_agrement,        
        'perimetre',perimetre,
        'statut_organisme',statut_organisme,
        'type_organisme',type_organisme

    )::jsonb  as additional_data
  
  from utilisateurs.ref_organismes_export 
--  where cp like '56%' 
--or cp like '44%'
--or cp like '35%'
--or cp like '29%'
--or cp like '22%'
where length(cp) <= 6
)
  ON CONFLICT (uuid_organisme) 
DO 
   UPDATE SET 
 uuid_organisme = EXCLUDED.uuid_organisme,
 nom_organisme = EXCLUDED.nom_organisme,
 adresse_organisme = EXCLUDED.adresse_organisme,
 cp_organisme =EXCLUDED.cp_organisme,
 ville_organisme = EXCLUDED.ville_organisme,
 tel_organisme = EXCLUDED.tel_organisme,
 email_organisme = EXCLUDED.email_organisme,
 url_organisme = EXCLUDED.url_organisme, 
 additional_data = EXCLUDED.additional_data
;