nasa_upload.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. import logging
  2. import pandas as pd
  3. import json
  4. from pathlib 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. logging.basicConfig(filename="logs/nasa.log", level=logging.DEBUG)
  11. logger = logging.getLogger()
  12. def get_config():
  13. fernet_key = b"YBckeKYt-8g7LFvpG7XqAAcEbsYESnI-yl8by9rjeQQ="
  14. fernet = Fernet(fernet_key)
  15. if Path("config/nasa_config.json").exists():
  16. with open("config/nasa_config.json", "r") as f:
  17. config = json.load(f)
  18. with open("config/nasa_config.crypt", "wb") as f:
  19. f.write(fernet.encrypt(json.dumps(config).encode()))
  20. else:
  21. with open("config/nasa_config.crypt", "rb") as f:
  22. config = json.loads(fernet.decrypt(f.read()).decode())
  23. return config
  24. def conn_string(dsn):
  25. return f"mssql+pyodbc://{dsn['user']}:{dsn['pass']}@{dsn['server']}/{dsn['database']}?driver=SQL+Server+Native+Client+11.0"
  26. def load_data(config, source, year=None, month=None):
  27. if year is None:
  28. curr_date = date.today() - relativedelta(months=+1)
  29. year = curr_date.strftime("%Y")
  30. month = curr_date.strftime("%m")
  31. period = f"{year}-{month}"
  32. select_befehl_auftraege = f"SELECT * FROM [Auftraege_NASA_gruppiert] WHERE Periode = '{period}'"
  33. select_befehl_mitarbeiter = f"SELECT * FROM [Mitarbeiter_NASA] WHERE Periode = '{period}'"
  34. source_auftraege = "data/Auftraege_NASA_gruppiert.csv"
  35. source_mitarbeiter = "data/Mitarbeiter_NASA.csv"
  36. payload = {
  37. "HaendlerNr": config["client_id"],
  38. "Filiale": config["client_id"],
  39. "Jahr": year,
  40. "Monat": month,
  41. "Fabrikat": "Mazda",
  42. "AnzahlMitarbeiter": 0,
  43. "AnzahlProduktiv": 0.0,
  44. "WerkstattDurchlaeufe": 0,
  45. "Token": config["credentials"]["token"],
  46. }
  47. if source == "database":
  48. source_db = create_engine(conn_string(config["source_dsn"]))
  49. df = pd.read_sql(select_befehl_auftraege, con=source_db)
  50. else:
  51. df = pd.read_csv(source_auftraege, sep=";", encoding="latin-1", decimal=",")
  52. # auftragsart = ["Extern", "Garantie", "Intern", "Theke"]
  53. # auftragstyp = ["Inspektion", "Karosseriearbeit", "Lackierung", "Verschleißteile", "Sonstiges"]
  54. columns = [
  55. "AuftragsArt",
  56. "AuftragsArtId",
  57. "TeileUmsatz",
  58. "LohnUmsatz",
  59. "SonstigeUmsatz",
  60. "GesamtUmsatz",
  61. "AnzahlAuftraege",
  62. ]
  63. df = df[columns]
  64. df.to_csv(
  65. f"export/{period}_auftraege.csv",
  66. sep=";",
  67. encoding="latin-1",
  68. decimal=",",
  69. index=False,
  70. )
  71. payload["WerkstattDurchlaeufe"] = df["AnzahlAuftraege"].sum()
  72. payload["AfterSalesPositionen"] = df.to_dict("records")
  73. # Mitarbeiter gesamt und produktiv
  74. if source == "database":
  75. df = pd.read_sql(select_befehl_mitarbeiter, con=source_db)
  76. else:
  77. df = pd.read_csv(source_mitarbeiter, sep=";", encoding="latin-1", decimal=",")
  78. df.to_csv(
  79. f"export/{period}_mitarbeiter.csv",
  80. sep=";",
  81. encoding="latin-1",
  82. decimal=",",
  83. index=False,
  84. )
  85. payload["AnzahlMitarbeiter"] = df.shape[0]
  86. payload["AnzahlProduktiv"] = df["Prod"].sum()
  87. return payload
  88. def submit_data(config, payload):
  89. client = Client(
  90. url=config["service_url"],
  91. username=config["credentials"]["username"],
  92. password=config["credentials"]["password"],
  93. )
  94. try:
  95. return client.service.MeldeAfterSalesDaten(payload)
  96. except Exception as e:
  97. print(e)
  98. return -1
  99. def print_result(period, result, len_pos):
  100. print("Periode: " + period)
  101. if len_pos == result:
  102. print(f"Erfolgreich {result} Datensätze übertragen")
  103. return
  104. print("Übertragung der Datensätze Fehlgeschlagen.")
  105. if result == -1:
  106. print("Fehler! Es waren keine Datensätze vorhanden.")
  107. else:
  108. print(f"{len_pos - result} von {len_pos} Datensätzen nicht verarbeitet!")
  109. def main():
  110. config = get_config()
  111. payload = load_data(config, "csv", "2024", "01")
  112. result = submit_data(config, payload)
  113. len_pos = len(payload["AfterSalesPositionen"])
  114. print_result("2024-01", result, len_pos)
  115. if __name__ == "__main__":
  116. main()