From 53d95b0ca7a8d9448ccaf62c211981c50c50b958 Mon Sep 17 00:00:00 2001 From: Hugo Lecuyer Date: Thu, 11 Jul 2024 17:54:27 +0200 Subject: [PATCH] feat(dbt): add new source fredo intermediare --- .../sources/fredo/_fredo__models.yml | 56 +++++ .../sources/fredo/_map_fredo_thematiques.sql | 140 +++++++++++++ .../sources/fredo/int_fredo__adresses.sql | 19 ++ .../sources/fredo/int_fredo__services.sql | 193 ++++++++++++++++++ .../sources/fredo/int_fredo__structures.sql | 62 ++++++ .../staging/sources/fredo/_fredo__models.yml | 12 +- .../sources/fredo/stg_fredo__categories.sql | 2 +- .../sources/fredo/stg_fredo__frais.sql | 4 +- .../sources/fredo/stg_fredo__publics.sql | 2 +- .../sources/fredo/stg_fredo__quartiers.sql | 2 +- .../sources/fredo/stg_fredo__services.sql | 2 +- .../sources/fredo/stg_fredo__structures.sql | 1 + .../sources/fredo/stg_fredo__types.sql | 2 +- .../modes_orientation_accompagnateur.csv | 1 + .../schema/modes_orientation_beneficiaire.csv | 1 + pipeline/dbt/seeds/schema/profils.csv | 5 + pipeline/dbt/seeds/schema/thematiques.csv | 3 + pipeline/pyproject.toml | 1 + pipeline/scripts/update_schema_seeds.py | 2 +- 19 files changed, 496 insertions(+), 14 deletions(-) create mode 100644 pipeline/dbt/models/intermediate/sources/fredo/_fredo__models.yml create mode 100644 pipeline/dbt/models/intermediate/sources/fredo/_map_fredo_thematiques.sql create mode 100644 pipeline/dbt/models/intermediate/sources/fredo/int_fredo__adresses.sql create mode 100644 pipeline/dbt/models/intermediate/sources/fredo/int_fredo__services.sql create mode 100644 pipeline/dbt/models/intermediate/sources/fredo/int_fredo__structures.sql diff --git a/pipeline/dbt/models/intermediate/sources/fredo/_fredo__models.yml b/pipeline/dbt/models/intermediate/sources/fredo/_fredo__models.yml new file mode 100644 index 000000000..139988afa --- /dev/null +++ b/pipeline/dbt/models/intermediate/sources/fredo/_fredo__models.yml @@ -0,0 +1,56 @@ +version: 2 + +models: + - name: int_fredo__adresses + tests: + - check_adresse: + config: + severity: warn + columns: + - name: id + tests: + - unique + - not_null + - dbt_utils.not_empty_string + + - name: int_fredo__structures + tests: + - check_structure: + config: + severity: warn + columns: + - name: id + tests: + - unique + - not_null + - dbt_utils.not_empty_string + - name: adresse_id + tests: + - not_null + - relationships: + to: ref('int_fredo__adresses') + field: id + + - name: int_fredo__services + tests: + - check_service: + config: + severity: warn + columns: + - name: id + tests: + - unique + - not_null + - dbt_utils.not_empty_string + - name: structure_id + tests: + - not_null + - relationships: + to: ref('int_fredo__structures') + field: id + - name: adresse_id + tests: + - not_null + - relationships: + to: ref('int_fredo__adresses') + field: id diff --git a/pipeline/dbt/models/intermediate/sources/fredo/_map_fredo_thematiques.sql b/pipeline/dbt/models/intermediate/sources/fredo/_map_fredo_thematiques.sql new file mode 100644 index 000000000..3dd0e1eb0 --- /dev/null +++ b/pipeline/dbt/models/intermediate/sources/fredo/_map_fredo_thematiques.sql @@ -0,0 +1,140 @@ +{{ config(materialized='ephemeral', sort='timestamp', dist='user_id') }} +SELECT + x.category, + x.thematiques +FROM ( + VALUES + ('accès à la propriété', 'logement-hebergement--etre-accompagne-dans-son-projet-accession'), + ('accès au matériel', 'numerique--acceder-a-du-materiel'), + ('accès au matériel informatique', 'numerique--s-equiper-en-materiel-informatique'), + ('accès à un logement', 'logement-hebergement--etre-accompagne-pour-se-loger'), + ('accès aux soins gratuits', 'sante--acces-aux-soins'), + ('accès aux soins gratuits', 'sante--prevention-et-acces-aux-soins'), + ('accès wifi', 'numerique--acceder-a-une-connexion-internet'), + ('accompagnement dans les recherches', 'preparer-sa-candidature--organiser-ses-demarches-de-recherche-demploi'), + ('accompagnement de personnes en insertion', 'accompagnement-social-et-professionnel-personnalise'), + ('accompagnement de personnes en insertion', 'accompagnement-social-et-professionnel-personnalise--parcours-d-insertion-socioprofessionnel'), + ('accompagnement social', 'accompagnement-social-et-professionnel-personnalise'), + ('accompagnement social', 'accompagnement-social-et-professionnel-personnalise--parcours-d-insertion-socioprofessionnel'), + ('addiction', 'sante--faire-face-a-une-situation-daddiction'), + ('administratif', 'acces-aux-droits-et-citoyennete--accompagnement-dans-les-demarches-administratives'), + ('aidants', 'handicap--aide-a-la-personne'), + ('aide à la gestion du budget', 'gestion-financiere--apprendre-a-gerer-son-budget'), + ('aide alimentaire', 'gestion-financiere--obtenir-une-aide-alimentaire'), + ('aide alimentaire', 'equipement-et-alimentation--alimentation'), + ('aide juridictionnelle', 'acces-aux-droits-et-citoyennete--accompagnement-juridique'), + ('aide-ménagère', 'handicap--aide-a-la-personne'), + ('alimentation / equipement', 'equipement-et-alimentation'), + ('amélioration de l’habitat', 'logement-hebergement--besoin-dadapter-mon-logement'), + ('ameublement', 'logement-hebergement--besoin-dadapter-mon-logement'), + ('ameublement', 'equipement-et-alimentation--electromenager'), + ('apprentissage', 'se-former--monter-son-dossier-de-formation'), + ('apprentissage', 'se-former--trouver-sa-formation'), + ('apprentissage lecture – écriture - calcul', 'illettrisme--info-acquisition-connaissances'), + ('arts martiaux', 'remobilisation--decouvrir-son-potentiel-via-le-sport-et-la-culture'), + ('assistant de service social', 'accompagnement-social-et-professionnel-personnalise--parcours-d-insertion-socioprofessionnel'), + ('ateliers parents / enfants', 'famille--soutien-aux-familles'), + ('avion', 'mobilite--etre-accompagne-dans-son-parcours-mobilite'), + ('bénévolat', 'remobilisation--participer-a-des-actions-solidaires-ou-de-benevolat'), + ('bus / vélo / trottinette', 'mobilite--comprendre-et-utiliser-les-transports-en-commun'), + ('bus / vélo / trottinette', 'mobilite--apprendre-a-utiliser-un-deux-roues'), + ('cantine', 'equipement-et-alimentation--alimentation'), + ('citoyenneté', 'acces-aux-droits-et-citoyennete--accompagnement-dans-les-demarches-administratives'), + ('citoyenneté', 'acces-aux-droits-et-citoyennete--faciliter-laction-citoyenne'), + ('covoiturage', 'mobilite--etre-accompagne-dans-son-parcours-mobilite'), + ('création d’entreprise', 'creation-activite--definir-son-projet-de-creation-dentreprise'), + ('culture', 'remobilisation--decouvrir-son-potentiel-via-le-sport-et-la-culture'), + ('danses', 'remobilisation--decouvrir-son-potentiel-via-le-sport-et-la-culture'), + ('décès', 'sante--accompagner-les-traumatismes'), + ('décès', 'famille--soutien-aux-familles'), + ('déménagement', 'logement-hebergement--demenagement'), + ('domiciliation', 'logement-hebergement--mal-loges-sans-logis'), + ('electroménagers', 'equipement-et-alimentation--electromenager'), + ('emploi', 'trouver-un-emploi'), + ('emploi des femmes', 'trouver-un-emploi'), + ('emploi / insertion / apprentissage', 'accompagnement-social-et-professionnel-personnalise--parcours-d-insertion-socioprofessionnel'), + ('famille', 'famille'), + ('formation', 'se-former--monter-son-dossier-de-formation'), + ('formations gratuites', 'se-former--trouver-sa-formation'), + ('formations gratuites', 'se-former--monter-son-dossier-de-formation'), + ('garde d’enfants', 'famille--garde-denfants'), + ('gynécologie / contraception / ivg', 'sante--vie-relationnelle-et-affective'), + ('gynécologie / contraception / ivg', 'sante--obtenir-la-prise-en-charge-de-frais-medicaux'), + ('gynécologie / contraception / ivg', 'sante--accompagnement-de-la-femme-enceinte-du-bebe-et-du-jeune-enfant'), + ('handicap', 'handicap'), + ('handisport', 'handicap'), + ('handisport', 'remobilisation--decouvrir-son-potentiel-via-le-sport-et-la-culture'), + ('hébergement', 'logement-hebergement--etre-accompagne-pour-se-loger'), + ('hébergement d’urgence', 'logement-hebergement--probleme-avec-son-logement'), + ('hébergement d’urgence', 'logement-hebergement--mal-loges-sans-logis'), + ('hébergement santé', 'logement-hebergement--probleme-avec-son-logement'), + ('hébergement santé', 'logement-hebergement--mal-loges-sans-logis'), + ('hébergement social', 'logement-hebergement--probleme-avec-son-logement'), + ('hébergement social', 'logement-hebergement--mal-loges-sans-logis'), + ('illettrisme/ apprentissage français / allophonie', 'apprendre-francais--communiquer-vie-tous-les-jours'), + ('illettrisme/ apprentissage français / allophonie', 'illettrisme'), + ('intérim', 'trouver-un-emploi--repondre-a-des-offres-demploi'), + ('jouets', 'famille--accompagnement-femme-enceinte-bebe-jeune-enfant'), + ('juridique', 'acces-aux-droits-et-citoyennete--accompagnement-juridique'), + ('lieu ressource', 'accompagnement-social-et-professionnel-personnalise'), + ('logement', 'logement-hebergement--etre-accompagne-pour-se-loger'), + ('maintien dans le logement', 'logement-hebergement--probleme-avec-son-logement'), + ('maladies chroniques', 'sante--acces-aux-soins'), + ('maladies chroniques', 'sante--obtenir-la-prise-en-charge-de-frais-medicaux'), + ('médiation – conciliation', 'acces-aux-droits-et-citoyennete--accompagnement-juridique'), + ('mesure judiciaire', 'acces-aux-droits-et-citoyennete--accompagnement-juridique'), + ('musée', 'remobilisation--decouvrir-son-potentiel-via-le-sport-et-la-culture'), + ('musique', 'remobilisation--decouvrir-son-potentiel-via-le-sport-et-la-culture'), + ('numérique', 'numerique'), + ('nutrition', 'equipement-et-alimentation--alimentation'), + ('objets', 'equipement-et-alimentation—aide-menagere'), + ('parents / enfants', 'famille--soutien-aux-familles'), + ('périscolaire', 'remobilisation--decouvrir-son-potentiel-via-le-sport-et-la-culture'), + ('permis de conduire', 'mobilite--preparer-son-permis-de-conduire-se-reentrainer-a-la-conduite'), + ('permis de conduire', 'mobilite--etre-accompagne-dans-son-parcours-mobilite'), + ('personne de compagnie', 'remobilisation--lien-social'), + ('personnes âgées', 'remobilisation--lien-social'), + ('personnes dépendantes', 'remobilisation--lien-social'), + ('personnes ressources dans les quartiers', 'remobilisation--lien-social'), + ('petite enfance', 'famille--accompagnement-femme-enceinte-bebe-jeune-enfant'), + ('petite enfance', 'famille--soutien-a-la-parentalite'), + ('prévention', 'sante--prevention-et-acces-aux-soins'), + ('protection / prévention / violences intrafamiliales', 'famille--violences-intrafamiliales'), + ('protection / prévention / violences intrafamiliales', 'famille--jeunes-sans-soutien-familial'), + ('recherche emploi', 'preparer-sa-candidature--organiser-ses-demarches-de-recherche-demploi'), + ('reconnaissance du handicap', 'handicap--faire-reconnaitre-un-handicap'), + ('remise en forme', 'remobilisation--decouvrir-son-potentiel-via-le-sport-et-la-culture'), + ('réparation de matériel', 'numerique--acceder-a-du-materiel'), + ('santé', 'sante--acces-aux-soins'), + ('santé mentale', 'sante--bien-etre-psychologique'), + ('scolarité', 'accompagnement-social-et-professionnel-personnalise--decrochage-scolaire'), + ('scolarité', 'illettrisme--accompagner-scolarite'), + ('scolarité', 'famille--information-et-accompagnement-des-parents'), + ('soins à domicile', 'sante--acces-aux-soins'), + ('sortir de l’isolement', 'remobilisation--lien-social'), + ('soutien enfants déscolarisés / scolarité adaptée', 'accompagnement-social-et-professionnel-personnalise--decrochage-scolaire'), + ('soutien scolaire', 'famille--information-et-accompagnement-des-parents'), + ('soutien scolaire', 'illettrisme--accompagner-scolarite'), + ('sport', 'remobilisation--decouvrir-son-potentiel-via-le-sport-et-la-culture'), + ('sport de musculation', 'remobilisation--decouvrir-son-potentiel-via-le-sport-et-la-culture'), + ('sport de réflexion', 'remobilisation--decouvrir-son-potentiel-via-le-sport-et-la-culture'), + ('sports aquatiques', 'remobilisation--decouvrir-son-potentiel-via-le-sport-et-la-culture'), + ('sports cyclistes', 'remobilisation--decouvrir-son-potentiel-via-le-sport-et-la-culture'), + ('sports d''athlétisme', 'remobilisation--decouvrir-son-potentiel-via-le-sport-et-la-culture'), + ('sports de ballon', 'remobilisation--decouvrir-son-potentiel-via-le-sport-et-la-culture'), + ('sports de combat', 'remobilisation--decouvrir-son-potentiel-via-le-sport-et-la-culture'), + ('sports de détente', 'remobilisation--decouvrir-son-potentiel-via-le-sport-et-la-culture'), + ('sports de plein air', 'remobilisation--decouvrir-son-potentiel-via-le-sport-et-la-culture'), + ('sports de raquette', 'remobilisation--decouvrir-son-potentiel-via-le-sport-et-la-culture'), + ('sports équestres', 'remobilisation--decouvrir-son-potentiel-via-le-sport-et-la-culture'), + ('sports gymniques', 'remobilisation--decouvrir-son-potentiel-via-le-sport-et-la-culture'), + ('sports mécaniques', 'remobilisation--decouvrir-son-potentiel-via-le-sport-et-la-culture'), + ('sports nautiques', 'remobilisation--decouvrir-son-potentiel-via-le-sport-et-la-culture'), + ('stages', 'accompagnement-social-et-professionnel-personnalise--definition-du-projet-professionnel'), + ('stages', 'choisir-un-metier--decouvrir-un-metier-ou-un-secteur-dactivite'), + ('structures d’insertion par l’emploi', 'accompagnement-social-et-professionnel-personnalise--parcours-d-insertion-socioprofessionnel'), + ('transport', 'mobilite--comprendre-et-utiliser-les-transports-en-commun'), + ('transport', 'mobilite--etre-accompagne-dans-son-parcours-mobilite'), + ('vêtements', 'equipement-et-alimentation--habillement'), + ('vih', 'sante--vie-relationnelle-et-affective') +) AS x (category, thematiques) diff --git a/pipeline/dbt/models/intermediate/sources/fredo/int_fredo__adresses.sql b/pipeline/dbt/models/intermediate/sources/fredo/int_fredo__adresses.sql new file mode 100644 index 000000000..a8a2797ac --- /dev/null +++ b/pipeline/dbt/models/intermediate/sources/fredo/int_fredo__adresses.sql @@ -0,0 +1,19 @@ +WITH structures AS ( + SELECT * FROM {{ ref('stg_fredo__structures') }} +), + +final AS ( + SELECT + id AS "id", + commune AS "commune", + NULL AS "code_insee", + longitude AS "longitude", + latitude AS "latitude", + _di_source_id AS "source", + code_postal AS "code_postal", + adresse AS "adresse", + NULL AS "complement_adresse" + FROM structures +) + +SELECT * FROM final diff --git a/pipeline/dbt/models/intermediate/sources/fredo/int_fredo__services.sql b/pipeline/dbt/models/intermediate/sources/fredo/int_fredo__services.sql new file mode 100644 index 000000000..b9760d54b --- /dev/null +++ b/pipeline/dbt/models/intermediate/sources/fredo/int_fredo__services.sql @@ -0,0 +1,193 @@ +WITH structures AS ( + SELECT * FROM {{ ref('stg_fredo__structures') }} +), + +services AS (SELECT * FROM {{ ref('stg_fredo__services') }}), + +categories AS (SELECT * FROM {{ ref('stg_fredo__categories') }}), + +fredo_frais AS (SELECT * FROM {{ ref('stg_fredo__frais') }}), + +publics AS (SELECT * FROM {{ ref('stg_fredo__publics') }}), + +map_thematiques AS (SELECT * FROM {{ ref('_map_fredo_thematiques') }}), + +di_nom_and_types_by_fredo_services AS ( + SELECT x.* + FROM ( + VALUES + -- Mapping: https://www.notion.so/dora-beta/8c8d883758df47649902ddba55ab2236?v=56c7542b590c42febc79db8d3ffe9f81&p=84e6e41b6a3b4f54bee46e11aa41ff47&pm=s + ('accès aux droits', 'accompagnement'), + ('accompagnement dans les démarches', 'accompagnement'), + ('accompagnement dans les démarches via le numérique', 'accompagnement'), + ('accompagnement global', 'accompagnement'), + ('accompagnement psychologique', 'accompagnement'), + ('activités / ateliers', 'atelier'), + ('aide à la personne', 'accompagnement'), + ('aide financière', 'aide-financiere'), + ('aide logistique', 'aide-materielle'), + ('dispositif', 'accompagnement'), + ('ecoute / soutien', 'accueil'), + ('information / orientation', 'information'), + ('initiation', 'information'), + ('soins', 'accompagnement') + ) AS x (service_fredo, di_type) +), + +di_profils_by_fredo_public AS ( + SELECT x.* + FROM ( + VALUES + ('adulte', 'adultes'), + ('détenu ou sortant de détention', 'sortants-de-detention'), + ('enfant', 'familles-enfants'), + ('etudiant', 'etudiants'), + ('femme', 'femmes'), + ('jeune', 'jeunes'), + ('personne âgée', 'seniors-65'), + ('personne de nationalité étrangère', 'personnes-de-nationalite-etrangere'), + ('sans domicile fixe', 'sans-domicile-fixe'), + ('sortant ase', 'familles-enfants'), + ('victime', 'victimes') + ) AS x (public, profil) +), + +di_frais_by_fredo_frais AS ( + SELECT x.* + FROM ( + VALUES + -- Mapping: https://www.notion.so/dora-beta/8c8d883758df47649902ddba55ab2236?v=56c7542b590c42febc79db8d3ffe9f81&p=84e6e41b6a3b4f54bee46e11aa41ff47&pm=s + ('gratuit', 'gratuit'), + ('payant', 'payant'), + ('gratuit sous condition', 'gratuit-sous-conditions'), + ('gratuit sous conditions', 'gratuit-sous-conditions'), + ('sous conditions', 'gratuit-sous-conditions') + ) AS x (frais_fredo, frais_di) +), + +di_mode_by_fredo_frais_di AS ( + SELECT x.* + FROM ( + VALUES + -- Mapping: https://www.notion.so/dora-beta/8c8d883758df47649902ddba55ab2236?v=56c7542b590c42febc79db8d3ffe9f81&p=84e6e41b6a3b4f54bee46e11aa41ff47&pm=s + ('sans rendez-vous', 'se-presenter'), + ('sur rendez-vous', 'envoyer-un-mail'), + ('sur rendez-vous', 'telephoner'), + ('sur rendez-vous', 'prendre-rdv'), + ('avec rendez-vous', 'envoyer-un-mail'), + ('avec rendez-vous', 'telephoner'), + ('avec rendez-vous', 'prendre-rdv') + ) AS x (frais_fredo, mode_benef_di) +), + +frais AS ( + SELECT + fredo_frais.structure_id, + ARRAY_AGG(di_frais_by_fredo_frais.frais_di) AS frais + FROM fredo_frais + INNER JOIN di_frais_by_fredo_frais ON fredo_frais.value = di_frais_by_fredo_frais.frais_fredo + GROUP BY fredo_frais.structure_id +), + +frais_autres AS ( + SELECT + fredo_frais.structure_id, + STRING_AGG(fredo_frais.value, ', ') AS frais_autres + FROM fredo_frais + WHERE fredo_frais.value NOT IN (SELECT frais_fredo FROM di_frais_by_fredo_frais) + GROUP BY fredo_frais.structure_id +), + +mode_orient_benef AS ( + SELECT + fredo_frais.structure_id, + ARRAY_AGG(DISTINCT di_mode_by_fredo_frais_di.mode_benef_di) AS mode_orient_benef + FROM fredo_frais + INNER JOIN di_mode_by_fredo_frais_di ON fredo_frais.value = di_mode_by_fredo_frais_di.frais_fredo + GROUP BY fredo_frais.structure_id +), + +thematiques AS ( + SELECT + categories.structure_id, + ARRAY_AGG(DISTINCT map_thematiques.thematiques) AS thematiques + FROM categories + INNER JOIN map_thematiques ON categories.value = map_thematiques.category + GROUP BY categories.structure_id +), + +profils AS ( + SELECT + publics.structure_id, + ARRAY_AGG(di_profils_by_fredo_public.profil) AS profils + FROM publics + INNER JOIN di_profils_by_fredo_public ON publics.value = di_profils_by_fredo_public.public + GROUP BY publics.structure_id +), + +final AS ( + SELECT + structures.id AS "structure_id", + structures._di_source_id AS "source", + structures.id AS "adresse_id", + thematiques.thematiques AS "thematiques", + NULL AS "prise_rdv", + frais.frais AS "frais", + profils.profils AS "profils", + NULL AS "modes_orientation_accompagnateur_autres", + NULL AS "modes_orientation_beneficiaire_autres", + NULL AS "formulaire_en_ligne", + structures.commune AS "commune", + structures.commune AS "code_postal", + NULL AS "code_insee", + structures.adresse AS "adresse", + NULL AS "complement_adresse", + structures.longitude AS "longitude", + structures.latitude AS "latitude", + structures.lien_source AS "lien_source", + structures.telephone AS "telephone", + NULL AS "courriel", + NULL AS "contact_nom_prenom", + NULL AS "zone_diffusion_type", + NULL AS "zone_diffusion_code", + NULL AS "zone_diffusion_nom", + NULL AS "recurrence", + CAST(UUID(MD5(structures.id || COALESCE(services.value, ''))) AS TEXT) AS "id", + CAST(NULL AS TEXT []) AS "pre_requis", + CAST(NULL AS BOOLEAN) AS "cumulable", + CAST(NULL AS TEXT []) AS "justificatifs", + CAST(NULL AS DATE) AS "date_creation", + CAST(NULL AS DATE) AS "date_maj", + CAST(NULL AS DATE) AS "date_suspension", + CAST(NULL AS BOOLEAN) AS "contact_public", + CAST(NULL AS TEXT []) AS "modes_accueil", + LEFT(structures.presentation_resume, 280) AS "presentation_resume", + CASE + WHEN CHAR_LENGTH(structures.presentation_resume) > 280 + THEN structures.presentation_resume + END AS "presentation_detail", + ARRAY[( + SELECT di_nom_and_types_by_fredo_services.di_type + FROM di_nom_and_types_by_fredo_services + WHERE services.value = di_nom_and_types_by_fredo_services.service_fredo + )] AS "types", + ( + SELECT REPLACE((UPPER(SUBSTRING(di_nom_and_types_by_fredo_services.service_fredo, 1, 1)) || SUBSTRING(di_nom_and_types_by_fredo_services.service_fredo, 2)), '/', 'et') + FROM di_nom_and_types_by_fredo_services + WHERE services.value = di_nom_and_types_by_fredo_services.service_fredo + ) AS "nom", + CASE + WHEN frais.frais IS NULL THEN frais_autres.frais_autres + END AS "frais_autres", + ARRAY['envoyer-un-mail', 'telephoner'] AS "modes_orientation_accompagnateur", + COALESCE(mode_orient_benef.mode_orient_benef, ARRAY['envoyer-un-mail', 'telephoner']) AS "modes_orientation_beneficiaire" + FROM structures + INNER JOIN services ON structures.id = services.structure_id + LEFT JOIN thematiques ON structures.id = thematiques.structure_id + LEFT JOIN profils ON structures.id = profils.structure_id + LEFT JOIN frais ON structures.id = frais.structure_id + LEFT JOIN frais_autres ON structures.id = frais_autres.structure_id + LEFT JOIN mode_orient_benef ON structures.id = mode_orient_benef.structure_id +) + +SELECT * FROM final diff --git a/pipeline/dbt/models/intermediate/sources/fredo/int_fredo__structures.sql b/pipeline/dbt/models/intermediate/sources/fredo/int_fredo__structures.sql new file mode 100644 index 000000000..7184070a9 --- /dev/null +++ b/pipeline/dbt/models/intermediate/sources/fredo/int_fredo__structures.sql @@ -0,0 +1,62 @@ +WITH structures AS ( + SELECT * FROM {{ ref('stg_fredo__structures') }} +), + +di_typologie_by_fredo_type_structure AS ( + SELECT x.* + FROM ( + VALUES + -- Mapping: https://www.notion.so/dora-beta/8c8d883758df47649902ddba55ab2236?v=56c7542b590c42febc79db8d3ffe9f81&p=84e6e41b6a3b4f54bee46e11aa41ff47&pm=s + ('ASSO', 'Association'), + ('REG', 'Collectivité Territoriale de la Région'), + ('MUNI', 'Collectivité Territoriale de la Ville'), + ('CD', 'Collectivité Territoriale du Département'), + ('ETABL PRI', 'Entreprise'), + ('ETABL PRI', 'Etablissement privé'), + ('ETABL PUB', 'Etablissement Public'), + ('ETAT', 'Services de l''Etat') + ) AS x (typologie, type_structure) +), + +final AS ( + SELECT + id AS "id", + id AS "adresse_id", + _di_source_id AS "source", + siret AS "siret", + NULL AS "rna", + nom AS "nom", + commune AS "commune", + code_postal AS "code_postal", + NULL AS "code_insee", + adresse AS "adresse", + CAST('2025-07-11' AS DATE) AS "date_maj", + NULL AS "complement_adresse", + longitude AS "longitude", + latitude AS "latitude", + ( + SELECT di_typologie_by_fredo_type_structure.typologie + FROM di_typologie_by_fredo_type_structure + INNER JOIN {{ ref('stg_fredo__types') }} AS stg_type ON stg_type.structure_id = structures.id + WHERE stg_type.value = di_typologie_by_fredo_type_structure.type_structure + LIMIT 1 + ) AS "typologie", + telephone AS "telephone", + NULL AS "courriel", + NULL AS "site_web", + LEFT(presentation_resume, 280) AS "presentation_resume", + CASE + WHEN CHAR_LENGTH(presentation_resume) > 280 + THEN presentation_resume + END AS "presentation_detail", + CAST(NULL AS BOOLEAN) AS "antenne", + lien_source AS "lien_source", + horaires_ouverture AS "horaires_ouverture", + NULL AS "accessibilite", + CAST(NULL AS TEXT []) AS "labels_nationaux", + CAST(NULL AS TEXT []) AS "labels_autres", + CAST(NULL AS TEXT []) AS "thematiques" + FROM structures +) + +SELECT * FROM final diff --git a/pipeline/dbt/models/staging/sources/fredo/_fredo__models.yml b/pipeline/dbt/models/staging/sources/fredo/_fredo__models.yml index c65e34fe4..48817f911 100644 --- a/pipeline/dbt/models/staging/sources/fredo/_fredo__models.yml +++ b/pipeline/dbt/models/staging/sources/fredo/_fredo__models.yml @@ -59,7 +59,7 @@ models: - name: stg_fredo__categories columns: - - name: id + - name: structure_id tests: - not_null - relationships: @@ -72,7 +72,7 @@ models: - name: stg_fredo__frais columns: - - name: id + - name: structure_id tests: - not_null - relationships: @@ -89,7 +89,7 @@ models: - name: stg_fredo__publics columns: - - name: id + - name: structure_id tests: - not_null - relationships: @@ -102,7 +102,7 @@ models: - name: stg_fredo__quartiers columns: - - name: id + - name: structure_id tests: - not_null - relationships: @@ -115,7 +115,7 @@ models: - name: stg_fredo__services columns: - - name: id + - name: structure_id tests: - not_null - relationships: @@ -128,7 +128,7 @@ models: - name: stg_fredo__types columns: - - name: id + - name: structure_id tests: - not_null - relationships: diff --git a/pipeline/dbt/models/staging/sources/fredo/stg_fredo__categories.sql b/pipeline/dbt/models/staging/sources/fredo/stg_fredo__categories.sql index 6ee5b19fb..883af892d 100644 --- a/pipeline/dbt/models/staging/sources/fredo/stg_fredo__categories.sql +++ b/pipeline/dbt/models/staging/sources/fredo/stg_fredo__categories.sql @@ -4,7 +4,7 @@ WITH source AS ( final AS ( SELECT - data ->> 'id' AS "id", + data ->> 'id' AS "structure_id", LOWER(TRIM(JSONB_ARRAY_ELEMENTS_TEXT(data -> 'categories'))) AS "value" FROM source WHERE data ->> 'categories' IS NOT NULL diff --git a/pipeline/dbt/models/staging/sources/fredo/stg_fredo__frais.sql b/pipeline/dbt/models/staging/sources/fredo/stg_fredo__frais.sql index 290fa246f..475ce5244 100644 --- a/pipeline/dbt/models/staging/sources/fredo/stg_fredo__frais.sql +++ b/pipeline/dbt/models/staging/sources/fredo/stg_fredo__frais.sql @@ -4,11 +4,11 @@ WITH source AS ( final AS ( SELECT - data ->> 'id' AS "id", + data ->> 'id' AS "structure_id", REPLACE(LOWER(TRIM(frais)), 'rendez vous', 'rendez-vous') AS "value" FROM source, - LATERAL UNNEST(STRING_TO_ARRAY(data->>'frais', '/')) AS frais + LATERAL UNNEST(STRING_TO_ARRAY(data ->> 'frais', '/')) AS frais ) SELECT * FROM final diff --git a/pipeline/dbt/models/staging/sources/fredo/stg_fredo__publics.sql b/pipeline/dbt/models/staging/sources/fredo/stg_fredo__publics.sql index 06d427bde..30bbea0f0 100644 --- a/pipeline/dbt/models/staging/sources/fredo/stg_fredo__publics.sql +++ b/pipeline/dbt/models/staging/sources/fredo/stg_fredo__publics.sql @@ -4,7 +4,7 @@ WITH source AS ( final AS ( SELECT - data ->> 'id' AS "id", + data ->> 'id' AS "structure_id", LOWER(TRIM(JSONB_ARRAY_ELEMENTS_TEXT(data -> 'publics'))) AS "value" FROM source WHERE data ->> 'publics' IS NOT NULL diff --git a/pipeline/dbt/models/staging/sources/fredo/stg_fredo__quartiers.sql b/pipeline/dbt/models/staging/sources/fredo/stg_fredo__quartiers.sql index edb138ea9..82278fb1a 100644 --- a/pipeline/dbt/models/staging/sources/fredo/stg_fredo__quartiers.sql +++ b/pipeline/dbt/models/staging/sources/fredo/stg_fredo__quartiers.sql @@ -4,7 +4,7 @@ WITH source AS ( final AS ( SELECT - data ->> 'id' AS "id", + data ->> 'id' AS "structure_id", JSONB_ARRAY_ELEMENTS_TEXT(data -> 'quartiers') AS "value" FROM source WHERE data ->> 'quartiers' IS NOT NULL diff --git a/pipeline/dbt/models/staging/sources/fredo/stg_fredo__services.sql b/pipeline/dbt/models/staging/sources/fredo/stg_fredo__services.sql index 211c404a7..5b219d0ec 100644 --- a/pipeline/dbt/models/staging/sources/fredo/stg_fredo__services.sql +++ b/pipeline/dbt/models/staging/sources/fredo/stg_fredo__services.sql @@ -4,7 +4,7 @@ WITH source AS ( final AS ( SELECT - data ->> 'id' AS "id", + data ->> 'id' AS "structure_id", LOWER(TRIM(JSONB_ARRAY_ELEMENTS_TEXT(data -> 'services'))) AS "value" FROM source WHERE data ->> 'services' IS NOT NULL diff --git a/pipeline/dbt/models/staging/sources/fredo/stg_fredo__structures.sql b/pipeline/dbt/models/staging/sources/fredo/stg_fredo__structures.sql index 145c7ffd5..99c864deb 100644 --- a/pipeline/dbt/models/staging/sources/fredo/stg_fredo__structures.sql +++ b/pipeline/dbt/models/staging/sources/fredo/stg_fredo__structures.sql @@ -4,6 +4,7 @@ WITH source AS ( final AS ( SELECT + _di_source_id AS "_di_source_id", data ->> 'id' AS "id", NULLIF(TRIM(data ->> 'adresse'), '') AS "adresse", NULLIF(TRIM(data ->> 'code_postal'), '') AS "code_postal", diff --git a/pipeline/dbt/models/staging/sources/fredo/stg_fredo__types.sql b/pipeline/dbt/models/staging/sources/fredo/stg_fredo__types.sql index 807091ea1..c140bc201 100644 --- a/pipeline/dbt/models/staging/sources/fredo/stg_fredo__types.sql +++ b/pipeline/dbt/models/staging/sources/fredo/stg_fredo__types.sql @@ -4,7 +4,7 @@ WITH source AS ( final AS ( SELECT - data ->> 'id' AS "id", + data ->> 'id' AS "structure_id", LOWER(TRIM(JSONB_ARRAY_ELEMENTS_TEXT(data -> 'type_structure'))) AS "value" FROM source WHERE data ->> 'type_structure' IS NOT NULL diff --git a/pipeline/dbt/seeds/schema/modes_orientation_accompagnateur.csv b/pipeline/dbt/seeds/schema/modes_orientation_accompagnateur.csv index 561ad919f..3ed617991 100644 --- a/pipeline/dbt/seeds/schema/modes_orientation_accompagnateur.csv +++ b/pipeline/dbt/seeds/schema/modes_orientation_accompagnateur.csv @@ -4,4 +4,5 @@ completer-le-formulaire-dadhesion,Compléter le formulaire d’adhésion,Complé envoyer-un-mail,Envoyer un courriel,Envoyer un courriel à l’adresse indiquée. envoyer-un-mail-avec-des-documents-a-completer,Envoyer un courriel avec des documents à compléter,Envoyer un courriel à l’adresse indiquée avec des documents à compléter. envoyer-un-mail-avec-une-fiche-de-prescription,Envoyer un courriel avec une fiche de prescription,Envoyer un courriel à l’adresse indiquée avec une fiche de prescription. +prendre-rdv,Prendre rendez-vous,Prendre rendez-vous auprès de la structure telephoner,Téléphoner,Téléphoner au numéro indiqué. diff --git a/pipeline/dbt/seeds/schema/modes_orientation_beneficiaire.csv b/pipeline/dbt/seeds/schema/modes_orientation_beneficiaire.csv index 5aee3ee8d..b9f451321 100644 --- a/pipeline/dbt/seeds/schema/modes_orientation_beneficiaire.csv +++ b/pipeline/dbt/seeds/schema/modes_orientation_beneficiaire.csv @@ -2,5 +2,6 @@ value,label,description autre,Autre, completer-le-formulaire-dadhesion,Compléter le formulaire d’adhésion,Compléter le formulaire d’adhésion associé. envoyer-un-mail,Envoyer un courriel,Envoyer un courriel à l’adresse indiquée. +prendre-rdv,Prendre rendez-vous,Prendre rendez-vous auprès de la structure se-presenter,Se présenter,Se présenter à l’adresse indiquée. telephoner,Téléphoner,Téléphoner au numéro indiqué. diff --git a/pipeline/dbt/seeds/schema/profils.csv b/pipeline/dbt/seeds/schema/profils.csv index 2132914bb..177aa5429 100644 --- a/pipeline/dbt/seeds/schema/profils.csv +++ b/pipeline/dbt/seeds/schema/profils.csv @@ -4,6 +4,7 @@ alternants,Alternants, beneficiaires-rsa,Bénéficiaires du Revenu de Solidarité Active (RSA), deficience-visuelle,Déficience visuelle, demandeurs-demploi,Demandeurs ou demandeuses d’emploi, +etudiants,Étudiants, familles-enfants,Familles/enfants, femmes,Femmes,Le lieu propose des accompagnements réservés aux femmes. handicaps-mentaux,Handicaps mentaux : déficiences limitant les activités d’une personne, @@ -11,6 +12,7 @@ handicaps-psychiques,Handicaps psychiques : troubles psychiatriques donnant lieu jeunes,Jeunes, jeunes-16-26,Jeunes (16-26 ans), locataires,Locataires, +personnes-de-nationalite-etrangere,Personnes de nationalité étrangère, personnes-en-situation-de-handicap,Personnes en situation de handicap,Une personne se déplaçant temporairement en béquilles des suites d’une intervention médicale est en situation de handicap sans toutefois être handicapée. personnes-en-situation-illettrisme,Personnes en situation d’illettrisme, personnes-handicapees,Personnes handicapées,Ce terme est privilégié pour désigner une incapacité persistante et significative subie par une personne dans son environnement. @@ -18,5 +20,8 @@ proprietaires,Propriétaires, public-langues-etrangeres,Public langues étrangères, retraites,Retraités, salaries,Salariés, +sans-domicile-fixe,Sans domicile fixe, seniors-65,Seniors (+ 65 ans), +sortants-de-detention,Sortants de détention, surdite,Surdité, +victimes,Victimes, diff --git a/pipeline/dbt/seeds/schema/thematiques.csv b/pipeline/dbt/seeds/schema/thematiques.csv index 063fc88ae..9539e22ec 100644 --- a/pipeline/dbt/seeds/schema/thematiques.csv +++ b/pipeline/dbt/seeds/schema/thematiques.csv @@ -32,6 +32,7 @@ equipement-et-alimentation--acces-a-un-telephone-et-un-abonnement,Accès à un t equipement-et-alimentation--alimentation,Alimentation, equipement-et-alimentation--electromenager,Électroménager, equipement-et-alimentation--habillement,Habillement, +equipement-et-alimentation—aide-menagere,Aide ménagère, famille,Famille, famille--accompagnement-femme-enceinte-bebe-jeune-enfant,"Accompagnement femme enceinte, bébé, jeune enfant", famille--garde-denfants,Garde d’enfants, @@ -52,6 +53,7 @@ handicap,Handicap, handicap--accompagnement-par-une-structure-specialisee,Accompagnement par une structure spécialisée, handicap--adaptation-au-poste-de-travail,Adaptation au poste de travail, handicap--adapter-son-logement,Adapter son logement, +handicap--aide-a-la-personne,Aide à la personne en situation de handicap ou malade, handicap--connaissance-des-droits-des-travailleurs,Connaissance des droits des travailleurs, handicap--faire-reconnaitre-un-handicap,Faire reconnaître un handicap, handicap--favoriser-le-retour-et-le-maintien-dans-lemploi,Favoriser le retour et le maintien dans l’emploi, @@ -131,6 +133,7 @@ sante--diagnostic-et-accompagnement-a-lemployabilite,Diagnostic et accompagnemen sante--faire-face-a-une-situation-daddiction,Faire face à une situation d’addiction, sante--obtenir-la-prise-en-charge-de-frais-medicaux,Obtenir la prise en charge de frais médicaux, sante--prevention-et-acces-aux-soins,"Prévention et accès aux soins (vaccination, éducation à la santé, lutte contre la tuberculose…).", +sante--sante-mental,Accompagnement des aidants, sante--se-soigner-et-prevenir-la-maladie,Se soigner et prévenir la maladie, sante--vie-relationnelle-et-affective,"Vie relationnelle et affective, dépistage et prévention des IST/VIH…", se-former,Se former, diff --git a/pipeline/pyproject.toml b/pipeline/pyproject.toml index 4105cb44c..1845d3e8b 100644 --- a/pipeline/pyproject.toml +++ b/pipeline/pyproject.toml @@ -36,6 +36,7 @@ markers = ''' dialect = "postgres" exclude_rules = "layout.long_lines" templater = "dbt" +large_file_skip_byte_limit = 25000 [tool.sqlfluff.layout.type.alias_expression] # https://docs.sqlfluff.com/en/stable/layout.html#aligned-elements diff --git a/pipeline/scripts/update_schema_seeds.py b/pipeline/scripts/update_schema_seeds.py index b2eac0f03..25973422d 100644 --- a/pipeline/scripts/update_schema_seeds.py +++ b/pipeline/scripts/update_schema_seeds.py @@ -7,7 +7,7 @@ BASE_URL = os.environ.get( "BASE_URL", - "https://raw.githubusercontent.com/gip-inclusion/data-inclusion-schema/latest/schemas/extra/", # noqa: E501 + "https://raw.githubusercontent.com/gip-inclusion/data-inclusion-schema/v0.15.0_fredo/schemas/extra/", # noqa: E501 ) OUTPUT_DIR = Path(__file__).parent.parent / "dbt" / "seeds" / "schema"