import pandas as pd import json from pathlib import Path from datetime import date from dateutil.relativedelta import relativedelta from sqlalchemy import create_engine from suds.client import Client from cryptography.fernet import Fernet def get_config(): fernet_key = b"YBckeKYt-8g7LFvpG7XqAAcEbsYESnI-yl8by9rjeQQ=" fernet = Fernet(fernet_key) if Path("config/nasa_config.json").exists(): with open("config/nasa_config.json", "r") as f: config = json.load(f) with open("config/nasa_config.crypt", "wb") as f: f.write(fernet.encrypt(json.dumps(config).encode())) else: with open("config/nasa_config.crypt", "rb") as f: config = json.loads(fernet.decrypt(f.read()).decode()) return config def conn_string(dsn): return f"mssql+pyodbc://{dsn['user']}:{dsn['pass']}@{dsn['server']}/{dsn['database']}?driver=SQL+Server+Native+Client+11.0" def load_data(config, source, year=None, month=None): if year is None: curr_date = date.today() - relativedelta(months=+1) year = curr_date.strftime("%Y") month = curr_date.strftime("%m") period = f"{year}-{month}" select_befehl_auftraege = f"SELECT * FROM [Auftraege_NASA_gruppiert] WHERE Periode = '{period}'" select_befehl_mitarbeiter = f"SELECT * FROM [Mitarbeiter_NASA] WHERE Periode = '{period}'" source_auftraege = "data/Auftraege_NASA_gruppiert.csv" source_mitarbeiter = "data/Mitarbeiter_NASA.csv" payload = { "HaendlerNr": config["client_id"], "Filiale": "1", "Jahr": year, "Monat": month, "Fabrikat": "Mazda", "AnzahlMitarbeiter": "0", "AnzahlProduktiv": "0.0", "WerkstattDurchlaeufe": "0", "Token": config["credentials"]["token"], } if source == "database": source_db = create_engine(conn_string(config["source_dsn"])) df = pd.read_sql(select_befehl_auftraege, con=source_db) else: df = pd.read_csv(source_auftraege, sep=";", encoding="latin-1", decimal=",") df.to_csv( f"export/{period}_auftraege.csv", sep=";", encoding="latin-1", decimal=",", index=False, ) # Array in gewünschtes Format bringen auftragsart = ["Extern", "Garantie", "Intern", "Theke"] auftragstyp = ["Inspektion", "Karosseriearbeit", "Lackierung", "Verschleißteile", "Sonstiges"] columns = [ "AuftragsArt", "AuftragsArtId", "TeileUmsatz", "LohnUmsatz", "SonstigeUmsatz", "GesamtUmsatz", "AnzahlAuftraege", ] df = df[columns] payload["WerkstattDurchlaeufe"] = df["AnzahlAuftraege"].sum() payload["AfterSalesPositionen"] = df.to_dict("records") # Mitarbeiter gesamt und produktiv if source == "database": df = pd.read_sql(select_befehl_mitarbeiter, con=source_db) else: df = pd.read_csv(source_mitarbeiter, sep=";", encoding="latin-1", decimal=",") df.to_csv( f"export/{period}_mitarbeiter.csv", sep=";", encoding="latin-1", decimal=",", index=False, ) payload["AnzahlMitarbeiter"] = df.shape[0] payload["AnzahlProduktiv"] = df["Prod"].sum() return payload def submit_data(config, payload): client = Client( url=config["service_url"], username=config["credentials"]["username"], password=config["credentials"]["password"], ) try: return client.service.MeldeAfterSalesDaten(payload) except Exception as e: print(e) return -1 def print_result(period, result, len_pos): print("Periode: " + period) if len_pos == result: print(f"Erfolgreich {result} Datensätze übertragen") return print("Übertragung der Datensätze Fehlgeschlagen.") if result == -1: print("Fehler! Es waren keine Datensätze vorhanden.") else: print(f"{len_pos - result} von {len_pos} Datensätzen nicht verarbeitet!") def main(): config = get_config() payload = load_data(config, "csv", "2024", "01") result = submit_data(config, payload) len_pos = len(payload["AfterSalesPositionen"]) print_result("2024-01", result, len_pos) if __name__ == "__main__": main()