Usando o Python para gerar relatórios em uma única empresa

Esta história aconteceu em uma empresa real, apesar de alguns nomes e eventos serem fictícios.

Glory era um desenvolvedor comum em uma pequena empresa na cidade de N. A empresa estava envolvida na prestação de serviços a organizações educacionais. Havia vários aplicativos que precisavam ser suportados, desenvolvendo gradualmente pouco a pouco. Mas as autoridades da Glória não acreditaram em seus esforços e no fato de que ele come seu pão por um motivo. Além disso, os chefes em tecnologia da informação realmente não queriam, mas queriam entender o que os funcionários estavam fazendo e que tipo de produtividade o departamento de vendas (que devo dizer consistia em uma pessoa e meia).

As autoridades olharam para o gerente de vendas com um olhar astuto e perguntaram: o que você fez hoje pela Pátria? O vendedor respondeu: realizou muitas reuniões, ofereceu serviços a tantas pessoas. A gerência chegou à Glory e diz: me diga se os funcionários estão dizendo a verdade ou se estão carregando uma mordaça. Precisa de estatísticas.

O diálogo ocorreu:

- Os usuários pagam pelo serviço através de um serviço de terceiros para receber pagamentos on-line? Então
- Então
- A gerência da empresa tem acesso a este serviço?
- existem.
- Então, provavelmente, há uma descarga de pagamentos lá.
- existem.
"Mas você precisa de um relatório adicional?"
- Necessário.
Porque?
- Porque é mais conveniente, porque você precisa, porque "isso e aquilo".

Para ser justo, é preciso dizer que dados adicionais eram necessários.

Sem hesitar, Glory realizou uma consulta simples com a seleção subsequente no Excel.

O relatório era um conjunto de dados em uma coluna em uma página. A princípio, eles abordaram Glory de maneira caótica, no meio do dia, e perguntaram. Mas me dê um relatório sobre essa organização e agora sobre esta. Sem hesitar, Slava decidiu que era suficiente suportar isso e que algo bonito e unificado deveria ser feito para satisfazer as necessidades daqueles que solicitavam.

Surgiu um pequeno script que permitia o envio de boletins para as pessoas interessadas:

import openpyxl, pymysql, os from smtplib import SMTP_SSL from email.mime.multipart import MIMEMultipart from email.mime.base import MIMEBase from email import encoders import datetime # Excel Settings today = datetime.date.today().strftime('%d.%m.%Y') excel_file = 'Oplata_polzovateley_' + today + '.xlsx' # SQL settings host = '' user = '' passwd = '' db = '' port=0000 headers = ['id', 'email', '', '', ' ', ' ', '', '- ', ' '] # SMTP Mail settings smtp_server = 'smtp.gmail.com' mail_login = '' mail_passwd = '' receiver = [''] cc = [''] def main(): # Fetch Data from SQL server conn = pymysql.connect(host=host, user=user, passwd=passwd, db=db, port=port) cursor = conn.cursor() cursor.execute('''select * from table''') data = cursor.fetchall() conn.close() # Write Data to Excel file wb = openpyxl.Workbook() contractors = {} for item in data: diff = item[6] - item[5] item = list(item) # print(item) if diff.days > 10: item.append('') else: item.append('') item = tuple(item) if item[0][:30] in contractors: contractors[item[0][:30]] += 1 else: wb.create_sheet(item[0][:30]) contractors[item[0][:30]] = 2 for i in range(1, len(headers) + 1): letter = openpyxl.utils.get_column_letter(i) wb[item[0][:30]][letter + '1'] = headers[i - 1] wb[item[0][:30]]['A' + str(contractors[item[0][:30]])] = contractors[item[0][:30]] - 1 for i in range(2, len(headers) + 1): letter = openpyxl.utils.get_column_letter(i) wb[item[0][:30]][letter + str(contractors[item[0][:30]])] = item[i] wb.save(excel_file) wb.remove(wb['Sheet']) wb.save(excel_file) # Compose attachment part = MIMEBase('application', "octet-stream") part.set_payload(open(excel_file, "rb").read()) encoders.encode_base64(part) part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(excel_file)) # Compose message msg = MIMEMultipart() msg['From'] = mail_login msg['To'] = ', '.join(receiver) msg['Cc'] = ', '.join(cc) msg['Subject'] = excel_file msg.attach(part) # Send mail tosend = receiver + cc smtp = SMTP_SSL('smtp.gmail.com') smtp.connect(smtp_server) smtp.login(mail_login, mail_passwd) smtp.sendmail(mail_login, tosend, msg.as_string()) smtp.quit() # Wipe file os.remove(excel_file) if __name__ == '__main__': main() 

