sync_manager.py aktualisiert
This commit is contained in:
@@ -35,8 +35,9 @@ class SyncManager:
|
|||||||
self.sheet_handler = sheet_handler
|
self.sheet_handler = sheet_handler
|
||||||
self.d365_export_path = d365_export_path
|
self.d365_export_path = d365_export_path
|
||||||
self.logger = logging.getLogger(__name__)
|
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.
|
# Definiert, welche D365-Spalten welchen GSheet-Spalten entsprechen.
|
||||||
self.d365_to_gsheet_map = {
|
self.d365_to_gsheet_map = {
|
||||||
@@ -50,7 +51,7 @@ class SyncManager:
|
|||||||
"No. Service Technicians": "CRM Anzahl Techniker",
|
"No. Service Technicians": "CRM Anzahl Techniker",
|
||||||
"Annual Revenue (Mio. €)": "CRM Umsatz",
|
"Annual Revenue (Mio. €)": "CRM Umsatz",
|
||||||
"Number of Employees": "CRM Anzahl Mitarbeiter",
|
"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
|
# Definiert die Merge-Strategien für GSheet-Spalten
|
||||||
@@ -114,6 +115,12 @@ class SyncManager:
|
|||||||
"""Führt den gesamten Synchronisationsprozess aus."""
|
"""Führt den gesamten Synchronisationsprozess aus."""
|
||||||
if not self._load_data():
|
if not self._load_data():
|
||||||
return
|
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'])
|
d365_ids = set(self.d365_df['CRM ID'])
|
||||||
gsheet_ids = set(self.gsheet_df[self.gsheet_df['CRM ID'] != '']['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:
|
if not row_indices.empty:
|
||||||
row_idx = row_indices[0]
|
row_idx = row_indices[0]
|
||||||
updates_to_batch.append({
|
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"]]
|
"values": [["TRUE"]]
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -169,7 +177,7 @@ class SyncManager:
|
|||||||
row_updates[gsheet_col] = str(d365_row[d365_col])
|
row_updates[gsheet_col] = str(d365_row[d365_col])
|
||||||
needs_reeval = True
|
needs_reeval = True
|
||||||
|
|
||||||
# Strategie 2: Smart-Merge für spezielle Spalten
|
# Strategie 2: Smart-Merge
|
||||||
for gsheet_col in self.smart_merge_cols:
|
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_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, ''))
|
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:
|
elif d365_val and gsheet_val and d365_val != gsheet_val:
|
||||||
conflict_messages.append(f"{gsheet_col}_CONFLICT: D365='{d365_val}' | GSHEET='{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:
|
if conflict_messages:
|
||||||
row_updates["SyncConflict"] = "; ".join(conflict_messages)
|
row_updates["SyncConflict"] = "; ".join(conflict_messages)
|
||||||
|
|
||||||
if needs_reeval:
|
if needs_reeval:
|
||||||
row_updates["ReEval Flag"] = "x"
|
row_updates["ReEval Flag"] = "x"
|
||||||
|
|
||||||
# Batch-Update-Objekte für die aktuelle Zeile erstellen
|
# Batch-Update-Objekte
|
||||||
if row_updates:
|
if row_updates:
|
||||||
row_idx = gsheet_indexed.index.get_loc(crm_id)
|
row_idx = gsheet_indexed.index.get_loc(crm_id)
|
||||||
for col_name, value in row_updates.items():
|
for col_name, value in row_updates.items():
|
||||||
updates_to_batch.append({
|
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]]
|
"values": [[value]]
|
||||||
})
|
})
|
||||||
|
|
||||||
# 4. Änderungen ins Google Sheet schreiben
|
# 4. Änderungen ins Google Sheet schreiben
|
||||||
if rows_to_append:
|
if rows_to_append:
|
||||||
self.logger.info(f"Füge {len(rows_to_append)} neue Zeilen zum Google Sheet hinzu...")
|
self.logger.info(f"Füge {len(rows_to_append)} neue Zeilen zum Google Sheet hinzu...")
|
||||||
# --- KORREKTUR HIER ---
|
self.sheet_handler.append_rows(sheet_name=self.target_sheet_name, values=rows_to_append)
|
||||||
self.sheet_handler.append_rows(values=rows_to_append, sheet_name=self.target_sheet_name)
|
|
||||||
|
|
||||||
if updates_to_batch:
|
if updates_to_batch:
|
||||||
self.logger.info(f"Sende {len(updates_to_batch)} Zell-Updates an das Google Sheet...")
|
self.logger.info(f"Sende {len(updates_to_batch)} Zell-Updates an das Google Sheet...")
|
||||||
|
|||||||
Reference in New Issue
Block a user