nasa_upload.py 4.3 KB

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