sync_manager.py aktualisiert

This commit is contained in:
2025-08-28 07:15:43 +00:00
parent 9fee872fc6
commit b347b029c2

View File

@@ -42,22 +42,20 @@ class SyncManager:
"CRM Umsatz", "CRM Anzahl Mitarbeiter"]
self.smart_merge_cols = ["CRM Website"]
def _load_data(self):
def _load_data(self):
"""Lädt und bereitet die Daten aus D365 und Google Sheets vor."""
self.logger.info(f"Lade Daten aus D365-Export: '{self.d365_export_path}'...")
try:
self.d365_df = pd.read_excel(self.d365_export_path, dtype=str).fillna('')
d365_guid_col = next((k for k, v in self.d365_to_gsheet_map.items() if v == "CRM ID"), None)
for d365_col in self.d365_to_gsheet_map.keys():
if d365_col not in self.d365_df.columns:
raise ValueError(f"Erwartete Spalte '{d365_col}' nicht in der D365-Exportdatei gefunden.")
if d365_guid_col and d365_guid_col in self.d365_df.columns:
self.d365_df.rename(columns={d365_guid_col: "CRM ID"}, inplace=True)
else:
raise ValueError(f"GUID-Spalte ('{d365_guid_col}') nicht in D365-Export gefunden.")
self.d365_df.rename(columns=self.d365_to_gsheet_map, inplace=True)
# KORREKTUR: GUIDs normalisieren (Kleinschreibung)
self.d365_df['CRM ID'] = self.d365_df['CRM ID'].str.strip().str.lower()
self.d365_df.dropna(subset=['CRM ID'], inplace=True)
self.d365_df = self.d365_df[self.d365_df['CRM ID'] != '']
self.d365_df = self.d365_df[self.d365_df['CRM ID'].str.match(r'^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$', na=False)]
except Exception as e:
self.logger.critical(f"Fehler beim Laden der Excel-Datei: {e}", exc_info=True)
@@ -67,7 +65,6 @@ class SyncManager:
try:
all_data_with_headers = self.sheet_handler.get_all_data_with_headers()
if not all_data_with_headers or len(all_data_with_headers) < self.sheet_handler._header_rows:
self.logger.warning("Google Sheet scheint leer. Erstelle leeres DataFrame.")
self.gsheet_df = pd.DataFrame(columns=COLUMN_ORDER).fillna('')
else:
actual_header = all_data_with_headers[self.sheet_handler._header_rows - 1]
@@ -86,18 +83,22 @@ class SyncManager:
for col_name in COLUMN_ORDER:
if col_name not in temp_df.columns:
self.logger.warning(f"Spalte '{col_name}' fehlt im GSheet und wird hinzugefügt.")
temp_df[col_name] = ''
self.gsheet_df = temp_df[COLUMN_ORDER]
except Exception as e:
self.logger.critical(f"Fehler beim Laden/Umwandeln der GSheet-Daten: {e}", exc_info=True)
return False
# KORREKTUR: GUIDs auch hier normalisieren (Kleinschreibung)
self.gsheet_df['CRM ID'] = self.gsheet_df['CRM ID'].str.strip().str.lower()
self.logger.info(f"{len(self.d365_df)} gültige Datensätze aus D365 geladen, {len(self.gsheet_df)} im Google Sheet vorhanden.")
# --- FINALE BEREINIGUNG: Nur echte GUIDs im GSheet DataFrame behalten ---
initial_row_count = len(self.gsheet_df)
self.gsheet_df = self.gsheet_df[self.gsheet_df['CRM ID'].str.match(r'^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$', na=False)]
final_row_count = len(self.gsheet_df)
self.logger.info(f"GSheet-Daten bereinigt: {initial_row_count - final_row_count} Zeilen ohne gültige GUID entfernt.")
self.logger.info(f"{len(self.d365_df)} gültige Datensätze aus D365 geladen, {len(self.gsheet_df)} gültige Datensätze im Google Sheet.")
return True
def run_sync(self):