nasa_upload.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. import pandas as pd
  2. import pyodbc
  3. import json
  4. from os import path
  5. from datetime import date
  6. from dateutil.relativedelta import relativedelta
  7. from sqlalchemy import create_engine
  8. from suds.client import Client
  9. from cryptography.fernet import Fernet
  10. # Konfiguration
  11. fernet_key = b"YBckeKYt-8g7LFvpG7XqAAcEbsYESnI-yl8by9rjeQQ="
  12. fernet = Fernet(fernet_key)
  13. if path.exists("nasa_config.json"):
  14. with open("nasa_config.json", "r") as f:
  15. config = json.load(f)
  16. with open("nasa_config.crypt", "wb") as f:
  17. f.write(fernet.encrypt(json.dumps(config).encode()))
  18. else:
  19. with open("nasa_config.crypt", "rb") as f:
  20. config = json.loads(fernet.decrypt(f.read()).decode())
  21. args = ["2020", "05"]
  22. # args = []
  23. if len(args) >= 2:
  24. config["selected_year"] = args[0]
  25. config["selected_month"] = args[1]
  26. else:
  27. curr_date = date.today() - relativedelta(months=+1)
  28. config["selected_year"] = curr_date.strftime("%Y")
  29. config["selected_month"] = curr_date.strftime("%m")
  30. select_befehl_auftraege = (
  31. "SELECT * FROM [Auftraege_NASA_gruppiert] WHERE Periode = '"
  32. + config["selected_year"]
  33. + config["selected_month"]
  34. + "'"
  35. )
  36. select_befehl_mitarbeiter = (
  37. "SELECT * FROM [Mitarbeiter_NASA] WHERE Periode = '"
  38. + config["selected_year"]
  39. + "-"
  40. + config["selected_month"]
  41. + "'"
  42. )
  43. source_auftraege = "nasa/Auftraege_NASA_gruppiert.csv"
  44. source_mitarbeiter = "nasa/Mitarbeiter_NASA.csv"
  45. header = {
  46. "HaendlerNr": config["client_id"],
  47. "Filiale": "1",
  48. "Jahr": config["selected_year"],
  49. "Monat": config["selected_month"],
  50. "Fabrikat": "Mazda",
  51. "AnzahlMitarbeiter": "0",
  52. "AnzahlProduktiv": "0.0",
  53. "WerkstattDurchlaeufe": "0",
  54. "Token": config["credentials"]["token"],
  55. }
  56. def conn_string(dsn):
  57. return f"mssql+pyodbc://{dsn['user']}:{dsn['pass']}@{dsn['server']}/{dsn['database']}?driver=SQL+Server+Native+Client+11.0"
  58. # Datenbankverbindung
  59. source_db = create_engine(conn_string(config["source_dsn"]))
  60. # Abfrage in Array speichern
  61. df = pd.read_sql(select_befehl_auftraege, con=source_db)
  62. # df = pd.read_csv(source_auftraege, sep=";", encoding="latin-1", decimal=",")
  63. df.to_csv(
  64. "mazda/export/" + config["selected_year"] + "-" + config["selected_month"] + "_auftraege.csv",
  65. sep=";",
  66. encoding="latin-1",
  67. decimal=",",
  68. index=False,
  69. )
  70. # Array in gewünschtes Format bringen
  71. auftragsart = ["Inspektion", "Karosseriearbeit", "Lackierung", "Verschleißteile", "Sonstiges"]
  72. columns = [
  73. "AuftragsArt",
  74. "AuftragsArtId",
  75. "TeileUmsatz",
  76. "LohnUmsatz",
  77. "SonstigeUmsatz",
  78. "GesamtUmsatz",
  79. "AnzahlAuftraege",
  80. ]
  81. df = df[columns]
  82. header["WerkstattDurchlaeufe"] = df["AnzahlAuftraege"].sum()
  83. header["AfterSalesPositionen"] = df.to_dict("records")
  84. # Mitarbeiter gesamt und produktiv
  85. df = pd.read_sql(select_befehl_mitarbeiter, con=source_db)
  86. # df = pd.read_csv(source_mitarbeiter, sep=";", encoding="latin-1", decimal=",")
  87. df.to_csv(
  88. "mazda/export/" + config["selected_year"] + "-" + config["selected_month"] + "_mitarbeiter.csv",
  89. sep=";",
  90. encoding="latin-1",
  91. decimal=",",
  92. index=False,
  93. )
  94. header["AnzahlMitarbeiter"] = df.shape[0]
  95. header["AnzahlProduktiv"] = df["Prod"].sum()
  96. # SOAP-Verbindung
  97. client = Client(
  98. url=config["service_url"], username=config["credentials"]["username"], password=config["credentials"]["password"]
  99. )
  100. try:
  101. result = client.service.MeldeAfterSalesDaten(header)
  102. except Exception as e:
  103. print(e)
  104. result = -1
  105. # Erfolg/Fehler protokollieren
  106. print("Periode: " + config["selected_year"] + "-" + config["selected_month"])
  107. if len(header["AfterSalesPositionen"]) == result:
  108. print("Erfolgreich " + str(result) + " Datensätze übertragen")
  109. else:
  110. print("Übertragung der Datensätze Fehlgeschlagen.")
  111. if result == -1:
  112. print("Fehler! Es waren keine Datensätze vorhanden.")
  113. else:
  114. print(str(len(header["AfterSalesPositionen"]) - result) + " Datensätze nicht verarbeitet")