sync_manager.py aktualisiert

This commit is contained in:
2025-08-28 05:16:10 +00:00
parent ab6d457d20
commit 573a5252fa

View File

@@ -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...")