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
# NEUE Funktion für Wiki-Updates basierend auf ChatGPT Vorschlägen (mit Status-Update in S) # 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 Identifiziert Zeilen, bei denen Wiki-Konsistenz (S) NICHT 'OK'/'X (Updated)' ist
und ein alternativer Artikel in U vorgeschlagen wurde (URL, != M). 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, SCHREIBT NUR die neue URL aus U nach M und markiert S als 'X (URL Copied)'.
löscht Timestamps (AN, AX, AO, AP) und markiert S als 'X (Updated)'. 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 if not sheet_handler.load_data(): return
all_data = sheet_handler.get_all_data_with_headers() 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:] data_rows = all_data[header_rows:]
# Indizes holen # 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"] required_keys = ["Chat Wiki Konsistenzprüfung", "Chat Vorschlag Wiki Artikel", "Wiki URL"]
col_indices = {}; all_keys_found = True col_indices = {}
all_keys_found = True
for key in required_keys: for key in required_keys:
idx = COLUMN_MAP.get(key) idx = COLUMN_MAP.get(key)
if idx is None: debug_print(f"FEHLER: Schlüssel '{key}' fehlt!"); all_keys_found = False if idx is None: debug_print(f"FEHLER: Schlüssel '{key}' fehlt!"); all_keys_found = False
col_indices[key] = idx 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 = [] all_sheet_updates = []
processed_rows_count = 0 processed_rows_count = 0
error_rows_count = 0 error_rows_count = 0 # Behalte Fehlerzählung bei, falls Probleme auftreten
wiki_scraper = data_processor.wiki_scraper
# --- Hauptschleife über Datenzeilen ---
for idx, row in enumerate(data_rows): for idx, row in enumerate(data_rows):
row_num_in_sheet = idx + header_rows + 1 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) index = col_indices.get(key)
if index is not None and len(row) > index: return row[index] if index is not None and len(row) > index: return row[index]
return "" return ""
konsistenz_s = get_value("Chat Wiki Konsistenzprüfung") 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") url_m = get_value("Wiki URL")
# Bedingung prüfen # --- Bedingung prüfen ---
is_update_candidate = False; new_url = "" is_update_candidate = False
new_url = ""
konsistenz_s_upper = konsistenz_s.strip().upper() konsistenz_s_upper = konsistenz_s.strip().upper()
vorschlag_u_cleaned = vorschlag_u.strip() vorschlag_u_cleaned = vorschlag_u.strip()
url_m_cleaned = url_m.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://")) condition2_u_is_url = vorschlag_u_cleaned.lower().startswith(("http://", "https://"))
condition3_u_differs_m = False condition3_u_differs_m = False
if condition2_u_is_url: new_url = vorschlag_u_cleaned; condition3_u_differs_m = new_url != url_m_cleaned 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 is_update_candidate = condition1_status_nok and condition2_u_is_url and condition3_u_differs_m
# Detailliertes Debugging für relevante Zeilen # (Debugging für Zeile 28 etc. kann drin bleiben)
if row_num_in_sheet in [28, 40, 42, 388, 416, 478, 523, 527, 545, 571, 630] or idx < 2: 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") 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: 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: try:
# Wiki Reparse # --- Updates sammeln (NUR Spalte M und S) ---
debug_print(f" -> Reparsing Wiki: {new_url}...") url_m_letter = sheet_handler._get_col_letter(col_indices["Wiki URL"] + 1)
new_wiki_data = wiki_scraper.extract_company_data(new_url); time.sleep(0.2) konsistenz_s_letter = sheet_handler._get_col_letter(col_indices["Chat Wiki Konsistenzprüfung"] + 1)
# Branch Neuberechnung vorschlag_u_letter = sheet_handler._get_col_letter(col_indices["Chat Vorschlag Wiki Artikel"] + 1) # Für "Korrektur übernommen"
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
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 = [ row_updates = [
{'range': f'{m_l}{row_num_in_sheet}', 'values': [[new_url]]}, {'range': f'{url_m_letter}{row_num_in_sheet}', 'values': [[new_url]]}, # Schreibe neue URL nach M
{'range': f'{n_l}{row_num_in_sheet}', 'values': [[new_wiki_data.get('first_paragraph', 'k.A.')]]}, {'range': f'{konsistenz_s_letter}{row_num_in_sheet}', 'values': [["X (URL Copied)"]]}, # Setze neuen Status
{'range': f'{o_l}{row_num_in_sheet}', 'values': [[new_wiki_data.get('branche', 'k.A.')]]}, {'range': f'{vorschlag_u_letter}{row_num_in_sheet}', 'values': [["URL übernommen"]]} # Markiere Spalte U
{'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)"]]},
] ]
all_sheet_updates.extend(row_updates) all_sheet_updates.extend(row_updates)
processed_rows_count += 1 processed_rows_count += 1
debug_print(f" -> Updates für Zeile {row_num_in_sheet} vorbereitet.") # debug_print(f" -> Updates für Zeile {row_num_in_sheet} vorbereitet (nur M, S, U).")
# Keine Pause mehr hier pro Zeile, nur am Ende des Batches
# --- 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: except Exception as e_row:
error_rows_count += 1 error_rows_count += 1
debug_print(f"FEHLER Verarbeitung Zeile {row_num_in_sheet}: {e_row}") 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 --- # --- Batch Update am Ende ---
if all_sheet_updates: 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)...") debug_print(f"BEREIT ZUM SENDEN: Batch-Update für {processed_rows_count} kopierte URLs ({len(all_sheet_updates)} Zellen)...")
# Optional: Logge Beispiel-Updates
if len(all_sheet_updates) > 0: debug_print(f" -> Beispiel Update 1: {all_sheet_updates[0]}") 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 success = False
try: try:
debug_print(" -> Rufe sheet_handler.batch_update_cells AUF...") debug_print(" -> Rufe sheet_handler.batch_update_cells AUF...")
success = sheet_handler.batch_update_cells(all_sheet_updates) success = sheet_handler.batch_update_cells(all_sheet_updates)
debug_print(f" -> Aufruf von sheet_handler.batch_update_cells BEENDET. Erfolg? {success}") debug_print(f" -> Aufruf von sheet_handler.batch_update_cells BEENDET. Erfolg? {success}")
except Exception as e_update: 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()) import traceback; debug_print(traceback.format_exc())
if success: debug_print(f"Sheet-Update für URL-Kopien erfolgreich.")
if success: debug_print(f"Sheet-Update Wiki-Korrekturen laut Rückgabewert erfolgreich.") else: debug_print(f"FEHLER/Kein Erfolg Sheet-Update für URL-Kopien.")
else: debug_print(f"FEHLER/Kein Erfolg Sheet-Update Wiki-Korrekturen.")
else: 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): def extract_numeric_value(raw_value, is_umsatz=False):
"""Extrahiert und normalisiert Zahlenwerte (Umsatz in Mio, Mitarbeiter).""" """Extrahiert und normalisiert Zahlenwerte (Umsatz in Mio, Mitarbeiter)."""