cuducos / minha-receita

🏢 Sua API web para consulta de informações do CNPJ da Receita Federal
https://minhareceita.org
MIT License
1.29k stars 129 forks source link

Salvar informação da data dos datasets originais #93

Closed cuducos closed 2 years ago

cuducos commented 2 years ago

No site oficial da Receita Federal existe a informação sobre quando os dados foram atualizados:

Pasted_Image_2022-01-04__11_02_AM

Seria interessante essa informação fazer parte do ETL e da API.

Uma sugestão de implementação (depende de #95):

No comando download já lemos essa página para extrair as URLs dos arquivos CSV, então poderíamos identificar essa data e salvá-la junto com os dados. No PostgreSQL esse comando pode ser uma query única que cria uma tabela (caso ela não exista, apenas) e faz upsert no único registro dessa tabela com o conteúdo desse arquivo.


Exemplos de SQL:

CREATE TABLE IF NOT EXISTS public.last_update (
    id INTEGER PRIMARY KEY,
    last_updated_on date
);

INSERT INTO public.last_update (id, last_updated_on)
VALUES(1, '2021-10-20')
ON CONFLICT (id)
DO UPDATE SET last_updated_on = '2021-10-20';

Exemplo de resposta para GET /last_updated

{"last_updated_on": "2021-10-20"}
andidevel commented 2 years ago

Se não se importar, posso tentar fechar essa issue.

cuducos commented 2 years ago

Coisa linda, @andidevel! Como posso ajudar?

Vou tentar ajudar com palpites:

andidevel commented 2 years ago

Ótimo!!! Vai ser um aprendizado. Vou atualizar o meu fork do projeto e seguir as suas dicas.

Valeu!

andidevel commented 2 years ago

Desculpe, mas estou tendo uma dificuldade para montar o ambiente de desenvolvimento, ao usar o docker-compose build, obtenho o seguinte erro:

--- FAIL: TestPostgresDB (0.00s)
    postgres_test.go:15: expected a posgres uri at TEST_POSTGRES_URI, found nothing

Inclusive já tentei configurar essa variável de ambiente diretamente no docker-compose.yml:

  minha-receita:
    environment:
      - TEST_POSTGRES_URI="postgres://minhareceita:minhareceita@localhost:5555/minhareceita?sslmode=disable"
    build: .
    ports:
      - 8000:8000
    volumes:
      - ./data:/mnt/data

Sem sucesso.

Está faltando fazer alguma outra coisa aqui no meu ambiente, ou será que tem a ver com a minha versão do docker/docker-compose?

Docker version 20.10.7

docker-compose version 1.25.0

Por hora estou utilizando somente os bancos de dados via docker e antes de rodar os testes fiz:

export TEST_POSTGRES_URI="postgres://minhareceita:minhareceita@localhost:5555/minhareceita?sslmode=disable"

Que funcionou como o esperado.

Se alguém tem alguma dica de como fazer funcionar diretamente com docker-compose build, ficaria agradecido.

cuducos commented 2 years ago

Pegou uma bela barbeiragem minha. Pode tirar a parte de go test do Dockerfile – inclusive abri a #96 para isso ; )

cuducos commented 2 years ago

Por hora estou utilizando somente os bancos de dados via docker

Ou… não precisa de docker build se vais usar o banco de dados via Docker. Como tem no CONTRIBUTING.mddocker-compose up -d postgres_test já resolve.

andidevel commented 2 years ago

Algumas considerações:

Acessando a página oficial da Receita (acessado no dia 15/01/2022), é possível notar "umas inconsistências": minha-receita-ss-dtatualizacao

O HTML atual está "um pouco" diferente do HTML utilizado para os testes:

Sugestões?

cuducos commented 2 years ago

Cara, muita tosquice, mas enfim… não é a primeira. Temos que fazer find & replace no código pq tem erros como http// (sem o :) no código.

Sugestões?

  1. Capturar a data mais recente: parece plausível que seja um erro na atualização, esqueceram de excluir a data antiga — pegar sempre a data mais nova das duas me parece ser melhor (inclusive semanticamente, se foi atualizado 2x, vale a mais nova).
  2. Atualizar o HTML do testdata (talvez tenha que incluir manualmene algum typo como http// para manter esses casos testados hehehe)
cuducos commented 2 years ago

Por sinal, protocolei um pedido de esclarecimento sobre isso no Fala.BR, protocolo 03005.021971/2022-55.

cuducos commented 2 years ago

Resposta do Ministério da Economia:

Senhor(a),

O Serviço de Informações ao Cidadão do Ministério da Economia agradece o seu contato.

Em atenção à sua solicitação, informamos que:

1 - A data de extração 14/01/22 se refere ao primeiro bloco de dados: Dados Abertos CNPJ EMPRESA 01 até Dados Abertos CNPJ SÓCIO 10.

2 - As datas são distintas devido ao volume de informações extraídas. Se optou por dividir os dados em blocos, além de facilitar o download para o usuário.

3 - A data de extração 08/01/22 se refere ao bloco de Informações sobre o Simples Nacional/MEI até Tabela de atributo qualificação dos sócios.

4 - A data de extração 20/10/21 se refere bloco de dados do regime tributário das Pessoas Jurídicas.

Atenciosamente, Serviço de Informações ao Cidadão (SIC) Ministério da Economia

Resumindo, esse parágrafo cortado entre as setinhas vermelha e azul é a chave: a data depois dele é das informações que ele descreve, ou seja. informações sobre o regime tributário das pessoas jurídicas ; ) image

Podemos adaptar a resposta para algo como:

{
    "companies": "2021-12-12",
    "taxes": "2021-10-20"
}
andidevel commented 2 years ago

Final de semana voltei a mexer nessa issue:

2. Atualizar o HTML do `testdata` (talvez tenha que incluir manualmene algum _typo_ como `http//` para manter esses casos testados hehehe)

Fiz isso, mas somente acrescentei o HTML diferente, ou seja, somente a parte da seta azul para baixo, e ao rodar os testes, percebi que essa página HTML é toda zoada. No fonte tem isso aqui:

<!-- algum HTML antes -->

<p>Data da última extração: 20/10/2021</p>
<div><a class="external-link" href="http://200.152.38.155/CNPJ/anual/Dados%20Abertos%20S%c3%adtio%20RFB%20Extracao%2020.10.2021.zip" target="_self" title="" data-tippreview-enabled="false" data-tippreview-image="" data-tippreview-title=""> </a></div>
<div><a class="external-link" href="http://200.152.38.155/CNPJ/anual/Dados%20Abertos%20S%c3%adtio%20RFB%20Extracao%2020.10.2021.zip" target="_self" title="" data-tippreview-enabled="false" data-tippreview-image="" data-tippreview-title="">Regime tributário</a></div>

<!-- algum HTML depois -->

Tem duas tags anchor com exatamente o mesmo link, só que uma não tem texto nenhum. Como as duas tags estão com a classe CSS "external-link", o link é capturado pela função getFiles(). Para passar no teste, seria somente acrescentar esse arquivo (duas vezes) lá na lista do "resultado esperado" e aumentar o número de arquivos esperados de 37 para 39, mas na prática esse arquivo vai ser baixado duas vezes. Acredito que isso seja um problema, não é não?

cuducos commented 2 years ago

Pronto, o d2ba549 (que já está na branch main) deve resolver isso ; )

andidevel commented 2 years ago

Olá @cuducos.

* (...) em PRs menores (talvez um apenas implementando a parte do comando `download` e criação do `last_update.txt`; (...)

Já tenho algum código para mostrar (com testes). Mas a branch dev não existe mais, faço a PR contra a main mesmo?

Estou fazendo o desenvolvimento aqui nesta branch.

cuducos commented 2 years ago

Mas a branch dev não existe mais

Já foi mergeada na main — pode abrir para a main ; )

andidevel commented 2 years ago

Opa! Desculpem o sumiço... "meio" ocupado por aqui... Mas espero poder voltar a colaborar logo, logo (acho que o pior já passou, hehehe).

Claro, se ainda for necessário/possível.

Vou tentar seguir mais a risca as "guide lines" do projeto nas próximas contribuições. Já aprendi bastante com o pouco que contribui para o projeto no passado.

Valeu!