This commit is contained in:
2025-04-17 18:34:42 +00:00
parent 9a615a88fc
commit a7220d9f20

View File

@@ -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)."""