Fix: NameError, IndentationError, UnboundLocalError & Parent-Wiki Logik

- Korrektur eines NameError in `_process_single_row` durch Verwendung der korrekten Log-Variablen `grund_message_wiki_str`.
- Behebung eines IndentationError in `process_reevaluation_rows` bei der Initialisierung von `processed_count_actual`.
- Korrektur eines UnboundLocalError in `serp_wikipedia_lookup` durch korrekte Initialisierung der `bonus`-Variable.
- Anpassung der Logik in `_process_single_row` zur Priorisierung der Parent-Wiki-Suche (aus Spalte D, dann O), wenn Spalte R (Tochter-Wiki) leer ist, bevor die allgemeine Tochter-Wiki-Verarbeitung (inkl. `force_reeval`) greift.
- Korrektur von `KeyError`s in `_process_single_row` durch Verwendung der korrekten Schreibweise (ohne Umlaute) für Spaltennamen-Schlüssel aus `COLUMN_MAP` ("Chat Begruendung Wiki Inkonsistenz", "Begruendung bei Abweichung").
- Korrektur der Limit-Prüfung in `process_reevaluation_rows`, um das Limit vor dem Aufruf von `_process_single_row` anzuwenden.
- Entfernung eines fehlerhaften Code-Blocks in `run_plausibility_checks_batch`, der einen `NameError` (Variable `updates`) verursachte. Batch-Update-Logik für `all_sheet_updates` präzisiert.
- Hinzufügen einer Debug-Logausgabe für `current_wiki_url_r` in `_process_single_row` zur besseren Analyse des Inhalts von Spalte R.
This commit is contained in:
2025-05-30 19:31:07 +00:00
parent fadc31b41c
commit fbee44b9ac

View File

