Escreva testes e rode os testes, use autoformatação e linter:
$ gofmt ./
$ staticcheck ./...
$ go test --race ./...
Os testes requerem um banco de dados de teste, com acesso configurado em TEST_DATABASE_URL
como no exemplo em .env
.
Caso queira utilizar o Docker apenas para subir o banco de dados, utilize:
$ docker compose up -d postgres
Existe também um banco de dados para teste, que não persiste dados e que loga todas as queries:
$ docker compose up -d postgres_test
Para visualizar as queries efetuadas:
$ docker compose logs postgres_test
As configurações padrão desses bancos são:
Serviço | Ambiente | Variável de ambiente | Valor |
---|---|---|---|
postgres |
Desenvolvimento | DATABASE_URL |
postgres://minhareceita:minhareceita@localhost:5432/minhareceita?sslmode=disable |
postgres_test |
Testes | TEST_DATABASE_URL |
postgres://minhareceita:minhareceita@localhost:5555/minhareceita?sslmode=disable |
Se for utilizar Docker para rodar o projeto todo, copie o arquivo .env.sample
como .env
— e ajuste, se necessário.
O banco de dados de sua escolha (padrão, que persiste dados; ou de testes, que não persiste dados) tem que ser iniciado isoladamente.
Todos os dados manipulados por esse pacote vem da Receita Federal.
Um número de CNPJ tem 3 partes, e isso é importante pois influencia a forma que a Receita Federal disponibiliza os dados:
- base
- ordem
- dígitos verificadores
Por exemplo, em 19.131.243/0001-97
o número base é 19.131.243
, a ordem é 0001
e 97
são os dígitos verificadores.
Uma mesma pessoa jurídica tem sempre a mesma base, e só varia a ordem (nas filiais dessa mesma pessoa jurídica, por exemplo), e os dígitos verificadores.
O grosso dos dados está nos arquivos CSV de estabelecimentos que tem Estabelecimentos*
como prefixo, e as linhas desses arquivos tem um número de CNPJ completo como chave.
- Arquivos com o prefixo
Empresas*
tem o básico dos dados, como razão social, natureza jurídica e porte. - Arquivos com o prefixo
Socios*
tem informações sobre o quadro societário de cada pessoa jurídica. - Arquivo
Simples.zip
tem informações sobre adesão das pessoas jurídicas ao Simples e MEI.
Na leitura desses arquivos existem campos que contém um código numérico, mas sem descrição do significado (por exemplo, temos o código 9701 para o município de Brasília). Esses arquivos são chamados de tabelas de look up:
- Arquivo
Cnaes.zip
com descrição dos CNAEs - Arquivo
Motivos.zip
com descrição dos motivos cadastrais - Arquivo
Municipios.zip
com o nome dos municípios - Arquivo
Paises.zip
com o nome dos países - Arquivo
Naturezas.zip
com o nome da natureza jurídica - Arquivo
Qualificacoes.zip
com a descrição da qualificação de cada pessoa do quadro societário - Arquivo do Tesouro Nacional com os códigos dos municípios do IBGE
A etapa de transformação dos dados, começa criando armazenamentos de chave e valor, com acesso rápido, para completar os dados dos CSVs principais, Estabelecimentos*
. Isso é feito em memória para os dados que tem outras chaves, e em disco para os dados que tem como chave a base do CNPJ.
A partir daí, cada linha dos Estabelecimentos*
é lida, enriquecida com esses pares de chave e valor armazenados anteriormente, e então enviada para o banco de dados.
Etapa | Descricão | Armazenamento |
---|---|---|
1 | Armazena pares de chave e valor em memória para os dados de: Cnaes.zip , Motivos.zip , Municipios.zip , Paises.zip , Naturezas.zip , Qualificacoes.zip e códigos dos municípios do IBGE |
Em memória |
2 | Armazena pares de chave e valor em disco para os dados de: Empresas* (já enriquecidas com dados de Cnaes.zip , Motivos.zip , Municipios.zip , Paises.zip , Naturezas.zip , Qualificacoes.zip e códigos dos municípios do IBGE), Socios* (já enriquecidos com pares de chave e valor de Qualificacoes.zip ) e Simples.zip |
Badger |
3 | Lê os arquivos Estabelecimentos* e os enriquece com os dados das etapas anteriores |
Em memória |
4 | Convert o struct para JSON e armazena o resultado no banco de dados |
PostgreSQL |
Como o processo todo de ETL (o comando transform
) demora demais, caso queira testar manualmente com uma amostra dos dados, utilize o comando sample
para gera arquivos limitados a 10 mil linhas (assim o processo todo roda em cerca de 1 minuto, por exemplo). Após fazer o download dos dados:
$ ./minha-receita sample
$ ./minha-receita transform -d data/sample
Explore mais opções com --help
.
Inconsistências podem acontecer no banco de dados de testes, e ./minha-receita drop -u $TEST_DATABASE_URL
é uma boa forma de evitar isso.
No ambiente de desenvolvimento com Docker Compose existe o serviço pREST. Ele está em fase de testes, e mais detalhes podem ser encontrados na issue sobre o assunto.
Não, ele ainda é opcional.
A ideia é sibstituir o módulo da API web pelo pREST. Isso reduz a base de código para manutenção no projeto, e facilita novas possibilidades como filtragem por UF ou CNAE, incluindo paginação.
Você pode baixar o binário executável e seguir a documentação do pREST.
Por exemplo, com http://localhost:8081/minhareceita/public/cnpj?id=33683111000280
, mas essa resposta é diferente da original:
- Ela é um array e não um objeto
- Ela tem tanto a coluna
id
quanto acnpj
Ou seja, dado que a resposta do pREST seja uma variável resp
, o resultado de https://minhareceita.org/33683111000280
deve ser igual a resp[0].json
.
Utilizamos o Material for MkDocs:
$ docker pull squidfunk/mkdocs-material
$ docker run --rm -v $(pwd):/docs squidfunk/mkdocs-material build
A documentação vai ser gerada em site/index.html
. Para servir enquanto desenvolve:
$ docker run -p 8000:8000 --rm -v $(pwd):/docs squidfunk/mkdocs-material serve --dev-addr 0.0.0.0:8000