diff --git a/brancheneinstufung.py b/brancheneinstufung.py index af0d64c9..09393bd1 100644 --- a/brancheneinstufung.py +++ b/brancheneinstufung.py @@ -575,14 +575,15 @@ def normalize_company_name(name): # NEUE Funktion für Wiki-Updates basierend auf ChatGPT Vorschlägen # NEUE Funktion für Wiki-Updates basierend auf ChatGPT Vorschlägen (mit Status-Update in S) -def process_wiki_updates_from_chatgpt(sheet_handler, data_processor): +def process_wiki_updates_from_chatgpt(sheet_handler, data_processor, row_limit=None): # row_limit hinzugefügt """ Identifiziert Zeilen, bei denen Wiki-Konsistenz (S) NICHT 'OK'/'X (Updated)' ist und ein alternativer Artikel in U vorgeschlagen wurde (URL, != M). - Kopiert neue URL nach M, führt Reparse (N-R) & Re-Branch (W-Y) durch, - löscht Timestamps (AN, AX, AO, AP) und markiert S als 'X (Updated)'. + SCHREIBT NUR die neue URL aus U nach M und markiert S als 'X (URL Copied)'. + Timestamps etc. werden NICHT gelöscht in diesem Schritt. + Verarbeitet maximal row_limit Kandidaten. """ - debug_print("Starte Modus: Wiki-Updates basierend auf ChatGPT-Vorschlägen...") + debug_print("Starte Modus: Wiki-Updates Schritt 1 (URL U -> M schreiben)...") if not sheet_handler.load_data(): return all_data = sheet_handler.get_all_data_with_headers() @@ -591,106 +592,105 @@ def process_wiki_updates_from_chatgpt(sheet_handler, data_processor): data_rows = all_data[header_rows:] # Indizes holen - required_keys = ["Chat Wiki Konsistenzprüfung", "Chat Vorschlag Wiki Artikel", "Wiki URL", "Wiki Absatz", "Wiki Branche", "Wiki Umsatz", "Wiki Mitarbeiter", "Wiki Kategorien", "Chat Vorschlag Branche", "Chat Konsistenz Branche", "Chat Begründung Abweichung Branche", "Wikipedia Timestamp", "Wiki Verif. Timestamp", "Timestamp letzte Prüfung", "Version", "Website Zusammenfassung", "CRM Branche", "CRM Beschreibung"] - col_indices = {}; all_keys_found = True + required_keys = ["Chat Wiki Konsistenzprüfung", "Chat Vorschlag Wiki Artikel", "Wiki URL"] + col_indices = {} + all_keys_found = True for key in required_keys: idx = COLUMN_MAP.get(key) if idx is None: debug_print(f"FEHLER: Schlüssel '{key}' fehlt!"); all_keys_found = False col_indices[key] = idx - if not all_keys_found: return debug_print("Breche Wiki-Updates ab.") + if not all_keys_found: return debug_print("Breche ab.") all_sheet_updates = [] processed_rows_count = 0 - error_rows_count = 0 - wiki_scraper = data_processor.wiki_scraper + error_rows_count = 0 # Behalte Fehlerzählung bei, falls Probleme auftreten + # --- Hauptschleife über Datenzeilen --- for idx, row in enumerate(data_rows): row_num_in_sheet = idx + header_rows + 1 - def get_value(key): # Sicherer Zugriff auf Spaltenindex + # --- NEU: Limit prüfen --- + if row_limit is not None and processed_rows_count >= row_limit: + debug_print(f"Zeilenlimit ({row_limit}) erreicht. Breche Suche nach weiteren Kandidaten ab.") + break # Verlasse die for-Schleife + + # --- Werte sicher lesen --- + def get_value(key): index = col_indices.get(key) if index is not None and len(row) > index: return row[index] return "" konsistenz_s = get_value("Chat Wiki Konsistenzprüfung") - vorschlag_u = get_value("Chat Vorschlag Wiki Artikel") # Liest Spalte U + vorschlag_u = get_value("Chat Vorschlag Wiki Artikel") url_m = get_value("Wiki URL") - # Bedingung prüfen - is_update_candidate = False; new_url = "" + # --- Bedingung prüfen --- + is_update_candidate = False + new_url = "" konsistenz_s_upper = konsistenz_s.strip().upper() vorschlag_u_cleaned = vorschlag_u.strip() url_m_cleaned = url_m.strip() - condition1_status_nok = konsistenz_s_upper not in ["OK", "X (UPDATED)", ""] + condition1_status_nok = konsistenz_s_upper not in ["OK", "X (UPDATED)", "X (URL COPIED)", ""] # Neuer Status hinzugefügt condition2_u_is_url = vorschlag_u_cleaned.lower().startswith(("http://", "https://")) condition3_u_differs_m = False if condition2_u_is_url: new_url = vorschlag_u_cleaned; condition3_u_differs_m = new_url != url_m_cleaned is_update_candidate = condition1_status_nok and condition2_u_is_url and condition3_u_differs_m - # Detailliertes Debugging für relevante Zeilen - if row_num_in_sheet in [28, 40, 42, 388, 416, 478, 523, 527, 545, 571, 630] or idx < 2: + # (Debugging für Zeile 28 etc. kann drin bleiben) + if row_num_in_sheet in [28, 40, 42] or idx < 2: debug_print(f"\n--- DEBUG Zeile {row_num_in_sheet} ---"); debug_print(f" S='{konsistenz_s}' -> NOK? {condition1_status_nok}"); debug_print(f" U='{vorschlag_u}' -> URL? {condition2_u_is_url}"); debug_print(f" M='{url_m}'"); debug_print(f" U!=M? {condition3_u_differs_m}"); debug_print(f" => Update? {is_update_candidate}"); debug_print(f"--- ENDE DEBUG ---\n") if is_update_candidate: - debug_print(f"Zeile {row_num_in_sheet}: Verarbeite Update-Kandidat. Neue URL: {new_url}") + debug_print(f"Zeile {row_num_in_sheet}: Update-Kandidat gefunden. Schreibe URL '{new_url}' nach Spalte M.") try: - # Wiki Reparse - debug_print(f" -> Reparsing Wiki: {new_url}...") - new_wiki_data = wiki_scraper.extract_company_data(new_url); time.sleep(0.2) - # Branch Neuberechnung - crm_branche = get_value("CRM Branche"); crm_beschreibung = get_value("CRM Beschreibung"); website_summary = get_value("Website Zusammenfassung") - debug_print(f" -> Neuberechnung Branch...") - new_branch_result = evaluate_branche_chatgpt(crm_branche, crm_beschreibung, new_wiki_data.get('branche', 'k.A.'), new_wiki_data.get('categories', 'k.A.'), website_summary); time.sleep(0.2) + # --- Updates sammeln (NUR Spalte M und S) --- + url_m_letter = sheet_handler._get_col_letter(col_indices["Wiki URL"] + 1) + konsistenz_s_letter = sheet_handler._get_col_letter(col_indices["Chat Wiki Konsistenzprüfung"] + 1) + vorschlag_u_letter = sheet_handler._get_col_letter(col_indices["Chat Vorschlag Wiki Artikel"] + 1) # Für "Korrektur übernommen" - # Updates sammeln - m_l=sheet_handler._get_col_letter(col_indices["Wiki URL"]+1); n_l=sheet_handler._get_col_letter(col_indices["Wiki Absatz"]+1); o_l=sheet_handler._get_col_letter(col_indices["Wiki Branche"]+1); p_l=sheet_handler._get_col_letter(col_indices["Wiki Umsatz"]+1); q_l=sheet_handler._get_col_letter(col_indices["Wiki Mitarbeiter"]+1); r_l=sheet_handler._get_col_letter(col_indices["Wiki Kategorien"]+1); w_l=sheet_handler._get_col_letter(col_indices["Chat Vorschlag Branche"]+1); x_l=sheet_handler._get_col_letter(col_indices["Chat Konsistenz Branche"]+1); y_l=sheet_handler._get_col_letter(col_indices["Chat Begründung Abweichung Branche"]+1); an_l=sheet_handler._get_col_letter(col_indices["Wikipedia Timestamp"]+1); ax_l=sheet_handler._get_col_letter(col_indices["Wiki Verif. Timestamp"]+1); ao_l=sheet_handler._get_col_letter(col_indices["Timestamp letzte Prüfung"]+1); ap_l=sheet_handler._get_col_letter(col_indices["Version"]+1); vorschlag_u_letter=sheet_handler._get_col_letter(col_indices["Chat Vorschlag Wiki Artikel"]+1); konsistenz_s_letter=sheet_handler._get_col_letter(col_indices["Chat Wiki Konsistenzprüfung"]+1) row_updates = [ - {'range': f'{m_l}{row_num_in_sheet}', 'values': [[new_url]]}, - {'range': f'{n_l}{row_num_in_sheet}', 'values': [[new_wiki_data.get('first_paragraph', 'k.A.')]]}, - {'range': f'{o_l}{row_num_in_sheet}', 'values': [[new_wiki_data.get('branche', 'k.A.')]]}, - {'range': f'{p_l}{row_num_in_sheet}', 'values': [[new_wiki_data.get('umsatz', 'k.A.')]]}, - {'range': f'{q_l}{row_num_in_sheet}', 'values': [[new_wiki_data.get('mitarbeiter', 'k.A.')]]}, - {'range': f'{r_l}{row_num_in_sheet}', 'values': [[new_wiki_data.get('categories', 'k.A.')]]}, - {'range': f'{w_l}{row_num_in_sheet}', 'values': [[new_branch_result.get("branch", "Fehler")]]}, - {'range': f'{x_l}{row_num_in_sheet}', 'values': [[new_branch_result.get("consistency", "Fehler")]]}, - {'range': f'{y_l}{row_num_in_sheet}', 'values': [[new_branch_result.get("justification", "Fehler")]]}, - {'range': f'{an_l}{row_num_in_sheet}', 'values': [[""]]}, {'range': f'{ax_l}{row_num_in_sheet}', 'values': [[""]]}, - {'range': f'{ao_l}{row_num_in_sheet}', 'values': [[""]]}, {'range': f'{ap_l}{row_num_in_sheet}', 'values': [[""]]}, - {'range': f'{vorschlag_u_letter}{row_num_in_sheet}', 'values': [["Korrektur übernommen"]]}, - {'range': f'{konsistenz_s_letter}{row_num_in_sheet}', 'values': [["X (Updated)"]]}, + {'range': f'{url_m_letter}{row_num_in_sheet}', 'values': [[new_url]]}, # Schreibe neue URL nach M + {'range': f'{konsistenz_s_letter}{row_num_in_sheet}', 'values': [["X (URL Copied)"]]}, # Setze neuen Status + {'range': f'{vorschlag_u_letter}{row_num_in_sheet}', 'values': [["URL übernommen"]]} # Markiere Spalte U ] all_sheet_updates.extend(row_updates) processed_rows_count += 1 - debug_print(f" -> Updates für Zeile {row_num_in_sheet} vorbereitet.") - # Keine Pause mehr hier pro Zeile, nur am Ende des Batches + # debug_print(f" -> Updates für Zeile {row_num_in_sheet} vorbereitet (nur M, S, U).") + + # --- Reparsing und Re-Branching HIER AUSKOMMENTIERT --- + # debug_print(f" -> Reparsing Wiki-Daten für {new_url}...") + # new_wiki_data = wiki_scraper.extract_company_data(new_url) + # time.sleep(0.2) + # debug_print(f" -> Neuberechnung der Branche...") + # new_branch_result = evaluate_branche_chatgpt(...) + # time.sleep(0.2) + # --- Ende Auskommentierung --- + + # --- KEINE Timestamps löschen in diesem Schritt --- except Exception as e_row: error_rows_count += 1 debug_print(f"FEHLER Verarbeitung Zeile {row_num_in_sheet}: {e_row}") - # import traceback; debug_print(traceback.format_exc()) # Bei Bedarf Traceback loggen # --- Batch Update am Ende --- if all_sheet_updates: - debug_print(f"BEREIT ZUM SENDEN: Batch-Update für {processed_rows_count} korrigierte Wiki-Einträge ({len(all_sheet_updates)} Zellen)...") - # Optional: Logge Beispiel-Updates + debug_print(f"BEREIT ZUM SENDEN: Batch-Update für {processed_rows_count} kopierte URLs ({len(all_sheet_updates)} Zellen)...") if len(all_sheet_updates) > 0: debug_print(f" -> Beispiel Update 1: {all_sheet_updates[0]}") - if len(all_sheet_updates) > 15: debug_print(f" -> Beispiel Update 15: {all_sheet_updates[14]}") - + if len(all_sheet_updates) > 2: debug_print(f" -> Beispiel Update 3: {all_sheet_updates[2]}") success = False try: debug_print(" -> Rufe sheet_handler.batch_update_cells AUF...") success = sheet_handler.batch_update_cells(all_sheet_updates) debug_print(f" -> Aufruf von sheet_handler.batch_update_cells BEENDET. Erfolg? {success}") except Exception as e_update: - debug_print(f" -> FEHLER direkt beim Aufruf von batch_update_cells in process_wiki_updates: {e_update}") + debug_print(f" -> FEHLER direkt beim Aufruf von batch_update_cells: {e_update}") import traceback; debug_print(traceback.format_exc()) - - if success: debug_print(f"Sheet-Update Wiki-Korrekturen laut Rückgabewert erfolgreich.") - else: debug_print(f"FEHLER/Kein Erfolg Sheet-Update Wiki-Korrekturen.") + if success: debug_print(f"Sheet-Update für URL-Kopien erfolgreich.") + else: debug_print(f"FEHLER/Kein Erfolg Sheet-Update für URL-Kopien.") else: - debug_print("Keine Zeilen für Wiki-URL-Korrektur gefunden/verarbeitet.") + debug_print("Keine Zeilen gefunden, für die eine URL kopiert werden muss.") - debug_print(f"Wiki-Updates basierend auf ChatGPT abgeschlossen. {processed_rows_count} Zeilen verarbeitet, {error_rows_count} Fehler bei Verarbeitung.") + debug_print(f"Wiki-Updates Schritt 1 (URL U->M) abgeschlossen. {processed_rows_count} URLs kopiert, {error_rows_count} Fehler.") def extract_numeric_value(raw_value, is_umsatz=False): """Extrahiert und normalisiert Zahlenwerte (Umsatz in Mio, Mitarbeiter)."""