Verwenden von Python für die Berichterstellung in einem einzelnen Unternehmen

Diese Geschichte ereignete sich in einer echten Firma, obwohl einige Namen und Ereignisse fiktiv sind.

Glory war ein gewöhnlicher Entwickler in einem kleinen Unternehmen in der Stadt N. Das Unternehmen war mit der Bereitstellung von Dienstleistungen für Bildungsorganisationen beschäftigt. Es gab mehrere Anwendungen, die unterstützt werden mussten und sich nach und nach entwickelten. Aber die Behörden von Glory glaubten nicht an seine Bemühungen und die Tatsache, dass er sein Brot aus einem bestimmten Grund isst. Darüber hinaus wollten die Chefs der Informationstechnologie nicht wirklich, sondern wollten verstehen, was die Mitarbeiter taten und welche Art von Produktivität die Verkaufsabteilung (die ich sagen muss, bestand aus eineinhalb Personen).

Die Behörden sahen den Verkaufsleiter mit einem listigen Auge an und fragten: Was haben Sie heute für das Mutterland getan? Der Verkäufer antwortete: hielt so viele Besprechungen ab, bot Dienstleistungen für so viele Menschen an. Die Führung kam zu Glory und sagte: Sag mir, ob die Angestellten die Wahrheit sagen oder so, sie tragen einen Knebel. Benötigen Sie Statistiken.

Der Dialog fand statt:

- Bezahlen Benutzer für den Dienst über einen Drittanbieter, um Online-Zahlungen zu erhalten? Also?
- Also.
- Hat die Unternehmensleitung Zugang zu diesem Service?
- Es gibt.
- Wahrscheinlich werden dort Zahlungen entladen.
- Es gibt.
"Aber brauchen Sie einen zusätzlichen Bericht?"
- Benötigt.
- Warum?
- Weil es bequemer ist, weil Sie müssen, weil "so und so".

Fairerweise muss gesagt werden, dass zusätzliche Daten benötigt wurden.

Ohne zu zögern erfüllte Glory eine einfache Abfrage mit anschließender Auswahl in Excel.

Der Bericht war ein Datensatz in einer Spalte auf einer Seite. Zuerst näherten sie sich mitten am Tag chaotisch Glory und fragten. Aber gib mir einen Bericht über diese Organisation und jetzt über diese. Ohne zu zögern entschied Slava, dass es ausreichte, dies zu ertragen, und dass etwas Schönes und Einheitliches getan werden sollte, das die Bedürfnisse derjenigen befriedigte, die darum baten.

Es entstand ein kleines Skript, mit dem Newsletter an interessierte Personen gesendet werden konnten:

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 dachte natürlich nicht wirklich an Ruhm. Aber wie sie sagen: "Ah, und so wird es tun."

Jeden Morgen kam Slava zur Arbeit, führte ein Skript aus und schickte eine E-Mail an interessierte Parteien.
Der nächste Schritt war das Einrichten des automatischen Sendens. Es hat ungefähr so ​​funktioniert:

Docker Build --tag = Berichte.
Docker run -it --rm Berichte
Und in Worten in der Krone:
0 8 * * * Docker run --rm foo

Jeden Tag um 8 Uhr morgens ging der Brief. Das Management war hübsch und begann sogar zu glauben, dass Slava jeden Tag genau um 8 Uhr morgens zur Arbeit kam, einen Bericht in Excel verfasste und ihn dann per Post an seine Hände schickte. Und er tat es am Samstag und Sonntag und im Schnee und im Regen und in der Polarnacht.

Github

Vorerst war für eine Weile alles in Ordnung und die Führung hielt an, aber nicht lange. Es war einmal ein Treffen, bei dem eine neue Bestellung angekündigt wurde. Hören Sie zu, hören Sie zu und sagen Sie nicht, dass Sie nicht gehört haben. Sim erklärt, dass jeder Mitarbeiter jeden Tag einem höheren und noch höheren Rang Bericht erstatten muss. Nun, im Allgemeinen verstehen Sie.

"Jeden Tag?", Fragte Glory.
- Täglich. - antwortete der Leiter der technischen Abteilung.
- Oder vielleicht auch nicht?
- Es ist notwendig Ruhm, es ist notwendig.

