123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- import logging
- 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
- logging.basicConfig(filename="logs/nasa.log", level=logging.DEBUG)
- logger = logging.getLogger()
- 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": config["client_id"],
- "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=",")
- # auftragsart = ["Extern", "Garantie", "Intern", "Theke"]
- # auftragstyp = ["Inspektion", "Karosseriearbeit", "Lackierung", "Verschleißteile", "Sonstiges"]
- columns = [
- "AuftragsArt",
- "AuftragsArtId",
- "TeileUmsatz",
- "LohnUmsatz",
- "SonstigeUmsatz",
- "GesamtUmsatz",
- "AnzahlAuftraege",
- ]
- df = df[columns]
- df.to_csv(
- f"export/{period}_auftraege.csv",
- sep=";",
- encoding="latin-1",
- decimal=",",
- index=False,
- )
- 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()
|