From 8e272bce4f6656c845a95fc2c74191eba75e747f Mon Sep 17 00:00:00 2001 From: Floke Date: Thu, 28 Aug 2025 05:16:10 +0000 Subject: [PATCH] sync_manager.py aktualisiert --- sync_manager.py | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/sync_manager.py b/sync_manager.py index dbc395c6..5d2cb063 100644 --- a/sync_manager.py +++ b/sync_manager.py @@ -35,8 +35,9 @@ class SyncManager: self.sheet_handler = sheet_handler self.d365_export_path = d365_export_path self.logger = logging.getLogger(__name__) - # <<< NEU: Speichere den Namen des Ziel-Sheets direkt beim Start. - self.target_sheet_name = self.sheet_handler.get_main_sheet_name() + + # <<< KORREKTUR: Der Name wird erst nach der Verbindung abgerufen. + self.target_sheet_name = None # Definiert, welche D365-Spalten welchen GSheet-Spalten entsprechen. self.d365_to_gsheet_map = { @@ -50,7 +51,7 @@ class SyncManager: "No. Service Technicians": "CRM Anzahl Techniker", "Annual Revenue (Mio. €)": "CRM Umsatz", "Number of Employees": "CRM Anzahl Mitarbeiter", - "GUID": "CRM ID" # Angepasst an deine Angabe + "GUID": "CRM ID" # Deine korrekte Anpassung } # Definiert die Merge-Strategien für GSheet-Spalten @@ -114,6 +115,12 @@ class SyncManager: """Führt den gesamten Synchronisationsprozess aus.""" if not self._load_data(): return + + # <<< KORREKTUR: Sheet-Namen nach erfolgreichem Laden abrufen + self.target_sheet_name = self.sheet_handler.get_main_sheet_name() + if not self.target_sheet_name: + self.logger.critical("Konnte den Namen des Ziel-Sheets nicht ermitteln. Breche ab.") + return d365_ids = set(self.d365_df['CRM ID']) gsheet_ids = set(self.gsheet_df[self.gsheet_df['CRM ID'] != '']['CRM ID']) @@ -145,7 +152,8 @@ class SyncManager: if not row_indices.empty: row_idx = row_indices[0] updates_to_batch.append({ - "range": f"{self.target_sheet_name}!{COLUMN_MAP['Archiviert']['Titel']}{row_idx + 2}", # <<< NEU: Sheet-Name hinzugefügt + # KORREKTUR: Dein Handler erwartet den Range ohne Sheet-Namen + "range": f"{COLUMN_MAP['Archiviert']['Titel']}{row_idx + 2}", "values": [["TRUE"]] }) @@ -169,7 +177,7 @@ class SyncManager: row_updates[gsheet_col] = str(d365_row[d365_col]) needs_reeval = True - # Strategie 2: Smart-Merge für spezielle Spalten + # Strategie 2: Smart-Merge for gsheet_col in self.smart_merge_cols: d365_col = next((k for k, v in self.d365_to_gsheet_map.items() if v == gsheet_col), None) d365_val = str(d365_row.get(d365_col, '')) @@ -181,27 +189,27 @@ class SyncManager: elif d365_val and gsheet_val and d365_val != gsheet_val: conflict_messages.append(f"{gsheet_col}_CONFLICT: D365='{d365_val}' | GSHEET='{gsheet_val}'") - # Updates und Flags zusammenstellen + # Updates und Flags if conflict_messages: row_updates["SyncConflict"] = "; ".join(conflict_messages) if needs_reeval: row_updates["ReEval Flag"] = "x" - # Batch-Update-Objekte für die aktuelle Zeile erstellen + # Batch-Update-Objekte if row_updates: row_idx = gsheet_indexed.index.get_loc(crm_id) for col_name, value in row_updates.items(): updates_to_batch.append({ - "range": f"{self.target_sheet_name}!{COLUMN_MAP[col_name]['Titel']}{row_idx + 2}", # <<< NEU: Sheet-Name hinzugefügt + # KORREKTUR: Dein Handler erwartet den Range ohne Sheet-Namen + "range": f"{COLUMN_MAP[col_name]['Titel']}{row_idx + 2}", "values": [[value]] }) # 4. Änderungen ins Google Sheet schreiben if rows_to_append: self.logger.info(f"Füge {len(rows_to_append)} neue Zeilen zum Google Sheet hinzu...") - # --- KORREKTUR HIER --- - self.sheet_handler.append_rows(values=rows_to_append, sheet_name=self.target_sheet_name) + self.sheet_handler.append_rows(sheet_name=self.target_sheet_name, values=rows_to_append) if updates_to_batch: self.logger.info(f"Sende {len(updates_to_batch)} Zell-Updates an das Google Sheet...")