Skip to content

Latest commit

 

History

History
394 lines (267 loc) · 14.9 KB

File metadata and controls

394 lines (267 loc) · 14.9 KB

finances_mail_invoices_and_bills


Traduções


Sobre

A aplicação finances_mail_invoices_and_bills foi desenvolvida para automatizar o envio mensal de notas fiscais e boletos para os clientes de uma empresa. Ela trabalha com as pastas sharepoint fornecidos por ela, elabora emails com anexos baixados e relatórios de envios bem sucedidos e mal sucedidos.

Esta aplicação é feita para não-desenvolvedores operarem ela e pode ser usada uma ou mais vezes por mês dependendo da demanda. Para esta versão ela é acionada manualmente.

Ela foi originalmente desenvolvida para o SO Windows.

Esta aplicação utiliza o framework Django, as bibliotecas OpenPyXl, Pandas e Selenium e o banco de dados SQLite3. Ela também trabalha com bateria de testes com Pytest.


Descrição_técnica

finances_mail_invoices_and_bills é uma automatização do processo de análise de planilha, busca no sharepoint por arquivos por período, CNPJ e número da NFE.

Processo resumido

A aplicação inteira é acionada no diretório raiz no script './run_everything_here.py' ou pelo arquivo .bat 'script_for_bat_file.bat'

Ela inicialmente insere na planilha fornecida em 'raw_table/' uma coluna 'STATUS' usando OpenPyXl e a salva em 'edited_table/', depois transforma a planilha editada em um dataframe usando Pandas e com isso filtra por determinadas colunas e insere uma nova coluna 'ID'.

Manipulado o dataframe ele é inserido em um banco de dados SQLite3 em 'db/' e transformado em uma model do Django usando o comando inspectdb. Isto possibilita o uso do framework Django para utilizar o container EmailMessage para anexar e enviar os emails para clientes. Para cada email enviado a planilha é editada na coluna 'STATUS'.

Segue uma descrição mais detalhada das partes:

Planilha

A aplicação iniciamente busca por uma planilha presente no seu diretório './finances_table_to_db_and_mail/management_before_django/raw_table'. Se encontrada a aplicação segue com o processo acima em busca de anexos. Senão, a aplicação usa a biblioteca Selenium para buscar pela planilha no sharepoint.

Quando o processo é finalizado a planilha baixada em 'raw_table/' é apagada. Assim, quando o processo for refeito a aplicação buscará por uma nova planilha no sharepoint. Se a planilha recém-baixada estiver atualizada a aplicação ao baixá-la vai comparar ela com a planilha editada de 'edite_table/' e atualizar a editada com o conteúdo novo.

Anexos

Para obter os anexos, a aplicação utiliza a biblioteca Selenium para buscar no sharepoint pelos anexos por período, CNPJ e NFE. Se encontrados, os anexos são baixados um por um no diretório './finances_table_to_db_and_mail/robot_sharepoint/anexos/'. Os anexos são lidos em './finances_table_to_db_and_mail/dj_project/filter_tables/views.py' e conforme o conjunto dos anexos é escolhido o template para compor o corpo do email em './finances_table_to_db_and_mail/dj_project/filter_tables/templates/'.

Quando não encontrados, a aplicação segue buscando pelos próximos anexos.

Relatórios

Os anexos encontrados e não encontrados são registrados em arquivos de texto criados em './finances_table_to_db_and_mail/robot_sharepoint/reports/'. Quando o processo é finalizado ou interrompido (mas não fechado) é automaticamente criado um terceiro arquivo de texto que junta os dois anteriores. Este terceiro arquivo é enviado para o sharepoint para servir de registro para cada envio feito ou não.

Padronização de arquivos e caminhos sharepoint

DOWNLOAD PLANILHAS:

Planilha CONTATOS (matr020 - CONTATOS.xlsx):

    Obtida no sharepoint em: Documentos > 02 - FATURAMENTO > 14 - BASE DE DADOS

    Linhas:
        Linha 1a: Títulos das colunas
        Demais linhas: (conteúdo)
    Colunas usadas:
        Coluna E (CNPJ/CPF): dd.ddd.ddd/dddd-dd (Ex: 11.222.333/4444-55) # dígitos com '.', '/' e '-'
        Coluna H (E-Mail): formatação padrão email (Ex: nfe@jcgestaoderiscos.com.br)

