diff --git a/dbt_project.yml b/dbt_project.yml index 8d6df6ef..b8d9f98d 100644 --- a/dbt_project.yml +++ b/dbt_project.yml @@ -252,7 +252,7 @@ models: dado_pessoal: sim dado_anonimizado: nao dado_sensivel_saude: sim - dominio: seguir_em_frente + dominio: seguir_em_frente tests: rj_sms: diff --git a/models/marts/core/dimensions/dim_estabelecimento.sql b/models/marts/core/dimensions/dim_estabelecimento.sql index bb63a34c..b7e1ec9e 100644 --- a/models/marts/core/dimensions/dim_estabelecimento.sql +++ b/models/marts/core/dimensions/dim_estabelecimento.sql @@ -1,138 +1,87 @@ -{{ config(materialized="table", alias="estabelecimento", tags=["daily"]) }} +{{ config(materialized='table', alias='estabelecimento', tags=['daily']) }} +with source as ( + select * from {{ ref('dim_estabelecimento_sus_rio_historico') }} +), -with - versao_atual as ( - select max(data_particao) as versao from {{ ref("raw_cnes_web__tipo_unidade") }} - ), +current_year as ( + select max(ano) as ano_atual from source +), - estabelecimento as ( - select * - from {{ ref("raw_cnes_web__estabelecimento") }} - where data_particao = (select versao from versao_atual) - ), +current_period as ( + select + cast(current_year.ano_atual as int64) as ano_atual, + cast(max(mes) as int64) as competencia_atual + from source + join current_year on source.ano = current_year.ano_atual + group by current_year.ano_atual +), - unidade as ( - select * - from {{ ref("raw_cnes_web__tipo_unidade") }} - where data_particao = (select versao from versao_atual) - ), +final as ( + select + -- primary key + id_unidade, - turno as ( - select * - from {{ ref("raw_cnes_web__turno_atendimento") }} - where data_particao = (select versao from versao_atual) - ), + -- foreign keys + id_cnes, + id_tipo_unidade, + id_ap as area_programatica, + cnpj_mantenedora, - estab_sms as ( - select * - from estabelecimento - where - cnpj_mantenedora = "29468055000102" -- SMS-RIO - or id_cnes = "5456932" -- Fio Cruz - or (id_municipio_gestor = "330455" and id_natureza_juridica = "2011") -- Rio de Janeiro & Empresa Publica (Rio Saúde) - or (id_municipio_gestor = "330455" and id_natureza_juridica = "1031") -- Rio de Janeiro & Orgao Publico do Poder Executivo Municipal - ), + -- common fields + ativa, + tipo_sms_agrupado, + tipo, -- trocar para tipo_cnes? + tipo_sms, + tipo_sms_simplificado, + nome_limpo, + nome_sigla, + nome_complemento, + nome_fantasia, + responsavel_sms, + administracao, + prontuario_tem, + prontuario_versao, + prontuario_estoque_tem_dado, + prontuario_estoque_motivo_sem_dado, + endereco_bairro, + endereco_logradouro, + endereco_numero, + endereco_complemento, + endereco_cep, + endereco_latitude, + endereco_longitude, + telefone, + email, + facebook, + instagram, + twitter, + aberto_sempre, + turno_atendimento, + diretor_clinico_cpf, + diretor_clinico_conselho, - estab_aux as (select * from {{ ref("raw_sheets__estabelecimento_auxiliar") }}), + -- metadata + data_atualizao_registro, + usuario_atualizador_registro, + mes_particao, + ano_particao, + data_particao, + data_carga, + data_snapshot - contatos_aps as ( - select * from {{ ref("raw_plataforma_smsrio__estabelecimento_contato") }} - ), + from + source + join current_period on source.ano = current_period.ano_atual and source.mes = current_period.competencia_atual + where + estabelecimento_sms_indicador = 1 - estab_final as ( - select - estab_sms.*, - split(estab_sms.telefone, "/") as telefone_cnes, - contatos_aps.telefone as telefone_aps, - estab_sms.email as email_cnes, - contatos_aps.email as email_aps, - contatos_aps.facebook, - contatos_aps.instagram, - contatos_aps.twitter, - estab_aux.agrupador_sms, - estab_aux.tipo_sms, - estab_aux.tipo_sms_simplificado, - estab_aux.nome_limpo, - regexp_replace( - estab_aux.nome_limpo, - r'(CF |CSE |CMS |UPA 24h |POLICLINICA |HOSPITAL MUNICIPAL |COORD DE EMERGENCIA REGIONAL CER |MATERNIDADE )', - '' - ) as nome_complemento, - estab_aux.nome_sigla, - estab_aux.prontuario_tem, - estab_aux.prontuario_versao, - estab_aux.responsavel_sms, - estab_aux.administracao, - estab_aux.prontuario_estoque_tem_dado, - estab_aux.prontuario_estoque_motivo_sem_dado, - coalesce( - estab_aux.area_programatica, estab_sms.id_distrito_sanitario - ) as id_distrito_sanitario_corrigido, -- corrige registros que possuem algum erro no cadsus - from estab_sms - left join estab_aux using (id_cnes) - left join contatos_aps using (id_cnes) - ) + order by + ativa desc, + id_tipo_unidade asc, + area_programatica asc, + endereco_bairro asc, + nome_fantasia asc +) -select - -- Primary key - est.id_unidade, - - -- Foreign keys - est.id_cnes, - est.id_tipo_unidade, - est.id_distrito_sanitario_corrigido as area_programatica, - est.cnpj_mantenedora, - - -- Common fields - if(est.id_motivo_desativacao = "", "sim", "não") as ativa, - est.agrupador_sms as tipo_sms_agrupado, - unidade.descricao as tipo, # TODO: renomear para tipo_cnes - est.tipo_sms, - est.tipo_sms_simplificado, - est.nome_limpo, - est.nome_sigla, - est.nome_complemento, - est.nome_fantasia, - est.responsavel_sms, - est.administracao, - est.prontuario_tem, - est.prontuario_versao, - est.prontuario_estoque_tem_dado, - est.prontuario_estoque_motivo_sem_dado, - est.endereco_bairro, - est.endereco_logradouro, - est.endereco_numero, - est.endereco_complemento, - est.endereco_cep, - est.endereco_latitude, - est.endereco_longitude, - coalesce(est.telefone_aps, est.telefone_cnes) as telefone, - coalesce(est.email_aps, est.email_cnes) as email, - est.facebook, - est.instagram, - est.twitter, - est.aberto_sempre, - turno.descricao as turno_atendimento, - est.diretor_clinico_cpf, - est.diretor_clinico_conselho, - - -- Metadata - data_atualizao_registro, - usuario_atualizador_registro, - est.mes_particao, - est.ano_particao, - est.data_particao, - est.data_carga, - est.data_snapshot, - -from estab_final as est -left join turno using (id_turno_atendimento) -left join unidade using (id_tipo_unidade) - -order by - ativa desc, - est.id_tipo_unidade asc, - area_programatica asc, - est.endereco_bairro asc, - est.nome_fantasia asc +select * from final \ No newline at end of file diff --git a/models/marts/saude_cnes/_mart_saude_cnes_schema.yml b/models/marts/saude_cnes/_mart_saude_cnes_schema.yml new file mode 100644 index 00000000..883b0863 --- /dev/null +++ b/models/marts/saude_cnes/_mart_saude_cnes_schema.yml @@ -0,0 +1,158 @@ +version: 2 + +models: + - name: estabelecimento_sus_rio_historico + description: Esta tabela contém dados sobre todos os estabelecimentos de saúde do Município do Rio de Janeiro que possuem algum tipo de vínculo com o SUS. + + columns: + # Identificação + - name: ano + description: "Ano de referência dos dados." + - name: mes + description: "Mês de referência dos dados." + - name: id_cnes + description: "Código Nacional de Estabelecimento de Saúde (CNES) do estabelecimento." + - name: id_unidade + description: "Identificador específico do estabelecimento de saúde" + - name: nome_razao_social + description: "Razão social do estabelecimento conforme registro oficial." + - name: nome_fantasia + description: "Nome fantasia do estabelecimento." + - name: nome_limpo + description: "Nome do estabelecimento formatado." + - name: nome_sigla + description: "Sigla do nome do estabelecimento." + - name: nome_complemento + description: "Detalhes adicionais que complementam o nome principal do estabelecimento." + - name: cnpj_mantenedora + description: "CNPJ da entidade mantenedora do estabelecimento, importante para identificação legal e financeira." + + # Responsabilização + - name: esfera + description: "Classificação administrativa da esfera governamental (federal, estadual, municipal)." + - name: id_natureza_juridica + description: "Código da natureza jurídica do estabelecimento." + - name: natureza_juridica_descr + description: "Descrição da natureza jurídica do estabelecimento." + - name: tipo_gestao + description: "Código indicativo do tipo de gestão (e.g., municipal, estadual)." + - name: tipo_gestao_descr + description: "Descrição do tipo de gestão do estabelecimento." + - name: responsavel_sms + description: "Setor da SMS responsável pelo estabelecimento." + - name: administracao + description: "Administração do estabelecimento." + - name: diretor_clinico_cpf + description: "CPF do diretor clínico do estabelecimento." + - name: diretor_clinico_conselho + description: "Número de registro no conselho profissional do diretor clínico." + + # Atributos + - name: tipo_turno + description: "Código indicativo do turno de atendimento (manhã, tarde, integral)." + - name: turno_atendimento + description: "Descrição do turno de atendimento." + - name: aberto_sempre + description: "Indica se o estabelecimento opera continuamente, 24 horas por dia." + + # Tipagem dos Estabelecimentos (CNES) + - name: id_tipo_unidade + description: "Código do tipo de unidade de saúde." + - name: tipo + description: "Descrição do tipo de unidade de saúde." + + # Tipagem dos Estabelecimentos (DIT) + - name: tipo_sms + description: "Categoria relacionada a serviços de saúde." + - name: tipo_sms_simplificado + description: "Versão simplificada da categoria de SMS, utilizada para classificação geral." + - name: tipo_sms_agrupado + description: "Variável de agrupamento relacionada a tipagem do estabelecimento." + + # Tipagem dos Estabelecimentos (SUBGERAL) + - name: tipo_unidade_alternativo + description: "Classificação alternativa do tipo de unidade conforme categorização interna." + - name: tipo_unidade_agrupado + description: "Classificação agrupada do tipo de unidade de saúde." + + # Localização + - name: id_ap + description: "Código da Área Programática." + - name: ap + description: "Descrição da Área Programática." + - name: endereco_cep + description: "CEP do estabelecimento." + - name: endereco_bairro + description: "Bairro onde o estabelecimento está localizado." + - name: endereco_logradouro + description: "Logradouro do endereço do estabelecimento." + - name: endereco_numero + description: "Número do endereço do estabelecimento." + - name: endereco_complemento + description: "Complemento do endereço do estabelecimento." + - name: endereco_latitude + description: "Latitude do estabelecimento para georreferenciamento." + - name: endereco_longitude + description: "Longitude do estabelecimento para georreferenciamento." + + # Status + - name: ativa + description: "Indica o status operacional do estabelecimento ('sim' para ativo, 'não' para inativo)." + + # Prontuário + - name: prontuario_tem + description: "Indica se o estabelecimento mantém prontuários dos pacientes." + - name: prontuario_versao + description: "Versão do prontuário utilizado pelo estabelecimento." + - name: prontuario_estoque_tem_dado + description: "Indica se os prontuários contêm dados disponíveis." + - name: prontuario_estoque_motivo_sem_dado + description: "Motivo pelo qual os prontuários não contêm dados." + + # Informações de Contato + - name: telefone + description: "Número de telefone principal para contato com o estabelecimento." + - name: email + description: "Endereço de e-mail principal do estabelecimento." + - name: facebook + description: "Página do Facebook do estabelecimento." + - name: instagram + description: "Perfil do Instagram do estabelecimento." + - name: twitter + description: "Conta do Twitter do estabelecimento." + + # Indicadores + - name: estabelecimento_sms_indicador + description: "Indica se o estabelecimento faz parte da rede municipal de saúde." + - name: vinculo_sus_indicador + description: "Indica se o estabelecimento possui vínculo com o SUS." + - name: atendimento_internacao_sus_indicador + description: "Indica se o estabelecimento oferece serviços de internação pelo SUS." + - name: atendimento_ambulatorial_sus_indicador + description: "Indica se o estabelecimento oferece serviços ambulatoriais pelo SUS." + - name: atendimento_sadt_sus_indicador + description: "Indica se o estabelecimento oferece Serviços Auxiliares de Diagnóstico e Terapia (SADT) pelo SUS." + - name: atendimento_urgencia_sus_indicador + description: "Indica se o estabelecimento oferece serviços de urgência pelo SUS." + - name: atendimento_outros_sus_indicador + description: "Indica se o estabelecimento oferece outros tipos de serviços pelo SUS." + - name: atendimento_vigilancia_sus_indicador + description: "Indica se o estabelecimento oferece serviços de vigilância em saúde pelo SUS." + - name: atendimento_regulacao_sus_indicador + description: "Indica se o estabelecimento atua em atividades de regulação de serviços de saúde pelo SUS." + + # Metadados + - name: data_atualizao_registro + description: "Data em que o registro foi atualizado pela última vez." + - name: usuario_atualizador_registro + description: "Identificador do usuário que atualizou o registro pela última vez." + - name: mes_particao + description: "Mês utilizado para fins de particionamento dos dados." + - name: ano_particao + description: "Ano utilizado para fins de particionamento dos dados." + - name: data_particao + description: "Data específica utilizada para particionamento dos dados." + - name: data_carga + description: "Data em que os dados foram carregados no banco de dados." + - name: data_snapshot + description: "Data em que o snapshot dos dados foi capturado." diff --git a/models/marts/saude_cnes/_mart_saude_cnes_sources.yml b/models/marts/saude_cnes/_mart_saude_cnes_sources.yml new file mode 100644 index 00000000..c4be7835 --- /dev/null +++ b/models/marts/saude_cnes/_mart_saude_cnes_sources.yml @@ -0,0 +1,14 @@ +sources: + + - name: brutos_cnes_ftp + database: rj-sms + schema: brutos_cnes_ftp + tables: + - name: estabelecimento + - name: leito + + - name: brutos_cnes_web_staging + database: rj-sms + schema: brutos_cnes_web_staging + tables: + - name: tbLeito \ No newline at end of file diff --git a/models/marts/saude_cnes/dim_estabelecimento_sus_rio_historico.sql b/models/marts/saude_cnes/dim_estabelecimento_sus_rio_historico.sql new file mode 100644 index 00000000..85f88889 --- /dev/null +++ b/models/marts/saude_cnes/dim_estabelecimento_sus_rio_historico.sql @@ -0,0 +1,351 @@ +{{ + config( + schema="mart_saude_cnes__estabelecimento_sus_rio_historico", + alias="estabelecimento_sus_rio_historico", + partition_by = { + 'field': 'data_carga', + 'data_type': 'timestamp', + 'granularity': 'day' + } + ) +}} + +WITH + +-- Obtendo a data mais atual +versao_atual AS ( + SELECT MAX(data_particao) AS versao + FROM {{ ref("raw_cnes_web__tipo_unidade") }} +), -- OBS: Não faz mais sentido pegar a versão de alguma outra tabela, sem ser tipo_unidade? + +-- Obtendo todos os estabelecimentos do MRJ que possuem vinculo com o SUS +estabelecimentos_brutos AS ( + SELECT + ano, + mes, + cep, + id_estabelecimento_cnes, + id_natureza_juridica, + tipo_gestao, + tipo_unidade, + tipo_turno, + indicador_vinculo_sus as vinculo_sus_indicador, + indicador_atendimento_internacao_sus as atendimento_internacao_sus_indicador, + indicador_atendimento_ambulatorial_sus as atendimento_ambulatorial_sus_indicador, + indicador_atendimento_sadt_sus as atendimento_sadt_sus_indicador, + indicador_atendimento_urgencia_sus as atendimento_urgencia_sus_indicador, + indicador_atendimento_outros_sus as atendimento_outros_sus_indicador, + indicador_atendimento_vigilancia_sus as atendimento_vigilancia_sus_indicador, + indicador_atendimento_regulacao_sus as atendimento_regulacao_sus_indicador + FROM {{ source("brutos_cnes_ftp", "estabelecimento") }} + WHERE + sigla_uf = "RJ" + AND id_municipio_6 = "330455" + AND ( + indicador_vinculo_sus = 1 + OR indicador_atendimento_internacao_sus = 1 + OR indicador_atendimento_ambulatorial_sus = 1 + OR indicador_atendimento_sadt_sus = 1 + OR indicador_atendimento_urgencia_sus = 1 + OR indicador_atendimento_outros_sus = 1 + OR indicador_atendimento_vigilancia_sus = 1 + OR indicador_atendimento_regulacao_sus = 1 + ) +), + +-- Obtendo atributos dos estabelecimentos via tabela desnormalizada proveniente do CNES WEB +estabelecimentos_atributos_cnes_web AS ( + SELECT + id_cnes, + nome_razao_social, + nome_fantasia, + cnpj_mantenedora, + endereco_bairro, + endereco_logradouro, + endereco_numero, + endereco_complemento, + endereco_latitude, + endereco_longitude, + id_motivo_desativacao, + id_unidade, + aberto_sempre, + diretor_clinico_cpf, + diretor_clinico_conselho, + data_atualizao_registro, + usuario_atualizador_registro, + mes_particao, + ano_particao, + data_particao, + data_carga, + data_snapshot, + id_distrito_sanitario, + telefone, + email + FROM {{ ref("raw_cnes_web__estabelecimento") }} + WHERE data_particao = (SELECT versao FROM versao_atual) +), + +-- Obtendo atributos auxiliares dos estabelecimentos via classificação interna construída pela SMS +estabelecimentos_atributos AS ( + SELECT + id_cnes, + indicador_estabelecimento_sms as estabelecimento_sms_indicador, + tipo_unidade_subgeral, + tipo_unidade_agrupado_subgeral, + esfera_subgeral, + area_programatica, + area_programatica_descr, + agrupador_sms, + tipo_sms, + tipo_sms_simplificado, + nome_limpo, + nome_sigla, + prontuario_tem, + prontuario_versao, + responsavel_sms, + administracao, + prontuario_estoque_tem_dado, + prontuario_estoque_motivo_sem_dado + FROM {{ ref("raw_sheets__estabelecimento_auxiliar") }} +), + +-- Obtendo atributos de contato para os estabelecimentos +contatos_aps AS ( + SELECT + id_cnes, + telefone, + email, + facebook, + instagram, + twitter + FROM {{ ref("raw_plataforma_smsrio__estabelecimento_contato") }} +), + +-- Carregando tabelas utilizadas para mapear códigos em suas descrições textuais +tp_gestao AS ( + SELECT * FROM UNNEST([ + STRUCT("D" AS id_tipo_gestao, "DUPLA" AS tipo_gestao_descr), + STRUCT("E", "ESTADUAL"), + STRUCT("M", "MUNICIPAL"), + STRUCT("Z", "SEM GESTAO"), + STRUCT("S", "SEM GESTAO"), + STRUCT("-Z", "NAO INFORMADO") + ]) +), -- Definição proveniente do CNES FTP DATASUS + +nat_jur AS ( + SELECT + id_natureza_juridica, + descricao AS natureza_juridica_descr + FROM {{ ref("raw_cnes_web__natureza_juridica") }} + WHERE data_particao = (SELECT versao FROM versao_atual) + +), + +tp_unidade AS ( + SELECT + id_tipo_unidade, + descricao AS tipo_unidade_descr + FROM {{ ref("raw_cnes_web__tipo_unidade") }} + WHERE data_particao = (SELECT versao FROM versao_atual) +), + +turno AS ( + SELECT + id_turno_atendimento, + descricao AS turno_atendimento + FROM {{ ref("raw_cnes_web__turno_atendimento") }} + WHERE data_particao = (SELECT versao FROM versao_atual) +), + +-- Juntando todos os atributos e mappings, para enriquecer a tabela final de estabelecimentos +estabelecimentos_final AS ( + SELECT + -- Brutos FTP DATASUS + brutos.ano, + brutos.mes, + brutos.cep, + brutos.id_estabelecimento_cnes, + brutos.id_natureza_juridica, + brutos.tipo_gestao, + brutos.tipo_unidade, + brutos.tipo_turno, + brutos.vinculo_sus_indicador, + brutos.atendimento_internacao_sus_indicador, + brutos.atendimento_ambulatorial_sus_indicador, + brutos.atendimento_sadt_sus_indicador, + brutos.atendimento_urgencia_sus_indicador, + brutos.atendimento_outros_sus_indicador, + brutos.atendimento_vigilancia_sus_indicador, + brutos.atendimento_regulacao_sus_indicador, + + -- CNES Web + cnes_web.nome_razao_social, + cnes_web.nome_fantasia, + cnes_web.cnpj_mantenedora, + cnes_web.endereco_bairro, + cnes_web.endereco_logradouro, + cnes_web.endereco_numero, + cnes_web.endereco_complemento, + cnes_web.endereco_latitude, + cnes_web.endereco_longitude, + cnes_web.id_motivo_desativacao, + cnes_web.id_unidade, + cnes_web.aberto_sempre, + cnes_web.diretor_clinico_cpf, + cnes_web.diretor_clinico_conselho, + cnes_web.data_atualizao_registro, + cnes_web.usuario_atualizador_registro, + cnes_web.mes_particao, + cnes_web.ano_particao, + cnes_web.data_particao, + cnes_web.data_carga, + cnes_web.data_snapshot, + cnes_web.email AS email_cnes, + SPLIT(cnes_web.telefone, "/") AS telefone_cnes, + + -- Atributos criados in house + estabelecimentos_atributos.estabelecimento_sms_indicador, + estabelecimentos_atributos.tipo_unidade_subgeral AS tipo_unidade_alternativo, + 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, + estabelecimentos_atributos.agrupador_sms, + estabelecimentos_atributos.tipo_sms, + estabelecimentos_atributos.tipo_sms_simplificado, + estabelecimentos_atributos.nome_limpo, + estabelecimentos_atributos.nome_sigla, + estabelecimentos_atributos.prontuario_tem, + estabelecimentos_atributos.prontuario_versao, + estabelecimentos_atributos.responsavel_sms, + estabelecimentos_atributos.administracao, + estabelecimentos_atributos.prontuario_estoque_tem_dado, + estabelecimentos_atributos.prontuario_estoque_motivo_sem_dado, + REGEXP_REPLACE( + estabelecimentos_atributos.nome_limpo, + r'(CF |CSE |CMS |UPA 24h |POLICLINICA |HOSPITAL MUNICIPAL |COORD DE EMERGENCIA REGIONAL CER |MATERNIDADE )', + '' + ) AS nome_complemento, + + -- Mappings oficiais do CNES / DATASUS + tp_gestao.tipo_gestao_descr, + nat_jur.natureza_juridica_descr, + tp_unidade.tipo_unidade_descr, + turno.turno_atendimento, + + -- Informações de Contato + contatos_aps.telefone AS telefone_aps, + contatos_aps.facebook, + contatos_aps.instagram, + contatos_aps.twitter, + contatos_aps.email AS email_aps, + + FROM estabelecimentos_brutos AS brutos + LEFT JOIN estabelecimentos_atributos_cnes_web AS cnes_web ON cast(brutos.id_estabelecimento_cnes as int64) = cast(cnes_web.id_cnes as int64) + LEFT JOIN nat_jur ON cast(brutos.id_natureza_juridica as int64) = cast(nat_jur.id_natureza_juridica as int64) + LEFT JOIN tp_unidade ON cast(brutos.tipo_unidade as int64) = cast(tp_unidade.id_tipo_unidade as int64) + LEFT JOIN turno ON cast(brutos.tipo_turno as int64) = cast(turno.id_turno_atendimento as int64) + LEFT JOIN tp_gestao ON brutos.tipo_gestao = tp_gestao.id_tipo_gestao + LEFT JOIN estabelecimentos_atributos ON cast(brutos.id_estabelecimento_cnes as int64) = cast(estabelecimentos_atributos.id_cnes as int64) + LEFT JOIN contatos_aps ON cast(brutos.id_estabelecimento_cnes as int64) = cast(contatos_aps.id_cnes as int64) +), + +-- Seleção final +final as ( + SELECT + -- Identificação + cast(ano as int64) as ano, + cast(mes as int64) as mes, + lpad(id_estabelecimento_cnes, 7, '0') AS id_cnes, + id_unidade, + nome_razao_social, + nome_fantasia, + nome_limpo, + nome_sigla, + nome_complemento, + lpad(cnpj_mantenedora, 14, '0') AS cnpj_mantenedora, + + -- Responsabilização + esfera, + cast(id_natureza_juridica as int64) as id_natureza_juridica, + natureza_juridica_descr, + tipo_gestao, + tipo_gestao_descr, + responsavel_sms, + administracao, + lpad(diretor_clinico_cpf, 11, '0') AS diretor_clinico_cpf, + diretor_clinico_conselho, + + -- Atributos + cast(tipo_turno as int64) as tipo_turno, + turno_atendimento, + aberto_sempre, + + -- Tipagem dos Estabelecimentos (CNES) + cast(tipo_unidade as int64) AS id_tipo_unidade, + tipo_unidade_descr AS tipo, -- Renomear para tipo_cnes? + + -- Tipagem dos Estabelecimentos (DIT) + tipo_sms, + tipo_sms_simplificado, + agrupador_sms AS tipo_sms_agrupado, + + -- Tipagem dos Estabelecimentos (SUBGERAL) + tipo_unidade_alternativo, + tipo_unidade_agrupado, + + -- Localização + id_ap, + ap, + lpad(cep, 8, '0') as endereco_cep, + endereco_bairro, + endereco_logradouro, + endereco_numero, + endereco_complemento, + endereco_latitude, + endereco_longitude, + + -- Status + CASE + WHEN id_motivo_desativacao IS NULL OR id_motivo_desativacao = '' THEN 'sim' + ELSE 'não' + END AS ativa, + + -- Prontuário + prontuario_tem, + prontuario_versao, + prontuario_estoque_tem_dado, + prontuario_estoque_motivo_sem_dado, + + -- Informações de contato + COALESCE(telefone_aps, telefone_cnes) AS telefone, + COALESCE(email_aps, email_cnes) AS email, + facebook, + instagram, + twitter, + + -- Indicadores + estabelecimento_sms_indicador, + vinculo_sus_indicador, + atendimento_internacao_sus_indicador, + atendimento_ambulatorial_sus_indicador, + atendimento_sadt_sus_indicador, + atendimento_urgencia_sus_indicador, + atendimento_outros_sus_indicador, + atendimento_vigilancia_sus_indicador, + atendimento_regulacao_sus_indicador, + + -- Metadados + data_atualizao_registro, + usuario_atualizador_registro, + mes_particao, + ano_particao, + data_particao, + data_carga, + data_snapshot + + FROM estabelecimentos_final +) + +select * from final \ No newline at end of file diff --git a/models/raw/cnes_web/_cnes_sources.yml b/models/raw/cnes_web/_cnes_sources.yml index 3ff8b102..acfba671 100644 --- a/models/raw/cnes_web/_cnes_sources.yml +++ b/models/raw/cnes_web/_cnes_sources.yml @@ -17,4 +17,5 @@ sources: - name: tbDadosProfissionalSus - name: rlEstabEquipeProf - name: tbTipoEquipe - - name: tbArea \ No newline at end of file + - name: tbArea + - name: tbNaturezaJuridica \ No newline at end of file diff --git a/models/raw/cnes_web/raw_cnes_web__natureza_juridica.sql b/models/raw/cnes_web/raw_cnes_web__natureza_juridica.sql new file mode 100644 index 00000000..5c33c150 --- /dev/null +++ b/models/raw/cnes_web/raw_cnes_web__natureza_juridica.sql @@ -0,0 +1,28 @@ +{{ + config( + alias="natureza_juridica", + ) +}} + +with source as (select * from {{ source("brutos_cnes_web_staging", "tbNaturezaJuridica") }}) + +select + -- pk + safe_cast(CO_NATUREZA_JUR as string) as id_natureza_juridica, + + -- common + safe_cast(DS_NATUREZA_JUR as string) as descricao, + + -- metadata + safe_cast(mes_particao as string) as mes_particao, + safe_cast(ano_particao as string) as ano_particao, + concat( + safe_cast(ano_particao as string), + '-', + safe_cast(mes_particao as string), + '-01' + ) as data_particao, + safe_cast(_data_carga as datetime) as data_carga, + safe_cast(_data_snapshot as datetime) as data_snapshot + +from source \ No newline at end of file diff --git a/models/raw/sheets/_sheets_schema.yml b/models/raw/sheets/_sheets_schema.yml index 469abcdd..1ef815cb 100644 --- a/models/raw/sheets/_sheets_schema.yml +++ b/models/raw/sheets/_sheets_schema.yml @@ -8,10 +8,18 @@ models: data_tests: - unique: name: raw_sheets__estabelecimento_auxiliar__id_cnes__unique + - relationships: + name: raw_sheets__estabelecimento_auxiliar__id_cnes__relationship + to: ref('estabelecimento_sus_rio_historico') + field: id_cnes + - name: indicador_estabelecimento_sms + description: Indica se o estabelecimento é pertencente a rede assistencial da Secretaria Municipal de Saúde do Rio de Janeiro (1=SIM, 0=NAO) - name: tipo_sms description: Classificação alternativa ao CNES de tipos de unidades - name: tipo_sms_simplificado description: Classificação alternativa ao CNES de tipos de unidades abreviada + - name: agrupador_sms + description: Classificação alternativa ao CNES - name: nome_fantasia description: Nome fantasia de unidade de saúde - name: nome_limpo @@ -35,6 +43,15 @@ models: description: Subcretaria responsável dentro da SMS - name: administracao description: Administradora da unidade de saúde. + - name: tipo_unidade_subgeral + description: Classificação alternativa ao CNES de tipos de unidades + - name: tipo_unidade_agrupado_subgeral + description: Classificação alternativa ao CNES + - name: esfera_subgeral + description: Classificação alternativa de esfera + - name: area_programatica_descr + description: Descrição da Área Programática + - name: raw_sheets__material_mestre description: Tabela cadastral de materiais da SMS-Rio columns: diff --git a/models/raw/sheets/raw_sheets__estabelecimento_auxiliar.sql b/models/raw/sheets/raw_sheets__estabelecimento_auxiliar.sql index 76e77cf8..00e9396e 100644 --- a/models/raw/sheets/raw_sheets__estabelecimento_auxiliar.sql +++ b/models/raw/sheets/raw_sheets__estabelecimento_auxiliar.sql @@ -16,13 +16,15 @@ select format("%07d", cast(id_cnes as int64)) as id_cnes, -- fix cases where 0 on the left is lost -- Common fields + cast(indicador_estabelecimento_sms as int64) as indicador_estabelecimento_sms, + if(agrupador_sms = "nan", null, agrupador_sms) as agrupador_sms, if(tipo_sms = "nan", null, tipo_sms) as tipo_sms, if(tipo_sms_simplificado = "nan", null, tipo_sms_simplificado) as tipo_sms_simplificado, safe_cast(nome_fantasia as string) as nome_fantasia, if(nome_limpo = "nan", null, nome_limpo) as nome_limpo, if(nome_sigla = "nan", null, nome_sigla) as nome_sigla, - if(area_programatica = "nan", null, area_programatica) as area_programatica, + if(area_programatica = "nan", null, cast(area_programatica as int64)) as area_programatica, if(prontuario_tem = "nan", null, prontuario_tem) as prontuario_tem, if(prontuario_versao = "nan", null, prontuario_versao) as prontuario_versao, if(prontuario_estoque_tem_dado = "nan", null, prontuario_estoque_tem_dado) as prontuario_estoque_tem_dado, @@ -30,5 +32,10 @@ select if(responsavel_sms = "nan", null, responsavel_sms) as responsavel_sms, if(administracao = "nan", null, administracao) as administracao, + tipo_unidade_subgeral, + tipo_unidade_agrupado_subgeral, + esfera_subgeral, + area_programatica_descr + from source