-
Notifications
You must be signed in to change notification settings - Fork 23
[Chore] Ajustes CNPJ #1698
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Chore] Ajustes CNPJ #1698
Changes from all commits
56cfac4
c1eecf2
886bd0c
8c08c42
df1cd65
e324eab
db79a5d
687db59
fca0e9d
6cbf170
5b46480
4e99cbc
2a9aa01
4da7902
ccce5d7
1a8b233
20c0387
820f554
1e51655
c377969
45c8484
9c6ece4
2c52cdb
59bd753
80e999a
f76ba4b
e24ccdf
7457ce0
51a7821
b88ba3b
e607b05
81c879c
0acf270
ee555f9
38bb5a0
407d186
fea8aff
7e70bed
10cdb3f
606da16
99f378c
9ca1b4d
8187bd3
15e4c5f
f9ea693
fa71a91
bc28e56
6d329aa
4fb79e5
23595b1
9de529a
b275f72
5097376
5a3a5e6
8f28fe5
5e66027
3eeddca
1876800
1c7dcc9
cfeeda2
10349fb
df463df
f21e95a
3754ed8
3d4105f
00125dc
c9d6824
9cac3e6
a090d6a
a1c9115
e34573c
248f123
2c0c56a
78531b7
eb509c1
cc15a77
cfe9aca
4320d76
ca9a973
5513024
49b43e1
0bf0309
c4fd7d4
de4a5a6
3867e86
669ac57
d80d5ea
04e1750
5c1e4ad
f89ae45
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,62 @@ | ||
| {{ config(alias="dicionario", schema="br_rf_cnpj", materialized="table") }} | ||
|
|
||
| with | ||
| tmp_dict as ( | ||
| 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, | ||
| regexp_replace( | ||
| {{ validate_null_cols("valor") }}, r'(^0+)(?:[^0]+|0{1})', '' | ||
| ) as valor, | ||
| from {{ set_datalake_project("br_rf_cnpj_staging.dicionario") }} as t | ||
| ) | ||
| select | ||
| id_tabela, | ||
| nome_coluna, | ||
| chave, | ||
| cobertura_temporal, | ||
| case when nome_coluna = "id_pais" then valor else initcap(valor) end as valor | ||
| from tmp_dict | ||
| where valor is not null | ||
| union all | ||
| {{ | ||
| dicionario_not_found( | ||
| id_tabela="empresas", | ||
| nome_coluna="qualificacao_responsavel", | ||
| chave="36", | ||
| ) | ||
| }} | ||
| union all | ||
| {{ | ||
| dicionario_not_found( | ||
| id_tabela="socios", | ||
| nome_coluna="id_pais", | ||
| chave=["994", "393"], | ||
| ) | ||
| }} | ||
| union all | ||
| {{ | ||
| dicionario_not_found( | ||
| id_tabela="estabelecimentos", | ||
| nome_coluna="id_pais", | ||
| chave=["8", "9", "393"], | ||
| ) | ||
| }} | ||
| union all | ||
| {{ | ||
| dicionario_not_found( | ||
| id_tabela="estabelecimentos", | ||
| nome_coluna="motivo_situacao_cadastral", | ||
| chave="32", | ||
| ) | ||
| }} | ||
| union all | ||
| {{ | ||
| dicionario_not_found( | ||
| id_tabela="estabelecimentos", | ||
| nome_coluna="", | ||
| chave=["6202100", "4761000"], | ||
| ) | ||
| }} | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,55 @@ | ||
| {{ | ||
| config( | ||
| schema="br_rf_cnpj", | ||
| alias="empresas", | ||
| materialized="incremental", | ||
| partition_by={ | ||
| "field": "data_referencia", | ||
| "data_type": "date", | ||
| "granularity": "month", | ||
| }, | ||
| ) | ||
| }} | ||
|
|
||
| with | ||
| cnpj_empresas as ( | ||
| select | ||
| safe.parse_date('%Y-%m', data_referencia) data_referencia, | ||
| safe_cast(lpad(cnpj_basico, 8, '0') as string) cnpj_basico, | ||
| safe_cast(razao_social as string) razao_social, | ||
| safe_cast(natureza_juridica as string) natureza_juridica, | ||
| safe_cast( | ||
| regexp_replace(qualificacao_responsavel, '^0', '') as string | ||
| ) qualificacao_responsavel, | ||
| safe_cast(capital_social as float64) capital_social, | ||
| safe_cast(regexp_replace(porte, '^0', '') as string) porte, | ||
| safe_cast(ente_federativo as string) ente_federativo, | ||
| safe_cast(data_modificacao as date) data_modificacao | ||
| from {{ set_datalake_project("br_rf_cnpj_staging.empresas") }} as t | ||
| where | ||
| porte != "porte" | ||
| {% if is_incremental() %} | ||
| and safe.parse_date('%Y-%m', data_referencia) | ||
| > (select max(data_referencia) from {{ this }}) | ||
| {% else %} | ||
| -- Dados históricos até 2023-04-30 foram migrados do modelo | ||
| -- br_me_cnpj.estabelecimentos | ||
| union all | ||
| select | ||
| safe_cast(data as date) data_referencia, | ||
| safe_cast(lpad(cnpj_basico, 8, '0') as string) cnpj_basico, | ||
| safe_cast(razao_social as string) razao_social, | ||
| safe_cast(natureza_juridica as string) natureza_juridica, | ||
| safe_cast( | ||
| regexp_replace(qualificacao_responsavel, '^0', '') as string | ||
| ) qualificacao_responsavel, | ||
| safe_cast(capital_social as float64) capital_social, | ||
| safe_cast(regexp_replace(porte, '^0', '') as string) porte, | ||
| safe_cast(ente_federativo as string) ente_federativo, | ||
| safe_cast(null as date) data_modificacao | ||
| from {{ set_datalake_project("br_rf_cnpj_staging.empresas_legado") }} | ||
| where porte != "porte" and safe_cast(data as date) <= date("2023-04-30") | ||
| {% endif %} | ||
| ) | ||
| select * | ||
| from cnpj_empresas |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,148 @@ | ||
| {{ | ||
| config( | ||
| schema="br_rf_cnpj", | ||
| alias="estabelecimentos", | ||
| materialized="incremental", | ||
| partition_by={ | ||
| "field": "data_referencia", | ||
| "data_type": "date", | ||
| "granularity": "month", | ||
| }, | ||
| cluster_by=["sigla_uf"], | ||
| ) | ||
| }} | ||
| with | ||
| cnpj_estabelecimentos as ( | ||
| select | ||
| safe.parse_date('%Y-%m', data_referencia) data_referencia, | ||
| safe_cast(lpad(cnpj, 14, "0") as string) cnpj, | ||
| safe_cast(lpad(cnpj_basico, 8, '0') as string) cnpj_basico, | ||
| safe_cast(lpad(cnpj_ordem, 4, '0') as string) cnpj_ordem, | ||
| safe_cast(lpad(cnpj_dv, 2, '0') as string) cnpj_dv, | ||
| safe_cast( | ||
| identificador_matriz_filial as string | ||
| ) identificador_matriz_filial, | ||
| safe_cast(nome_fantasia as string) nome_fantasia, | ||
| safe_cast(cast(situacao_cadastral as int64) as string) situacao_cadastral, | ||
| safe_cast(data_situacao_cadastral as date) data_situacao_cadastral, | ||
| safe_cast( | ||
| regexp_replace(motivo_situacao_cadastral, '^0', '') as string | ||
| ) motivo_situacao_cadastral, | ||
| safe_cast(nome_cidade_exterior as string) nome_cidade_exterior, | ||
| safe_cast(cast(id_pais as int64) as string) id_pais, | ||
|
Comment on lines
+26
to
+32
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win 🧩 Analysis chain🏁 Script executed: #!/usr/bin/env bash
set -euo pipefail
# Find all nested SAFE_CAST(CAST(...)) expressions in the CNPJ models.
rg -n -U -P 'safe_cast\s*\(\s*cast\s*\(' models/br_rf_cnpj
# Inspect raw CNPJ transformations for handling of blank numeric-code fields.
rg -n -C 4 --glob '*.py' \
'qualificacao_representante_legal|qualificacao|situacao_cadastral|id_pais' \
pipelines/crawler/rf_cnpjRepository: basedosdados/pipelines Length of output: 12888 🏁 Script executed: #!/usr/bin/env bash
set -euo pipefail
echo "== model excerpts =="
sed -n '1,100p' models/br_rf_cnpj/br_rf_cnpj__estabelecimentos.sql
sed -n '1,85p' models/br_rf_cnpj/br_rf_cnpj__socios.sql
echo "== source preparation excerpts around rf_cnpj columns =="
rg -n -C 7 'qualificacao|id_pais|situacao_cadastral|CNPJ|RF_CNPJ|colunas_estabelecimentos|COLUNAS_ESTABELECIMENTOS|COLUNAS_SOCIOS' pipelines/crawler/rf_cnpj -g '*.py'
echo "== deterministic SQL semantics probe if duckdb is available =="
python3 - <<'PY'
from pathlib import Path
p = Path("/tmp/probe_cast.sql")
for val in ("", None, "abc", "1"):
expr = f"SELECT {repr(val) if val else 'NULL'} AS val, CAST({repr(val) if val else 'NULL'} AS INT64) AS safe_cast_of_cast"
txt = p.read_text() if p.exists() else ""
txt += expr + "\n"
p.write_text(txt)
print("sql generated for values: '', NULL, 'abc', '1'\n" + p.read_text())
PYRepository: basedosdados/pipelines Length of output: 31166 🏁 Script executed: #!/usr/bin/env bash
set -euo pipefail
echo "== rf_cnpj utils relevant source =="
sed -n '430,510p' pipelines/crawler/rf_cnpj/utils.py
sed -n '780,830p' pipelines/crawler/rf_cnpj/utils.py
echo "== deterministic typecast probe if duckdb is available =="
if command -v duckdb >/dev/null 2>&1; then
cat >/tmp/cast_probe.sql <<'SQL'
select
'NULL' as value, CAST(NULL AS INT64) as cast_result, CAST(NULL AS STRING) as outer_safe_result
union all select 'empty', CAST('' AS INT64), CAST(CAST('' AS INT64) AS STRING)
union all select 'malformed', CAST('abc' AS INT64), CAST(CAST('abc' AS INT64) AS STRING)
union all select 'valid', CAST('1' AS INT64), CAST(CAST('1' AS INT64) AS STRING);
SQL
duckdb /tmp/cast_probe.sql
else
echo "duckdb not available"
fiRepository: basedosdados/pipelines Length of output: 5146 Make numeric-code normalization fail-safe. The inner Replace the inner casts with
📍 Affects 2 files
🤖 Prompt for AI Agents |
||
| safe_cast(data_inicio_atividade as date) data_inicio_atividade, | ||
| safe_cast(cnae_fiscal_principal as string) cnae_fiscal_principal, | ||
| safe_cast(cnae_fiscal_secundaria as string) cnae_fiscal_secundaria, | ||
| safe_cast(sigla_uf as string) sigla_uf, | ||
| safe_cast(safe_cast(id_municipio_rf as numeric) as string) id_municipio_rf, | ||
| safe_cast(tipo_logradouro as string) tipo_logradouro, | ||
| safe_cast(logradouro as string) logradouro, | ||
| safe_cast(numero as string) numero, | ||
| safe_cast(complemento as string) complemento, | ||
| safe_cast(bairro as string) bairro, | ||
| safe_cast(replace (cep, ".0", "") as string) cep, | ||
| safe_cast(ddd_1 as string) ddd_1, | ||
| safe_cast(telefone_1 as string) telefone_1, | ||
| safe_cast(ddd_2 as string) ddd_2, | ||
| safe_cast(telefone_2 as string) telefone_2, | ||
| safe_cast(ddd_fax as string) ddd_fax, | ||
| safe_cast(fax as string) fax, | ||
| safe_cast(lower(email) as string) email, | ||
| safe_cast(situacao_especial as string) situacao_especial, | ||
| safe_cast(data_modificacao as date) data_modificacao, | ||
| safe_cast(data_situacao_especial as date) data_situacao_especial | ||
| from {{ set_datalake_project("br_rf_cnpj_staging.estabelecimentos") }} | ||
| {% if is_incremental() %} | ||
| where | ||
| safe.parse_date('%Y-%m', data_referencia) | ||
| > (select max(data_referencia) from {{ this }}) | ||
| -- Dados históricos até 2023-04-30 foram migrados do modelo | ||
| -- br_me_cnpj.estabelecimentos | ||
| {% else %} | ||
| union all | ||
| select | ||
| safe_cast(data as date) data_referencia, | ||
| safe_cast(lpad(cnpj, 14, "0") as string) cnpj, | ||
| safe_cast(lpad(cnpj_basico, 8, '0') as string) cnpj_basico, | ||
| safe_cast(lpad(cnpj_ordem, 4, '0') as string) cnpj_ordem, | ||
| safe_cast(lpad(cnpj_dv, 2, '0') as string) cnpj_dv, | ||
| safe_cast( | ||
| identificador_matriz_filial as string | ||
| ) identificador_matriz_filial, | ||
| safe_cast(nome_fantasia as string) nome_fantasia, | ||
| safe_cast( | ||
| cast(situacao_cadastral as int64) as string | ||
| ) situacao_cadastral, | ||
| safe_cast(data_situacao_cadastral as date) data_situacao_cadastral, | ||
| safe_cast( | ||
| regexp_replace(motivo_situacao_cadastral, '^0', '') as string | ||
| ) motivo_situacao_cadastral, | ||
| safe_cast(nome_cidade_exterior as string) nome_cidade_exterior, | ||
| safe_cast(cast(id_pais as int64) as string) id_pais, | ||
| safe_cast(data_inicio_atividade as date) data_inicio_atividade, | ||
| safe_cast(cnae_fiscal_principal as string) cnae_fiscal_principal, | ||
| safe_cast(cnae_fiscal_secundaria as string) cnae_fiscal_secundaria, | ||
| safe_cast(sigla_uf as string) sigla_uf, | ||
| safe_cast( | ||
| safe_cast(id_municipio_rf as numeric) as string | ||
| ) id_municipio_rf, | ||
| safe_cast(tipo_logradouro as string) tipo_logradouro, | ||
| safe_cast(logradouro as string) logradouro, | ||
| safe_cast(numero as string) numero, | ||
| safe_cast(complemento as string) complemento, | ||
| safe_cast(bairro as string) bairro, | ||
| safe_cast(replace (cep, ".0", "") as string) cep, | ||
| safe_cast(ddd_1 as string) ddd_1, | ||
| safe_cast(telefone_1 as string) telefone_1, | ||
| safe_cast(ddd_2 as string) ddd_2, | ||
| safe_cast(telefone_2 as string) telefone_2, | ||
| safe_cast(ddd_fax as string) ddd_fax, | ||
| safe_cast(fax as string) fax, | ||
| safe_cast(lower(email) as string) email, | ||
| safe_cast(situacao_especial as string) situacao_especial, | ||
| safe_cast(null as date) data_modificacao, | ||
| safe_cast(data_situacao_especial as date) data_situacao_especial | ||
| from | ||
| {{ set_datalake_project("br_rf_cnpj_staging.estabelecimentos_legado") }} | ||
| where safe_cast(data as date) <= date("2023-04-30") | ||
| {% endif %} | ||
| ) | ||
| select | ||
| a.data_referencia, | ||
| a.cnpj, | ||
| a.cnpj_basico, | ||
| a.cnpj_ordem, | ||
| a.cnpj_dv, | ||
| a.identificador_matriz_filial, | ||
| a.nome_fantasia, | ||
| a.situacao_cadastral, | ||
| a.data_situacao_cadastral, | ||
| a.motivo_situacao_cadastral, | ||
| a.nome_cidade_exterior, | ||
| a.id_pais, | ||
| a.data_inicio_atividade, | ||
| a.cnae_fiscal_principal, | ||
| a.cnae_fiscal_secundaria, | ||
| a.sigla_uf, | ||
| safe_cast(b.id_municipio as string) id_municipio, | ||
| a.id_municipio_rf, | ||
| a.tipo_logradouro, | ||
| a.logradouro, | ||
| a.numero, | ||
| a.complemento, | ||
| a.bairro, | ||
| a.cep, | ||
| a.ddd_1, | ||
| a.telefone_1, | ||
| a.ddd_2, | ||
| a.telefone_2, | ||
| a.ddd_fax, | ||
| a.fax, | ||
| a.email, | ||
| a.situacao_especial, | ||
| a.data_modificacao, | ||
| a.data_situacao_especial | ||
| from cnpj_estabelecimentos a | ||
| left join | ||
| basedosdados.br_bd_diretorios_brasil.municipio b | ||
| on safe_cast(safe_cast(a.id_municipio_rf as numeric) as string) = b.id_municipio_rf | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,20 @@ | ||
| {{ | ||
| config( | ||
| schema="br_rf_cnpj", | ||
| alias="simples", | ||
| materialized="table", | ||
| ) | ||
| }} | ||
|
|
||
| select | ||
| -- safe.parse_date('%Y-%m', data_referencia) data_referencia, | ||
| lpad(safe_cast(cnpj_basico as string), 8, '0') cnpj_basico, | ||
| safe_cast(opcao_simples as int64) opcao_simples, | ||
| safe_cast(data_opcao_simples as date) data_opcao_simples, | ||
| safe_cast(data_exclusao_simples as date) data_exclusao_simples, | ||
| safe_cast(opcao_mei as int64) opcao_mei, | ||
| safe_cast(data_opcao_mei as date) data_opcao_mei, | ||
| safe_cast(data_exclusao_mei as date) data_exclusao_mei, | ||
| -- safe_cast(data_modificacao as date) data_modificacao | ||
| from {{ set_datalake_project("br_rf_cnpj_staging.simples") }} as t | ||
| where safe_cast(opcao_mei as string) != "opcao_mei" |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,64 @@ | ||
| {{ | ||
| config( | ||
| schema="br_rf_cnpj", | ||
| alias="socios", | ||
| materialized="incremental", | ||
| partition_by={ | ||
| "field": "data_referencia", | ||
| "data_type": "date", | ||
| "granularity": "month", | ||
| }, | ||
| ) | ||
| }} | ||
| with | ||
| cnpj_socios as ( | ||
| select | ||
| safe.parse_date('%Y-%m', data_referencia) data_referencia, | ||
| lpad(safe_cast(cnpj_basico as string), 8, '0') cnpj_basico, | ||
| safe_cast(tipo as string) tipo, | ||
| safe_cast(nome as string) nome, | ||
| safe_cast(documento as string) documento, | ||
| safe_cast(cast(qualificacao as int64) as string) qualificacao, | ||
| safe_cast(data_entrada_sociedade as date) data_entrada_sociedade, | ||
| safe_cast(cast(id_pais as int64) as string) id_pais, | ||
| safe_cast(cpf_representante_legal as string) cpf_representante_legal, | ||
| safe_cast(nome_representante_legal as string) nome_representante_legal, | ||
| safe_cast( | ||
| cast(qualificacao_representante_legal as int64) as string | ||
| ) qualificacao_representante_legal, | ||
| safe_cast(faixa_etaria as string) faixa_etaria, | ||
| safe_cast(data_modificacao as date) data_modificacao | ||
| from {{ set_datalake_project("br_rf_cnpj_staging.socios") }} as t | ||
| where | ||
| safe_cast(qualificacao as string) != "qualificacao" | ||
| {% if is_incremental() %} | ||
| and safe.parse_date('%Y-%m', data_referencia) | ||
| > (select max(data_referencia) from {{ this }}) | ||
| {% else %} | ||
| -- Dados históricos até 2023-04-30 foram migrados do modelo | ||
| -- br_me_cnpj.socios | ||
| union all | ||
| select | ||
| safe_cast(data as date) data_referencia, | ||
| lpad(safe_cast(cnpj_basico as string), 8, '0') cnpj_basico, | ||
| safe_cast(tipo as string) tipo, | ||
| safe_cast(nome as string) nome, | ||
| safe_cast(documento as string) documento, | ||
| safe_cast(cast(qualificacao as int64) as string) qualificacao, | ||
| safe_cast(data_entrada_sociedade as date) data_entrada_sociedade, | ||
| safe_cast(cast(id_pais as int64) as string) id_pais, | ||
| safe_cast(cpf_representante_legal as string) cpf_representante_legal, | ||
| safe_cast(nome_representante_legal as string) nome_representante_legal, | ||
| safe_cast( | ||
| cast(qualificacao_representante_legal as int64) as string | ||
| ) qualificacao_representante_legal, | ||
| safe_cast(faixa_etaria as string) faixa_etaria, | ||
| safe_cast(null as date) data_modificacao | ||
| from {{ set_datalake_project("br_rf_cnpj_staging.socios_legado") }} | ||
| where | ||
| safe_cast(qualificacao as string) != "qualificacao" | ||
| and safe_cast(data as date) <= date("2023-04-30") | ||
| {% endif %} | ||
| ) | ||
| select * | ||
| from cnpj_socios |
Uh oh!
There was an error while loading. Please reload this page.