Planilha BASE DE DADOS (finr940.xlsx):
    Obtida no sharepoint em:  Documentos > 02 - FATURAMENTO > 14 - BASE DE ENVIO > ANO {número_ano} > {xx} {nome_mês} # Ex: ANO 2023 > 01 JANEIRO 
        Obs: Tanto ano quanto mês são obtidos dinamicamente na aplicação.

        Linhas:
            Linha 1a: Títulos das colunas
            Demais linhas: (conteúdo)
        Colunas usadas:
            Coluna D (Nome do Cliente): texto
            Coluna E (CNPJ): dddddddddddddd (Ex: 01234567890123) # apenas dígitos
            Coluna G (Numero): 0ddddd (Ex: 012345) # número da NFE iniciada por 0
            Coluna K (Dt Vencto): dd/mm/aaaa (Ex: 28/02/2024) # formatação 'dia-mês-ano'
            Coluna S (Valor Liquido): 00.000,00 (50.000,44) # '.' quando houver milhar e ',' para centavos

DOWNLOAD ANEXOS:

Obtida no sharepoint em:  01 - MEDIÇÕES > ANO {número_ano} > {xx} {nome_mês} > {CNPJ - nome} > {número_nfe} 
    # Ex: ANO 2023 > 01 JANEIRO > 00111222333444455 - nome > 012345
    Obs: Os valores são obtidos dinamicamente na aplicação.

Boletos:
    "'NFE' <número da nfe> <tipo de serviço> <competenciaano>.pdf" # considerar os espaços
    Por exemplo: 'NFE 17758 FIXO Dezembro24.pdf'.
Medições:
    "MEDIÇÃO.xlsx" 
    Por exemplo: 'MEDIÇÃO.xlsx'
NFEs:
    "BOLETO <número da nfe>.pdf"  # considerar o espaço
    Por exemplo: 'BOLETO 17757.pdf'

UPLOAD RELATÓRIOS:

Obtida no sharepoint em:  Documentos > 02 - FATURAMENTO > 15 - RELATÓRIOS DE ENVIO > ANO {número_ano} > {xx} {nome_mês} 
# Ex: ANO 2023 > 01 JANEIRO 
Obs: Tanto ano quanto mês são obtidos dinamicamente na aplicação.

Estudos de caso

Segue uma listagem resumida de como a aplicação se comporta por situação:

ERROS:

1. Processo interrompido totalmente (falta de luz, falta de internet, ou fechamento da aplicação):
    Procedimento:
        Fim do processo.
    Quando retomado:
        Tabela baixada se mantém como estava;
        Tabela editada idem;
        Relatório 'enviados' idem;
        Relatório 'não enviados' recriado;
        Relatório final idem.

2.  Processo interrompido parcialmente (erro interno ou interrupção voluntária do processo no terminal (CTRL + C uma única vez)):
    Procedimento:
        Relatório final ('enviados' e 'não enviados') enviado sharepoint;
        Fim do processo.
    Quando retomado:
        Tabela baixada se mantém como estava;
        Tabela editada idem;
        Relatório 'enviados' idem;
        Relatório 'não enviados' recriado;
        Relatório final idem.

IDEAL:

3. Processo finalizado por tabela baixada (novos faturamentos virão):
    Procedimento:
        Relatório final ('enviados' e 'não enviados') enviado sharepoint;
        Apagar tabela baixada;
        Manter tabela editada;
        Fim do processo.
    Quando retomado:
        Tabela baixada se mantém como estava;
        Tabela editada idem;
        Relatório 'enviados' idem;
        Relatório 'não enviados' recriado;
        Relatório final recriado.

4. Processo finalizado com todos os faturamentos do mês (virada do mês):
    Procedimento:
        Apagar tabelas;
        Apagar relatórios;
        Tabela baixada criada;
        Tabela editada criada;
        Relatório 'enviados' criado;
        Relatório 'não enviados' criado;
        Relatório final recriado.

Instalação

0. Primeiramente, é necessário já ter instalado na própria máquina:

  • O versionador de codigo Git.

  • A linguagem de programação Python.

  • Um editor de código, conhecido também como IDE. Por exemplo, o Visual Studio Code (VSCode).

  • Uma ferramenta cliente de API REST. Por exemplo, o Insomnia ou o Postman.

  • E versionar o diretório escolhido para receber o clone da aplicação:

git init

1. Fazer o clone do reposítório finances_mail_invoices_and_bills na sua máquina pelo terminal do computador ou pelo do IDE:

git clone https://github.com/AndreKuratomi/finances_mail_invoices_and_bills.git

WINDOWS:

Obs: Caso apareca algum erro semelhante a este:

unable to access 'https://github.com/AndreKuratomi/finances_mail_invoices_and_bills.git': SSL certificate problem: self-signed certificate in certificate chain

Configure o git para desabilitar a certificação SSL:

git config --global http.sslVerify "false"

Entrar na pasta criada:

cd finances_mail_invoices_and_bills

2. Após feito o clone do repositório, instalar:

