diff --git a/Abfrage_Sivas.py b/Abfrage_Sivas.py new file mode 100644 index 0000000..bd0fe2e --- /dev/null +++ b/Abfrage_Sivas.py @@ -0,0 +1,121 @@ +import pandas as pd +import configparser +import os.path + +""" +Erstellung einer Excel-Datei mit aktuellen Preisen aus Sivas ist leicht möglich. +Diese soll in einer config-Datei für die Berechnung der rieter-eKalkulation verwendet werden. +Den Parametern der rieter_ekalk werden die entsprechenden Sivas-Nummern zugewiesen, und damit die aktuellen Preise. +Diese Zuordnung von Parametern und ihren aktuellen Preisen wird wieder in eine config-Datei geschrieben, die mit den Preisen der Daten_cfg.txt-Datei abzugleichen ist, auf die rieter_ekalk zugreift. +""" + +class Kosten(): + """ + Liest die Sivas-Excel-Liste ein und schreibt eine neue config Datei mit den aktuellen Preisen der in rieter-ekalk verwendeten Sivas-IDs. + """ + def __init__(self, pathNew="Zuordnung_Teilenummern.txt", pathOld="Daten_cfg.txt", sivasData="grid_export.xlsx"): + """ + :param pathNew: cfg-Datei, die den Bauteilen ihre Sivas-Nummern zuweist z.B. "schaltschrankgehaeuse_b2x800_zubehoer = 790821101" + :param pathOld: cfg-Datei, die in rieter_ekalk verwendet wird und den Bauteilen Preise zuweist z.B. "schaltschrankgehaeuse_b2x800_zubehoer = 4663.45" + :param sivasData: Excel-Datei mit Sivas-Nummern und entsprechenden Preisen, Überschrift: Teilenummer, Herstellkosten + """ + df = pd.read_excel(sivasData, header=0, index_col="Teilenummer") + tab = df.drop(columns=["Bezeichnung1"]) + self._kosten = tab.to_dict() + + self._given = True + if os.path.exists(pathNew): + self._zuordnung = configparser.ConfigParser(inline_comment_prefixes="#") + self._zuordnung.read_file(open(pathNew)) + else: + self._given = False + self._zuordnung = None + + self._default = configparser.ConfigParser(inline_comment_prefixes="#") + self._default.read_file(open(pathOld)) + + def exists(self): + return self._given + + def getNewPricesAsDict(self, not_found_keys): + """ + Gibt die neuen Preise als Dict zurück. + + :param not_found_keys: Dict von Bauteilen, denen eine Nummer zugeordnet ist, die in Sivas nicht existiert z.B. {'schaltschrankgehaeuse_b1x800_zubehoer': '----'} + """ + newDict = {} + for key, val in self.getZuordnungTeilenummernAsDict().items(): + number = val.strip() + self.getPriceFromNumber(key, number, newDict, not_found_keys) + if "+" in number: + del not_found_keys[key] + split_sivas_ids = number.split('+') + self.getPriceFromAddedNumbers(key, split_sivas_ids, newDict, not_found_keys) + + return newDict + + def getPriceFromAddedNumbers(self, key, split_sivas_ids, newDict, not_found_keys): + """ + Trägt die Zuordnung Bauteil:Gesamtpreis in das newDict Dictionary ein, wenn das Bauteil mehrere Sivas-Nummern beinhaltet. + Ist die Nummer eines Summanden nicht in Sivas enthalten, wird er in das Dict "not_found_keys" eingetragen. + + :param split_sivas_ids: Liste von Sivas IDs, die addiert werden z.B. [' 827072204', ' 721000041'] + :param key: Name z.B. "anlagenrechner_ohne_bildschirm" + :param newDict: z.B. {'schaltschrankgehaeuse_b2x800_zubehoer':9490.23, ...} + :param not_found_keys: Dict von Bauteilen, denen eine Nummer zugeordnet ist, die in Sivas nicht existiert z.B. {'schaltschrankgehaeuse_b1x800_zubehoer': '----'} + """ + price = 0 + for summand in split_sivas_ids: + summand = summand.strip() + # summand: einzelner Summand z.B. '827072204' + if summand in self._kosten["Herstellkosten"]: + cost = self._kosten["Herstellkosten"][summand] + # cost: Einzelpreis eines Summanden [€] + if type(cost) is type(int) or type(float): + price += cost + # price: Gesamtpreis + newDict.update({key: price}) + else: + not_found_keys.update({key:summand}) + + + def getPriceFromNumber(self, key, number, newDict, not_found_keys): + """ + Trägt die Zuordnung Bauteil:Gesamtpreis in das newDict Dictionary ein, wenn das Bauteil eine Sivas-Nummer beinhaltet. + In Sivas nicht existierende Nummern werden in das Dict "not_found_keys" zurückgegeben. + + :param key: Name z.B. "anlagenrechner_ohne_bildschirm" + :param number: Sivas Nummer zum key z.B. '827072204' + :param newDict: z.B. {'schaltschrankgehaeuse_b2x800_zubehoer':9490.23, ...} + :param not_found_keys: Dict von Bauteilen, denen eine Nummer zugeordnet ist, die in Sivas nicht existiert z.B. {'schaltschrankgehaeuse_b1x800_zubehoer': '----'} + """ + if number in self._kosten["Herstellkosten"]: + price = self._kosten["Herstellkosten"][number] + if price is int or float: + newDict.update({key: price}) + else: + not_found_keys.update({key:number}) + def getDefaultDictAsFloat(self): + res = dict() + for key, val in self._default.items("HW_Einzelpreise"): + res[key] = float(val) + return res + + def getZuordnungTeilenummernAsDict(self): + res = dict() + for key, val in self._zuordnung.items("HW_Einzelpreise"): + res[key] = val + return res + + def writeNewConfig(self, name='Sivas_Abgleich.cfg'): + config = configparser.ConfigParser() + config["HW_Einzelpreise"] = latest_costs + config["Preise durch Sivas nicht ermittelbar"] = not_found_in_sivas + with open(name, 'w') as configfile: + config.write(configfile) + +costs = Kosten() +not_found_in_sivas = dict() +latest_costs = costs.getNewPricesAsDict(not_found_in_sivas) +costs.writeNewConfig('Sivas_Abgleich.cfg') +