import argparse import os import pandas as pd import json """ Dieses Programm : - holt sich die CSV-Datei, in der alle exisitierenden RuleDesigner-Teilenummern enthalten sind - holt sich die json-Datei, in der alle Teilenummern aufgelistet sind, die in Verbindung mit einer gewünschten Teilenummer migriert werden müssen - exportiert alle Nummern aus der JSON-Datei in eine Excel Datei. Die Excel zeigt, welche Teilenummern bereits migriert wurden und welche noch migriert werden müssen. """ def create_sorter_string(sivasData, sivasId): # Funktion setzt rekursiv einen String zusammen, der anzeigt, wo sich eine Teilenummer in der Hierarchie der obersten, zu migrierenden Baugruppe befindet. # Beispiel: # Die Teilenummer "123456" ist das Halbzeug der Teilenummer "234567". "234567" ist wiederum in der Baugruppe "345678" eingebaut. # Die Funktion gibt dann folgenden Sortier-String zurück: # 345678-234567-123456 parent = sivasData[sivasId]['Parent'] if parent not in sivasData: return f"{parent}-{sivasId}" recurval = create_sorter_string(sivasData, parent) return f"{recurval}-{sivasId}" def create_excel_export(existingIds, sivasData, sivasId, outPath): # Spalten in Excel-Datei: Sortierung, Teilenummer, Bezeichnung, Bestandsabfrage, Teilebeurteilung, Zusatzbemerkung # Sortierung: Minus-separierter "Pfad" dieser Teilenummer im Assembly / im Halbzeug # Teilenummer: Sivas-Teilenummer # Bezeichnung: SIVAS-Bezeichnung der Teilenummer # Bestandsabfrage: IMPORTIEREN oder VERFÜGBAR -> "IMPORTIEREN" = Teilenummer muss noch migriert werden, "VERFÜGBAR" = Teilenummer wurde bereits migriert # Restliche Spalten bleiben leer, da sie erst in Excel befüllt werden sortierung = [] teilenummer = [] bezeichnung = [] migrationsstatus = [] teilebeurteilung = [] zusatzbemerkung = [] for item in sivasData: sortierung.append(create_sorter_string(sivasData, item)) teilenummer.append(item) bezeichnung.append(sivasData[item]['Bezeichnung']) if existingIds[item] is True: existing = "VERFÜGBAR" else: existing = "IMPORTIEREN" migrationsstatus.append(existing) teilebeurteilung.append('') zusatzbemerkung.append('') data = { "Sortierung":sortierung, "Teilenummer":teilenummer, "Bezeichnung":bezeichnung, "Migrationsstatus":migrationsstatus, "Teile Beurteilung":teilebeurteilung, "Zusatzbemerkung":zusatzbemerkung } excel_filename = os.path.join(outPath, sivasId + ".xlsx") df = pd.DataFrame.from_dict(data) df.to_excel(excel_filename, sheet_name="Ergebnis", index_label="Sortierung") def compareFiles(rdDataBasePath, jsonPath, sivasId, outPath): # Lies die CSV-Datei ein, in der alle RuleDesigner-Nummern aufgelistet sind ein df = pd.read_csv(rdDataBasePath, sep=';', converters={"Teilenummer":str}) tn = tuple(df["Teilenummer"]) # Lies die JSON-Datei ein, in der alle Sivas-Teilenummern aufgelistet sind, die in Verbindung mit der Migration einer Teilenummer ebenfalls migriert werden müssen with open(jsonPath, encoding='utf-8') as fp: sivasData = json.load(fp) # Prüfe, ob die Sivas-Nummern bereits migriert wurden existingIds = {} for item in sivasData: if item in tn: existingIds[item] = True else: existingIds[item] = False # Schreibe eine Excel-Datei mit den korrekten Spalten raus create_excel_export(existingIds, sivasData, sivasId, outPath) if __name__ == '__main__': parser = argparse.ArgumentParser(description='fetches data from sivas or ruledesigner fusion', prog='update_database') parser.add_argument('-s', '--sivas', action='store', help='fetch data of this id from sivas fo local database folder') parser.add_argument('-d', '--database', action='store', default="RD_Bestandspool.csv", help='local filename of the latest fetched RuleDesigner Database') args = parser.parse_args() if args.sivas: # fetching the names of all existing cad files from the local file dataDir = os.environ.get('CREMIG_DATA') rdDataBasePath = os.path.join(dataDir, args.database) # get the path to ask for further json files exePath = os.environ.get('SIVAS_DATABASE_QUERY') # in case the infos for this cad file are already there sivasId = str(args.sivas) jsonPath = os.path.join(dataDir, sivasId + ".json") # there the results are written outPath = os.environ.get('CREMIG_WORK') compareFiles(rdDataBasePath, jsonPath, sivasId, outPath)