diff --git a/dbt_project.yml b/dbt_project.yml index 6bbab5d0..aa713f49 100644 --- a/dbt_project.yml +++ b/dbt_project.yml @@ -318,6 +318,9 @@ models: br_rf_cafir: +materialized: table +schema: br_rf_cafir + br_rf_cno: + +materialized: table + +schema: br_rf_cno br_rj_isp_estatisticas_seguranca: +materialized: table +schema: br_rj_isp_estatisticas_seguranca diff --git a/macros/custom_get_where_subquery.sql b/macros/custom_get_where_subquery.sql index 8b33dddc..0a25ccae 100644 --- a/macros/custom_get_where_subquery.sql +++ b/macros/custom_get_where_subquery.sql @@ -44,6 +44,25 @@ {% endif %} {% endif %} + {% if "__most_recent_date_cno__" in where %} + {% set max_date_query = ( + "select max(data_extracao) as max_date from " ~ relation + ) %} + {% set max_date_result = run_query(max_date_query) %} + {% if execute and max_date_result.rows[0][0] %} + {% set max_date = max_date_result.rows[0][0] %} + {% set where = where | replace( + "__most_recent_date_cno__", + "data_extracao = '" ~ max_date ~ "'", + ) %} + {% do log( + "The test will filter by the most recent date: " + ~ max_date, + info=True, + ) %} + {% endif %} + {% endif %} + {# This block looks for __most_recent_year_month__ placeholder #} {% if "__most_recent_year_month__" in where %} {% set max_date_query = ( diff --git a/models/br_rf_cno/br_rf_cno__areas.sql b/models/br_rf_cno/br_rf_cno__areas.sql new file mode 100644 index 00000000..2dcf7cb6 --- /dev/null +++ b/models/br_rf_cno/br_rf_cno__areas.sql @@ -0,0 +1,23 @@ +{{ + config( + alias="areas", + schema="br_rf_cno", + materialized="incremental", + partition_by={ + "field": "data_extracao", + "data_type": "date", + }, + ) +}} + +select + safe_cast(data as date) data_extracao, + safe_cast(id_cno as string) id_cno, + safe_cast(categoria as string) categoria, + safe_cast(destinacao as string) destinacao, + safe_cast(tipo_obra as string) tipo_obra, + safe_cast(tipo_area as string) tipo_area, + safe_cast(tipo_area_complementar as string) tipo_area_complementar, + safe_cast(metragem as float64) metragem, +from `basedosdados-staging.br_rf_cno_staging.areas` as t +{% if is_incremental() %} where data > (select max(data) from {{ this }}) {% endif %} diff --git a/models/br_rf_cno/br_rf_cno__cnaes.sql b/models/br_rf_cno/br_rf_cno__cnaes.sql new file mode 100644 index 00000000..6e9072b8 --- /dev/null +++ b/models/br_rf_cno/br_rf_cno__cnaes.sql @@ -0,0 +1,18 @@ +{{ + config( + alias="cnaes", + schema="br_rf_cno", + materialized="incremental", + partition_by={ + "field": "data_extracao", + "data_type": "date", + }, + ) +}} +select + safe_cast(data as date) data_extracao, + safe_cast(data_registro as date) data_registro, + safe_cast(id_cno as string) id_cno, + safe_cast(cnae_2_subclasse as string) cnae_2_subclasse, +from `basedosdados-staging.br_rf_cno_staging.cnaes` as t +{% if is_incremental() %} where data > (select max(data) from {{ this }}) {% endif %} diff --git a/models/br_rf_cno/br_rf_cno__dicionario.sql b/models/br_rf_cno/br_rf_cno__dicionario.sql new file mode 100644 index 00000000..af35ffc2 --- /dev/null +++ b/models/br_rf_cno/br_rf_cno__dicionario.sql @@ -0,0 +1,8 @@ +{{ config(alias="dicionario", schema="br_rf_cno", materialized="table") }} +select + safe_cast(id_tabela as string) id_tabela, + safe_cast(nome_coluna as string) nome_coluna, + safe_cast(chave as string) chave, + safe_cast(cobertura_temporal as string) cobertura_temporal, + safe_cast(valor as string) valor, +from `basedosdados-staging.br_rf_cno_staging.dicionario` as t diff --git a/models/br_rf_cno/br_rf_cno__microdados.sql b/models/br_rf_cno/br_rf_cno__microdados.sql new file mode 100644 index 00000000..41f854ee --- /dev/null +++ b/models/br_rf_cno/br_rf_cno__microdados.sql @@ -0,0 +1,48 @@ +{{ + config( + alias="microdados", + schema="br_rf_cno", + materialized="incremental", + partition_by={ + "field": "data_extracao", + "data_type": "date", + }, + pre_hook="DROP ALL ROW ACCESS POLICIES ON {{ this }}", + ) +}} + +select + safe_cast(data as date) data_extracao, + safe_cast(data_situacao as date) data_situacao, + safe_cast(data_registro as date) data_registro, + safe_cast(data_inicio as date) data_inicio, + safe_cast(data_inicio_responsabilidade as date) data_inicio_responsabilidade, + safe_cast(id_pais as string) id_pais, + safe_cast(nome_pais as string) nome_pais, + safe_cast(sigla_uf as string) sigla_uf, + safe_cast(b.id_municipio as string) id_municipio, + safe_cast(id_cno as string) id_cno, + safe_cast(id_cno_vinculado as string) id_cno_vinculado, + safe_cast(ltrim(situacao, '0') as string) situacao, + safe_cast(id_responsavel as string) id_responsavel, + safe_cast(nome_responsavel as string) nome_responsavel, + safe_cast(ltrim(qualificacao_responsavel, '0') as string) qualificacao_responsavel, + safe_cast(nome_empresarial as string) nome_empresarial, + safe_cast(area as float64) area, + safe_cast(unidade_medida as string) unidade_medida, + safe_cast(bairro as string) bairro, + safe_cast(cep as string) cep, + safe_cast(logradouro as string) logradouro, + safe_cast(tipo_logradouro as string) tipo_logradouro, + safe_cast(numero_logradouro as string) numero_logradouro, + safe_cast(complemento as string) complemento, + safe_cast(caixa_postal as string) caixa_postal, +from `basedosdados-staging.br_rf_cno_staging.microdados` microdados +left join + ( + select id_municipio, id_municipio_rf + from `basedosdados.br_bd_diretorios_brasil.municipio` + ) b + on ltrim(microdados.id_municipio_rf, '0') = b.id_municipio_rf + +{% if is_incremental() %} where data > (select max(data) from {{ this }}) {% endif %} diff --git a/models/br_rf_cno/br_rf_cno__vinculos.sql b/models/br_rf_cno/br_rf_cno__vinculos.sql new file mode 100644 index 00000000..0c8e78f0 --- /dev/null +++ b/models/br_rf_cno/br_rf_cno__vinculos.sql @@ -0,0 +1,27 @@ +{{ + config( + alias="vinculos", + schema="br_rf_cno", + materialized="incremental", + partition_by={ + "field": "data_extracao", + "data_type": "date", + }, + pre_hook="DROP ALL ROW ACCESS POLICIES ON {{ this }}", + ) +}} + + +select + safe_cast(data as date) data_extracao, + safe_cast(data_registro as date) data_registro, + safe_cast(data_inicio as date) data_inicio, + safe_cast(data_fim as date) data_fim, + safe_cast(id_cno as string) id_cno, + safe_cast(id_responsavel as string) id_responsavel, + safe_cast( + ltrim(qualificacao_contribuinte, '0') as string + ) qualificacao_contribuinte, +from `basedosdados-staging.br_rf_cno_staging.vinculos` as t + +{% if is_incremental() %} where data > (select max(data) from {{ this }}) {% endif %} diff --git a/models/br_rf_cno/schema.yml b/models/br_rf_cno/schema.yml new file mode 100644 index 00000000..e5a8e272 --- /dev/null +++ b/models/br_rf_cno/schema.yml @@ -0,0 +1,253 @@ +--- +version: 2 +models: + - name: br_rf_cno__vinculos + description: Esta tabela apresenta o cadastro de vínculos relacionados a uma determinada + obra. + tests: + - custom_dictionary_coverage: + columns_covered_by_dictionary: [qualificacao_contribuinte] + dictionary_model: ref('br_rf_cno__dicionario') + config: + where: __most_recent_date_cno__ + columns: + - name: data_extracao + description: Data de extração dos dados na fonte original + tests: + - relationships: + to: ref('br_bd_diretorios_data_tempo__data') + field: data.data + config: + where: __most_recent_date_cno__ + - name: data_registro + description: Data de registro da obra + tests: + - relationships: + to: ref('br_bd_diretorios_data_tempo__data') + field: data.data + config: + where: __most_recent_date_cno__ + - name: data_inicio + description: Data de início do vínculo + tests: + - relationships: + to: ref('br_bd_diretorios_data_tempo__data') + field: data.data + config: + where: __most_recent_date_cno__ + - name: data_fim + description: Data de fim do vínculo + tests: + - relationships: + to: ref('br_bd_diretorios_data_tempo__data') + field: data.data + config: + where: __most_recent_date_cno__ + - name: id_cno + description: ID da obra no Cadastro Nacional de Obras (CNO) + - name: id_responsavel + description: ID (CNPJ/CPF) do responsável pela obra - se for CPF o campo + virá em branco. + - name: qualificacao_contribuinte + description: Qualificação do contribuinte + - name: br_rf_cno__areas + description: Esta tabela apresenta especificações da obra relacionada a uma determinada + obra. + tests: + - dbt_utils.unique_combination_of_columns: + combination_of_columns: [id_cno] + config: + where: __most_recent_date_cno__ + - custom_dictionary_coverage: + columns_covered_by_dictionary: + - categoria + - destinacao + - tipo_obra + - tipo_area + - tipo_area_complementar + dictionary_model: ref('br_rf_cno__dicionario') + config: + where: __most_recent_date_cno__ + columns: + - name: data_extracao + description: Data de extração dos dados na fonte original + tests: + - relationships: + to: ref('br_bd_diretorios_data_tempo__data') + field: data.data + config: + where: __most_recent_date_cno__ + - name: id_cno + description: ID da obra no Cadastro Nacional de Obras (CNO) + - name: categoria + description: Categoria da obra + - name: destinacao + description: Destinação da obra + - name: tipo_obra + description: Tipo de Obra + - name: tipo_area + description: Tipo de Área + - name: tipo_area_complementar + description: Tipo de Área Complementar + - name: metragem + description: Metragem da Área + - name: br_rf_cno__cnaes + description: Esta tabela apresenta a subclasse do Código Nacional de Atividades + Econômicas (CNAE) relacionado a uma determinada obra. + columns: + - name: data_extracao + description: Data de extração dos dados na fonte original + tests: + - relationships: + to: ref('br_bd_diretorios_data_tempo__data') + field: data.data + config: + where: __most_recent_date_cno__ + - name: data_registro + description: Data de registro + tests: + - relationships: + to: ref('br_bd_diretorios_data_tempo__data') + field: data.data + config: + where: __most_recent_date_cno__ + - name: id_cno + description: ID da obra no Cadastro Nacional de Obras (CNO) + - name: cnae_2_subclasse + description: Código de 7 dígitos da Subclasse da Classificação Nacional de + Atividades Econômicas (CNAE) + tests: + - relationships: + to: ref('br_bd_diretorios_brasil__cnae_2') + field: subclasse + config: + where: __most_recent_date_cno__ + - name: br_rf_cno__microdados + description: Esta é a tabela cadastral básica do Cadastro Nacional de Obras (CNO). + Nela são informadas as informações básicas das obras registradas no CNO. + tests: + - dbt_utils.unique_combination_of_columns: + combination_of_columns: [id_cno] + config: + where: __most_recent_date_cno__ + - custom_dictionary_coverage: + columns_covered_by_dictionary: [situacao, qualificacao_responsavel] + dictionary_model: ref('br_rf_cno__dicionario') + config: + where: __most_recent_date_cno__ + columns: + - name: data_extracao + description: Data de extração dos dados na fonte original + tests: + - relationships: + to: ref('br_bd_diretorios_data_tempo__data') + field: data.data + config: + where: __most_recent_date_cno__ + - name: data_situacao + description: Data da situação da obra + tests: + - relationships: + to: ref('br_bd_diretorios_data_tempo__data') + field: data.data + config: + where: __most_recent_date_cno__ + - name: data_registro + description: Data de registro + tests: + - relationships: + to: ref('br_bd_diretorios_data_tempo__data') + field: data.data + config: + where: __most_recent_date_cno__ + - name: data_inicio + description: Data de início da obra + tests: + - relationships: + to: ref('br_bd_diretorios_data_tempo__data') + field: data.data + config: + where: __most_recent_date_cno__ + - name: data_inicio_responsabilidade + description: Data de início do período de responsabilidade da obra + tests: + - relationships: + to: ref('br_bd_diretorios_data_tempo__data') + field: data.data + config: + where: __most_recent_date_cno__ + - name: id_pais + description: ID País + - name: sigla_uf + description: Sigla da Unidade da Federação + tests: + - relationships: + to: ref('br_bd_diretorios_brasil__uf') + field: sigla + config: + where: __most_recent_date_cno__ + - name: id_municipio + description: ID Município - IBGE 7 Dígitos + tests: + - relationships: + to: ref('br_bd_diretorios_brasil__municipio') + field: id_municipio + config: + where: __most_recent_date_cno__ + - name: id_cno + description: ID da obra no Cadastro Nacional de Obras (CNO) + - name: id_cno_vinculado + description: ID de inscrição vinculada a obra no Cadastro Nacional de Obras + (CNO) + - name: situacao + description: Situação da obra + - name: id_responsavel + description: ID (CNPJ/CPF) do responsável pela obra - se for CPF o campo + virá em branco + - name: nome_responsavel + description: Nome do responsável + - name: qualificacao_responsavel + description: Qualificação do responsável + - name: nome_empresarial + description: Nome empresarial do responsável pela obra (Se responsável pessoa + física, o campo virá em branco) + - name: area + description: Valor da área total + - name: unidade_medida + description: Unidade de medida + - name: bairro + description: Bairro + - name: cep + description: Número do CEP + - name: logradouro + description: Logradouro + - name: tipo_logradouro + description: Tipo de logradouro + - name: numero_logradouro + description: Número do logradouro + - name: complemento + description: Complemento do endereço + - name: caixa_postal + description: Caixa postal no exterior + - name: br_rf_cno__dicionario + description: Dicionário para tradução dos códigos do conjunto br_rf_cno. Para + traduzir códigos compartilhados entre instituições, como id_municipio, buscar + por diretórios + tests: + - dbt_utils.unique_combination_of_columns: + combination_of_columns: + - id_tabela + - nome_coluna + - chave + - cobertura_temporal + columns: + - name: id_tabela + description: ID Tabela + - name: nome_coluna + description: Nome da coluna + - name: chave + description: Chave + - name: cobertura_temporal + description: Cobertura Temporal + - name: valor + description: Valor