From 09b8ee7e6e951a1ff3bb27c86fab89b9879dbd24 Mon Sep 17 00:00:00 2001 From: Simon Steuer Date: Sun, 16 Jun 2024 21:59:47 +0200 Subject: [PATCH] =?UTF-8?q?Vor=20Durchf=C3=BChrung=20der=20Migration=20wir?= =?UTF-8?q?d=20nun=20zus=C3=A4tzlich=20gepr=C3=BCft,=20ob=20Teilenummern?= =?UTF-8?q?=20in=20der=20Blacklist=20fehlen.=20Ist=20immer=20dann=20der=20?= =?UTF-8?q?Fall,=20wenn=20eine=20Teilenummer=20eine=20St=C3=BCckliste=20be?= =?UTF-8?q?sitzt=20und=20sich=20darin=20Positionsnummern=20befinden,=20die?= =?UTF-8?q?=20beigestellt=20oder=20dispo-inaktiv=20sind.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/caditem.py | 36 ++++++++++++++++++++++++++++++++++++ lib/controller.py | 27 ++++++++++++++++++++++++++- lib/manage_configs.py | 15 +++++++++++++-- 3 files changed, 75 insertions(+), 3 deletions(-) diff --git a/lib/caditem.py b/lib/caditem.py index d100f94..b5a5c11 100644 --- a/lib/caditem.py +++ b/lib/caditem.py @@ -234,6 +234,7 @@ class CadItem(DataModel): super().__init__() self._red_ids = {} self._parent_children_mapping = {} + self._bom_properties = {} self._data = {} self._gui_data = {} self._gui_states = {} @@ -280,7 +281,18 @@ class CadItem(DataModel): self._red_ids = red_ids def get_red_ids(self): return self._red_ids + + def set_bom_properties(self, properties) -> dict: + """" + Contains the properties of the BOM-positions(e.g. description, material etc.) + """ + self._bom_properties = properties + def get_bom_properties(self, property_name) -> dict: + if property_name not in self._bom_properties: + raise ValueError(f"Property '{property_name}' doesn't exist in BOM! Check property spelling!") + else: + return self._bom_properties[property_name] # Methoden um die Verwendbarkeit einzelner Schalter auszugrauen def set_read_only_dict(self, data:dict): @@ -700,6 +712,30 @@ class CadItem(DataModel): return (False, missing) else: return (True, []) + + def check_blacklist_completeness(self): + """ Prüft, ob Baugruppen-id in Blacklist fehlt + -> zutreffend, wenn in Stückliste beigestellte oder dispo-inaktive Stücklistenpositionen existieren + """ + teilenummer = self.get_gui_data("teilenummer") + child_id = self.get_child_of_id(teilenummer) + + if child_id is None: # Prüfung nur bei Teilenummern mit Stückliste sinnvoll + return (True, {}) + + config = self._controller.get_config() + blacklist_ids = set(config.get_blacklist()) + + ids_dispoaktiv_status = self.get_bom_properties("Dispoaktiv") + ids_beistellung_status = self.get_bom_properties("Lieferantenbeistellung") + + if not "False" in ids_dispoaktiv_status.values() or not "True" in ids_beistellung_status.values(): + return (True, {}) + + if teilenummer not in blacklist_ids: + return (False, {teilenummer}) + else: + return (True, {}) def check_improper_chars(self, invalid_chars): """ überprüft ob inder Oberfläche nicht erlaubte Zeichen eingetragen wurden""" diff --git a/lib/controller.py b/lib/controller.py index 9b5f323..d4cec81 100644 --- a/lib/controller.py +++ b/lib/controller.py @@ -45,7 +45,8 @@ messages = { "wrong_impftool_path": 'Pfad zur DataPrepUtility.exe nicht gefunden. Bitte setenv.bat prüfen.' , "too_many_logfiles":'Keine eindeutige Logdatei zum aktuellen DataPrep Prozess gefunden. Bitte löschen Sie die überflüssigen .log files', "some_error_in_log":'Log Datei enthält einen Fehler. Bitte prüfen.', - "preparation_sucessful":'Preparation mit der Datei {path} erfolgreich' + "preparation_sucessful":'Preparation mit der Datei {path} erfolgreich', + "missing_in_blacklist":"{teilenummer} fehlt in der Blacklist, da sich in dessen Stückliste beigestellte oder dispo-inaktive Positionen befinden.\n\nBitte {teilenummer} in die Blacklist aufnehmen!" } @@ -135,6 +136,14 @@ class Controller(Observer): self._model.set_parent_children(parent_children) self._model.set_asm_id(asmid) + def get_bom_properties(self, asmid): + """ Holt sich aus Stückliste alle Eigenschaften der Stücklistenpositionen (z.B. Bezeichnung)""" + data_dir = self.get_env("data") + assembly_data = SivasAssemblyData(data_dir, asmid + '.json') + + bom_properties = assembly_data.get_all_bom_properties() + self._model.set_bom_properties(bom_properties) + def set_model(self, model): self._model = model self.attach(model) @@ -159,6 +168,7 @@ class Controller(Observer): self._model.set_asm_id(asm_id) # hole alle Daten vom Server self.get_csv_files_of_asm(asm_id, loadlocal) + self.get_bom_properties(asm_id) #self._load_cid_data2model(asm_id) def set_current_item_id(self, cid): @@ -260,6 +270,8 @@ class Controller(Observer): text = text.format(Zeichentyp=values['Zeichentyp'], Feldname=values['Feldname'] ) if 'path' in values: text = text.format(path=values['path']) + if 'teilenummer' in values: + text = text.format(teilenummer=values['teilenummer']) return messagebox.showerror(title, text) def callback(self, key, value): @@ -303,12 +315,23 @@ class Controller(Observer): def migrieren(self): self._view.reset_labels() + + # Pruefung ob Pflichtfelder befuellt (ok, missing) = self._model.check_pflichtfelder() if ok == False: labels = ', '.join(missing) self.message_error('Fehlende Angaben', 'missing_data', {'Labels':labels}) self._view.highlight_labels(missing) return + + # Pruefung ob assembly-id in Blacklist fehlt + (ok, missing_blacklist_id) = self._model.check_blacklist_completeness() + if ok == False: + id = ''.join(missing_blacklist_id) + self.message_error('Fehlend in Blacklist', 'missing_in_blacklist', {'teilenummer': id}) + return + + # Pruefung, ob unzulaessige Zeichen vorhanden invalid_chars = self._config.InvalidChars.get() (ok, wrongchars) = self._model.check_improper_chars(invalid_chars) if ok == False: @@ -317,6 +340,8 @@ class Controller(Observer): self.message_error('Unzulässige Zeichen', 'unzulaessige_zeichen', {'Zeichentyp': chars, 'Feldname':label}) self._view.highlight_labels(wrongchars) return + + # Pruefung Feldinhalte ok = self._model.check_content() if ok == True: data = self._model.create_migration_data() diff --git a/lib/manage_configs.py b/lib/manage_configs.py index 099742e..d917501 100644 --- a/lib/manage_configs.py +++ b/lib/manage_configs.py @@ -112,7 +112,7 @@ class SivasAssemblyData(JsonBasedConfig): return list(parent_data[0]) @_lazy_init_assembly_data - def get_property(self, property) -> dict: + def get_bom_property_values(self, property) -> dict: """Gibt eine Eigenschaft zu den Teilenummern der Stückliste zurück (z.B. Bezeichnung)""" if property not in self.get_property_names(): @@ -121,9 +121,20 @@ class SivasAssemblyData(JsonBasedConfig): id_property_mapping = {} for child, parent_data in self.assembly_data.items(): for properties in parent_data: - id_property_mapping[child] = properties[property] + if property in properties: + id_property_mapping[child] = properties[property] return id_property_mapping + @_lazy_init_assembly_data + def get_all_bom_properties(self) -> dict: + """Gibt alle Eigenschaften zu den Teilenummern der Stückliste zurück (z.B. Bezeichnung)""" + + all_properties = {} + property_names = self.get_property_names() + for property_name in property_names: + all_properties[property_name] = self.get_bom_property_values(property_name) + return all_properties + class RuleDesignerDatabaseConfig(CSVBasedConfig): """Auslesen der Angaben aus der RuleDesigner-Datenbank-CSV"""