nasa_upload.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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 = "SELECT * FROM [Auftraege_NASA_gruppiert] WHERE Periode = '" + \
  31. config['selected_year'] + config['selected_month'] + "'"
  32. select_befehl_mitarbeiter = "SELECT * FROM [Mitarbeiter_NASA] WHERE Periode = '" + \
  33. config['selected_year'] + "-" + config['selected_month'] + "'"
  34. source_auftraege = 'nasa/Auftraege_NASA_gruppiert.csv'
  35. source_mitarbeiter = 'nasa/Mitarbeiter_NASA.csv'
  36. header = {
  37. 'HaendlerNr': config['client_id'],
  38. 'Filiale': "1",
  39. 'Jahr': config['selected_year'],
  40. 'Monat': config['selected_month'],
  41. 'Fabrikat': 'Mazda',
  42. 'AnzahlMitarbeiter': '0',
  43. 'AnzahlProduktiv': '0.0',
  44. 'WerkstattDurchlaeufe': '0',
  45. 'Token': config['credentials']['token']
  46. }
  47. def conn_string(dsn):
  48. return f"mssql+pyodbc://{dsn['user']}:{dsn['pass']}@{dsn['server']}/{dsn['database']}?driver=SQL+Server+Native+Client+11.0"
  49. # Datenbankverbindung
  50. source_db = create_engine(conn_string(config['source_dsn']))
  51. # Abfrage in Array speichern
  52. df = pd.read_sql(select_befehl_auftraege, con=source_db)
  53. # df = pd.read_csv(source_auftraege, sep=";", encoding="latin-1", decimal=",")
  54. df.to_csv("mazda/export/" + config['selected_year'] + "-" + config['selected_month'] + "_auftraege.csv",
  55. sep=";", encoding="latin-1", decimal=",", index=False)
  56. # Array in gewünschtes Format bringen
  57. auftragsart = ["Inspektion", "Karosseriearbeit", "Lackierung", "Verschleißteile", "Sonstiges"]
  58. columns = ["AuftragsArt", "AuftragsArtId", "TeileUmsatz", "LohnUmsatz", "SonstigeUmsatz", "GesamtUmsatz", "AnzahlAuftraege"]
  59. df = df[columns]
  60. header['WerkstattDurchlaeufe'] = df['AnzahlAuftraege'].sum()
  61. header['AfterSalesPositionen'] = df.to_dict("records")
  62. # Mitarbeiter gesamt und produktiv
  63. df = pd.read_sql(select_befehl_mitarbeiter, con=source_db)
  64. # df = pd.read_csv(source_mitarbeiter, sep=";", encoding="latin-1", decimal=",")
  65. df.to_csv("mazda/export/" + config['selected_year'] + "-" + config['selected_month'] + '_mitarbeiter.csv',
  66. sep=';', encoding='latin-1', decimal=',', index=False)
  67. header['AnzahlMitarbeiter'] = df.shape[0]
  68. header['AnzahlProduktiv'] = df['Prod'].sum()
  69. # SOAP-Verbindung
  70. client = Client(config['service_url'], username=config['credentials']['username'], password=config['credentials']['password'])
  71. try:
  72. result = client.service.MeldeAfterSalesDaten(header)
  73. except Exception as e:
  74. print(e)
  75. result = -1
  76. # Erfolg/Fehler protokollieren
  77. print('Periode: ' + config['selected_year'] + "-" + config['selected_month'])
  78. if len(header['AfterSalesPositionen']) == result:
  79. print('Erfolgreich ' + str(result) + ' Datensätze übertragen')
  80. else:
  81. print('Übertragung der Datensätze Fehlgeschlagen.')
  82. if result == -1:
  83. print('Fehler! Es waren keine Datensätze vorhanden.')
  84. else:
  85. print(str(len(header['AfterSalesPositionen']) - result) + ' Datensätze nicht verarbeitet')