From 80ae56bf9f4e63eae70fa999e2345c6ad5e99536 Mon Sep 17 00:00:00 2001 From: Floke Date: Tue, 22 Apr 2025 06:31:38 +0000 Subject: [PATCH] bugfix --- brancheneinstufung.py | 84 ++++++++++++++++++++++++------------------- 1 file changed, 48 insertions(+), 36 deletions(-) diff --git a/brancheneinstufung.py b/brancheneinstufung.py index f2dfd63c..fbfd7407 100644 --- a/brancheneinstufung.py +++ b/brancheneinstufung.py @@ -319,7 +319,7 @@ def process_find_wiki_with_serp(sheet_handler, row_limit=None, min_employees=500 """ Sucht fehlende Wikipedia-URLs (Spalte M = k.A.) für Unternehmen mit > min_employees über SerpAPI und trägt gefundene URLs in Spalte M ein. Setzt ReEval-Flag (A) - und löscht Timestamps (AN, AO) für gefundene Einträge. + und löscht abhängige Wiki-Spalten (N-V, AN, AO, AP, AX). Merkt sich in Spalte AY, wann die Suche durchgeführt wurde. Args: @@ -337,16 +337,27 @@ def process_find_wiki_with_serp(sheet_handler, row_limit=None, min_employees=500 header_rows = 5 data_rows = all_data[header_rows:] - # Benötigte Spaltenindizes holen (inkl. neuer Spalte AY) + # Benötigte Spaltenindizes holen (inkl. aller zu löschenden Spalten) try: col_indices = { "A": COLUMN_MAP["ReEval Flag"], "K": COLUMN_MAP["CRM Anzahl Mitarbeiter"], "M": COLUMN_MAP["Wiki URL"], "B": COLUMN_MAP["CRM Name"], + "N": COLUMN_MAP["Wiki Absatz"], # NEU zum Löschen + "O": COLUMN_MAP["Wiki Branche"], # NEU zum Löschen + "P": COLUMN_MAP["Wiki Umsatz"], # NEU zum Löschen + "Q": COLUMN_MAP["Wiki Mitarbeiter"], # NEU zum Löschen + "R": COLUMN_MAP["Wiki Kategorien"], # NEU zum Löschen + "S": COLUMN_MAP["Chat Wiki Konsistenzprüfung"], # NEU zum Löschen + "T": COLUMN_MAP["Chat Begründung Wiki Inkonsistenz"], # NEU zum Löschen + "U": COLUMN_MAP["Chat Vorschlag Wiki Artikel"], # NEU zum Löschen + "V": COLUMN_MAP["Begründung bei Abweichung"], # NEU zum Löschen "AN": COLUMN_MAP["Wikipedia Timestamp"], "AO": COLUMN_MAP["Timestamp letzte Prüfung"], - "AY": COLUMN_MAP["SerpAPI Wiki Search Timestamp"] # <-- NEU + "AP": COLUMN_MAP["Version"], # NEU zum Löschen + "AX": COLUMN_MAP["Wiki Verif. Timestamp"], # NEU zum Löschen + "AY": COLUMN_MAP["SerpAPI Wiki Search Timestamp"] } col_letters = {key: sheet_handler._get_col_letter(idx + 1) for key, idx in col_indices.items()} except KeyError as e: @@ -356,14 +367,13 @@ def process_find_wiki_with_serp(sheet_handler, row_limit=None, min_employees=500 logging.critical(f"FEHLER beim Holen der Spaltenbuchstaben: {e}") return - # --- HIER WIRD all_sheet_updates definiert --- all_sheet_updates = [] - processed_rows = 0 # Zählt Zeilen, für die eine Suche durchgeführt wurde - found_urls = 0 # Zählt Zeilen, wo eine URL gefunden wurde - skipped_timestamp_ay = 0 # Zählt Zeilen, die übersprungen wurden, weil AY gesetzt war + processed_rows = 0 + found_urls = 0 + skipped_timestamp_ay = 0 skipped_employee_count = 0 skipped_m_filled_count = 0 - now_timestamp_str = datetime.now().strftime("%Y-%m-%d %H:%M:%S") # Einmaliger Timestamp für diesen Lauf + now_timestamp_str = datetime.now().strftime("%Y-%m-%d %H:%M:%S") for idx, row in enumerate(data_rows): row_num_in_sheet = idx + header_rows + 1 @@ -372,18 +382,14 @@ def process_find_wiki_with_serp(sheet_handler, row_limit=None, min_employees=500 logging.info(f"Zeilenlimit ({row_limit}) für durchgeführte Suchen erreicht.") break - # --- NEUE PRÜFUNG: Wurde diese Zeile schon via SerpAPI geprüft? --- + # Prüfe AY Timestamp ts_ay_val = row[col_indices["AY"]] if len(row) > col_indices["AY"] else "" if ts_ay_val and ts_ay_val.strip(): skipped_timestamp_ay += 1 - # Optional: Debug Log - # logging.debug(f"Zeile {row_num_in_sheet}: Übersprungen (SerpAPI Wiki Search Timestamp AY bereits gesetzt: '{ts_ay_val}').") - continue # Nächste Zeile, diese wurde schon geprüft - # --- ENDE NEUE PRÜFUNG --- + continue - # Prüfe, ob Zeile überhaupt verarbeitet werden soll try: - # 1. Mitarbeiterzahl prüfen + # Mitarbeiterzahl prüfen ma_val_str = row[col_indices["K"]] if len(row) > col_indices["K"] else "0" try: ma_val_str_cleaned = re.sub(r"[^\d]", "", ma_val_str) @@ -394,60 +400,66 @@ def process_find_wiki_with_serp(sheet_handler, row_limit=None, min_employees=500 skipped_employee_count += 1 continue - # 2. Prüfen, ob Wiki URL (M) leer oder "k.A." ist + # Wiki URL (M) prüfen m_value = row[col_indices["M"]] if len(row) > col_indices["M"] else "" - # Prüfe auf leer UND 'k.a.' (case-insensitive) if m_value and m_value.strip().lower() != "k.a.": skipped_m_filled_count += 1 continue - # Wenn wir hier sind, ist die Zeile ein Kandidat FÜR DIESEN LAUF + # Kandidat gefunden company_name = row[col_indices["B"]] if len(row) > col_indices["B"] else "" if not company_name: logging.warning(f"Zeile {row_num_in_sheet}: Übersprungen, kein Firmenname für Suche vorhanden.") continue - # --- SerpAPI Suche durchführen --- + # SerpAPI Suche logging.info(f"Zeile {row_num_in_sheet}: Suche Wiki-URL für '{company_name}' (MA: {ma_val})...") - wiki_url_found = serp_wikipedia_lookup(company_name) # Annahme: nutzt logging - processed_rows += 1 # Zähle die durchgeführte Suche - time.sleep(1.5) # Pause zwischen SerpAPI-Aufrufen + wiki_url_found = serp_wikipedia_lookup(company_name) + processed_rows += 1 + time.sleep(1.5) - # --- Updates vorbereiten --- - # Timestamp AY IMMER setzen, um die Suche zu markieren + # Updates vorbereiten + # Timestamp AY IMMER setzen row_updates = [{'range': f'{col_letters["AY"]}{row_num_in_sheet}', 'values': [[now_timestamp_str]]}] if wiki_url_found: - logging.info(f" -> URL gefunden: {wiki_url_found}. Bereite Update vor.") + logging.info(f" -> URL gefunden: {wiki_url_found}. Bereite Update vor (Setze M, A; Lösche N-V, AN, AO, AP, AX).") found_urls += 1 - # Zusätzliche Updates nur, wenn URL gefunden wurde + # Zusätzliche Updates für gefundene URL row_updates.extend([ - {'range': f'{col_letters["M"]}{row_num_in_sheet}', 'values': [[wiki_url_found]]}, - {'range': f'{col_letters["A"]}{row_num_in_sheet}', 'values': [['x']]}, + {'range': f'{col_letters["M"]}{row_num_in_sheet}', 'values': [[wiki_url_found]]}, # URL setzen + {'range': f'{col_letters["A"]}{row_num_in_sheet}', 'values': [['x']]}, # ReEval Flag + # --- Spalten leeren --- + {'range': f'{col_letters["N"]}{row_num_in_sheet}', 'values': [['']]}, + {'range': f'{col_letters["O"]}{row_num_in_sheet}', 'values': [['']]}, + {'range': f'{col_letters["P"]}{row_num_in_sheet}', 'values': [['']]}, + {'range': f'{col_letters["Q"]}{row_num_in_sheet}', 'values': [['']]}, + {'range': f'{col_letters["R"]}{row_num_in_sheet}', 'values': [['']]}, + {'range': f'{col_letters["S"]}{row_num_in_sheet}', 'values': [['']]}, + {'range': f'{col_letters["T"]}{row_num_in_sheet}', 'values': [['']]}, + {'range': f'{col_letters["U"]}{row_num_in_sheet}', 'values': [['']]}, + {'range': f'{col_letters["V"]}{row_num_in_sheet}', 'values': [['']]}, {'range': f'{col_letters["AN"]}{row_num_in_sheet}', 'values': [['']]}, - {'range': f'{col_letters["AO"]}{row_num_in_sheet}', 'values': [['']]} + {'range': f'{col_letters["AO"]}{row_num_in_sheet}', 'values': [['']]}, + {'range': f'{col_letters["AP"]}{row_num_in_sheet}', 'values': [['']]}, + {'range': f'{col_letters["AX"]}{row_num_in_sheet}', 'values': [['']]} ]) else: logging.info(f" -> Keine Wiki-URL für '{company_name}' via SerpAPI gefunden.") - # Optional: Marker in M schreiben? Vorerst nicht, AY reicht. - # row_updates.append({'range': f'{col_letters["M"]}{row_num_in_sheet}', 'values': [['k.A. (SerpAPI Searched)']]}) + # Nur AY Timestamp wird geschrieben - # Füge die Updates für diese Zeile zur Gesamtliste hinzu all_sheet_updates.extend(row_updates) except Exception as e: - # Logge Fehler und fahre mit der nächsten Zeile fort logging.exception(f"Unerwarteter Fehler bei Verarbeitung von Zeile {row_num_in_sheet}: {e}") - continue # Gehe zur nächsten Zeile + continue # --- Batch Update am Ende --- - # Dieser Block muss auf derselben Einrückungsebene wie die for-Schleife sein! if all_sheet_updates: logging.info(f"Sende Batch-Update für {processed_rows} geprüfte Zeilen ({found_urls} URLs gefunden, {len(all_sheet_updates)} Zellen)...") success = sheet_handler.batch_update_cells(all_sheet_updates) if success: logging.info(f"Sheet-Update für 'find_wiki_serp' erfolgreich.") - # Fehler wird von batch_update_cells geloggt else: logging.info("Keine Zeilen gefunden, für die eine SerpAPI Wiki-Suche durchgeführt werden musste/konnte.")