Skip to content

Commit

Permalink
1st commit
Browse files Browse the repository at this point in the history
  • Loading branch information
cuducos committed Jun 29, 2019
0 parents commit 0e8fa7c
Show file tree
Hide file tree
Showing 20 changed files with 1,161 additions and 0 deletions.
9 changes: 9 additions & 0 deletions .env.sample
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
SANIC_HOST=0.0.0.0
SANIC_PORT=8000
SANIC_DEBUG=True

POSTGRES_URI=postgres://minhareceita:minhareceita@postgres:5432/minhareceita
POSTGRES_PASSWORD=minhareceita
POSTGRES_USER=minhareceita
POSTGRES_DB=minhareceita
POSTGRES_HOST=postgres
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
*.pyc
.env
__pycache__/
data/*.gz
data/*.xlsx
data/postgres
21 changes: 21 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2019 Eduardo Vicente Gonçalves

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
185 changes: 185 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
# Minha Receita

Sua API web para consulta de informações do CNPJ (Cadastro Nacional da Pessoa Jurídica) da Receita Federal.

## Sobre

### Histórico

Pela [Lei de Acesso à Informação](http://www.acessoainformacao.gov.br/assuntos/conheca-seu-direito/a-lei-de-acesso-a-informacao), os dados de CNPJ devem ser públicos e acessíveis por máquina. A Receita Federal oferece esses dados escondidos atrás de um CAPTCHA ou em formato pouco convencional (um _fixed-width text file_), com links lentos para download de diversos arquivos somando gigas. Isso não é acessível o suficiente.

O [Turicas](https://twitter.com/turicas) já baixou e converteu esses arquivos para CSV, e ainda oferece um _mirror_ para download mais estável desses arquivos — tudo isso no [`socios-brasil`](https://github.com/turicas/socios-brasil).

### Propósito

O código desse repositório faz esses dados ainda mais acessíveis:

1. Importando autimaticamente os dados para um banco de dados PostgreSQL utilizando a [`rows`](https://github.com/turicas/rows)
2. Adicionando dados com descrições dos CNAEs (inexistente nos arquivos da Receita Federal)
3. Fornecendo uma API web para a consulta de dados de um CNPJ

### Qual a URL para acesso?

Não tem. Disponibilizo essa aplicação para que cada um rode na sua própria infraestrutura, pois:

1. não tenho dinheiro para manter um serviço desse porte no ar
2. não tenho interesse em desenvolver um sistema para cobrar por esse serviço

## Instalação

### Requisitos

* [Docker Compose](https://docs.docker.com/compose/install/)
* Cerca de 30Gb disponíveis de espaço em disco
* _Talvez_ seja necessário um sistema UNIX (Linux ou macOS), mas não tenho certeza pois não testei em Windows.

### Download dos arquivos

Salve **quatro** arquivos no diretório `data/` desse repositório (3 da Receita Federal, 1 do IBGE):

#### Receita Federal

Primeiro faço o download dos arquivos da Receita Federal convertidos para CSV com o [`socios-brasil`](https://github.com/turicas/socios-brasil) e [disponibilizados no Google Drive do Turicas](https://drive.google.com/drive/folders/1JRJDfjm6uHqyEruJdtWT--kPwUx3APEy):

* `empresa.csv.gz`
* `socio.csv.gz`
* `cnae-secundaria.csv.gz`

#### IBGE

Depois, precisamos dos dados com a descrição dos CNAE (Classificação Nacional de Atividades Econômicas), já que nos dados da Receita Federal apenas temos o código númerico, sem a descrição. Acesse [a página da CONCLA no IBGE](https://cnae.ibge.gov.br/classificacoes/download-concla.html) e baixe a planilha _Estrutura detalhada_ do documento _CNAE 2.3 Subclasses_:

* [`CNAE_Subclasses_2_3_Estrutura_Detalhada.xlsx`](https://cnae.ibge.gov.br/images/concla/documentacao/CNAE_Subclasses_2_3_Estrutura_Detalhada.xlsx)

### Configurações

Copie o arquivo `.env.sample` como `.env` e ajuste de acordo com as suas preferências e necessidades:

* As variáveis com o prefixo `POSTGRES_` configuram os dados de acesso ao PostgreSQL que o Docker Compose sobe
* As variáveis com o prefixo `SANIC_` configuram o framework web [Sanic](https://github.com/huge-success/sanic) (se o uso for em producão é extremamente recomendável configurar `SANIC_DEBUG` para `True`)

### Alimente o banco de dados local

Existe um serviço nesse repositório chamado `feed` só para automatizar esse carregamento de dados. Utilizamos o primeiro comando para importar os dados da Receita Federal para o PostgreSQL (demora algumas horas) e depois os do IBGE (dmeora segundos):

```console
$ docker-compose run --rm feed sh import.sh
$ docker-compose run --rm feed python import_cnae.py
```

#### Inicia a API web

A API web é uma aplicação super simples que pode ser inciada com:

```console
$ docker-compose up api
```

## Uso

### API web

A API web tem apenas um endpoint (`/`) que somente aceita requisições tipo `POST`:

| Caminho da URL | Tipo de requisição | Dados enviados | Código esperado na resposta | Conteúdo esperado na resposta |
|---|---|---|---|---|
| `/` | `GET` | | 405| `Error: Method GET not allowed for URL /` |
| `/` | `POST` | | 404 | `Error: CNPJ não enviado na requisição POST.` |
| `/` | `POST` | `cpf=foobar` | 404 | `Error: CNPJ não enviado na requisição POST.`
| `/` | `POST` | `cnpj=foobar` | 404 | `Error: CNPJ foobar inválido.` |
| `/` | `POST` | `cnpj=00000000000000` | 404 | `Error: CNPJ 00000000000000 não encontrado.` |
| `/` | `POST` | `cnpj=19131243000197` | 200 | _Ver JSON de exemplo abaixo._ |
| `/` | `POST` | `cnpj=19.131.243/0001-97` | 200 | _Ver JSON de exemplo abaixo._ |

Exemplo de resposta válida:

```json
{
"cnpj": "19131243000197",
"identificador_matriz_filial": 1,
"razao_social": "OPEN KNOWLEDGE BRASIL",
"nome_fantasia": "REDE PELO CONHECIMENTO LIVRE",
"situacao_cadastral": 2,
"data_situacao_cadastral": 1380758400,
"motivo_situacao_cadastral": 0,
"nome_cidade_exterior": null,
"codigo_natureza_juridica": 3999,
"data_inicio_atividade": 1380758400,
"cnae_fiscal": 9430800,
"descricao_tipo_logradouro": "ALAMEDA",
"logradouro": "FRANCA",
"numero": "144",
"complemento": "APT 34",
"bairro": "JARDIM PAULISTA",
"cep": 1422000,
"uf": "SP",
"codigo_municipio": 7107,
"municipio": "SAO PAULO",
"ddd_telefone_1": "11 23851939",
"ddd_telefone_2": null,
"ddd_fax": null,
"qualificacao_do_responsavel": 10,
"capital_social": 0.0,
"porte": 5,
"opcao_pelo_simples": false,
"data_opcao_pelo_simples": null,
"data_exclusao_do_simples": null,
"opcao_pelo_mei": false,
"situacao_especial": null,
"data_situacao_especial": null,
"cnaes_secundarios": [
{
"cnae_codigo": 9493600,
"cnae_descricao": "Atividades de organizações associativas ligadas à cultura e à arte"
},
{
"cnae_codigo": 9499500,
"cnae_descricao": "Atividades associativas não especificadas anteriormente"
},
{
"cnae_codigo": 8599699,
"cnae_descricao": "Outras atividades de ensino não especificadas anteriormente"
},
{
"cnae_codigo": 8230001,
"cnae_descricao": "Serviçoos de organização de feiras, congressos, exposições e festas"
},
{
"cnae_codigo": 6204000,
"cnae_descricao": "Consultoria em tecnologia da informação"
}
],
"qsa": [
{
"identificador_de_socio": 2,
"nome_socio": "NATALIA PASSOS MAZOTTE CORTEZ",
"cnpj_cpf_do_socio": "***059967**",
"codigo_qualificacao_socio": 10,
"percentual_capital_social": 0,
"data_entrada_sociedade": 1550102400,
"cpf_representante_legal": null,
"nome_representante_legal": null,
"codigo_qualificacao_representante_legal": null
}
]
}
```

### Acesso ao banco de dados

É possível, também, conectar-se diretamente ao PostresSQL, pois o serviço expõe a porta `5432`. A URI, descontando alterações no `.env`, seria `postgres://minhareceita:minhareceita@localhost:5432/minhareceita`.

## Contribuindo

Escreva testes, reconstra os container, rode os testes e formate seu código com [Black](https://github.com/python/black):

```console
$ docker-compose build
$ docker-compose run --rm api pipenv run py.test
$ docker-compose run --rm api black . --check
$ docker-compose run --rm feed black . --check
```

## Muito obrigado

Ao [Turicas](https://twitter.com/turicas) por todo ativismo mais o trabalho de coleta, tratamento, e carinho que faz os dados serem cada vez mais acessíveis. E ao [Bruno](https://twitter.com/555112299jedi), sem o qual [nunca teríamos acesso a esses dados por menos de R$ 500 mil](https://medium.com/serenata/o-dia-que-a-receita-nos-mandou-pagar-r-500-mil-para-ter-dados-p%C3%BAblicos-8e18438f3076).
21 changes: 21 additions & 0 deletions api/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
FROM python:3.7.3-slim

ENV PYTHONPATH=/api
WORKDIR /api
ADD Pipfile Pipfile
ADD Pipfile.lock Pipfile.lock

RUN apt-get update && \
apt-get install -y gcc python3-dev && \
python -m pip install --upgrade pip && \
python -m pip install --upgrade black pipenv && \
pipenv install --deploy --dev && \
apt-get remove -y -y gcc python3-dev && \
apt-get autoremove -y && \
rm -rf /var/lib/apt/lists/*

ADD search.py search.py
ADD api.py api.py
ADD tests/ tests/

CMD ["pipenv", "run", "python", "api.py"]
16 changes: 16 additions & 0 deletions api/Pipfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]
asynctest = "*"
pytest = "*"

[packages]
aiopg = "*"
sanic = "*"
python-decouple = "*"

[requires]
python_version = "3.7"
Loading

0 comments on commit 0e8fa7c

Please sign in to comment.