From 5d3d702f0b502ba59b0c5af09782567ffcace508 Mon Sep 17 00:00:00 2001 From: Floke Date: Mon, 4 Aug 2025 09:33:55 +0000 Subject: [PATCH] Refactor Core Helpers & Introduce Tests - Zentralisierung kritischer Hilfsfunktionen in helpers.py (get_col_idx, _get_col_letter). - Bereinigung der helpers.py durch Entfernen der doppelten alignment_demo-Funktion. - Anpassung des GoogleSheetHandler, um die zentralen Helper zu nutzen. - Erstellung einer Test-Suite (test_core_functionality.py) zur Absicherung der Kernlogik. --- helpers.py | 60 +++++++++++++----------------------------------------- 1 file changed, 14 insertions(+), 46 deletions(-) diff --git a/helpers.py b/helpers.py index a1d47e8e..caa8af8a 100644 --- a/helpers.py +++ b/helpers.py @@ -67,12 +67,14 @@ def get_col_idx(key): """ Ermittelt sicher den 0-basierten Spalten-Index für einen gegebenen Spaltennamen (key) mithilfe der zentralen COLUMN_ORDER-Liste aus der Config. + Gibt None zurück, wenn der Schlüssel nicht gefunden wird, um Fehler abzufangen. """ try: return COLUMN_ORDER.index(key) - except (ValueError, NameError): - # Fängt den Fehler ab, falls COLUMN_ORDER nicht importiert wurde oder der Key nicht existiert. + except ValueError: + # Fängt den Fehler ab, falls der Key nicht in der Liste existiert. # Ein Logging hier wäre gut, aber um Abhängigkeiten zu vermeiden, geben wir nur None zurück. + logging.getLogger(__name__).error(f"Spalten-Schlüssel '{key}' konnte in COLUMN_ORDER nicht gefunden werden!") return None # ============================================================================== @@ -1567,47 +1569,12 @@ def is_valid_wikipedia_article_url(url): # 12. ALIGNMENT DEMO UTILITY # ============================================================================== -def alignment_demo(sheet): - """ - Schreibt die Header-Struktur (v2.1.4, 71 Spalten) ins Google Sheet zur Dokumentation. - Dies ist die Single Source of Truth für die Spaltenbedeutung. Version mit ungekürzten Texten. - """ - logger = logging.getLogger(__name__) - logger.info("Starte Alignment Demo für das Hauptblatt (v2.1.4)...") - - new_headers = [ - [ # Zeile 1: Spaltenname (71 Spalten, A-BS) - "ReEval Flag", "CRM Name", "CRM Kurzform", "Parent Account Name", "CRM Website", "CRM Ort", "CRM Land", "CRM Beschreibung", "CRM Branche", "CRM Beschreibung Branche extern", "CRM Anzahl Techniker", "CRM Umsatz", "CRM Anzahl Mitarbeiter", "CRM Vorschlag Wiki URL", "System Vorschlag Parent Account", "Parent Vorschlag Status", "Parent Vorschlag Timestamp", "Wiki URL", "Wiki Sitz Stadt", "Wiki Sitz Land", "Wiki Absatz", "Wiki Branche", "Wiki Umsatz", "Wiki Mitarbeiter", "Wiki Kategorien", "Wikipedia Timestamp", "Wiki Verif. Timestamp", "SerpAPI Wiki Search Timestamp", "Chat Wiki Konsistenzpruefung", "Chat Begründung Wiki Inkonsistenz", "Chat Vorschlag Wiki Artikel", "Begründung bei Abweichung", "Website Rohtext", "Website Zusammenfassung", "Website Meta-Details", "Website Scrape Timestamp", "URL Prüfstatus", "Chat Vorschlag Branche", "Chat Branche Konfidenz", "Chat Konsistenz Branche", "Chat Begruendung Abweichung Branche", "Chat Prüfung FSM Relevanz", "Chat Begründung für FSM Relevanz", "Chat Schätzung Anzahl Mitarbeiter", "Chat Konsistenzprüfung Mitarbeiterzahl", "Chat Begruendung Abweichung Mitarbeiterzahl", "Chat Einschätzung Anzahl Servicetechniker", "Chat Begründung Abweichung Anzahl Servicetechniker", "Chat Schätzung Umsatz", "Chat Begründung Abweichung Umsatz", "FSM Pitch", "FSM Pitch Timestamp", "Linked Serviceleiter gefunden", "Linked It-Leiter gefunden", "Linked Management gefunden", "Linked Disponent gefunden", "Contact Search Timestamp", "Finaler Umsatz (Wiki>CRM)", "Finaler Mitarbeiter (Wiki>CRM)", "Geschaetzter Techniker Bucket", "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", "Timestamp letzte Pruefung", "Version", "Tokens", "CRM ID" - ], - [ # Zeile 2: Quelle der Daten - "CRM", "CRM", "CRM", "CRM/Manuell", "CRM", "CRM", "CRM/Manuell", "CRM", "CRM", "CRM", "CRM", "CRM", "CRM", "CRM", "System", "Manuell/System", "System", "Wikipediascraper/SerpAPI/ChatGPT/Manuell", "Wikipediascraper", "Wikipediascraper", "Wikipediascraper", "Wikipediascraper", "Wikipediascraper", "Wikipediascraper", "Wikipediascraper", "System", "System", "System", "ChatGPT API", "ChatGPT API", "ChatGPT API", "System/Manuell", "Web Scraper", "ChatGPT API", "Web Scraper", "System", "System/Web Scraper", "ChatGPT API", "ChatGPT API", "System/ChatGPT API", "ChatGPT API", "ChatGPT API", "ChatGPT API", "ChatGPT API", "System/ChatGPT API", "ChatGPT API", "ChatGPT API", "ChatGPT API", "ChatGPT API", "ChatGPT API", "ChatGPT API", "System", "LinkedIn (via SerpApi)", "LinkedIn (via SerpApi)", "LinkedIn (via SerpApi)", "LinkedIn (via SerpApi)", "System", "Skript (Wiki/CRM Logik)", "Skript (Wiki/CRM Logik)", "ML Modell / Skript", "Skript (Plausi-Check)", "Skript (Plausi-Check)", "Skript (Plausi-Check)", "Skript (Plausi-Check)", "Skript (Plausi-Check)", "Skript (Plausi-Check)", "System (Plausi-Check TS)", "System", "System", "System", "CRM" - ], - [ # Zeile 3: Feldkategorie - "Prozess", "Firmenname", "Firmenname", "Konzernstruktur", "Website", "Ort", "Land", "Beschreibung (Text)", "Branche", "Branche", "Anzahl Servicetechniker", "Umsatz", "Anzahl Mitarbeiter", "Wikipedia Artikel URL", "Konzernstruktur (Vorschlag)", "Konzernstruktur (Status)", "Timestamp", "Wikipedia Artikel URL", "Ort", "Land", "Beschreibung (Text)", "Branche", "Umsatz", "Anzahl Mitarbeiter", "Kategorien (Text)", "Timestamp", "Timestamp", "Timestamp", "Verifizierung Wiki-Artikel", "Begründung Verifizierung", "Wikipedia Artikel URL (Vorschlag)", "Begründung URL-Abweichung", "Website-Content", "Website-Content (Zusammenfassung)", "Website-Content (Meta)", "Timestamp", "Prozess-Status", "Branche (Vorschlag KI)", "Branche (Konfidenz KI)", "Branche (Konsistenz)", "Branche (Begründung KI)", "FSM Relevanz (KI)", "FSM Relevanz (Begründung KI)", "Anzahl Mitarbeiter (KI)", "Anzahl Mitarbeiter (Konsistenz KI)", "Anzahl Mitarbeiter (Begründung KI)", "Anzahl Servicetechniker (KI)", "Anzahl Servicetechniker (Begründung KI)", "Umsatz (KI)", "Umsatz (Begründung KI)", "Argumentation", "Timestamp", "Kontakte (Anzahl)", "Kontakte (Anzahl)", "Kontakte (Anzahl)", "Kontakte (Anzahl)", "Timestamp", "Umsatz (Konsolidiert)", "Anzahl Mitarbeiter (Konsolidiert)", "Anzahl Servicetechniker (Bucket ML)", "Plausibilität", "Plausibilität", "Plausibilität", "Datenqualitäts-Indikator", "Datenqualitäts-Indikator", "Plausibilität (Text)", "Timestamp (Plausi)", "Timestamp", "Skript Version", "API Tokens", "System-ID" - ], - [ # Zeile 4: Kurze Beschreibung (UNGEKÜRZT) - "Systemspalte, irrelevant für den Prompt. Wird genutzt um die manuelle Neuprüfung dieses Accounts durchzuführen.", "Enthält den Firmennamen nach bestem Gewissen. Firmennamen sind manchmal herausfordernd, insbesondere was unterschiedliche Schreibweisen, Firmierung, Tochter/Mutterfirmen etc. anbelangt. Zur besseren Trefferquote in der Wikipedia-Suche normalisieren wir den Firmennamen und entfernen sämtliche Firmenformen, wie z.B. AG, GmbH, SE etc.", "Enthält eine manuell gepflegte (normalisierte) Kurzform des Firmennamens, wie auch ein Mensch die Firma nennen würde. Dies bedeutet insbesondere, dass die Firmenform wie z.B. GmbH oder AG aus dem Namen entfernt wird. Meist entspricht die Kurzform den ersten beiden Worten des Firmennamens. Manchmal sind auch Worte nötig, wenn die ersten beiden worte zu wenig Aussagekraft haben. Beispiele dafür sind beispielsweise Firmen wie 'Schmidt & Söhne', bei denen 'Schmidt &' wenig Sinn machen würde, oder 'Philip Morris Tabakwaren' - weil in diesem Fall 'Philip Morris' zu generisch wäre bzw. wenig eindeutig.", "Name der direkten Muttergesellschaft / des Hauptkonzerns (falls zutreffend). Manuell gepflegt oder aus CRM. Beeinflusst Konsolidierung und Plausi-Checks.", "Von uns ermittelte Website des Unternehmens, sofern verfügbar.", "von uns ermittelter Ort des Unternehmens", "Land des Unternehmenssitzes laut CRM oder manueller Recherche. Wichtig für regionale Analysen (z.B. DACH).", "Kurze Beschreibung der Haupttätigkeit des Unternehmens aus dem CRM-System. Dient als Input für KI-Analysen.", "Branchenzuweisung aus dem CRM-System. Entspricht idealerweise einer Branche aus dem Ziel-Branchenschema.", "Von externen Datenanbietern (z.B. Dealfront) gelieferte Beschreibung der Branche des Unternehmens. Diese Branchenbeschreibung sollte in den allermeisten Fällen sehr zutreffend sein und ist vermutlich verlässlicher als die aktuelle Branche aus Spalte I.", "Bekannte Anzahl der Servicetechniker des Unternehmens (aus CRM oder Recherche). Dient als Ground Truth für ML.", "Umsatz des Unternehmens in Millionen Euro laut CRM oder Recherche.", "Anzahl der Mitarbeiter des Unternehmens laut CRM oder Recherche.", "Enthält aus einer alten Recherche Vorschläge für die Wikipedia URL zum Unternehmen. Dieser muss aber nicht stimmen. Sollte als Ausgangs- und Vergleichspunkt für die nachgelagerte Wikipedia-Suche dienen. Der Wert soll mit den üblichen Methoden geprüft werden z.B. kommt die normalisierte Website vor, Ähnlichkeitsprüfung des Firmennamens mit dem Artikelnamen von Wikipedia etc.", "Vom System heuristisch ermittelter Vorschlag für den Parent Account (basierend auf Namensähnlichkeiten, Wiki-Infos etc.).", "Status des System-Vorschlags für Parent Account (z.B. 'x' für akzeptiert, '-' für abgelehnt, '?' für unklar zur manuellen Prüfung).", "Zeitstempel der letzten Generierung/Änderung des Parent-Vorschlags/-Status.", "Wikipedia URL aus der Recherche im laufenden Prozess", "Aus Wikipedia-Infobox extrahierte Stadt des Unternehmenssitzes.", "Aus Wikipedia-Infobox extrahiertes Land des Unternehmenssitzes.", "Erster Absatz des Wikipedia-Artikels", "Branche aus Wikipedia-Artikel soweit verfügbar", "Umsatz aus Wikipediaartikel soweit verfügbar.", "Anzahl Mitarbeiter laut Wikipedia sofern verfügbar.", "Komma-separierte Liste der Kategorien, denen der Artikel in Wikipedia zugewiesen wurde. Hier ist auch häufig eine Branche enthalten, häufig auch noch weitere Informationen etwa zur Gründung, ob sie etwa im DAX gelistet ist etc. Guter Anhaltspunkt zur Differenzierung von Unternehmenseinträgen und Wikipedia-Seiten, die kein Unternehmen beschreiben und fälschlicherweise zugewiesen wurden. \nBei jeder Unternehmensseite MUSS das Wort unternehmen in irgendeiner Art und Weise vorkommen.\nNEGATIVSIGNAL: EHEMALIGES UNTERNEHMEN -> Weist darauf hin, dass das Unternehmen nicht mehr besteht.", "Zeitstempel der letzten Wikipedia-Suche und Datenextraktion für diese Zeile (jetzt für Spalten R-Y).", "Zeitstempel der letzten Wikipedia-Artikel-Verifizierung durch ChatGPT (Ergebnis in Spalten AC-AE).", "Zeitstempel des letzten Versuchs, eine fehlende Wiki-URL (R) über SerpAPI zu suchen.", "\"OK\" wird bei Firmen eingetragen, wo Firma und Wikipedia-Eintrag zusammenpassen. \"X\" wird bei Firmen eingetragen, wo Firma und Wikipedia-Eintrag nicht zusammenpassen.", "Begründung welche Inkonsistenz aus den Daten hervorgeht.", "URL des durch ChatGPT recherchierten Wikipedia-Artikels", "XXX derzeit nicht verwendet, wird vermutlich gelöscht xxx", "Roh extrahierter Textinhalt der Firmenwebsite. Basis für Zusammenfassung und KI-Analysen.", "KI-generierte Zusammenfassung des Website-Rohtextes (AG). Input für Branchenbewertung.", "Extrahierte Meta-Daten der Website (Title, Description, H-Tags). Für schnelle Analyse & Validierung.", "Zeitstempel des letzten Website-Scraping/Summarization-Versuchs (für AG-AI).", "Status der URL-Prüfung (z.B. 'URL_CHECK_NEEDED', 'URL_OK', 'FEHLER_SSL'). Wird von 'check_urls' Modus gesetzt/genutzt.", "Durch ChatGPT ermittelte Branche des Unternehmens", "Konfidenz des ChatGPT-Branchenvorschlags (AL), z.B. Hoch/Mittel/Niedrig.", "\"OK\" wird bei Firmen eingetragen, wo die Einschätzung zur Branche mit der CRM Branche übereinstimmt. \"X\" wird ausgegeben, wenn die Einschätzungen nicht zusammenpassen.", "Begründung für Abweichung der Branche von CRM Branche", "\"OK\" wird bei Firmen eingetragen, für die FSM relevant ist, \"X\" für Firmen, für die FSM irrelevant ist.", "Begründung für die Beurteilung in Spalte Chat Begründung für FSM Relevanz", "Anzahl der Mitarbeiter durch ChatGPT geschätzt.", "\"OK\" wird bei Firmen eingetragen, für die Anzahl der Mitarbeiter grob mit der aus Spalte CRM Anzahl Mitarbeiter bzw. der Spalte Wiki Mitarbeiter übereinstimmt. \"X\" für Firmen, bei denen dies nicht zutrifft.", "Begründung für Abweichende Mitarbeiterzahl", "Anzahl der Servicetechniker geschätzt durch Chat GPT", "Begründung für Abweichungen zur Anzahl der Techniker", "Umsatz durch ChatGTP geschätzt", "Begründung für Abweichungen zum Umsatz", "Ein maßgeschneiderter Satz (ca. 20-35 Wörter), der den Nutzen von FSM im spezifischen Unternehmenskontext beleuchtet. Ideal für E-Mail-Automationen.", "Timestamp, wann der FSM Pitch generiert wurde. Steuert die Wiederholung.", "Anzahl der Kontakte die zur Suche 'Serviceleiter', 'Leiter Service', 'technischer Leiter', 'Service Manager', 'Leiter Kundendienst' gefunden wurden", "Anzahl der Kontakte die zur Suche 'Leiter IT', 'IT Leiter', 'Head of IT', 'IT-Leiter', 'CIO' gefunden wurden", "Anzahl der Kontakte die zur Suche 'Geschäftsführer', 'Geschäftsführung', 'GF', 'CEO', 'Geschäftsführerin', 'Managing Director', 'Geschäftsführender Gesellschafter' gefunden wurden", "Anzahl der Kontakte die zur Suche 'Disponent', 'Einsatzplaner' gefunden wurden", "Timestamp des Zeitpunkts zu dem die Kontaktsuche fertiggestellt wurde", "Konsolidierter Umsatzwert in Millionen Euro. Priorisiert Wiki (W) > CRM (L). Berücksichtigt Parent-Account (D).", "Konsolidierte Mitarbeiterzahl (absolut). Priorisiert Wiki (X) > CRM (M). Berücksichtigt Parent-Account (D).", "Ergebnis der Schätzung durch das trainierte Machine-Learning-Modell (Techniker-Bucket).", "Plausibilitätsstatus für den finalen Umsatzwert (BD) (z.B. OK, WARNUNG_HOCH, FEHLER_FORMAT).", "Plausibilitätsstatus für die finale Mitarbeiterzahl (BE) (z.B. OK, WARNUNG_NIEDRIG).", "Plausibilitätsstatus für die Umsatz-pro-Mitarbeiter-Ratio (BD/BE).", "Indikator für Abweichung (>30%) zwischen CRM-Umsatz (L) und Wiki-Umsatz (W). Berücksichtigt Parent-Logik.", "Indikator für Abweichung (>30%) zwischen CRM-MA (M) und Wiki-MA (X). Berücksichtigt Parent-Logik.", "Gesammelte Begründungen für Plausibilitätswarnungen oder -fehler aus den Spalten BG-BK.", "Zeitstempel des letzten Laufs der Plausibilitäts-Checks für diese Zeile.", "Timestamp des Zeitpunkts zu dem die Validierung durch ChatGPT durchgeführt wurde", "Systemspalte zur Ausgabe der Skriptversion die das Ergebnis generiert hat", "Zeigt an, wie viele Tokens für den Request benötigt wurden", "Die eindeutige ID des Accounts aus dem CRM (z.B. Dynamics 365)." - ], - [ # Zeile 5: Aufgabe / Funktion (UNGEKÜRZT) - "Datenquelle/Prozesssteuerung: 'x' markiert Zeile für Re-Evaluation.", "Datenquelle", "Datenquelle/Such-Input", "Datenquelle/Konsolidierungs-Logik", "Datenquelle/Scraping-Ziel", "Datenquelle", "Datenquelle", "Datenquelle/KI-Input", "Datenquelle/Referenz", "Datenquelle/KI-Input", "Datenquelle/ML-Groundtruth", "Datenquelle", "Datenquelle", "Quelle (Priorität 1)", "Ziel/System", "Prozesssteuerung", "System", "Ziel/Quelle (Priorität 2)", "Ziel", "Ziel", "Ziel/KI-Input", "Ziel/KI-Input", "Ziel/Konsolidierung", "Ziel/Konsolidierung", "Ziel/KI-Input", "System", "System", "System", "Ziel", "Ziel", "Ziel", "Manuell", "Quelle/Ziel", "Ziel/KI-Input", "Ziel", "System", "System/Ziel", "Ziel", "Ziel", "Ziel", "Ziel", "Ziel", "Ziel", "Ziel", "Ziel", "Ziel", "Ziel", "Ziel", "Ziel", "Ziel", "Ziel (E-Mail-Automation)", "System", "Ziel", "Ziel", "Ziel", "Ziel", "System", "Ziel/ML-Input", "Ziel/ML-Input", "Ziel", "Ziel", "Ziel", "Ziel", "Ziel", "Ziel", "Ziel", "System", "System", "System", "System", "Datenquelle" - ] - ] +def is_valid_wikipedia_article_url(url): + # ... (Code dieser Funktion bleibt unverändert) ... - num_cols = len(new_headers[0]) - if not all(len(row) == num_cols for row in new_headers): - logger.critical(f"FEHLER in alignment_demo: Inkonsistente Spaltenanzahl! Erwartet {num_cols}. Längen: {[len(r) for r in new_headers]}") - return - - end_col_letter = self.sheet_handler._get_col_letter(num_cols) - header_range = f"A1:{end_col_letter}{len(new_headers)}" - - logger.info(f"Schreibe Alignment-Demo Header in Bereich {header_range}...") - try: - sheet.update(values=new_headers, range_name=header_range, value_input_option='USER_ENTERED') - logger.info("Alignment-Demo Header erfolgreich geschrieben.") - except Exception as e: - logger.error(f"FEHLER beim Schreiben der Alignment-Demo Header: {e}") - +# ============================================================================== +# 12. ALIGNMENT DEMO UTILITY +# ============================================================================== def alignment_demo(sheet_handler): """ @@ -1618,10 +1585,11 @@ def alignment_demo(sheet_handler): logger.info("Starte Alignment Demo für das Hauptblatt (basierend auf v2.1.4)...") # Holen des worksheet-Objekts aus dem übergebenen handler + if not sheet_handler or not sheet_handler.sheet: + logger.critical("FEHLER in alignment_demo: Ungültiger oder nicht verbundener sheet_handler übergeben.") + return sheet = sheet_handler.sheet - # HIER IST IHR CODE FÜR DIE HEADER-DATEN - new_headers = [ [ # Zeile 1: Spaltenname (71 Spalten, A-BS) "ReEval Flag", "CRM Name", "CRM Kurzform", "Parent Account Name", "CRM Website", "CRM Ort", "CRM Land", "CRM Beschreibung", "CRM Branche", "CRM Beschreibung Branche extern", "CRM Anzahl Techniker", "CRM Umsatz", "CRM Anzahl Mitarbeiter", "CRM Vorschlag Wiki URL", "System Vorschlag Parent Account", "Parent Vorschlag Status", "Parent Vorschlag Timestamp", "Wiki URL", "Wiki Sitz Stadt", "Wiki Sitz Land", "Wiki Absatz", "Wiki Branche", "Wiki Umsatz", "Wiki Mitarbeiter", "Wiki Kategorien", "Wikipedia Timestamp", "Wiki Verif. Timestamp", "SerpAPI Wiki Search Timestamp", "Chat Wiki Konsistenzpruefung", "Chat Begründung Wiki Inkonsistenz", "Chat Vorschlag Wiki Artikel", "Begründung bei Abweichung", "Website Rohtext", "Website Zusammenfassung", "Website Meta-Details", "Website Scrape Timestamp", "URL Prüfstatus", "Chat Vorschlag Branche", "Chat Branche Konfidenz", "Chat Konsistenz Branche", "Chat Begruendung Abweichung Branche", "Chat Prüfung FSM Relevanz", "Chat Begründung für FSM Relevanz", "Chat Schätzung Anzahl Mitarbeiter", "Chat Konsistenzprüfung Mitarbeiterzahl", "Chat Begruendung Abweichung Mitarbeiterzahl", "Chat Einschätzung Anzahl Servicetechniker", "Chat Begründung Abweichung Anzahl Servicetechniker", "Chat Schätzung Umsatz", "Chat Begründung Abweichung Umsatz", "FSM Pitch", "FSM Pitch Timestamp", "Linked Serviceleiter gefunden", "Linked It-Leiter gefunden", "Linked Management gefunden", "Linked Disponent gefunden", "Contact Search Timestamp", "Finaler Umsatz (Wiki>CRM)", "Finaler Mitarbeiter (Wiki>CRM)", "Geschaetzter Techniker Bucket", "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", "Timestamp letzte Pruefung", "Version", "Tokens", "CRM ID" @@ -1633,7 +1601,7 @@ def alignment_demo(sheet_handler): "Prozess", "Firmenname", "Firmenname", "Konzernstruktur", "Website", "Ort", "Land", "Beschreibung (Text)", "Branche", "Branche", "Anzahl Servicetechniker", "Umsatz", "Anzahl Mitarbeiter", "Wikipedia Artikel URL", "Konzernstruktur (Vorschlag)", "Konzernstruktur (Status)", "Timestamp", "Wikipedia Artikel URL", "Ort", "Land", "Beschreibung (Text)", "Branche", "Umsatz", "Anzahl Mitarbeiter", "Kategorien (Text)", "Timestamp", "Timestamp", "Timestamp", "Verifizierung Wiki-Artikel", "Begründung Verifizierung", "Wikipedia Artikel URL (Vorschlag)", "Begründung URL-Abweichung", "Website-Content", "Website-Content (Zusammenfassung)", "Website-Content (Meta)", "Timestamp", "Prozess-Status", "Branche (Vorschlag KI)", "Branche (Konfidenz KI)", "Branche (Konsistenz)", "Branche (Begründung KI)", "FSM Relevanz (KI)", "FSM Relevanz (Begründung KI)", "Anzahl Mitarbeiter (KI)", "Anzahl Mitarbeiter (Konsistenz KI)", "Anzahl Mitarbeiter (Begründung KI)", "Anzahl Servicetechniker (KI)", "Anzahl Servicetechniker (Begründung KI)", "Umsatz (KI)", "Umsatz (Begründung KI)", "Argumentation", "Timestamp", "Kontakte (Anzahl)", "Kontakte (Anzahl)", "Kontakte (Anzahl)", "Kontakte (Anzahl)", "Timestamp", "Umsatz (Konsolidiert)", "Anzahl Mitarbeiter (Konsolidiert)", "Anzahl Servicetechniker (Bucket ML)", "Plausibilität", "Plausibilität", "Plausibilität", "Datenqualitäts-Indikator", "Datenqualitäts-Indikator", "Plausibilität (Text)", "Timestamp (Plausi)", "Timestamp", "Skript Version", "API Tokens", "System-ID" ], [ # Zeile 4: Kurze Beschreibung (UNGEKÜRZT) - "Systemspalte, irrelevant für den Prompt. Wird genutzt um die manuelle Neuprüfung dieses Accounts durchzuführen.", "Enthält den Firmennamen nach bestem Gewissen. Firmennamen sind manchmal herausfordernd, insbesondere was unterschiedliche Schreibweisen, Firmierung, Tochter/Mutterfirmen etc. anbelangt. Zur besseren Trefferquote in der Wikipedia-Suche normalisieren wir den Firmennamen und entfernen sämtliche Firmenformen, wie z.B. AG, GmbH, SE etc.", "Enthält eine manuell gepflegte (normalisierte) Kurzform des Firmennamens, wie auch ein Mensch die Firma nennen würde. Dies bedeutet insbesondere, dass die Firmenform wie z.B. GmbH oder AG aus dem Namen entfernt wird. Meist entspricht die Kurzform den ersten beiden Worten des Firmennamens. Manchmal sind auch Worte nötig, wenn die ersten beiden worte zu wenig Aussagekraft haben. Beispiele dafür sind beispielsweise Firmen wie 'Schmidt & Söhne', bei denen 'Schmidt &' wenig Sinn machen würde, oder 'Philip Morris Tabakwaren' - weil in diesem Fall 'Philip Morris' zu generisch wäre bzw. wenig eindeutig.", "Name der direkten Muttergesellschaft / des Hauptkonzerns (falls zutreffend). Manuell gepflegt oder aus CRM. Beeinflusst Konsolidierung und Plausi-Checks.", "Von uns ermittelte Website des Unternehmens, sofern verfügbar.", "von uns ermittelter Ort des Unternehmens", "Land des Unternehmenssitzes laut CRM oder manueller Recherche. Wichtig für regionale Analysen (z.B. DACH).", "Kurze Beschreibung der Haupttätigkeit des Unternehmens aus dem CRM-System. Dient als Input für KI-Analysen.", "Branchenzuweisung aus dem CRM-System. Entspricht idealerweise einer Branche aus dem Ziel-Branchenschema.", "Von externen Datenanbietern (z.B. Dealfront) gelieferte Beschreibung der Branche des Unternehmens. Diese Branchenbeschreibung sollte in den allermeisten Fällen sehr zutreffend sein und ist vermutlich verlässlicher als die aktuelle Branche aus Spalte I.", "Bekannte Anzahl der Servicetechniker des Unternehmens (aus CRM oder Recherche). Dient als Ground Truth für ML.", "Umsatz des Unternehmens in Millionen Euro laut CRM oder Recherche.", "Anzahl der Mitarbeiter des Unternehmens laut CRM oder Recherche.", "Enthält aus einer alten Recherche Vorschläge für die Wikipedia URL zum Unternehmen. Dieser muss aber nicht stimmen. Sollte als Ausgangs- und Vergleichspunkt für die nachgelagerte Wikipedia-Suche dienen. Der Wert soll mit den üblichen Methoden geprüft werden z.B. kommt die normalisierte Website vor, Ähnlichkeitsprüfung des Firmennamens mit dem Artikelnamen von Wikipedia etc.", "Vom System heuristisch ermittelter Vorschlag für den Parent Account (basierend auf Namensähnlichkeiten, Wiki-Infos etc.).", "Status des System-Vorschlags für Parent Account (z.B. 'x' für akzeptiert, '-' für abgelehnt, '?' für unklar zur manuellen Prüfung).", "Zeitstempel der letzten Generierung/Änderung des Parent-Vorschlags/-Status.", "Wikipedia URL aus der Recherche im laufenden Prozess", "Aus Wikipedia-Infobox extrahierte Stadt des Unternehmenssitzes.", "Aus Wikipedia-Infobox extrahiertes Land des Unternehmenssitzes.", "Erster Absatz des Wikipedia-Artikels", "Branche aus Wikipedia-Artikel soweit verfügbar", "Umsatz aus Wikipediaartikel soweit verfügbar.", "Anzahl Mitarbeiter laut Wikipedia sofern verfügbar.", "Komma-separierte Liste der Kategorien, denen der Artikel in Wikipedia zugewiesen wurde. Hier ist auch häufig eine Branche enthalten, häufig auch noch weitere Informationen etwa zur Gründung, ob sie etwa im DAX gelistet ist etc. Guter Anhaltspunkt zur Differenzierung von Unternehmenseinträgen und Wikipedia-Seiten, die kein Unternehmen beschreiben und fälschlicherweise zugewiesen wurden. \nBei jeder Unternehmensseite MUSS das Wort unternehmen in irgendeiner Art und Weise vorkommen.\nNEGATIVSIGNAL: EHEMALIGES UNTERNEHMEN -> Weist darauf hin, dass das Unternehmen nicht mehr besteht.", "Zeitstempel der letzten Wikipedia-Suche und Datenextraktion für diese Zeile (jetzt für Spalten R-Y).", "Zeitstempel der letzten Wikipedia-Artikel-Verifizierung durch ChatGPT (Ergebnis in Spalten AC-AE).", "Zeitstempel des letzten Versuchs, eine fehlende Wiki-URL (R) über SerpAPI zu suchen.", "\"OK\" wird bei Firmen eingetragen, wo Firma und Wikipedia-Eintrag zusammenpassen. \"X\" wird bei Firmen eingetragen, wo Firma und Wikipedia-Eintrag nicht zusammenpassen.", "Begründung welche Inkonsistenz aus den Daten hervorgeht.", "URL des durch ChatGPT recherchierten Wikipedia-Artikels", "XXX derzeit nicht verwendet, wird vermutlich gelöscht xxx", "Roh extrahierter Textinhalt der Firmenwebsite. Basis für Zusammenfassung und KI-Analysen.", "KI-generierte Zusammenfassung des Website-Rohtextes (AG). Input für Branchenbewertung.", "Extrahierte Meta-Daten der Website (Title, Description, H-Tags). Für schnelle Analyse & Validierung.", "Zeitstempel des letzten Website-Scraping/Summarization-Versuchs (für AG-AI).", "Status der URL-Prüfung (z.B. 'URL_CHECK_NEEDED', 'URL_OK', 'FEHLER_SSL'). Wird von 'check_urls' Modus gesetzt/genutzt.", "Durch ChatGPT ermittelte Branche des Unternehmens", "Konfidenz des ChatGPT-Branchenvorschlags (AL), z.B. Hoch/Mittel/Niedrig.", "\"OK\" wird bei Firmen eingetragen, wo die Einschätzung zur Branche mit der CRM Branche übereinstimmt. \"X\" wird ausgegeben, wenn die Einschätzungen nicht zusammenpassen.", "Begründung für Abweichung der Branche von CRM Branche", "\"OK\" wird bei Firmen eingetragen, für die FSM relevant ist, \"X\" für Firmen, für die FSM irrelevant ist.", "Begründung für die Beurteilung in Spalte Chat Begründung für FSM Relevanz", "Anzahl der Mitarbeiter durch ChatGPT geschätzt.", "\"OK\" wird bei Firmen eingetragen, für die Anzahl der Mitarbeiter grob mit der aus Spalte CRM Anzahl Mitarbeiter bzw. der Spalte Wiki Mitarbeiter übereinstimmt. \"X\" für Firmen, bei denen dies nicht zutrifft.", "Begründung für Abweichende Mitarbeiterzahl", "Anzahl der Servicetechniker geschätzt durch Chat GPT", "Begründung für Abweichungen zur Anzahl der Techniker", "Umsatz durch ChatGTP geschätzt", "Begründung für Abweichungen zum Umsatz", "Ein maßgeschneiderter Satz (ca. 20-35 Wörter), der den Nutzen von FSM im spezifischen Unternehmenskontext beleuchtet. Ideal für E-Mail-Automationen.", "Timestamp, wann der FSM Pitch generiert wurde. Steuert die Wiederholung.", "Anzahl der Kontakte die zur Suche 'Serviceleiter', 'Leiter Service', 'technischer Leiter', 'Service Manager', 'Leiter Kundendienst' gefunden wurden", "Anzahl der Kontakte die zur Suche 'Leiter IT', 'IT Leiter', 'Head of IT', 'IT-Leiter', 'CIO' gefunden wurden", "Anzahl der Kontakte die zur Suche 'Geschäftsführer', 'Geschäftsführung', 'GF', 'CEO', 'Geschäftsführerin', 'Managing Director', 'Geschäftsführender Gesellschafter' gefunden wurden", "Anzahl der Kontakte die zur Suche 'Disponent', 'Einsatzplaner' gefunden wurden", "Timestamp des Zeitpunkts zu dem die Kontaktsuche fertiggestellt wurde", "Konsolidierter Umsatzwert in Millionen Euro. Priorisiert Wiki (W) > CRM (L). Berücksichtigt Parent-Account (D).", "Konsolidierte Mitarbeiterzahl (absolut). Priorisiert Wiki (X) > CRM (M). Berücksichtigt Parent-Account (D).", "Ergebnis der Schätzung durch das trainierte Machine-Learning-Modell (Techniker-Bucket).", "Plausibilitätsstatus für den finalen Umsatzwert (BD) (z.B. OK, WARNUNG_HOCH, FEHLER_FORMAT).", "Plausibilitätsstatus für die finale Mitarbeiterzahl (BE) (z.B. OK, WARNUNG_NIEDRIG).", "Plausibilitätsstatus für die Umsatz-pro-Mitarbeiter-Ratio (BD/BE).", "Indikator für Abweichung (>30%) zwischen CRM-Umsatz (L) und Wiki-Umsatz (W). Berücksichtigt Parent-Logik.", "Indikator für Abweichung (>30%) zwischen CRM-MA (M) und Wiki-MA (X). Berücksichtigt Parent-Logik.", "Gesammelte Begründungen für Plausibilitätswarnungen oder -fehler aus den Spalten BG-BK.", "Zeitstempel des letzten Laufs der Plausibilitäts-Checks für diese Zeile.", "Timestamp des Zeitpunkts zu dem die Validierung durch ChatGPT durchgeführt wurde", "Systemspalte zur Ausgabe der Skriptversion die das Ergebnis generiert hat", "Zeigt an, wie viele Tokens für den Request benötigt wurden", "Die eindeutige ID des Accounts aus dem CRM (z.B. Dynamics 365)." + "Systemspalte, irrelevant für den Prompt. Wird genutzt um die manuelle Neuprüfung dieses Accounts durchzuführen.", "Enthält den Firmennamen nach bestem Gewissen. Firmennamen sind manchmal herausfordernd, insbesondere was unterschiedliche Schreibweisen, Firmierung, Tochter/Mutterfirmen etc. anbelangt. Zur besseren Trefferquote in der Wikipedia-Suche normalisieren wir den Firmennamen und entfernen sämtliche Firmenformen, wie z.B. AG, GmbH, SE etc.", "Enthält eine manuell gepflegte (normalisierte) Kurzform des Firmennamens, wie auch ein Mensch die Firma nennen würde. Dies bedeutet insbesondere, dass die Firmenform wie z.B. GmbH oder AG aus dem Namen entfernt wird. Meist entspricht die Kurzform den ersten beiden Worten des Firmennamens. Manchmal sind auch Worte nötig, wenn die ersten beiden worte zu wenig Aussagekraft haben. Beispiele dafür sind beispielsweise Firmen wie 'Schmidt & Söhne', bei denen 'Schmidt &' wenig Sinn machen würde, oder 'Philip Morris Tabakwaren' - weil in diesem Fall 'Philip Morris' zu generisch wäre bzw. wenig eindeutig.", "Name der direkten Muttergesellschaft / des Hauptkonzerns (falls zutreffend). Manuell gepflegt oder aus CRM. Beeinflusst Konsolidierung und Plausi-Checks.", "Von uns ermittelte Website des Unternehmens, sofern verfügbar.", "von uns ermittelter Ort des Unternehmens", "Land des Unternehmenssitzes laut CRM oder manueller Recherche. Wichtig für regionale Analysen (z.B. DACH).", "Kurze Beschreibung der Haupttätigkeit des Unternehmens aus dem CRM-System. Dient als Input für KI-Analysen.", "Branchenzuweisung aus dem CRM-System. Entspricht idealerweise einer Branche aus dem Ziel-Branchenschema.", "Von externen Datenanbietern (z.B. Dealfront) gelieferte Beschreibung der Branche des Unternehmens. Diese Branchenbeschreibung sollte in den allermeisten Fällen sehr zutreffend sein und ist vermutlich verlässlicher als die aktuelle Branche aus Spalte I.", "Bekannte Anzahl der Servicetechniker des Unternehmens (aus CRM oder Recherche). Dient als Ground Truth für ML.", "Umsatz des Unternehmens in Millionen Euro laut CRM oder Recherche.", "Anzahl der Mitarbeiter des Unternehmens laut CRM oder Recherche.", "Enthält aus einer alten Recherche Vorschläge für die Wikipedia URL zum Unternehmen. Dieser muss aber nicht stimmen. Sollte als Ausgangs- und Vergleichspunkt für die nachgelagerte Wikipedia-Suche dienen. Der Wert soll mit den üblichen Methoden geprüft werden z.B. kommt die normalisierte Website vor, Ähnlichkeitsprüfung des Firmennamens mit dem Artikelnamen von Wikipedia etc.", "Vom System heuristisch ermittelter Vorschlag für den Parent Account (basierend auf Namensähnlichkeiten, Wiki-Infos etc.).", "Status des System-Vorschlags für Parent Account (z.B. 'x' für akzeptiert, '-' für abgelehnt, '?' für unklar zur manuellen Prüfung).", "Zeitstempel der letzten Generierung/Änderung des Parent-Vorschlags/-Status.", "Wikipedia URL aus der Recherche im laufenden Prozess", "Aus Wikipedia-Infobox extrahierte Stadt des Unternehmenssitzes.", "Aus Wikipedia-Infobox extrahiertes Land des Unternehmenssitzes.", "Erster Absatz des Wikipedia-Artikels", "Branche aus Wikipedia-Artikel soweit verfügbar", "Umsatz aus Wikipediaartikel soweit verfügbar.", "Anzahl Mitarbeiter laut Wikipedia sofern verfügbar.", "Komma-separierte Liste der Kategorien, denen der Artikel in Wikipedia zugewiesen wurde. Hier ist auch häufig eine Branche enthalten, häufig auch noch weitere Informationen etwa zur Gründung, ob sie etwa im DAX gelistet ist etc. Guter Anhaltspunkt zur Differenzierung von Unternehmenseinträgen und Wikipedia-Seiten, die kein Unternehmen beschreiben und fälschlicherweise zugewiesen wurden. \nBei jeder Unternehmensseite MUSS das Wort unternehmen in irgendeiner Art und Weise vorkommen.\nNEGATIVSIGNAL: EHEMALIGES UNTERNEHMEN -> Weist darauf hin, dass das Unternehmen nicht mehr besteht.", "Zeitstempel der letzten Wikipedia-Suche und Datenextraktion für diese Zeile (jetzt für Spalten R-Y).", "Zeitstempel der letzten Wikipedia-Artikel-Verifizierung durch ChatGPT (Ergebnis in Spalten AC-AE).", "Zeitstempel des letzten Versuchs, eine fehlende Wiki-URL (R) über SerpAPI zu suchen.", "\"OK\" wird bei Firmen eingetragen, wo Firma und Wikipedia-Eintrag zusammenpassen. \"X\" wird bei Firmen eingetragen, wo Firma und Wikipedia-Eintrag nicht zusammenpassen.", "Begründung welche Inkonsistenz aus den Daten hervorgeht.", "URL des durch ChatGPT recherchierten Wikipedia-Artikels", "XXX derzeit nicht verwendet, wird vermutlich gelöscht xxx", "Roh extrahierter Textinhalt der Firmenwebsite. Basis für Zusammenfassung und KI-Analysen.", "KI-generierte Zusammenfassung des Website-Rohtextes (AG). Input für Branchenbewertung.", "Extrahierte Meta-Daten der Website (Title, Description, H-Tags). Für schnelle Analyse & Validierung.", "Zeitstempel des letzten Website-Scraping/Summarization-Versuchs (für AG-AI).", "Status der URL-Prüfung (z.B. 'URL_CHECK_NEEDED', 'URL_OK', 'FEHLER_SSL'). Wird von 'check_urls' Modus gesetzt/genutzt.", "Durch ChatGPT ermittelte Branche des Unternehmens", "Konfidenz des ChatGPT-Branchenvorschlags (AL), z.B. Hoch/Mittel/Niedrig.", "\"OK\" wird bei Firmen eingetragen, wo die Einschätzung zur Branche mit der CRM Branche übereinstimmt. \"X\" wird ausgegeben, wenn die Einschätzungen nicht zusammenpassen.", "Begründung für Abweichung der Branche von CRM Branche", "\"OK\" wird bei Firmen eingetragen, für die FSM relevant ist, \"X\" für Firmen, für die FSM irrelevant ist.", "Begründung für die Beurteilung in Spalte Chat Begründung für FSM Relevanz", "Anzahl der Mitarbeiter durch ChatGPT geschätzt.", "\"OK\" wird bei Firmen eingetragen, für die Anzahl der Mitarbeiter grob mit der aus Spalte CRM Anzahl Mitarbeiter bzw. der Spalte Wiki Mitarbeiter übereinstimmt. \"X\" für Firmen, bei denen dies nicht zutrifft.", "Begründung für Abweichende Mitarbeiterzahl", "Anzahl der Servicetechniker geschätzt durch Chat GPT", "Begründung für Abweichungen zur Anzahl der Techniker", "Umsatz durch ChatGTP geschätzt", "Begründung für Abweichungen zum Umsatz", "Ein maßgeschneiderter Satz (ca. 20-35 Wörter), der den Nutzen von FSM im spezifischen Unternehmenskontext beleuchtet. Ideal für E-Mail-Automationen.", "Timestamp, wann der FSM Pitch generiert wurde. Steuert die Wiederholung.", "Anzahl der Kontakte die zur Suche 'Serviceleiter', 'Leiter Service', 'technischer Leiter', 'Service Manager', 'Leiter Kundendienst' gefunden wurden", "Anzahl der Kontakte die zur Suche 'Leiter IT', 'IT Leiter', 'Head of IT', 'IT-Leiter', 'CIO' gefunden wurden", "Anzahl der Kontakte die zur Suche 'Geschäftsführer', 'Geschäftsführung', 'GF', 'CEO', 'Geschäftsführerin', 'Managing Director', 'Geschäftsführender Gesellschafter' gefunden wurden", "Anzahl der Kontakte die zur Suche 'Disponent', 'Einsatzplaner' gefunden wurden", "Timestamp des Zeitpunkts zu dem die Kontaktsuche fertiggestellt wurde", "Konsolidierter Umsatzwert in Millionen Euro. Priorisiert Wiki (W) > CRM (L). Berücksichtigt Parent-Account (D).", "Konsolidierte Mitarbeiterzahl (absolut). Priorisiert Wiki (X) > CRM (M). Berücksichtigt Parent-Account (D).", "Ergebnis der Schätzung durch das trainierte Machine-Learning-Modell (Techniker-Bucket).", "Plausibilitätsstatus für den finalen Umsatzwert (BD) (z.B. OK, WARNUNG_HOCH, FEHLER_FORMAT).", "Plausibilitätsstatus für die finale Mitarbeiterzahl (BE) (z.B. OK, WARNUNG_NIEDRIG).", "Plausibilitätsstatus für die Umsatz-pro-Mitarbeiter-Ratio (BD/BE).", "Indikator für Abweichung (>30%) zwischen CRM-Umsatz (L) und Wiki-Umsatz (W). Berücksichtigt Parent-Logik.", "Indikator für Abweichung (>30%) zwischen CRM-MA (M) und Wiki-MA (X). Berücksichtigt Parent-Logik.", "Gesammelte Begründungen für Plausibilitätswarnungen oder -fehler aus den Spalten BG-BK.", "Zeitstempel des letzten Laufs der Plausibilitäts-Checks für diese Zeile.", "Timestamp des Zeitpunkts zu dem die Validierung durch ChatGPT durchgeführt wurde", "Systemspalte zur Ausgabe der Skriptversion die das Ergebnis generiert hat", "Zeigt an, wie viele Tokens für den Request benötigt wurden", "Die eindeutige ID des Accounts aus dem CRM (z.B. Dynamics 35)." ], [ # Zeile 5: Aufgabe / Funktion (UNGEKÜRZT) "Datenquelle/Prozesssteuerung: 'x' markiert Zeile für Re-Evaluation.", "Datenquelle", "Datenquelle/Such-Input", "Datenquelle/Konsolidierungs-Logik", "Datenquelle/Scraping-Ziel", "Datenquelle", "Datenquelle", "Datenquelle/KI-Input", "Datenquelle/Referenz", "Datenquelle/KI-Input", "Datenquelle/ML-Groundtruth", "Datenquelle", "Datenquelle", "Quelle (Priorität 1)", "Ziel/System", "Prozesssteuerung", "System", "Ziel/Quelle (Priorität 2)", "Ziel", "Ziel", "Ziel/KI-Input", "Ziel/KI-Input", "Ziel/Konsolidierung", "Ziel/Konsolidierung", "Ziel/KI-Input", "System", "System", "System", "Ziel", "Ziel", "Ziel", "Manuell", "Quelle/Ziel", "Ziel/KI-Input", "Ziel", "System", "System/Ziel", "Ziel", "Ziel", "Ziel", "Ziel", "Ziel", "Ziel", "Ziel", "Ziel", "Ziel", "Ziel", "Ziel", "Ziel", "Ziel", "Ziel (E-Mail-Automation)", "System", "Ziel", "Ziel", "Ziel", "Ziel", "System", "Ziel/ML-Input", "Ziel/ML-Input", "Ziel", "Ziel", "Ziel", "Ziel", "Ziel", "Ziel", "Ziel", "System", "System", "System", "System", "Datenquelle" @@ -1645,7 +1613,7 @@ def alignment_demo(sheet_handler): logger.critical(f"FEHLER in alignment_demo: Inkonsistente Spaltenanzahl! Erwartet {num_cols}. Längen: {[len(r) for r in new_headers]}") return - # KORRIGIERT: Verwende die neue Hilfsfunktion anstatt 'self' + # KORRIGIERT: Verwende die globale Hilfsfunktion anstatt 'self' end_col_letter = _get_col_letter(num_cols) header_range = f"A1:{end_col_letter}{len(new_headers)}"