O ambiente virtual e atualizar suas dependências com o seguinte comando:

LINUX:

python3 -m venv venv --upgrade-deps

WINDOWS:

py -m venv venv --upgrade-deps

Ative o seu ambiente virtual com o comando:

LINUX:

source/venv/bin/activate

WINDOWS:

No sistema operacional Windows é necessário antes configurar o Execution Policy do PowerShell:

Get-ExecutionPolicy # para verificar o tipo de política de execução
Set-ExecutionPolicy RemoteSigned # para alterar o tipo de política se o comando acima mostrar 'Restricted'

Obs: Eventualmente, pode ser necessário abrir o PowerShell como administrador.

.\venv\Scripts\activate

Instalar suas dependências:

pip install -r requirements.txt

WINDOWS:

Caso seja retornado algum erro semelhante a este:

ERROR: Could not install packages due to an OSError: [Errno 2] No such file or directory: 'C:\\Users\\andre.kuratomi\\OneDrive - JC Gestao de Riscos\\Área de Trabalho\\tables_to_db_mail_for_finances\\tables_to_db_and_mail_finances\\env\\Lib\\site-packages\\jedi\\third_party\\django-stubs\\django-stubs\\contrib\\contenttypes\\management\\commands\\remove_stale_contenttypes.pyi'
HINT: This error might have occurred since this system does not have Windows Long Path support enabled. You can find information on how to enable this at https://pip.pypa.io/warnings/enable-long-paths

Rode no cmd como adminstrador o seguinte comando:

reg.exe add HKLM\SYSTEM\CurrentControlSet\Control\FileSystem /v LongPathsEnabled /t REG_DWORD /d 1 /f

3. E rodar a aplicação:

code .

4. Criar arquivo .env:

./

touch .env

Dentro dele precisamos definir nossas variáveis de ambiente tendo como referência o arquivo .env.example:

# DJANGO:
SECRET_KEY=secret_key

# EMAIL VARIABLES:
EMAIL_HOST_USER=host_email
EMAIL_HOST_PASSWORD=host_password

# SHAREPOINT VARIABLES:
SHAREPOINT_FOR_UPLOAD_URL=sharepoint_for_upload_url
SHAREPOINT_FATURAMENTO_URL=faturamento
SHAREPOINT_MEASUREMENTS_URL=measurements

DOWNLOAD_DIRECTORY=download_directory
RAW_TABLE_DIRECTORY=raw_table_url

Obs: As informações contidas no arquivo .env não devem ser compartilhadas. O arquivo já consta no .gitignore para não ser subido no repositório.


Como_fazer_a_aplicação_funcionar

  1. INÍCIO DA OPERAÇÃO:

    1.1. Via arquivo .bat:

    Para o usuário leigo basta apenas clicar duas vezes no arquivo rode_aplicacao_aqui.bat*:

    Double-click .bat file

    *Obs: Este arquivo rode_aplicacao_aqui.bat pode ser retirado dos arquivos da aplicação e colocado na área de trabalho, por exemplo.


    1.2. Via IDE:

    Para todos os procedimentos necessários para a aplicação trabalhar basta rodar apenas o comando abaixo:

    ./

    WINDOWS:

    py rode_tudo_aqui.py
    

    LINUX:

    python3 rode_tudo_aqui.py
    

  1. INTERRUPÇÃO TOTAL DA APLICAÇÃO (SEM ENVIO DE RELATÓRIOS):

    Basta fechar o arquivo rode_aplicacao_aqui.bat ou o IDE.


  1. INTERRUPÇÃO PARCIAL DA APLICAÇÃO (COM ENVIO DE RELATÓRIO DO QUE FOI FEITO ATÉ A INTERRUPÇÃO.)

    Basta clicar "CTRL + C" UMA ÚNICA VEZ que o programa enviará o relatório automaticamente. Se clicar várias vezes nenhum relatório será enviado.

    Double-click .bat file

    Ao clicar "CTRL + C" a aplicação mostrará a imagem 'ELABORANDO RELATÓRIO FINAL E ENVIANDO'. Aí é só aguardar aparecer 'PROCESSO ENCERRADO. CHECAR RELATÓRIOS.' para ter certeza de que o processo foi finalizado.


  1. Para a primeira operação do mês:

    Antes de rodar a aplicação pela primeira vez no mês (para os faturamentos do mês) é preciso manualmente apagar na aplicação o arquivo DELETE_ME_BEFORE_FIRST_MONTH_OPERATION.

    DELETE_ME_BEFORE_FIRST_MONTH_OPERATION

    Só isso já fará a aplicação apagar o que ela contém do mês anterior e buscar conteúdo novo.


Referências