@@ -8079,169 +8079,149 @@ class DataProcessor:
return results
def run_plausibility_checks_batch(self, start_sheet_row=None, end_sheet_row=None, limit=None):
"""
Führt Konsolidierung und Plausibilitäts-Checks für einen Bereich von Zeilen durch.
- Konsolidiert Umsatz/MA (BD/BE) basierend auf CRM/Wiki und Parent-Account (D).
- Ruft _check_financial_plausibility für jede Zeile auf.
- Schreibt konsolidierte Werte und Plausi-Ergebnisse (BG-BM) ins Sheet.
- Setzt den Plausibilität Prüfdatum (BM).
self.logger.info(f"Starte Modus 'plausi_check_data' (Konsolidierung & Plausi-Checks). Bereich: {start_sheet_row if start_sheet_row is not None else 'Start'}-{end_sheet_row if end_sheet_row else 'Ende'}, Limit: {limit if limit is not None else 'Unbegrenzt'}")
Args:
start_sheet_row (int, optional): Die 1-basierte Startzeile. Default: Ab erster Datenzeile.
end_sheet_row (int, optional): Die 1-basierte Endzeile. Default: Bis Ende des Sheets.
limit (int, optional): Maximale Anzahl zu verarbeitender Zeilen. Default: Unbegrenzt.
"""
self.logger.info(f"Starte Modus 'plausi_check_data' (Konsolidierung & Plausi-Checks). Bereich: {start_sheet_row if start_sheet_row is not None else 'Start'}-{end_sheet_row if end_sheet_row else 'Ende'}, Limit: {limit if limit is not None else 'Unbegrenzt'}")
if not self.sheet_handler.load_data():
self.logger.error("Konnte Sheet-Daten nicht laden für Plausi-Checks. Abbruch.")
return
# --- Daten laden und Start/Ende bestimmen ---
if not self.sheet_handler.load_data():
self.logger.error("Konnte Sheet-Daten nicht laden für Plausi-Checks. Abbruch.")
return
all_data = self.sheet_handler.get_all_data_with_headers()
header_offset = self.sheet_handler._header_rows
total_sheet_rows = len(all_data)
all_data = self.sheet_handler.get_all_data_with_headers()
header_offset = self.sheet_handler._header_rows
total_sheet_rows = len(all_data)
effective_start_row = start_sheet_row if start_sheet_row is not None else header_offset + 1
effective_end_row = end_sheet_row if end_sheet_row is not None else total_sheet_rows
effective_start_row = start_sheet_row if start_sheet_row is not None else header_offset + 1
effective_end_row = end_sheet_row if end_sheet_row is not None else total_sheet_rows
if effective_start_row > effective_end_row or effective_start_row > total_sheet_rows:
self.logger.info("Start liegt nach Ende oder außerhalb des Sheets. Keine Zeilen zu verarbeiten.")
return
self.logger.info(f"Verarbeite Zeilen {effective_start_row} bis {effective_end_row} für Konsolidierung und Plausi-Checks.")
# --- Notwendige Spalten prüfen ---
required_keys_for_plausi_mode = [
"CRM Umsatz", "Wiki Umsatz", "CRM Anzahl Mitarbeiter", "Wiki Mitarbeiter", "Parent Account Name",
"Finaler Umsatz (Wiki>CRM)", "Finaler Mitarbeiter (Wiki>CRM)",
"Plausibilität Umsatz", "Plausibilität Mitarbeiter", "Plausibilität Umsatz/MA Ratio",
"Abweichung Umsatz CRM/Wiki", "Abweichung MA CRM/Wiki", "Plausibilität Begründung",
"Plausibilität Prüfdatum"
]
if not all(key in COLUMN_MAP for key in required_keys_for_plausi_mode):
missing_k = [k for k in required_keys_for_plausi_mode if k not in COLUMN_MAP]
self.logger.error(f"Nicht alle benötigten Spalten ({missing_k}) für Modus 'plausi_check_data' in COLUMN_MAP. Abbruch.")
return
# --- Verarbeitung ---
all_sheet_updates = []
processed_rows_count = 0
now_timestamp_str = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
update_batch_limit_config = getattr(Config, 'UPDATE_BATCH_ROW_LIMIT', 50)
# Jede Zeile generiert ca. 9 Updates (BD, BE, BG-BL, BM)
# Daher ist die Anzahl der Operationen ca. 9 * Anzahl Zeilen
# Wir lösen den Batch-Update aus, wenn die Anzahl der Operationen das Limit erreicht.
# update_batch_operations_trigger = update_batch_limit_config * 9
# Sicherer: nach jeder `update_batch_limit_config`-ten Zeile updaten
for row_num_sheet in range(effective_start_row, effective_end_row + 1):
if limit is not None and processed_rows_count >= limit:
self.logger.info(f"Verarbeitungslimit von {limit} Zeilen erreicht.")
break
if effective_start_row > effective_end_row or effective_start_row > total_sheet_rows:
self.logger.info("Start liegt nach Ende oder außerhalb des Sheets. Keine Zeilen zu verarbeiten.")
return
row_list_idx = row_num_sheet - 1
if row_list_idx >= total_sheet_rows: break # Ende der Daten erreicht
row_data = all_data[row_list_idx] # Rohdaten der aktuellen Zeile
self.logger.info(f"Verarbeite Zeilen {effective_start_row} bis {effective_end_row} für Konsolidierung und Plausi-Checks.")
# Überspringe leere Zeilen oder Zeilen ohne Firmennamen
crm_name_check = self._get_cell_value_safe(row_data, "CRM Name").strip()
if not crm_name_check:
# self.logger.debug(f"Zeile {row_num_sheet}: Übersprungen (kein Firmenname).")
continue
required_keys_for_plausi_mode = [ # Schlüssel wie gehabt
"CRM Umsatz", "Wiki Umsatz", "CRM Anzahl Mitarbeiter", "Wiki Mitarbeiter", "Parent Account Name",
"Finaler Umsatz (Wiki>CRM)", "Finaler Mitarbeiter (Wiki>CRM)",
"Plausibilität Umsatz", "Plausibilität Mitarbeiter", "Plausibilität Umsatz/MA Ratio",
"Abweichung Umsatz CRM/Wiki", "Abweichung MA CRM/Wiki", "Plausibilität Begründung",
"Plausibilität Prüfdatum", "CRM Name" # CRM Name für Logging hinzugefügt
]
if not all(key in COLUMN_MAP for key in required_keys_for_plausi_mode):
missing_k = [k for k in required_keys_for_plausi_mode if k not in COLUMN_MAP]
self.logger.error(f"Nicht alle benötigten Spalten ({missing_k}) für Modus 'plausi_check_data' in COLUMN_MAP. Abbruch.")
return
all_sheet_updates = []
processed_rows_count = 0
now_timestamp_str = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
update_batch_limit_config = getattr(Config, 'UPDATE_BATCH_ROW_LIMIT', 50)
self.logger.debug(f"Zeile {row_num_sheet} ({crm_name_check[:30]}...): Starte Konsolidierung und Plausi-Check.")
current_row_updates = []
# 1. Konsolidierung (BD, BE)
final_umsatz_str_konsolidiert = "k.A."
final_ma_str_konsolidiert = "k.A."
parent_account_name_d_val = self._get_cell_value_safe(row_data, "Parent Account Name").strip()
try:
crm_umsatz_val_str = self._get_cell_value_safe(row_data, "CRM Umsatz")
wiki_umsatz_val_str = self._get_cell_value_safe(row_data, "Wiki Umsatz")
crm_ma_val_str = self._get_cell_value_safe(row_data, "CRM Anzahl Mitarbeiter")
wiki_ma_val_str = self._get_cell_value_safe(row_data, "Wiki Mitarbeiter")
for row_num_sheet in range(effective_start_row, effective_end_row + 1):
if limit is not None and processed_rows_count >= limit:
self.logger.info(f"Verarbeitungslimit von {limit} Zeilen erreicht.")
break
num_crm_umsatz = get_numeric_filter_value(crm_umsatz_val_str, is_umsatz=True)
num_wiki_umsatz = get_numeric_filter_value(wiki_umsatz_val_str, is_umsatz=True)
num_crm_ma = get_numeric_filter_value(crm_ma_val_str, is_umsatz=False)
num_wiki_ma = get_numeric_filter_value(wiki_ma_val_str, is_umsatz=False)
row_list_idx = row_num_sheet - 1
if row_list_idx >= total_sheet_rows: break
row_data = all_data[row_list_idx]
if parent_account_name_d_val and parent_account_name_d_val.lower() != 'k.a.':
self.logger.debug(f" -> Parent D ('{parent_account_name_d_val}') ist gesetzt. Konsolidiere primär mit CRM-Daten der Tochter.")
final_num_umsatz = num_crm_umsatz if num_crm_umsatz > 0 else num_wiki_umsatz
final_num_ma = num_crm_ma if num_crm_ma > 0 else num_wiki_ma
else:
final_num_umsatz = num_wiki_umsatz if num_wiki_umsatz > 0 else num_crm_umsatz
final_num_ma = num_wiki_ma if num_wiki_ma > 0 else num_crm_ma
crm_name_check = self._get_cell_value_safe(row_data, "CRM Name").strip()
if not crm_name_check:
continue
final_umsatz_str_konsolidiert = str(int(round(final_num_umsatz))) if final_num_umsatz > 0 else 'k.A.'
final_ma_str_konsolidiert = str(int(round(final_num_ma))) if final_num_ma > 0 else 'k.A.'
except Exception as e_conso_batch:
self.logger.error(f"Fehler bei Konsolidierung in Plausi-Batch für Zeile {row_num_sheet}: {e_conso_batch}")
final_umsatz_str_konsolidiert = "FEHLER_KONSO_PLAUSI"
final_ma_str_konsolidiert = "FEHLER_KONSO_PLAUSI"
self.logger.debug(f"Zeile {row_num_sheet} ({crm_name_check[:30]}...): Starte Konsolidierung und Plausi-Check.")
current_row_updates = []
current_row_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Finaler Umsatz (Wiki>CRM)"] + 1)}{row_num_sheet}', 'values': [[final_umsatz_str_konsolidiert]]})
current_row_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Finaler Mitarbeiter (Wiki>CRM)"] + 1)}{row_num_sheet}', 'values': [[final_ma_str_konsolidiert]]})
# 1. Konsolidierung (BD, BE)
# ... (Ihre bestehende Logik für Konsolidierung hier) ...
# Beispiel:
final_umsatz_str_konsolidiert = "k.A."
final_ma_str_konsolidiert = "k.A."
parent_account_name_d_val = self._get_cell_value_safe(row_data, "Parent Account Name").strip()
# 2. Plausibilitäts-Checks (BG-BM)
if not final_umsatz_str_konsolidiert.startswith("FEHLER") and not final_ma_str_konsolidiert.startswith("FEHLER"):
try:
plausi_input_data = {
"Finaler Umsatz (Wiki>CRM)": final_umsatz_str_konsolidiert,
"Finaler Mitarbeiter (Wiki>CRM)": final_ma_str_konsolidiert,
"CRM Umsatz": self._get_cell_value_safe(row_data, "CRM Umsatz"),
"Wiki Umsatz": self._get_cell_value_safe(row_data, "Wiki Umsatz"), # Direkter Wert aus Sheet
"CRM Anzahl Mitarbeiter": self._get_cell_value_safe(row_data, "CRM Anzahl Mitarbeiter"),
"Wiki Mitarbeiter": self._get_cell_value_safe(row_data, "Wiki Mitarbeiter"), # Direkter Wert aus Sheet
"Parent Account Name": parent_account_name_d_val
}
plausi_results = self._check_financial_plausibility(plausi_input_data)
crm_umsatz_val_str = self._get_cell_value_safe(row_data, "CRM Umsatz")
wiki_umsatz_val_str = self._get_cell_value_safe(row_data, "Wiki Umsatz") # Nimmt den Wert direkt aus dem Sheet
crm_ma_val_str = self._get_cell_value_safe(row_data, "CRM Anzahl Mitarbeiter")
wiki_ma_val_str = self._get_cell_value_safe(row_data, "Wiki Mitarbeiter") # Nimmt den Wert direkt aus dem Sheet
current_row_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Plausibilität Umsatz"] + 1)}{row_num_sheet}', 'values': [[plausi_results.get("plaus_umsatz_flag", "ERR_FLAG")]]})
current_row_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Plausibilität Mitarbeiter"] + 1)}{row_num_sheet}', 'values': [[plausi_results.get("plaus_ma_flag", "ERR_FLAG")]]})
current_row_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Plausibilität Umsatz/MA Ratio"] + 1)}{row_num_sheet}', 'values': [[plausi_results.get("plaus_ratio_flag", "ERR_FLAG")]]})
current_row_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Abweichung Umsatz CRM/Wiki"] + 1)}{row_num_sheet}', 'values': [[plausi_results.get("abweichung_umsatz_flag", "ERR_FLAG")]]})
current_row_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Abweichung MA CRM/Wiki"] + 1)}{row_num_sheet}', 'values': [[plausi_results.get("abweichung_ma_flag", "ERR_FLAG")]]})
current_row_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Plausibilität Begründung"] + 1)}{row_num_sheet}', 'values': [[plausi_results.get("plausi_begruendung_final", "Fehler Begr.")]]})
except Exception as e_plausi_run_batch:
self.logger.error(f"Fehler im Plausi-Check Aufruf (Batch-Modus) für Zeile {row_num_sheet}: {e_plausi_run_batch}")
# Fehler-Flags für Plausi-Spalten setzen
num_crm_umsatz = get_numeric_filter_value(crm_umsatz_val_str, is_umsatz=True)
num_wiki_umsatz = get_numeric_filter_value(wiki_umsatz_val_str, is_umsatz=True)
num_crm_ma = get_numeric_filter_value(crm_ma_val_str, is_umsatz=False)
num_wiki_ma = get_numeric_filter_value(wiki_ma_val_str, is_umsatz=False)
if parent_account_name_d_val and parent_account_name_d_val.lower() != 'k.a.':
self.logger.debug(f" -> Parent D ('{parent_account_name_d_val}') ist gesetzt. Konsolidiere primär mit CRM-Daten der Tochter.")
final_num_umsatz = num_crm_umsatz if num_crm_umsatz > 0 else num_wiki_umsatz
final_num_ma = num_crm_ma if num_crm_ma > 0 else num_wiki_ma
else:
final_num_umsatz = num_wiki_umsatz if num_wiki_umsatz > 0 else num_crm_umsatz
final_num_ma = num_wiki_ma if num_wiki_ma > 0 else num_crm_ma
final_umsatz_str_konsolidiert = str(int(round(final_num_umsatz))) if final_num_umsatz > 0 else 'k.A.'
final_ma_str_konsolidiert = str(int(round(final_num_ma))) if final_num_ma > 0 else 'k.A.'
except Exception as e_conso_batch:
self.logger.error(f"Fehler bei Konsolidierung in Plausi-Batch für Zeile {row_num_sheet}: {e_conso_batch}")
final_umsatz_str_konsolidiert = "FEHLER_KONSO_PLAUSI"
final_ma_str_konsolidiert = "FEHLER_KONSO_PLAUSI"
current_row_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Finaler Umsatz (Wiki>CRM)"] + 1)}{row_num_sheet}', 'values': [[final_umsatz_str_konsolidiert]]})
current_row_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Finaler Mitarbeiter (Wiki>CRM)"] + 1)}{row_num_sheet}', 'values': [[final_ma_str_konsolidiert]]})
# 2. Plausibilitäts-Checks (BG-BM)
# ... (Ihre bestehende Logik für _check_financial_plausibility hier, die current_row_updates füllt) ...
if not final_umsatz_str_konsolidiert.startswith("FEHLER") and not final_ma_str_konsolidiert.startswith("FEHLER"):
try:
plausi_input_data = {
"Finaler Umsatz (Wiki>CRM)": final_umsatz_str_konsolidiert,
"Finaler Mitarbeiter (Wiki>CRM)": final_ma_str_konsolidiert,
"CRM Umsatz": self._get_cell_value_safe(row_data, "CRM Umsatz"),
"Wiki Umsatz": self._get_cell_value_safe(row_data, "Wiki Umsatz"),
"CRM Anzahl Mitarbeiter": self._get_cell_value_safe(row_data, "CRM Anzahl Mitarbeiter"),
"Wiki Mitarbeiter": self._get_cell_value_safe(row_data, "Wiki Mitarbeiter"),
"Parent Account Name": parent_account_name_d_val
}
plausi_results = self._check_financial_plausibility(plausi_input_data)
current_row_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Plausibilität Umsatz"] + 1)}{row_num_sheet}', 'values': [[plausi_results.get("plaus_umsatz_flag", "ERR_FLAG")]]})
current_row_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Plausibilität Mitarbeiter"] + 1)}{row_num_sheet}', 'values': [[plausi_results.get("plaus_ma_flag", "ERR_FLAG")]]})
current_row_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Plausibilität Umsatz/MA Ratio"] + 1)}{row_num_sheet}', 'values': [[plausi_results.get("plaus_ratio_flag", "ERR_FLAG")]]})
current_row_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Abweichung Umsatz CRM/Wiki"] + 1)}{row_num_sheet}', 'values': [[plausi_results.get("abweichung_umsatz_flag", "ERR_FLAG")]]})
current_row_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Abweichung MA CRM/Wiki"] + 1)}{row_num_sheet}', 'values': [[plausi_results.get("abweichung_ma_flag", "ERR_FLAG")]]})
current_row_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Plausibilität Begründung"] + 1)}{row_num_sheet}', 'values': [[plausi_results.get("plausi_begruendung_final", "Fehler Begr.")]]})
except Exception as e_plausi_run_batch:
self.logger.error(f"Fehler im Plausi-Check Aufruf (Batch-Modus) für Zeile {row_num_sheet}: {e_plausi_run_batch}")
for key_flag in ["Plausibilität Umsatz", "Plausibilität Mitarbeiter", "Plausibilität Umsatz/MA Ratio", "Abweichung Umsatz CRM/Wiki", "Abweichung MA CRM/Wiki"]:
current_row_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP[key_flag] + 1)}{row_num_sheet}', 'values': [['FEHLER_CALL']]})
current_row_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Plausibilität Begründung"] + 1)}{row_num_sheet}', 'values': [[f"Systemfehler: {str(e_plausi_run_batch)[:100]}"]]})
else: # Fehler bei Konsolidierung
self.logger.warning(f"Zeile {row_num_sheet}: Überspringe Plausi-Checks wegen Fehler bei Konsolidierung.")
for key_flag in ["Plausibilität Umsatz", "Plausibilität Mitarbeiter", "Plausibilität Umsatz/MA Ratio", "Abweichung Umsatz CRM/Wiki", "Abweichung MA CRM/Wiki"]:
current_row_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP[key_flag] + 1)}{row_num_sheet}', 'values': [['FEHLER_CALL']]})
current_row_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Plausibilität Begründung"] + 1)}{row_num_sheet}', 'values': [[f"Systemfehler: {str(e_plausi_run_batch)[:100]}"]]})
else:
self.logger.warn(f"Zeile {row_num_sheet}: Überspringe Plausi-Checks wegen Fehler bei Konsolidierung.")
for key_flag in ["Plausibilität Umsatz", "Plausibilität Mitarbeiter", "Plausibilität Umsatz/MA Ratio", "Abweichung Umsatz CRM/Wiki", "Abweichung MA CRM/Wiki"]:
current_row_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP[key_flag] + 1)}{row_num_sheet}', 'values': [['INPUT_FEHLER_KONSO']]})
current_row_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Plausibilität Begründung"] + 1)}{row_num_sheet}', 'values': [["Konsolidierung fehlgeschlagen"]]})
current_row_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP[key_flag] + 1)}{row_num_sheet}', 'values': [['INPUT_FEHLER_KONSO']]})
current_row_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Plausibilität Begründung"] + 1)}{row_num_sheet}', 'values': [["Konsolidierung fehlgeschlagen"]]})
# Plausibilität Prüfdatum (BM) setzen
current_row_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Plausibilität Prüfdatum"] + 1)}{row_num_sheet}', 'values': [[now_timestamp_str]]})
all_sheet_updates.extend(current_row_updates)
processed_rows_count += 1
current_row_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Plausibilität Prüfdatum"] + 1)}{row_num_sheet}', 'values': [[now_timestamp_str]]})
all_sheet_updates.extend(current_row_updates)
processed_rows_count += 1
# Batch-Update auslösen, wenn Limit erreicht
# --- 6. Batch Update fuer diese EINE Zeile ---
if updates: # 'updates' ist die Liste, die innerhalb von _process_single_row für die aktuelle Zeile gefüllt wurde
self.logger.info(f"Zeile {row_num_in_sheet}: Sende Batch-Update mit {len(updates)} Operationen für diese Zeile...")
success = self.sheet_handler.batch_update_cells(updates)
if not success:
self.logger.error(f"Zeile {row_num_in_sheet}: ENDGUELTIGER FEHLER beim Batch-Update nach Retries.")
else:
if not any_processing_done: # any_processing_done wurde am Anfang auf False gesetzt und bei jeder Aktion auf True
self.logger.debug(f"Zeile {row_num_in_sheet}: Keine Updates zum Schreiben (alle relevanten Schritte übersprungen oder nicht angefordert).")
# Batch-Update auslösen, wenn Limit erreicht
if processed_rows_count % update_batch_limit_config == 0 and processed_rows_count > 0:
if all_sheet_updates:
self.logger.info(f"Plausi-Batch: Sende {len(all_sheet_updates)} Operationen für {update_batch_limit_config} Zeilen...")
self.sheet_handler.batch_update_cells(all_sheet_updates)
all_sheet_updates = [] # Liste leeren nach dem Senden
time.sleep(0.5) # Kurze Pause nach Batch-Update
pause_duration = max(0.05, getattr(Config, 'RETRY_DELAY', 5) / 20.0)
time.sleep(pause_duration)
self.logger.info(f"--- Verarbeitung fuer Zeile {row_num_in_sheet} abgeschlossen ---")
# Ende der for-Schleife über die Zeilen
# Sende verbleibende Updates
if all_sheet_updates:
self.logger.info(f"Plausi-Batch: Sende verbleibende {len(all_sheet_updates)} Operationen...")
self.sheet_handler.batch_update_cells(all_sheet_updates)
self.logger.info(f"Modus 'plausi_check_data' abgeschlossen. {processed_rows_count} Zeilen verarbeitet.")
# ==========================================================================
# === Batch Processing Methods (Parent Account Suggestion) ==============