diff --git a/.github/workflows/dbt-compile.yaml b/.github/workflows/dbt-compile.yaml index ddc2230c..3787dc3b 100644 --- a/.github/workflows/dbt-compile.yaml +++ b/.github/workflows/dbt-compile.yaml @@ -35,5 +35,5 @@ jobs: run: dbt deps - name: Compile dbt models - run: dbt compile --profiles-dir . --profile default --target dev + run: dbt compile --profiles-dir . --profile sms --target dev diff --git a/.gitignore b/.gitignore index 1ca6bb66..7b32e2e4 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,6 @@ credentials/ target-base/ *.DS_Store /dbt_packages -.state/ \ No newline at end of file +.state/ +.cursorignore +.cursor/ \ No newline at end of file diff --git a/dbt_project.yml b/dbt_project.yml index 189a087f..5e2953dd 100644 --- a/dbt_project.yml +++ b/dbt_project.yml @@ -6,7 +6,7 @@ version: "1.0.0" config-version: 2 # This setting configures which "profile" dbt uses for this project. -profile: "default" +profile: "sms" # These configurations specify where dbt should look for different types of files. # The `source-paths` config, for example, states that models in this project can be @@ -107,6 +107,20 @@ models: dado_publico: sim dado_pessoal: sim dado_sensivel: nao + area_programatica: + +schema: brutos_area_programatica + +tags: ["weekly", "subgeral", "monitora_reg", "cnes_subgeral"] + +labels: + dado_publico: sim + dado_pessoal: nao + dado_sensivel: nao + geo_pgeo3: + +schema: brutos_geo_pgeo3 + +tags: ["weekly", "subgeral", "monitora_reg", "cnes_subgeral"] + +labels: + dado_publico: sim + dado_pessoal: nao + dado_sensivel: nao ergon: +schema: brutos_ergon +tags: ["daily", "ergon"] @@ -232,7 +246,7 @@ models: dado_sensivel: nao rio: +schema: saude_rio - +tags: ["weekly", "saude_rio", "subgeral"] + +tags: ["weekly", "saude_rio", "subgeral", "cnes_subgeral"] +labels: dado_publico: sim dado_pessoal: sim @@ -240,7 +254,7 @@ models: facts: sisreg: +schema: saude_sisreg - +tags: "daily" + +tags: ["daily", "cnes", "sisreg"] +labels: dado_publico: nao dado_pessoal: nao @@ -318,7 +332,7 @@ models: dominio: subgeral sisreg_reports: +schema: projeto_sisreg_reports - +tags: ["weekly", "subgeral", "sisreg_reports"] + +tags: ["weekly", "subgeral", "sisreg", "sisreg_reports"] +labels: dado_publico: nao dado_pessoal: sim diff --git a/models/marts/core/dimensions/rio/dim_estabelecimento_sus_rio_historico.sql b/models/marts/core/dimensions/rio/dim_estabelecimento_sus_rio_historico.sql index 3af7b9c6..6a35050f 100644 --- a/models/marts/core/dimensions/rio/dim_estabelecimento_sus_rio_historico.sql +++ b/models/marts/core/dimensions/rio/dim_estabelecimento_sus_rio_historico.sql @@ -81,6 +81,29 @@ with from {{ ref("raw_sheets__estabelecimento_auxiliar") }} ), + -- Obtendo informações sobre as áreas programáticas + aps_tb as ( + select bairro, ap, ap_titulo + from {{ ref("raw_area_programatica__bairros_aps") }} + ), + + -- Obtendo latitudes e longitudes dos estabelecimentos de saúde + coordenadas as ( + select id_cnes, latitude_api, longitude_api + from + ( + select + id_cnes, + latitude_api, + longitude_api, + row_number() over ( + partition by id_cnes order by data_extracao desc + ) as rn + from {{ ref("raw_geo_pgeo3__estabelecimentos_coordenadas") }} + ) + where rn = 1 + ), + -- Obtendo atributos de contato para os estabelecimentos contatos_aps as ( select id_cnes, telefone, email, facebook, instagram, twitter @@ -149,8 +172,12 @@ with cnes_web.endereco_logradouro, cnes_web.endereco_numero, cnes_web.endereco_complemento, - cnes_web.endereco_latitude, - cnes_web.endereco_longitude, + coalesce( + cnes_web.endereco_latitude, coordenadas.latitude_api + ) as endereco_latitude, + coalesce( + cnes_web.endereco_longitude, coordenadas.longitude_api + ) as endereco_longitude, cnes_web.id_motivo_desativacao, cnes_web.id_unidade, cnes_web.aberto_sempre, @@ -173,8 +200,13 @@ with estabelecimentos_atributos.tipo_unidade_agrupado_subgeral as tipo_unidade_agrupado, estabelecimentos_atributos.esfera_subgeral as esfera, - estabelecimentos_atributos.area_programatica as id_ap, - estabelecimentos_atributos.area_programatica_descr as ap, + coalesce( + estabelecimentos_atributos.area_programatica, + safe_cast(aps_tb.ap as string) + ) as id_ap, + coalesce( + estabelecimentos_atributos.area_programatica_descr, aps_tb.ap_titulo + ) as ap, estabelecimentos_atributos.agrupador_sms, estabelecimentos_atributos.tipo_sms, estabelecimentos_atributos.tipo_sms_simplificado, @@ -236,6 +268,11 @@ with contatos_aps on cast(brutos.id_estabelecimento_cnes as int64) = cast(contatos_aps.id_cnes as int64) + left join aps_tb on cnes_web.endereco_bairro = aps_tb.bairro + left join + coordenadas + on cast(brutos.id_estabelecimento_cnes as int64) + = cast(coordenadas.id_cnes as int64) ), -- Seleção final diff --git a/models/marts/subgeral/monitora_reg/mart_monitora_reg__monitor_vagas_ambulatoriais.sql b/models/marts/subgeral/monitora_reg/mart_monitora_reg__monitor_vagas_ambulatoriais.sql index 54757393..2f496a54 100644 --- a/models/marts/subgeral/monitora_reg/mart_monitora_reg__monitor_vagas_ambulatoriais.sql +++ b/models/marts/subgeral/monitora_reg/mart_monitora_reg__monitor_vagas_ambulatoriais.sql @@ -194,11 +194,12 @@ with left join estabelecimentos as estab -- ma prática temporária (convertendo o tipo durante o join) - on safe_cast(ofer.ano_competencia as int) + on safe_cast(coalesce(ofer.ano_competencia, prof.ano_competencia) as int) = safe_cast(estab.ano_competencia as int) - and safe_cast(ofer.mes_competencia as int) + and safe_cast(coalesce(ofer.mes_competencia, prof.mes_competencia) as int) = safe_cast(estab.mes_competencia as int) - and safe_cast(ofer.id_cnes as int) = safe_cast(estab.id_cnes as int) + and safe_cast(coalesce(ofer.id_cnes, prof.id_cnes) as int) + = safe_cast(estab.id_cnes as int) ), iqr as ( @@ -212,7 +213,7 @@ with group by ano_competencia, mes_competencia, id_procedimento ), - final as ( + iqr_label as ( select mva.*, @@ -244,6 +245,57 @@ with and safe_cast(mva.id_cnes as int) = safe_cast(estab.id_cnes as int) where estab.vinculo_sus_indicador = 1 + ), + + final as ( + select + cpf, + cns, + {{ remove_accents_upper("profissional") }} as profissional, + id_cbo_2002, + {{ remove_accents_upper("ocupacao") }} as ocupacao, + {{ remove_accents_upper("ocupacao_agg") }} as ocupacao_agg, + id_cbo_2002_qtd_sisreg, + id_cbo_2002_todos_sisreg, + id_cnes, + {{ remove_accents_upper("estabelecimento") }} as estabelecimento, + ano_competencia, + mes_competencia, + id_procedimento, + {{ remove_accents_upper("procedimento") }} as procedimento, + carga_horaria_ambulatorial_mensal, + carga_horaria_procedimento_esperada_mensal, + vagas_programadas_mensal_todas, + vagas_programadas_mensal_primeira_vez, + vagas_programadas_mensal_retorno, + vagas_esperadas_mensal, + vagas_esperadas_mensal_primeira_vez, + vagas_esperadas_mensal_retorno, + vagas_diferenca_ofertado_esperado, + procedimento_distribuicao, + procedimento_consultas_hora, + procedimento_proporcao_reservas, + procedimento_proporcao_retornos, + {{ remove_accents_upper("tipo_estabelecimento") }} as tipo_estabelecimento, + {{ remove_accents_upper("tipo_estabelecimento_agrupado") }} + as tipo_estabelecimento_agrupado, + {{ remove_accents_upper("turno_estabelecimento") }} + as turno_estabelecimento, + {{ remove_accents_upper("tipo_gestao_estabelecimento") }} + as tipo_gestao_estabelecimento, + {{ remove_accents_upper("esfera_estabelecimento") }} + as esfera_estabelecimento, + {{ remove_accents_upper("natureza_juridica_estabelecimento") }} + as natureza_juridica_estabelecimento, + id_ap_estabelecimento, + {{ remove_accents_upper("ap_estabelecimento") }} as ap_estabelecimento, + {{ remove_accents_upper("endereco_bairro_estabelecimento") }} + as endereco_bairro_estabelecimento, + procedimento_ppi, + sisreg_dados, + cnes_dados, + {{ remove_accents_upper("status_oferta") }} as status_oferta + from iqr_label ) select * diff --git a/models/raw/area_programatica/_area_programatica_schema.yml b/models/raw/area_programatica/_area_programatica_schema.yml new file mode 100644 index 00000000..6e2344dc --- /dev/null +++ b/models/raw/area_programatica/_area_programatica_schema.yml @@ -0,0 +1,16 @@ +models: + - name: raw_area_programatica__bairros_aps + description: As Áreas Programáticas de Saúde do Rio de Janeiro são 10 grandes regiões que dividem a cidade para fins de planejamento e gestão. Essa divisão facilita a organização do sistema de saúde e permite identificar e abordar problemas específicos de cada área. + columns: + - name: bairro + description: A coluna 'bairro' representa o nome do bairro na cidade do Rio de Janeiro. + data_type: string + quote: true + - name: ap + description: A coluna 'ap' representa o código da Área Programática, um identificador único para cada uma das 10 Áreas Programáticas da cidade do Rio de Janeiro. + data_type: int64 + quote: true + - name: ap_titulo + description: A coluna 'ap_titulo' representa o nome ou título da Área Programática correspondente. + data_type: string + quote: true diff --git a/models/raw/area_programatica/_area_programatica_sources.yml b/models/raw/area_programatica/_area_programatica_sources.yml new file mode 100644 index 00000000..97daa787 --- /dev/null +++ b/models/raw/area_programatica/_area_programatica_sources.yml @@ -0,0 +1,8 @@ +version: 2 + +sources: + - name: brutos_area_programatica_staging + database: rj-sms + schema: brutos_area_programatica_staging + tables: + - name: bairros_aps diff --git a/models/raw/area_programatica/raw_area_programatica__bairros_aps.sql b/models/raw/area_programatica/raw_area_programatica__bairros_aps.sql new file mode 100644 index 00000000..d0a072af --- /dev/null +++ b/models/raw/area_programatica/raw_area_programatica__bairros_aps.sql @@ -0,0 +1,10 @@ +{{ config(alias="bairros_aps", schema="brutos_area_programatica") }} + +with + source as ( + select bairro, ap, ap_titulo + from {{ source("brutos_area_programatica_staging", "bairros_aps") }} + ) + +select * +from source diff --git a/models/raw/cnes_web/raw_cnes_web__estabelecimento.sql b/models/raw/cnes_web/raw_cnes_web__estabelecimento.sql index d0ad6e98..4a1524bc 100644 --- a/models/raw/cnes_web/raw_cnes_web__estabelecimento.sql +++ b/models/raw/cnes_web/raw_cnes_web__estabelecimento.sql @@ -38,7 +38,32 @@ select safe_cast(no_logradouro as string) as endereco_logradouro, safe_cast(nu_endereco as string) as endereco_numero, safe_cast(no_complemento as string) as endereco_complemento, - safe_cast(no_bairro as string) as endereco_bairro, + + -- Handling typos and a few other errors + CASE + WHEN safe_cast(no_bairro as string) = 'SAO FRANCISCO XAVEIR' THEN 'SAO FRANCISCO XAVIER' + WHEN safe_cast(no_bairro as string) = 'BRAS DE PINA' THEN 'BRAZ DE PINA' + WHEN safe_cast(no_bairro as string) = 'CAMPO GRNADE' THEN 'CAMPO GRANDE' + WHEN safe_cast(no_bairro as string) = 'TAQUARA JACAREPAGU' THEN 'TAQUARA' + WHEN safe_cast(no_bairro as string) = 'CENTRO RJ' THEN 'CENTRO' + WHEN safe_cast(no_bairro as string) = 'QUINTINO' THEN 'QUINTINO BOCAIUVA' + WHEN safe_cast(no_bairro as string) = 'COCOTA ILHA DO GOVER' THEN 'COCOTA' + WHEN safe_cast(no_bairro as string) = 'SANTA TEREZA' THEN 'SANTA TERESA' + WHEN safe_cast(no_bairro as string) = 'MAL HERMES' THEN 'MARECHAL HERMES' + WHEN safe_cast(no_bairro as string) = 'TANQUE JACAREPAGUA' THEN 'TANQUE' + WHEN safe_cast(no_bairro as string) = 'ILHA DO FUNDAO' THEN 'CIDADE UNIVERSITARIA' + WHEN safe_cast(no_bairro as string) = 'SENADOR VASCONCELLOS' THEN 'SENADOR VASCONCELOS' + WHEN safe_cast(no_bairro as string) = 'RICARDO DE ALBUQUERQ' THEN 'RICARDO DE ALBUQUERQUE' + WHEN safe_cast(no_bairro as string) = 'RECREIO DOS BANDEIRA' THEN 'RECREIO DOS BANDEIRANTES' + WHEN safe_cast(no_bairro as string) = 'FUNDAO' THEN 'CIDADE UNIVERSITARIA' + WHEN safe_cast(no_bairro as string) = 'CASTELO' THEN 'CENTRO' + WHEN safe_cast(no_bairro as string) = 'TANGUE' THEN 'TANQUE' + WHEN safe_cast(no_bairro as string) = 'VILA MANGUINHOS' THEN 'MANGUINHOS' + WHEN safe_cast(no_bairro as string) = 'CAIS DO PORTO' THEN 'CENTRO' + WHEN safe_cast(co_cnes as string) = "2269767" THEN 'MEIER' + ELSE safe_cast(no_bairro as string) + END AS endereco_bairro, + safe_cast(co_cep as string) as endereco_cep, safe_cast(nu_latitude as float64) as endereco_latitude, safe_cast(nu_longitude as float64) as endereco_longitude, diff --git a/models/raw/geo_pgeo3/_geo_pgeo3_schema.yml b/models/raw/geo_pgeo3/_geo_pgeo3_schema.yml new file mode 100644 index 00000000..db093777 --- /dev/null +++ b/models/raw/geo_pgeo3/_geo_pgeo3_schema.yml @@ -0,0 +1,64 @@ +models: + - name: raw_geo_pgeo3__estabelecimentos_coordenadas + description: O modelo raw_geo_pgeo3__estabelecimentos_coordenadas contém dados geográficos relacionados a estabelecimentos de saúde. Estes dados são municipais, provenientes da API do IPP. + columns: + - name: id_cnes + description: Esta coluna representa o identificador único do estabelecimento de saúde. É um número de sete dígitos, preenchido com zeros à esquerda caso o número original tenha menos de sete dígitos. + data_type: string + quote: true + - name: endereco_cep + description: Esta coluna representa o Código de Endereçamento Postal (CEP) do endereço do estabelecimento de saúde. É um número de oito dígitos, preenchido com zeros à esquerda caso o número original tenha menos de oito dígitos. + data_type: string + quote: true + - name: endereco_bairro + description: Esta coluna representa o bairro do endereço do estabelecimento de saúde. + data_type: string + quote: true + - name: endereco_logradouro + description: Esta coluna contém o nome da rua do estabelecimento. + data_type: string + quote: true + - name: endereco_numero + description: Esta coluna contém o número do endereço do estabelecimento. + data_type: string + quote: true + - name: latitude_cep + description: Esta coluna contém a latitude do estabelecimento com base no CEP. + data_type: float64 + quote: true + - name: longitude_cep + description: Esta coluna representa a longitude do CEP do estabelecimento. + data_type: float64 + quote: true + - name: latitude_addr + description: Esta coluna representa a latitude do endereço do estabelecimento. + data_type: float64 + quote: true + - name: longitude_addr + description: Esta coluna representa a longitude do endereço do estabelecimento. + data_type: float64 + quote: true + - name: latitude_api + description: Latitude final à ser considerada (Tenta preencher com addr, e caso não consiga, tenta preencher com cep). + data_type: float64 + quote: true + - name: longitude_api + description: Longitude final à ser considerada (Tenta preencher com addr, e caso não consiga, tenta preencher com cep). + data_type: float64 + quote: true + - name: data_extracao + description: A data e hora em que os dados foram extraídos. + data_type: datetime + quote: true + - name: ano_particao + description: Esta coluna representa o ano da partição. + data_type: int64 + quote: true + - name: mes_particao + description: Esta coluna representa o mês da partição. + data_type: int64 + quote: true + - name: data_particao + description: Esta coluna representa a data da partição. É baseada na data_extração, e é utilizada para fins de organização dos dados e consultas mais rápidas. + data_type: date + quote: true diff --git a/models/raw/geo_pgeo3/_geo_pgeo3_sources.yml b/models/raw/geo_pgeo3/_geo_pgeo3_sources.yml new file mode 100644 index 00000000..f9f9d169 --- /dev/null +++ b/models/raw/geo_pgeo3/_geo_pgeo3_sources.yml @@ -0,0 +1,8 @@ +version: 2 + +sources: + - name: brutos_geo_pgeo3_staging + database: rj-sms + schema: brutos_geo_pgeo3_staging + tables: + - name: estabelecimentos_coordenadas \ No newline at end of file diff --git a/models/raw/geo_pgeo3/raw_geo_pgeo3__estabelecimentos_coordenadas.sql b/models/raw/geo_pgeo3/raw_geo_pgeo3__estabelecimentos_coordenadas.sql new file mode 100644 index 00000000..12434c1a --- /dev/null +++ b/models/raw/geo_pgeo3/raw_geo_pgeo3__estabelecimentos_coordenadas.sql @@ -0,0 +1,40 @@ +{{ + config( + schema="brutos_geo_pgeo3", + alias="estabelecimentos_coordenadas", + partition_by={ + "field": "data_particao", + "data_type": "date", + "granularity": "month", + }, + ) +}} + +with + source as ( + select + lpad(id_cnes, 7, '0') as id_cnes, + lpad(endereco_cep, 8, '0') as endereco_cep, + + endereco_bairro, + endereco_logradouro, + endereco_numero, + + safe_cast(latitude_cep as float64) as latitude_cep, + safe_cast(longitude_cep as float64) as longitude_cep, + safe_cast(latitude_addr as float64) as latitude_addr, + safe_cast(longitude_addr as float64) as longitude_addr, + safe_cast(latitude_api as float64) as latitude_api, + safe_cast(longitude_api as float64) as longitude_api, + + safe_cast(data_extracao as datetime) as data_extracao, + safe_cast(ano_particao as int64) as ano_particao, + safe_cast(mes_particao as int64) as mes_particao, + safe_cast(data_particao as date) as data_particao + + from {{ source("brutos_geo_pgeo3_staging", "estabelecimentos_coordenadas") }} + + ) + +select * +from source diff --git a/models/raw/sheets/_sheets_sources.yml b/models/raw/sheets/_sheets_sources.yml index ed26cc4f..867d4f6a 100644 --- a/models/raw/sheets/_sheets_sources.yml +++ b/models/raw/sheets/_sheets_sources.yml @@ -15,6 +15,7 @@ sources: - name: aps_farmacias - name: profissionais_cns_cpf_aux - name: assistencial_procedimento + - name: usuarios_permitidos_hci - name: brutos_sheets database: rj-sms diff --git a/models/raw/sheets/raw_sheets__usuarios_permitidos_hci.sql b/models/raw/sheets/raw_sheets__usuarios_permitidos_hci.sql new file mode 100644 index 00000000..3a75a86e --- /dev/null +++ b/models/raw/sheets/raw_sheets__usuarios_permitidos_hci.sql @@ -0,0 +1,35 @@ +{{ + config( + schema="brutos_sheets", + alias="usuarios_permitidos_hci", + partition_by={ + "field": "cpf_particao", + "data_type": "int64", + "range": {"start": 0, "end": 100000000000, "interval": 34722222}, + }, + ) +}} + +with + source as ( + select * + from {{ source("brutos_sheets_staging", "usuarios_permitidos_hci") }} + ), + + tratados as ( + select + safe_cast(cpf as int64) as cpf_particao, + lpad(safe_cast(cpf as string), 11, "0") as cpf, + cnes, + nivel_de_acesso as nivel_acesso + from source + ), + + distintos as ( + select distinct * + from tratados + ) + +select * +from distintos +where {{ validate_cpf('cpf') }} diff --git a/profiles.yml b/profiles.yml index 2d077e27..5d7576b1 100644 --- a/profiles.yml +++ b/profiles.yml @@ -1,4 +1,4 @@ -default: +sms: target: dev outputs: dev: