Utiliser Python pour créer des rapports dans une seule entreprise

Cette histoire s'est produite dans une vraie entreprise, malgré le fait que certains noms et événements sont fictifs.

Glory était un développeur ordinaire dans une petite entreprise de la ville de N. L'entreprise était engagée dans la fourniture de services aux organisations éducatives. Plusieurs applications devaient être prises en charge, se développant progressivement petit à petit. Mais les autorités de Glory ne croyaient pas en ses efforts et au fait qu'il mange son pain pour une raison. De plus, les patrons des technologies de l'information ne le voulaient pas vraiment, mais voulaient comprendre ce que faisaient les employés et quel type de productivité le service commercial (qui je dois dire était composé d'une personne et demie).

Les autorités ont regardé le directeur des ventes avec un œil rusé et ont demandé: qu'avez-vous fait aujourd'hui pour la Patrie. Le vendeur a répondu: tenu tant de réunions, offert des services à tant de gens. La direction est venue à Glory et dit: dites-moi si les employés disent la vérité ou s'ils portent un bâillon. Besoin de statistiques.

Le dialogue a eu lieu:

- Les utilisateurs paient-ils le service via un service tiers pour recevoir des paiements en ligne? Alors?
- Alors.
- La direction de l'entreprise a-t-elle accès à ce service?
- Il y en a.
- Donc, probablement, il y a un déchargement des paiements là-bas.
- Il y en a.
"Mais avez-vous besoin d'un rapport supplémentaire?"
- Nécessaire.
- Pourquoi?
- Parce que c'est plus pratique, parce que vous devez le faire, parce que "tel ou tel".

En toute justice, il faut dire que des données supplémentaires étaient nécessaires.

Sans hésitation, Glory a rempli une simple requête avec sélection ultérieure dans Excel.

Le rapport était un ensemble de données dans une colonne sur une page. Au début, ils se sont approchés de Glory de manière chaotique, au milieu de la journée et ont demandé. Mais donnez-moi un rapport sur cette organisation, et maintenant sur celle-ci. Sans hésitation, Slava a décidé qu'il suffisait de supporter cela et que quelque chose de beau et d'unifié devait être fait pour satisfaire les besoins de ceux qui le demandaient.

Un petit script est apparu qui a permis d'envoyer des newsletters aux personnes intéressées:

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, bien sûr, ne pensait pas vraiment à Glory. Mais comme on dit: "Ah, et ça fera l'affaire."

Chaque matin, Slava est venu travailler, a exécuté un script et a envoyé un e-mail aux parties intéressées.
L'étape suivante consistait à configurer l'envoi automatique. Cela a fonctionné comme ceci:

docker build --tag = rapports.
docker run -it --rm rapports
Et en mots dans la couronne:
0 8 * * * docker run --rm foo

Chaque jour à 8 heures du matin, la lettre partait. La direction était jolie et a même commencé à penser que Slava venait travailler tous les jours à exactement 8 heures du matin, rédigeait un rapport dans Excel, puis l'envoyait par la poste à ses mains. Et il l'a fait samedi et dimanche, et dans la neige, et sous la pluie, et dans la nuit polaire.

Github

Pour le moment, pendant un moment tout allait bien et la direction a perduré, mais pas pour longtemps. Une fois, il y a eu une réunion au cours de laquelle un nouvel ordre a été annoncé. Écoutez, écoutez et ne dites pas que vous n'avez pas entendu. Sim déclare que chaque employé, chaque jour doit se rapporter à un rang supérieur, et même supérieur. Eh bien, en général, vous comprenez.

"Tous les jours?", Demanda Glory.
- Tous les jours. - a répondu le chef du service technique.
- Ou peut-être pas?
- Il faut la gloire, c'est nécessaire.

Slava avait plusieurs questions concernant cette situation. La responsabilité immédiate était de finaliser le logiciel et ses rapports devraient consister en quelque chose comme ceci:
feat (Module) Correction d'un bug dans NoteLineCount ... pas sérieusement ...
upd (Module2) Ne faites pas attention à l'homme derrière le rideau
fixe (Module3) on m'a dit de le laisser tranquille, mais j'ai ce truc appelé OCD, vous voyez
* Remarque: le nom des messages à valider est tiré d'ici

Glory a décidé qu'il rédigerait un rapport sur cette base. Une semaine s'est écoulée. Une nouvelle conversation a eu lieu sur le contenu suivant:

- Vous envoyez donc des rapports tous les jours, mais aucun progrès n'est visible. Par exemple: «un masque a été ajouté lors de la saisie d'un numéro de téléphone sur le front-end».
- Eh bien, regarde. Auparavant, vous deviez entrer votre numéro de téléphone et vérifier le nombre de chiffres, ce qui n'était pas pratique. Et donc c'est pratique.
- Hm. Bon. Je vois. Et comment expliquez-vous cela: «Refactorisation de code pour le module Contreparties. La fonction de validation est dans une méthode distincte. "
- Tu vois. Il existe une telle chose - le système de contrôle de version, qui indique qui, quand et quoi. Regardez ici. Voici les commits, et voici le code qui a été modifié. Voici le code ajouté, voici le code supprimé.
- Bien. Faisons-le alors. Faites un rapport sur la base de ces commits, puis nous nous réunirons et vérifierons si oui ce que vous y avez écrit.

En fin de compte - c'est ce qui s'est passé:

Github

Le script a modifié le référentiel et envoyé une lettre sur ce qui a été fait et ce qui ne l'a pas été.

Plus tôt, Slava a été gêné de signaler que ceux qui ne vérifieront rien du tout ne comprennent pas comment écrire du code. Peut-être que la direction comprend les ventes, les achats et toutes sortes d'autres choses et paie de l'argent, mais vous verrez certaines lignes de code dans un langage peu familier, observez comment les lignes vertes et rouges scintillent lorsque vous passez de commit à commit.

Oui, Slava est une personne responsable et le travail a fonctionné, mais il y a eu des jours où le code était à peine finalisé ou c'était la paresse. Quoi qu'il en soit, en général, le système fonctionnait sans échecs et ne voulait pas ajouter 15 couches d'abstraction supplémentaires, mais des rapports devaient être envoyés tous les jours.

Il n'y avait plus rien à faire que de devenir un nouveau Mayakovsky et d'écrire un bâillon avec une échelle. Mais chaque jour, je ne voulais pas vraiment en inventer un nouveau. En conséquence, Vyacheslav a commencé à développer la première solution qui est venue à l'esprit et s'est avérée être un code simple, où, en l'absence de tout travail effectué et de modifications poussées, un rapport a été compilé. Cela ressemblait à ceci:

Github

Il restait à faire pour qu'un faux code soit formé avec les commits suivants. Est-il nécessaire de le faire? Le temps nous le dira.

PS: L'histoire de Glory ne s'arrête pas là. Il y a eu plusieurs autres événements qui ont influencé son destin, mais c'est une histoire complètement différente. Il est intéressant de lire dans les commentaires des histoires similaires de la vie et les décisions qui ont été créées sur leur base. Il est possible que le projet soit développé sur la base de ces commentaires.

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


All Articles