Programm für die einfache Erstellung der config aus dem Export von Sivas-Preisen
This commit is contained in:
@@ -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')
|
||||||
|
|
||||||
Reference in New Issue
Block a user