diff --git a/.gitignore b/.gitignore index 5d381cc..7e783a8 100644 --- a/.gitignore +++ b/.gitignore @@ -15,7 +15,6 @@ dist/ downloads/ eggs/ .eggs/ -lib/ lib64/ parts/ sdist/ diff --git a/bin/sivasprices_setenv.bat b/bin/sivasprices_setenv.bat index 4aef3d9..601530e 100644 --- a/bin/sivasprices_setenv.bat +++ b/bin/sivasprices_setenv.bat @@ -7,9 +7,11 @@ set SIVASPRICES_CFG=%SIVASPRICES%\cfg set SIVASPRICES_LIB=%SIVASPRICES%\lib set SIVASPRICES_DATA=%SIVASPRICES%\data set SIVASPRICES_WORK=%SIVASPRICES%\work +set SIVASPRICES_OUT=%SIVASPRICES%\out set SIVASPRICES_LOG=%SIVASPRICES%\log if not exist %SIVASPRICES%\work mkdir %SIVASPRICES%\work +if not exist %SIVASPRICES%\out mkdir %SIVASPRICES%\out if not exist %SIVASPRICES%\log mkdir %SIVASPRICES%\log set PATH=%SIVASPRICES%\bin;%PATH% diff --git a/data/grid_export.xlsx b/data/grid_export.xlsx index e01b860..1173e8c 100644 Binary files a/data/grid_export.xlsx and b/data/grid_export.xlsx differ diff --git a/lib/requirements.txt b/lib/requirements.txt new file mode 100644 index 0000000..bc1b9eb --- /dev/null +++ b/lib/requirements.txt @@ -0,0 +1,8 @@ +numpy==1.26.1 +pandas==2.1.1 +python-dateutil==2.8.2 +pytz==2023.3.post1 +six==1.16.0 +tzdata==2023.3 +et-xmlfile==1.1.0 +openpyxl==3.1.2 diff --git a/lib/test.py b/lib/test.py new file mode 100644 index 0000000..7f703c8 --- /dev/null +++ b/lib/test.py @@ -0,0 +1,25 @@ +import pandas as pd +from io import StringIO + +#df1 = pd.DataFrame({'Teilenummer': ['709000031_A', '825304002', '825304003', '825304004', '825304006', '825304007', '825304008', '0_A3000020'], + #'Laufende Materialkosten': [43.22, 26.19, 30.49, 25.85, 32.35, 23.99, 19.25, 0] }) +#df2 = pd.DataFrame({'Teilenummer':['825304002', '709000031_A']}) +df1 = pd.read_json( + '''{"Teilenummer":{"0":"709000031_A","1":"825304002","2":"825304003","3":"825304004","4":"825304006","5":"825304007","6":"825304008","7":"0_A3000020"}, + "Laufende Materialkosten":{"0":43.22,"1":26.19,"2":30.49,"3":25.8547,"4":32.3574812376,"5":23.99,"6":19.25,"7":null}}''' +) +df2 = pd.read_json( + '''{"Teilenummer":{"0":825304002,"1":"709000031_A"}}''' +) +print(df1.dtypes) +print(df2.dtypes) +df1['Teilenummer'] = df1['Teilenummer'].astype(str) +df2['Teilenummer'] = df2['Teilenummer'].astype(str) +print(df1.dtypes) +print(df2.dtypes) +#print(df1) +#print(df2) +#print(df1.to_json()) +#print(df2.to_json()) +newdf = df1.merge(df2, on='Teilenummer', how='inner') +print(newdf) \ No newline at end of file diff --git a/lib/update_prices.py b/lib/update_prices.py new file mode 100644 index 0000000..3087233 --- /dev/null +++ b/lib/update_prices.py @@ -0,0 +1,90 @@ +import argparse +import os +import pandas as pd + +""" +Dieses Programm kann: +- eine Excel-Datei exportieren, in der alle aktualisierten Preise der Excel Datei aus dme work Ordner enthalten sind +""" + +class Fetch: + + datafile = 'grid_export.xlsx' + lib_dir = os.environ.get('SIVASPRICES_LIB') + data_dir = os.environ.get('SIVASPRICES_DATA') + in_dir = os.environ.get('SIVASPRICES_WORK') + out_dir = os.environ.get('SIVASPRICES_OUT') + sivas_prices_xls_path = os.path.join(data_dir, datafile) + + def __init__(self): + self.read_grid_export() + + def process(self, inputfile): + df_to_search_ids = self.read_inputfile(inputfile) + self.create_excel_export(df_to_search_ids) + + + def read_grid_export(self): + # liest die XLS-Datei ein, in der alle Preise des kompletten Teilestamms enthalten sind + # mit Teilenummer, Bezeichnung 1 und Laufende Materialkosten + try: + #self._sivas_df = pd.read_excel(self.sivas_prices_xls_path, usecols=["Teilenummer", "Bezeichnung1", "Laufende Materialkosten"]) + self._sivas_df = pd.read_excel(self.sivas_prices_xls_path) + self._sivas_df['Teilenummer'] = self._sivas_df['Teilenummer'].astype(str) + + except FileNotFoundError: + # XLSX-Datei wurde noch nicht ins %SIVASPRICES_WORK% kopiert + print(f"FAILED: '{Fetch.datafile}' nicht gefunden. sollte im '{Fetch.in_dir}' liegen ...") + + def read_inputfile(self, inputfile): + # Methode liest die Sivas Ids der Eingabedatei, um festzustellen welche Preise gesucht werden. + try: + df = pd.read_excel(inputfile, sheet_name='Kaufteile', usecols=["Teilenummer"]) + df['Teilenummer'] = df['Teilenummer'].astype(str) + return df + + except FileNotFoundError: + print(f"FAILED: '{inputfile}' nicht gefunden. sollte im '{Fetch.data_dir}' liegen ...") + return pd.DataFrame() + except ValueError: + print(f"FAILED: Spalte 'Teilenummer' nicht gefunden") + return pd.DataFrame() + + + def create_excel_export(self, df_to_search_sivas_ids:pd.DataFrame, outfile): + # Spalten in Excel-Datei: Teilenummer, Bezeichnung, Preis + + df_merged = self._sivas_df.merge(df_to_search_sivas_ids, how='inner', on='Teilenummer') + df_merged.set_index('Teilenummer') + df_merged.to_excel(outfile, index=False) + print(f"OK: Excel-Datei erfolgreich in '{Fetch.out_dir}' geschrieben...") + + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='Das Programm holt die speziell gewünschten Preise aus der data/grid_export.xlsx ', prog='update_prices') + parser.add_argument('-a', '--all', action='store_true', help='Erzeugt Excel-Dateien für alle Teilenummern in allen .xlsx Files im Work Ordner') + parser.add_argument('-e', '--excel', action='store', help='Erzeugt Excel-Datei in der alle Teilenummern, die migriert werden müssen, aufgelistet sind') + + args = parser.parse_args() + + +if args.excel: + fetch = Fetch() + fetch.process(args.excel) +elif args.all: + all_files = os.listdir(os.environ.get('SIVASPRICES_WORK')) + fetch = Fetch() + in_dir = os.environ.get('SIVASPRICES_WORK') + out_dir = os.environ.get('SIVASPRICES_OUT') + for myfile in all_files: + if not myfile.endswith(".xlsx"): + continue + input_xlsx = os.path.join(in_dir, myfile) + output_xlsx = os.path.join(out_dir, 'updated_'+myfile) + df_to_search_ids = fetch.read_inputfile(input_xlsx) + if df_to_search_ids.empty: + continue + fetch.create_excel_export(df_to_search_ids, output_xlsx) +else: + parser.print_help()