Slava hatte mehrere Fragen zu dieser Situation. Die unmittelbare Verantwortung bestand darin, die Software fertigzustellen, und ihre Berichte sollten wie folgt bestehen:
feat (Modul) Ein Fehler in NoteLineCount wurde behoben ... nicht ernsthaft ...
upd (Modul2) Achten Sie nicht auf den Mann hinter dem Vorhang
behoben (Modul 3) Mir wurde gesagt, ich solle es in Ruhe lassen, aber ich habe dieses Ding namens OCD, verstehen Sie?
* Hinweis: Der Name der Nachrichten an Commits wird von hier übernommen

Glory beschloss, einen darauf basierenden Bericht zu erstellen. Eine Woche ist vergangen. Es fand ein neues Gespräch über folgenden Inhalt statt:

- Sie senden also jeden Tag Berichte, aber es sind keine Fortschritte sichtbar. Was zum Beispiel ist: "Bei der Eingabe einer Telefonnummer am Frontend wurde eine Maske hinzugefügt".
- Schau mal. Zuvor mussten Sie Ihre Telefonnummer eingeben und die Anzahl der Ziffern überprüfen, was unpraktisch war. Und so ist es bequem.
- Hm. Gut. Ich verstehe. Und wie erklären Sie das: „Code Refactoring für das Modul Gegenparteien. Die Funktion zur Validierung erfolgt in einer separaten Methode. “
- Siehst du? Es gibt so etwas - ein Versionskontrollsystem, das anzeigt, wer, wann und was getan hat. Schau hier. Hier sind die Commits und hier ist der Code, der geändert wurde. Hier wird der Code hinzugefügt, hier wird der Code gelöscht.
- Gut. Dann lass es uns tun. Machen Sie einen Bericht basierend auf diesen Ihrer Verpflichtungen, und dann werden wir uns zusammensetzen und prüfen, wie ja, was Sie dort geschrieben haben.

Am Ende - das ist passiert:

Github

Das Skript nahm Änderungen im Repository vor und schickte einen Brief darüber, was getan wurde und was nicht.

Zuvor war es Slava peinlich zu berichten, dass diejenigen, die überhaupt nichts überprüfen, nicht verstehen, wie man Code schreibt. Vielleicht versteht das Management Verkäufe, Einkäufe und alles Mögliche und zahlt Geld, aber Sie werden bestimmte Codezeilen in einer nicht sehr vertrauten Sprache sehen und beobachten, wie die grünen und roten Linien beim Wechsel von Commit zu Commit flackern.

Ja, Slava ist eine verantwortliche Person und die Arbeit hat funktioniert, aber es gab Tage, an denen der Code kaum fertiggestellt wurde oder es Faulheit war. Im Allgemeinen funktionierte das System jedoch ohne Fehler und wollte keine weiteren 15 Abstraktionsebenen hinzufügen, sondern es mussten täglich Berichte gesendet werden.

Es blieb nichts anderes übrig, als ein neuer Mayakovsky zu werden und einen Knebel mit einer Leiter zu schreiben. Aber ich wollte nicht jeden Tag einen neuen erfinden. Infolgedessen begann Vyacheslav mit der Entwicklung der ersten Lösung, die mir in den Sinn kam, und stellte sich als einfacher Code heraus, in dem ein Bericht erstellt wurde, in dem keine Arbeit geleistet und Änderungen vorangetrieben wurden. Es sah ungefähr so ​​aus:

Github

Es blieb zu tun, damit ein gefälschter Code mit nachfolgenden Commits gebildet wurde. Muss das getan werden? Die Zeit wird zeigen.

PS: Die Geschichte von Glory endete nicht dort. Es gab mehrere weitere Ereignisse, die sein Schicksal beeinflussten, aber dies ist eine ganz andere Geschichte. Es ist interessant, in den Kommentaren ähnliche Geschichten aus dem Leben und die Entscheidungen zu lesen, die auf ihrer Grundlage getroffen wurden. Es ist möglich, dass das Projekt auf der Grundlage dieser Kommentare weiterentwickelt wird.

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


All Articles