From 844aedc02b40567c8d8c76e062a4f652c8c34cae Mon Sep 17 00:00:00 2001 From: mistangl Date: Thu, 29 Jun 2023 14:31:43 +0200 Subject: [PATCH] =?UTF-8?q?json=20export=20gebaut.=20Weitere=20Ausgaben=20?= =?UTF-8?q?wie=20EMO=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/calc_site.py | 132 +++++++++++++++++++++++++++++--------------- lib/rieter_ekalk.py | 69 ++++++++++++++++++----- lib/test_jayjay.py | 2 +- 3 files changed, 145 insertions(+), 58 deletions(-) diff --git a/lib/calc_site.py b/lib/calc_site.py index 7d8ac69..979e6e9 100644 --- a/lib/calc_site.py +++ b/lib/calc_site.py @@ -1,6 +1,7 @@ import rieter_ekalk as rek import pandas as pd import argparse +import json import os import configparser @@ -237,6 +238,22 @@ order_eas = [ 'Summe Komponenten', 'Summe Komponenten inkcl. Reserve', ] +order_emo = [ +'Schaltschrank_aufstellen', +'Unterverteiler_montieren', +'Pritsche_montieren_umbauen_demontieren', +'Pritsche_in_RSM_montieren', +'Motor_verdrahten_und_anschliessen', +'Tableau_befestigen_und_anschliessen', +'Schnittstelle_Flyer_Putzmaschine', +'Sensoren_montieren', +'Seilzugschalter_installieren', +'Blitzleuchte_installieren', +'Weiche_Stopper_anschliessen', +'Erdung', +'Summe', +'Summe inkl. Mehraufwand', +] class cfg(): """ Liest die config-Datei ein, in der Stückpreise und Zeiteinheiten pro Bauteil wie in der rieter_ekalk Excel-Datei verwendet angegeben sind, und schreibt sie in ein Dictionary. @@ -287,8 +304,60 @@ class cfg(): res[key] = val return res +def to_dicts(eas:rek.EA, hw:rek.HW, emo:rek.EMO, dl:rek.Dienstleistung, erg:rek.Ergebnis): + dEas = eas.getSEAs(order_eas) + dEas['Summe Komponenten'] = [eas.gesamt_E(), eas.gesamt_A()] + dEas['Summe Komponenten inkcl. Reserve'] = [eas.gesamt_E_incl_reserve(), eas.gesamt_A_incl_reserve()] -def run_calc(infile, outfile, SivasConfig): + dhardware = hw.to_dict() + hoursEMO = emo.to_dict() + dDienstleistung = dl.to_dict() + + dSummary = erg.summary_costs(hw) + return (dEas, dhardware, hoursEMO, dDienstleistung, dSummary) + +def to_json(eas:rek.EA, hw:rek.HW, emo:rek.EMO, dl:rek.Dienstleistung, erg:rek.Ergebnis, outfile): + (dEas, hardware, hoursEMO, dienstleistung, ergebnisse) = to_dicts(eas, hw, emo, dl, erg) + dOut = { + 'ergebnisse': ergebnisse, + 'hardware': hardware, + 'eas': dEas, + 'dienstleistung': dienstleistung, + 'emo': hoursEMO, + } + with open(outfile, 'w', encoding ='utf8') as json_file: + json.dump(dOut, json_file, ensure_ascii=False, indent=2) + +def to_excel(eas:rek.EA, hw:rek.HW, emo:rek.EMO, dl:rek.Dienstleistung, erg:rek.Ergebnis, outfile): + + (dEas, hardware, hoursEMO, dienstleistung, ergebnisse) = to_dicts(eas, hw, emo, dl, erg) + + df_temp = pd.DataFrame.from_dict(data=dEas, orient='index', columns=['S.E', 'S.A']) + df_eas = pd.DataFrame(data=df_temp, index=order_eas) + + df_temp = pd.DataFrame.from_dict(data=hardware, orient='index', columns=['Strück']) + df_hardware = pd.DataFrame(data=df_temp, index=order_hardware) + + df_temp = pd.DataFrame.from_dict(data=hoursEMO, orient='index', columns=['Aufwand [h]']) + df_emo = pd.DataFrame(data=df_temp, index=order_emo) + + df_temp = pd.DataFrame.from_dict(data=dienstleistung, orient='index', columns=['Aufwand [h]']) + df_dienst = pd.DataFrame(data=df_temp, index=order_dienstleistungen) + + df_temp = pd.DataFrame.from_dict(data=ergebnisse, orient='index', columns=['Aufwand [€]']) + df_aufwand = pd.DataFrame(data=df_temp, index=order_ergebnisse) + + #df = pd.DataFrame.from_dict(data=dienstleistung, orient='index', columns=['Dienstleistungen']) + + with pd.ExcelWriter(outfile) as writer: + df_aufwand.to_excel(writer, sheet_name='Kostenaufstellung') + df_hardware.to_excel(writer, sheet_name='Hardware') + df_dienst.to_excel(writer, sheet_name='Dienstleistungen') + df_eas.to_excel(writer, sheet_name='EAs') + df_emo.to_excel(writer, sheet_name='EMO') + # TODO Mengengerüst, ev. Anschlussleistung und Ausgangsstrom + +def run_calc(infile, SivasConfig): infileCfg = cfg(infile) @@ -330,69 +399,37 @@ def run_calc(infile, outfile, SivasConfig): Anzahl_EAS = infileCfg.getTypedDict("EAS") eas = rek.EA(Anzahl_EAS, mg) - dEas = eas.getSEAs(order_eas) - dEas['Summe Komponenten'] = [eas.gesamt_E(), eas.gesamt_A()] - dEas['Summe Komponenten inkcl. Reserve'] = [eas.gesamt_E_incl_reserve(), eas.gesamt_A_incl_reserve()] - - df_temp = pd.DataFrame.from_dict(data=dEas, orient='index', columns=['S.E', 'S.A']) - df_eas = pd.DataFrame(data=df_temp, index=order_eas) - - Anzahl_HW = infileCfg.getTypedDict("HW") - - + hwep = SivasConfig.getTypedDict("HW_Einzelpreise") hwhp = SivasConfig.getTypedDict("HW_Zeiten Hardwareplanung") hwzew = SivasConfig.getTypedDict("HW_Zeiten Elektro-Werkstatt") + Anzahl_HW = infileCfg.getTypedDict("HW") hw = rek.HW(hwep, hwhp, hwzew) hw.calc(Anzahl_HW, mg, eas) - hardware = hw.get_anzahl() - hardware["Summe_vorOrt"] = hw.summe_vorort() - hardware["Summe_gesamt"] = hw.summe_gesamt() - hardware["Summe_Landsberg"] = hw.summe_in_LL() - hardware["Zeiten_Hardwareplanung"] = hw.summe_h_zeiten_hardwareplanung() - hardware["Zeiten_Unterverteiler_Werkstatt"] = hw.summe_h_unterverteiler_e_werkstatt() - df_temp = pd.DataFrame.from_dict(data=hardware, orient='index', columns=['Strück']) - df_hardware = pd.DataFrame(data=df_temp, index=order_hardware) - emoz = SivasConfig.getTypedDict("Elektro-Montagezeiten") + emoz = SivasConfig.getTypedDict("ElektSro-Montagezeiten") emo = rek.EMO(emoz) emo.calc(eas, hw, mg) Anzahl_DL = infileCfg.getTypedDict("DL") dl = rek.Dienstleistung(Anzahl_DL, hw) - dienstleistung = dl.get_hours() - dienstleistung["Summe_Dienstleistungen_Hardwareplanung"] = dl.stunden_diensleistung_hardwareplanung() - dienstleistung["Summe_Dienstleistungen_Elektrowerkstatt"] = dl.stunden_elektrowerkstatt() - dienstleistung["Summe_Dienstleistungen_in_LL"] = dl.summe_stunden_dienstleistung_in_landsberg() - df_temp = pd.DataFrame.from_dict(data=dienstleistung, orient='index', columns=['Aufwand [h]']) - df_dienst = pd.DataFrame(data=df_temp, index=order_dienstleistungen) Anzahl_Ergebnis = infileCfg.getTypedDict("Ergebnis") kph = SivasConfig.getTypedDict("Kosten pro h") erg = rek.Ergebnis(kph) erg.calc(Anzahl_Ergebnis, hw, dl, emo) - - ergebnisse = erg.summary_costs(hw) - df_temp = pd.DataFrame.from_dict(data=ergebnisse, orient='index', columns=['Aufwand [€]']) - df_aufwand = pd.DataFrame(data=df_temp, index=order_ergebnisse) + return (eas, hw, emo, dl, erg) - #df = pd.DataFrame.from_dict(data=dienstleistung, orient='index', columns=['Dienstleistungen']) - - with pd.ExcelWriter(outfile) as writer: - df_aufwand.to_excel(writer, sheet_name='Kostenaufstellung') - df_hardware.to_excel(writer, sheet_name='Hardware') - df_dienst.to_excel(writer, sheet_name='Dienstleistungen') - df_eas.to_excel(writer, sheet_name='EAs') - # TODO Mengengerüst, EMO, ev. Anschlussleistung und Ausgangsstrom if __name__ == '__main__': parser = argparse.ArgumentParser(description='calculation of a system according to Bös', prog='ecalc') parser.add_argument('-i', '--infile', action='store', help='name of the input file', default="jayjay.cfg") - parser.add_argument('-o', '--outfile', action='store', help='name of the output .xlsx file. If none given, name of the input file is used.') + parser.add_argument('-x', '--xlsx', action='store', help='name of the output .xlsx file. If none given, name of the input file is used.') parser.add_argument('-c', '--config', action='store', help='name of the config file inside of cfg folder to use. Default is Sivas_Daten.cfg', default="Sivas_Daten.cfg") + parser.add_argument('-j', '--json', action='store', help='name of the json file as output. If none given, name of the input file is used. ') args = parser.parse_args() sivasCfgFilePath = os.path.join(os.environ.get('ECALC_CFG'), args.config) @@ -400,12 +437,19 @@ if __name__ == '__main__': inFilePath = os.path.join(os.environ.get('ECALC_WORK'), args.infile) if os.path.isfile(inFilePath): - if args.outfile: - outPath = os.path.join(os.environ.get('ECALC_WORK'), args.outfile) + (fname, ext) = os.path.splitext(args.infile) + (eas, hw, emo, dl, erg) = run_calc(inFilePath, RieterConfig) + if args.xlsx: + xlsPath = os.path.join(os.environ.get('ECALC_WORK'), args.xlsx) else: - (fname, ext) = os.path.splitext(args.infile) - outPath = os.path.join(os.environ.get('ECALC_WORK'), fname + '.xlsx') - run_calc(inFilePath, outPath, RieterConfig) + xlsPath = os.path.join(os.environ.get('ECALC_WORK'), fname + '.xlsx') + to_excel(eas, hw, emo, dl, erg, xlsPath) + if args.json: + jsonPath = os.path.join(os.environ.get('ECALC_WORK'), args.json) + else: + jsonPath = os.path.join(os.environ.get('ECALC_WORK'), fname + '.json') + to_json(eas, hw, emo, dl, erg, jsonPath) + else: print("no such file in ECALC_WORK") # os.environ.get('ECALC_BIN') diff --git a/lib/rieter_ekalk.py b/lib/rieter_ekalk.py index 3641149..4e2dc2a 100644 --- a/lib/rieter_ekalk.py +++ b/lib/rieter_ekalk.py @@ -2233,6 +2233,14 @@ class HW(): summe_h_schaltschrank_hardware = self.summe_h_schaltschrank_hardware() summe_h_unterverteiler_hardware = self.summe_h_unterverteiler_hardware() return (summe_h_schaltschrank_hardware + summe_h_unterverteiler_hardware) + def to_dict(self): + dhardware = self.get_anzahl() + dhardware["Summe_vorOrt"] = self.summe_vorort() + dhardware["Summe_Landsberg"] = self.summe_in_LL() + dhardware["Zeiten_Hardwareplanung"] = self.summe_h_zeiten_hardwareplanung() + dhardware["Zeiten_Unterverteiler_Werkstatt"] = self.summe_h_unterverteiler_e_werkstatt() + dhardware["Summe_gesamt"] = self.summe_gesamt() + return dhardware class Dienstleistung(): # Angaben in h @@ -2356,6 +2364,12 @@ class Dienstleistung(): def stunden_elektro_Landsberg(self): return 0 + def to_dict(self): + dDienstleistung = self.get_hours() + dDienstleistung["Summe_Dienstleistungen_Hardwareplanung"] = self.stunden_diensleistung_hardwareplanung() + dDienstleistung["Summe_Dienstleistungen_Elektrowerkstatt"] = self.stunden_elektrowerkstatt() + dDienstleistung["Summe_Dienstleistungen_in_LL"] = self.summe_stunden_dienstleistung_in_landsberg() + return dDienstleistung #EMO class EMO(): @@ -2379,6 +2393,7 @@ class EMO(): def __init__(self, emoz=None): if emoz: self.set_config_data("Elektro-Montagezeiten", emoz) + self._Mengen = {} def calc(self, ea: type[EA], hw: type[HW], mg: type[MG]): #für jede Zeile (Eintrag im dict 'mengen') muss ein Wert übergeben werden, der aus den Klassen HW(), MG() oder EA() stammt @@ -2436,16 +2451,16 @@ class EMO(): self._mehraufwand = PS def dauer_emo_h(self): keys_tätigkeiten_1 = [ - "Unterverteiler_montieren", - "Sensoren_montieren", - "Seilzugschalter_installieren", - "Blitzleuchte_installieren", - "Weiche_Stopper_anschliessen", - "Erdung", - "Schaltschrank_aufstellen", - "Motor_verdrahten_und_anschliessen", - "Tableau_befestigen_und_anschliessen", - "Schnittstelle_Flyer_Putzmaschine" + "Unterverteiler_montieren", + "Sensoren_montieren", + "Seilzugschalter_installieren", + "Blitzleuchte_installieren", + "Weiche_Stopper_anschliessen", + "Erdung", + "Schaltschrank_aufstellen", + "Motor_verdrahten_und_anschliessen", + "Tableau_befestigen_und_anschliessen", + "Schnittstelle_Flyer_Putzmaschine" ] keys_1 = 0 for k in keys_tätigkeiten_1: @@ -2460,10 +2475,38 @@ class EMO(): for k in keys_tätigkeiten_2: dauer = self._Mengen.get(k) / self.montagezeiten.get(k) keys_2 += dauer - return math.ceil((keys_1 + keys_2)) - def dauer_emo_h_incl_mehrauwand(self): + def dauer_emo_h_incl_mehraufwand(self): return (self.dauer_emo_h() * (1 + self._mehraufwand)) + def get_dict_of_hours(self): + res = dict() + keys_tätigkeiten_1 = [ + "Unterverteiler_montieren", + "Sensoren_montieren", + "Seilzugschalter_installieren", + "Blitzleuchte_installieren", + "Weiche_Stopper_anschliessen", + "Erdung", + "Schaltschrank_aufstellen", + "Motor_verdrahten_und_anschliessen", + "Tableau_befestigen_und_anschliessen", + "Schnittstelle_Flyer_Putzmaschine" + ] + for k in keys_tätigkeiten_1: + res[k] = self.montagezeiten.get(k) * self._Mengen.get(k) + + keys_tätigkeiten_2 = [ + "Pritsche_montieren_umbauen_demontieren", + "Pritsche_in_RSM_montieren" + ] + for k in keys_tätigkeiten_2: + res[k] = self._Mengen.get(k) / self.montagezeiten.get(k) + return res + def to_dict(self): + hoursEMO = self.get_dict_of_hours() + hoursEMO['Summe'] = self.dauer_emo_h() + hoursEMO['Summe inkl. Mehraufwand'] = self.dauer_emo_h_incl_mehraufwand() + return hoursEMO class Anschlussl(): """ @@ -2631,7 +2674,7 @@ class Ergebnis(): self._anzahl["Pflichtenheft"] = anzahl_h.get("Pflichtenheft", 0) self._anzahl["SPS_Programmierung"] = anzahl_h.get("SPS_Programmierung", 0) * (1 + self._Abweichung_softwareerstellung) self._anzahl["PC_Programmierung_Visualisierung"] = anzahl_h.get("SPS_Programmierung", 0) * self._Anteil_PC_Visualisierung_an_SPS - self._anzahl["Montage_elektrisch"] = emo.dauer_emo_h_incl_mehrauwand() + self._anzahl["Montage_elektrisch"] = emo.dauer_emo_h_incl_mehraufwand() self._anzahl["Inbetriebnahmetest_Hardware_durch_Montage"] = anzahl_h.get("Montage_elektrisch", 0) * 0.1 self._anzahl["SPS_Inbetriebsetzung"] = anzahl_h.get("SPS_Inbetriebsetzung", 0) self._anzahl["PC_Inbetriebsetzung"] = anzahl_h.get("PC_Inbetriebsetzung", 0) diff --git a/lib/test_jayjay.py b/lib/test_jayjay.py index bc00485..4510229 100644 --- a/lib/test_jayjay.py +++ b/lib/test_jayjay.py @@ -1191,7 +1191,7 @@ class TestObjectMethods(unittest.TestCase): hw = rek.HW(Anzahl_HW, mg, eas) emo = rek.EMO(eas, hw, mg) self.assertAlmostEqual(emo.dauer_emo_h(), 241) - self.assertAlmostEqual(emo.dauer_emo_h_incl_mehrauwand(), 265.1) + self.assertAlmostEqual(emo.dauer_emo_h_incl_mehraufwand(), 265.1) def test_dienstleistung(self): Anzahl_MG = {