sync_manager.py aktualisiert
This commit is contained in:
@@ -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...")
|
||||
|
||||
Reference in New Issue
Block a user