Made, é claro, realmente não achava Glory. Mas como eles dizem: "Ah, e assim será".

Todas as manhãs, Slava vinha trabalhar, executava um script e enviava um email para as partes interessadas.
O próximo passo foi configurar o envio automático. Funcionou algo como isto:

docker build --tag = relatórios.
docker run -it --rm relatórios
E em palavras da coroa:
0 8 * * * docker run --rm foo

Todos os dias às 8 da manhã a carta saía. A gerência era bonita e até começou a pensar que Slava vinha trabalhar todos os dias exatamente às 8 horas da manhã, redigia um relatório em Excel e depois o enviava por correio para suas mãos. E ele fez isso no sábado e domingo, e na neve, e na chuva e na noite polar.

Github

Por enquanto, por um tempo, tudo estava bem e a liderança durou, mas não por muito tempo. Uma vez houve uma reunião em que um novo pedido foi anunciado. Ouça, ouça e não diga que você não ouviu. Sim declara que todo funcionário, todos os dias, deve reportar-se a uma classificação mais alta e até mais alta. Bem, em geral, você entende.

"Todo dia?" Perguntou Glory.
Todos os dias. - respondeu o chefe do departamento técnico.
- Ou talvez não?
- É necessário Glória, é necessário.

Slava tinha várias perguntas sobre essa situação. A responsabilidade imediata foi finalizar o software e seus relatórios devem consistir em algo assim:
feat (Módulo) Corrigido um erro no NoteLineCount ... não seriamente ...
upd (Módulo2) Não preste atenção ao homem atrás da cortina
fixo (Módulo3) Me disseram para deixá-lo em paz, mas eu tenho essa coisa chamada TOC, você vê
* Nota: o nome das mensagens a serem confirmadas é retirado daqui

Glory decidiu que ele elaboraria um relatório baseado neles. Uma semana se passou. Ocorreu uma nova conversa sobre o seguinte conteúdo:

- Você envia relatórios todos os dias, mas nenhum progresso é visível. O que, por exemplo, é: “uma máscara foi adicionada ao inserir um número de telefone no front-end”.
Bem, olhe. Antes, era necessário digitar seu número de telefone e verificar o número de dígitos, o que era inconveniente. E assim é conveniente.
- Hum. Bom Eu vejo. E como você explica isso: “Refatoração de código para o módulo de contrapartes. A função de validação está em um método separado. ”
- Bem, você vê. Existe um sistema de controle de versão, que indica quem, quando e o que fez. Olha aqui. Aqui estão os commits, e aqui está o código que foi alterado. Aqui está o código adicionado, aqui está o código excluído.
- bom Vamos fazer então. Faça um relatório com base nesses compromissos, e depois nos reuniremos e verificamos como sim o que você escreveu lá.

No final - foi o que aconteceu:

Github

O script sofreu alterações no repositório e enviou uma carta sobre o que foi feito e o que não foi.

Anteriormente, Slava estava com vergonha de informar que aqueles que não verificam nada não entendem como escrever código. Talvez a gerência entenda vendas, compras e todo tipo de outras coisas e pague dinheiro, mas você verá certas linhas de código em uma linguagem pouco familiar, observe como as linhas verde e vermelha piscam ao alternar entre confirmar e confirmar.

Sim, Slava é uma pessoa responsável e o trabalho funcionou, mas havia dias em que o código mal era finalizado ou era preguiça. De qualquer forma, em geral, o sistema funcionou sem falhas e não queria adicionar outras 15 camadas de abstração, mas os relatórios precisavam ser enviados todos os dias.

Não havia mais nada a fazer senão tornar-se um novo Mayakovsky e escrever uma mordaça com uma escada. Mas todo dia eu realmente não queria inventar um novo. Como resultado, Vyacheslav começou a desenvolver a primeira solução que veio à mente e se transformou em um código simples, onde, na ausência de qualquer trabalho realizado e pressionado por alterações, um relatório foi compilado. Parecia algo assim:

Github

Faltava ser feito para que um código falso fosse formado com confirmações subsequentes. Existe alguma necessidade de fazer isso? O tempo dirá.

PS: A história da Glory não terminou aí. Houve vários outros eventos que influenciaram seu destino, mas essa é uma história completamente diferente. É interessante ler nos comentários histórias semelhantes da vida e as decisões que foram criadas com base em elas. É possível que o projeto seja desenvolvido com base nesses comentários.

Source: https://habr.com/ru/post/pt446740/


All Articles