nasa-upload.py 3.7 KB

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