Base CNPJ
Toda a base do TermoLeads cabe em uma tabela de consulta, a cnpj, com uma linha por estabelecimento. A Receita publica os dados divididos em vários arquivos; a importação junta tudo uma vez só, e as telas leem essa tabela sem cruzar nenhuma outra.
As tabelas
| Tabela | O que guarda | Quem lê |
|---|---|---|
cnpj | Uma linha por estabelecimento, com empresa, Simples, sócios e descrições na própria linha. Chave primária: o CNPJ de 14 dígitos. | As duas telas de consulta |
cnpj_cnae | Código e descrição das atividades econômicas (CNAE). | Só a importação |
cnpj_municipio | Código e nome dos municípios, no código da Receita. | Só a importação |
cnpj_natureza | Código e descrição das naturezas jurídicas. | Só a importação |
cnpj_qualificacao | Código e descrição das qualificações de responsável e de sócio. | Só a importação |
cnpj_motivo | Código e descrição dos motivos de situação cadastral. | Só a importação |
cnpj_pais | Código e nome dos países. | Só a importação |
cnpj_import_execucao | Uma linha por execução da importação, com mês, situação, contagens e erro. | A tela de importação (histórico) |
As seis tabelas de domínio só servem para preencher as colunas de descrição da cnpj durante a importação. Se o arquivo de um domínio não vier na pasta do mês ou falhar na leitura, a importação usa o que já está na tabela, e a tabela não é regravada.
Aqui não existe coluna deletado. A base não é editada linha a linha: cada importação completa substitui a tabela cnpj inteira, e uma empresa que sumiu da publicação da Receita some junto.
Dos arquivos da Receita para a linha
A Receita publica, em cada pasta mensal, estes arquivos .zip, cada um com um CSV separado por ; e codificado em Latin-1:
| Arquivo | Conteúdo | Colunas | Chave de ligação |
|---|---|---|---|
Estabelecimentos*.zip | Cada unidade, matriz ou filial, com endereço, contato, situação e CNAE | 30 | cnpj_basico + cnpj_ordem + cnpj_dv |
Empresas*.zip | Razão social, natureza jurídica, capital social e porte | 7 | cnpj_basico |
Socios*.zip | Quadro societário | 11 | cnpj_basico (vários por empresa) |
Simples.zip | Opção pelo Simples Nacional e pelo MEI, com datas | 7 | cnpj_basico |
Cnaes.zip, Municipios.zip, Naturezas.zip, Qualificacoes.zip, Motivos.zip, Paises.zip | Tabelas de código e descrição | 2 | O próprio código |
O arquivo de estabelecimentos dirige a montagem: cada estabelecimento vira uma linha, e os dados da empresa, do Simples e dos sócios do mesmo cnpj_basico são copiados para ela. Por isso, a matriz e todas as filiais de uma empresa repetem a mesma razão social, o mesmo capital e o mesmo quadro de sócios.
As colunas da tabela cnpj
cnpj (os 14 dígitos, chave primária), cnpj_basico (8 dígitos da empresa), cnpj_ordem (4 dígitos do estabelecimento), cnpj_dv (2 dígitos verificadores), identificador_matriz_filial e sua descrição (Matriz ou Filial), e nome_fantasia.
situacao_cadastral e sua descrição (Nula, Ativa, Suspensa, Inapta ou Baixada), data_situacao_cadastral, motivo_situacao_cadastral e sua descrição, situacao_especial e data_situacao_especial.
data_inicio_atividade, cnae_fiscal_principal e sua descrição, e cnae_fiscal_secundaria, a lista de CNAEs secundários separados por vírgula, como a Receita publica.
tipo_logradouro, logradouro, numero, complemento, bairro, cep, uf, municipio (código da Receita) e municipio_descricao (nome da cidade), nome_cidade_exterior, pais e sua descrição, ddd_1 e telefone_1, ddd_2 e telefone_2, ddd_fax e fax, e correio_eletronico.
empresa_razao_social, empresa_natureza_juridica e sua descrição, empresa_qualificacao_responsavel e sua descrição, empresa_capital_social (texto bruto, com vírgula decimal), empresa_porte_empresa e sua descrição (Não informado, Microempresa, Empresa de Pequeno Porte ou Demais) e empresa_ente_federativo_responsavel. A coluna tem_empresa é false quando o estabelecimento não tinha empresa correspondente no arquivo.
simples_opcao_pelo_simples e sua descrição (Sim ou Não), simples_data_opcao_simples, simples_data_exclusao_simples, simples_opcao_pelo_mei e sua descrição, simples_data_opcao_mei e simples_data_exclusao_mei. A coluna tem_simples é false quando a empresa não aparece no arquivo do Simples.
Uma lista em jsonb, ordenada pelo nome do sócio. Cada item tem os 11 campos do arquivo de sócios (identificador, nome ou razão social, CPF ou CNPJ, qualificação, data de entrada, país, representante legal, nome e qualificação do representante e faixa etária) e as descrições acrescentadas: tipo de sócio (Pessoa Jurídica, Pessoa Física ou Estrangeiro), qualificação do sócio, qualificação do representante e país.
Regras de fidelidade
- Tudo é texto. Datas ficam como
AAAAMMDD(que ordenam corretamente como texto), códigos mantêm os zeros à esquerda e campos vazios continuam vazios. A formatação para leitura (datasDD/MM/AAAA, capital em reais, máscara do CNPJ) acontece só na tela. - Acentos sem perda. A conversão de Latin-1 para UTF-8 é feita byte a byte, sem trocar nenhum caractere por símbolo de erro.
- Descrição ao lado do código. Toda coluna
*_descricaoé derivada na importação; o código original continua na sua coluna. - Estabelecimento sem CNPJ completo é descartado, porque não tem identidade. CNPJ repetido também: vale a primeira ocorrência.
Índices
| Índice | Colunas | Para quê |
|---|---|---|
| Chave primária | cnpj | Consulta de um CNPJ |
cnpj_consulta_canonica | uf, municipio_descricao, cnae_fiscal_principal, situacao_cadastral, cnpj | Localizar Empresas com UF, cidade, CNAE e situação |
cnpj_cnae_cnpj | cnae_fiscal_principal, cnpj | Filtro só por atividade, sem UF |
A importação recria na tabela nova todos os índices que a cnpj tiver no momento, lidos do próprio banco. Um índice acrescentado por uma migration futura entra na base nova sem mudar o código da importação.
Histórico de importações
A tabela cnpj_import_execucao recebe uma linha no início de cada importação, com situação executando, e é atualizada no fim:
| Situação | Quando |
|---|---|
concluido | Todos os arquivos foram lidos e a base nova entrou no ar. |
concluido_com_falhas | A base nova entrou no ar, mas algum arquivo falhou na leitura. |
erro | Um erro interrompeu a importação; a base anterior continua no ar. |
cancelado | O master cancelou; a base anterior continua no ar. |
Também ficam registrados o mês importado, o total de arquivos, quantos terminaram bem, o total de linhas, a lista de arquivos que falharam e a mensagem de erro.