neue Spalten

This commit is contained in:
2025-05-10 20:58:45 +00:00
parent 93a0122b86
commit 57f6be7d8d

View File

@@ -183,8 +183,78 @@ class Config:
# --- Globale Spalten-Mapping (WICHTIG: MUSS ZU IHREM SHEET PASSEN!) --- # --- Globale Spalten-Mapping (WICHTIG: MUSS ZU IHREM SHEET PASSEN!) ---
# --- Globale Spalten-Mapping (WICHTIG: MUSS ZU IHREM SHEET PASSEN!) ---
# Version 1.7.3 - 56 Spalten (A-BD)
COLUMN_MAP = { COLUMN_MAP = {
"ReEval Flag": 0, "CRM Name": 1, "CRM Kurzform": 2, "CRM Website": 3, "CRM Ort": 4, "CRM Beschreibung": 5, "CRM Branche": 6, "CRM Beschreibung Branche extern": 7, "CRM Anzahl Techniker": 8, "CRM Umsatz": 9, "CRM Anzahl Mitarbeiter": 10, "CRM Vorschlag Wiki URL": 11, "Wiki URL": 12, "Wiki Absatz": 13, "Wiki Branche": 14, "Wiki Umsatz": 15, "Wiki Mitarbeiter": 16, "Wiki Kategorien": 17, "Chat Wiki Konsistenzpruefung": 18, "Chat Begruendung Wiki Inkonsistenz": 19, "Chat Vorschlag Wiki Artikel": 20, "Begruendung bei Abweichung": 21, "Chat Vorschlag Branche": 22, "Chat Konsistenz Branche": 23, "Chat Begruendung Abweichung Branche": 24, "Chat Pruefung FSM Relevanz": 25, "Chat Begruendung fuer FSM Relevanz": 26, "Chat Schaetzung Anzahl Mitarbeiter": 27, "Chat Konsistenzpruefung Mitarbeiterzahl": 28, "Chat Begruendung Abweichung Mitarbeiterzahl": 29, "Chat Einschaetzung Anzahl Servicetechniker": 30, "Chat Begruendung Abweichung Anzahl Servicetechniker": 31, "Chat Schaetzung Umsatz": 32, "Chat Begruendung Abweichung Umsatz": 33, "Linked Serviceleiter gefunden": 34, "Linked It-Leiter gefunden": 35, "Linked Management gefunden": 36, "Linked Disponent gefunden": 37, "Contact Search Timestamp": 38, "Wikipedia Timestamp": 39, "Timestamp letzte Pruefung": 40, "Version": 41, "Tokens": 42, "Website Rohtext": 43, "Website Zusammenfassung": 44, "Website Scrape Timestamp": 45, "Geschaetzter Techniker Bucket": 46, "Finaler Umsatz (Wiki>CRM)": 47, "Finaler Mitarbeiter (Wiki>CRM)": 48, "Wiki Verif. Timestamp": 49, "SerpAPI Wiki Search Timestamp": 50 # ReEval Flag & CRM-Daten (A-M)
"ReEval Flag": 0, # A
"CRM Name": 1, # B
"CRM Kurzform": 2, # C
"CRM Website": 3, # D
"CRM Ort": 4, # E
"CRM Land": 5, # F (NEU)
"CRM Beschreibung": 6, # G
"CRM Branche": 7, # H
"CRM Beschreibung Branche extern": 8, # I
"CRM Anzahl Techniker": 9, # J
"CRM Umsatz": 10, # K
"CRM Anzahl Mitarbeiter": 11, # L
"CRM Vorschlag Wiki URL": 12, # M
# Wikipedia-Daten & -Status (N-AB)
"Wiki URL": 13, # N
"Wiki Sitz Stadt": 14, # O (NEU)
"Wiki Sitz Land": 15, # P (NEU)
"Wiki Absatz": 16, # Q
"Wiki Branche": 17, # R
"Wiki Umsatz": 18, # S
"Wiki Mitarbeiter": 19, # T
"Wiki Kategorien": 20, # U
"Wikipedia Timestamp": 21, # V (vorher AN)
"Wiki Verif. Timestamp": 22, # W (vorher AX)
"SerpAPI Wiki Search Timestamp": 23, # X (vorher AY)
"Chat Wiki Konsistenzpruefung": 24, # Y (vorher S)
"Chat Begründung Wiki Inkonsistenz": 25, # Z (vorher T)
"Chat Vorschlag Wiki Artikel": 26, # AA (vorher U)
"Begründung bei Abweichung": 27, # AB (vorher V)
# Website-Daten (AC-AG)
"Website Rohtext": 28, # AC (vorher AR)
"Website Zusammenfassung": 29, # AD (vorher AS)
"Website Meta-Details": 30, # AE (NEU)
"Website Scrape Timestamp": 31, # AF (vorher AT)
"URL Prüfstatus": 32, # AG (NEU für URL_CHECK_NEEDED etc.)
# ChatGPT Branchen- & weitere Schätzungen (AH-AT)
"Chat Vorschlag Branche": 33, # AH (vorher W)
"Chat Konsistenz Branche": 34, # AI (vorher X)
"Chat Begründung Abweichung Branche": 35, # AJ (vorher Y)
"Chat Prüfung FSM Relevanz": 36, # AK (vorher Z)
"Chat Begründung für FSM Relevanz": 37, # AL (vorher AA)
"Chat Schätzung Anzahl Mitarbeiter": 38, # AM (vorher AB)
"Chat Konsistenzprüfung Mitarbeiterzahl": 39, # AN (vorher AC)
"Chat Begründung Abweichung Mitarbeiterzahl": 40, # AO (vorher AD)
"Chat Einschätzung Anzahl Servicetechniker": 41, # AP (vorher AE)
"Chat Begründung Abweichung Anzahl Servicetechniker": 42, # AQ (vorher AF)
"Chat Schätzung Umsatz": 43, # AR (vorher AG)
"Chat Begründung Abweichung Umsatz": 44, # AS (vorher AH)
# LinkedIn-Kontakte (AT-AW)
"Linked Serviceleiter gefunden": 45, # AT (vorher AI)
"Linked It-Leiter gefunden": 46, # AU (vorher AJ)
"Linked Management gefunden": 47, # AV (vorher AK)
"Linked Disponent gefunden": 48, # AW (vorher AL)
# Konsolidierte Werte & ML (AX-AZ)
"Finaler Umsatz (Wiki>CRM)": 49, # AX (vorher AV)
"Finaler Mitarbeiter (Wiki>CRM)": 50, # AY (vorher AW)
"Geschaetzter Techniker Bucket": 51, # AZ (vorher AU)
# Timestamps (Rest) & System (BA-BD)
"Contact Search Timestamp": 52, # BA (vorher AM)
"Timestamp letzte Prüfung": 53, # BB (vorher AO, ChatGPT-bezogen)
"Version": 54, # BC (vorher AP)
"Tokens": 55, # BD (vorher AQ)
} }
# --- Globale Variablen fuer Branch Mapping (werden von load_target_schema() befuellt) --- # --- Globale Variablen fuer Branch Mapping (werden von load_target_schema() befuellt) ---
@@ -2371,170 +2441,154 @@ def is_valid_wikipedia_article_url(url_to_check, lang=None):
def alignment_demo(sheet): def alignment_demo(sheet):
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
logger.info("Starte Alignment Demo für das Hauptblatt...")
new_headers = [ new_headers = [
[ # Zeile 1: Spaltenname [ # Zeile 1: Spaltenname
"ReEval Flag", "CRM Name", "CRM Kurzform", "CRM Website", "CRM Ort", "CRM Beschreibung", "CRM Branche", "CRM Beschreibung Branche extern", "CRM Anzahl Techniker", "CRM Umsatz", "CRM Anzahl Mitarbeiter", "CRM Vorschlag Wiki URL", "ReEval Flag", "CRM Name", "CRM Kurzform", "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",
"Wiki URL", "Wiki Absatz", "Wiki Branche", "Wiki Umsatz", "Wiki Mitarbeiter", "Wiki Kategorien", "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",
"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 Konsistenz Branche", "Chat Begründung Abweichung Branche", "Chat Vorschlag Branche", "Chat Konsistenz Branche", "Chat Begründung Abweichung Branche", "Chat Prüfung FSM Relevanz", "Chat Begründung für FSM Relevanz", "Chat Schätzung Anzahl Mitarbeiter", "Chat Konsistenzprüfung Mitarbeiterzahl", "Chat Begründung Abweichung Mitarbeiterzahl", "Chat Einschätzung Anzahl Servicetechniker", "Chat Begründung Abweichung Anzahl Servicetechniker", "Chat Schätzung Umsatz", "Chat Begründung Abweichung Umsatz",
"Chat Prüfung FSM Relevanz", "Chat Begründung für FSM Relevanz",
"Chat Schätzung Anzahl Mitarbeiter", "Chat Konsistenzprüfung Mitarbeiterzahl", "Chat Begründung Abweichung Mitarbeiterzahl",
"Chat Einschätzung Anzahl Servicetechniker", "Chat Begründung Abweichung Anzahl Servicetechniker",
"Chat Schätzung Umsatz", "Chat Begründung Abweichung Umsatz",
"Linked Serviceleiter gefunden", "Linked It-Leiter gefunden", "Linked Management gefunden", "Linked Disponent gefunden", "Linked Serviceleiter gefunden", "Linked It-Leiter gefunden", "Linked Management gefunden", "Linked Disponent gefunden",
"Contact Search Timestamp", "Wikipedia Timestamp", "Timestamp letzte Prüfung", "Version", "Tokens", "Finaler Umsatz (Wiki>CRM)", "Finaler Mitarbeiter (Wiki>CRM)", "Geschaetzter Techniker Bucket",
"Website Rohtext", "Website Zusammenfassung", "Website Scrape Timestamp", "Contact Search Timestamp", "Timestamp letzte Prüfung", "Version", "Tokens"
"Geschaetzter Techniker Bucket", "Finaler Umsatz (Wiki>CRM)", "Finaler Mitarbeiter (Wiki>CRM)",
"Wiki Verif. Timestamp", "SerpAPI Wiki Search Timestamp",
"Website Meta-Details" # <<< NEUE SPALTE AZ
], ],
[ # Zeile 2: Quelle der Daten [ # Zeile 2: Quelle der Daten
"CRM", "CRM", "CRM", "CRM", "CRM", "CRM", "CRM", "CRM", "CRM", "CRM", "CRM", "CRM", "CRM", "CRM", "CRM", "CRM", "CRM", "CRM/Manuell", "CRM", "CRM", "CRM", "CRM", "CRM", "CRM", "CRM",
"Wikipediascraper/SerpAPI/ChatGPT/Manuell", "Wikipediascraper", "Wikipediascraper", "Wikipediascraper", "Wikipediascraper", "Wikipediascraper", "Wikipediascraper/SerpAPI/ChatGPT/Manuell", "Wikipediascraper", "Wikipediascraper", "Wikipediascraper", "Wikipediascraper", "Wikipediascraper", "Wikipediascraper", "Wikipediascraper", "System", "System", "System", "ChatGPT API", "ChatGPT API", "ChatGPT API", "System/Manuell",
"ChatGPT API", "ChatGPT API", "ChatGPT API", "System/Manuell", "Web Scraper", "ChatGPT API", "Web Scraper", "System", "System/Web Scraper",
"ChatGPT API", "System/ChatGPT API", "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", "ChatGPT API",
"ChatGPT API", "System/ChatGPT API", "ChatGPT API",
"ChatGPT API", "ChatGPT API",
"ChatGPT API", "ChatGPT API",
"LinkedIn (via SerpApi)", "LinkedIn (via SerpApi)", "LinkedIn (via SerpApi)", "LinkedIn (via SerpApi)", "LinkedIn (via SerpApi)", "LinkedIn (via SerpApi)", "LinkedIn (via SerpApi)", "LinkedIn (via SerpApi)",
"System", "System", "System", "System", "System", "Skript (Wiki/CRM Logik)", "Skript (Wiki/CRM Logik)", "ML Modell / Skript",
"Web Scraper", "ChatGPT API", "System", "System", "System", "System", "System"
"ML Modell / Skript", "Skript (Wiki/CRM Logik)", "Skript (Wiki/CRM Logik)",
"System", "System",
"Web Scraper (Modus 'website_details')" # <<< NEUE SPALTE AZ
], ],
[ # Zeile 3: Feldkategorie [ # Zeile 3: Feldkategorie
"Prozess", "Firmenname", "Firmenname", "Website", "Ort", "Beschreibung (Text)", "Branche", "Branche", "Anzahl Servicetechniker", "Umsatz", "Anzahl Mitarbeiter", "Wikipedia Artikel URL", "Prozess", "Firmenname", "Firmenname", "Website", "Ort", "Land", "Beschreibung (Text)", "Branche", "Branche", "Anzahl Servicetechniker", "Umsatz", "Anzahl Mitarbeiter", "Wikipedia Artikel URL",
"Wikipedia Artikel URL", "Beschreibung (Text)", "Branche", "Umsatz", "Anzahl Mitarbeiter", "Kategorien (Text)", "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",
"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 (Konsistenz)", "Branche (Begründung KI)", "Branche (Vorschlag 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)",
"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)",
"Kontakte (Anzahl)", "Kontakte (Anzahl)", "Kontakte (Anzahl)", "Kontakte (Anzahl)", "Kontakte (Anzahl)", "Kontakte (Anzahl)", "Kontakte (Anzahl)", "Kontakte (Anzahl)",
"Timestamp", "Timestamp", "Timestamp", "Skript Version", "API Tokens", "Umsatz (Konsolidiert)", "Anzahl Mitarbeiter (Konsolidiert)", "Anzahl Servicetechniker (Bucket ML)",
"Website-Content", "Website-Content (Zusammenfassung)", "Timestamp", "Timestamp", "Timestamp", "Skript Version", "API Tokens"
"Anzahl Servicetechniker (Bucket ML)", "Umsatz (Konsolidiert)", "Anzahl Mitarbeiter (Konsolidiert)",
"Timestamp", "Timestamp",
"Website-Content (Meta)" # <<< NEUE SPALTE AZ
], ],
[ # Zeile 4: Kurze Beschreibung [ # Zeile 4: Kurze Beschreibung
"Systemspalte, irrelevant für den Prompt. Wird genutzt um die manuelle Neuprüfung dieses Accounts durchzuführen ('x' setzen).", "Systemspalte, irrelevant für den Prompt. 'x' markiert Zeile für Re-Evaluation.", #A
"Enthält den Firmennamen nach bestem Gewissen...", # (wie gehabt) "Enthält den Firmennamen nach bestem Gewissen...", #B
"Enthält eine manuell gepflegte (normalisierte) Kurzform des Firmennamens...", # (wie gehabt) "Enthält eine manuell gepflegte (normalisierte) Kurzform des Firmennamens...", #C
"Von uns ermittelte Website des Unternehmens, sofern verfügbar. Kann durch Modi 'website_lookup' oder 'check_urls' aktualisiert werden.", "Von uns ermittelte Website des Unternehmens. Kann durch 'website_lookup' oder 'check_urls' aktualisiert werden.", #D
"Von uns ermittelter Ort des Unternehmens.", "Von uns ermittelter Ort des Unternehmens.", #E
"Kurze Beschreibung des Unternehmens aus CRM.", "Land des Unternehmenssitzes laut CRM (manuell zu pflegen).", #F NEU
"Aktuelle Branchenzuweisung entsprechend unserem Ziel-Branchenschema (manuell oder aus Altsystem).", "Kurze Beschreibung des Unternehmens aus CRM.", #G
"Von Dealfront gelieferte externe Beschreibung der Branche...", # (wie gehabt) "Aktuelle Branchenzuweisung entsprechend unserem Ziel-Branchenschema (manuell oder aus Altsystem).", #H
"Von uns Recherchierte Anzahl der Servicetechniker...", # (wie gehabt) "Von Dealfront gelieferte externe Beschreibung der Branche...", #I
"Von uns recherchierter Umsatz in Mio. € (aus CRM).", "Von uns Recherchierte Anzahl der Servicetechniker...", #J
"Von uns recherchierte Anzahl der Mitarbeiter (aus CRM).", "Von uns recherchierter Umsatz in Mio. € (aus CRM).", #K
"Enthält aus einer alten Recherche Vorschläge für die Wikipedia URL zum Unternehmen...", # (wie gehabt) "Von uns recherchierte Anzahl der Mitarbeiter (aus CRM).", #L
"Finale Wikipedia URL des Unternehmens. Quelle: Wikipedia-Scraper (Suche/Extraktion), SerpAPI (Neusuche), ChatGPT (Vorschlag U nach Prüfung), oder manuelle Eingabe.", "Enthält aus einer alten Recherche Vorschläge für die Wikipedia URL zum Unternehmen...", #M
"Erster aussagekräftiger Absatz des Wikipedia-Artikels (M).", "Finale Wikipedia URL des Unternehmens.", #N
"Aus der Wikipedia-Infobox extrahierte Branche(n).", "Aus Wikipedia-Infobox extrahierte Stadt des Unternehmenssitzes.", #O NEU
"Aus der Wikipedia-Infobox extrahierter Umsatz (normalisiert in Mio. €).", "Aus Wikipedia-Infobox extrahiertes Land des Unternehmenssitzes.", #P NEU
"Aus der Wikipedia-Infobox extrahierte Mitarbeiterzahl (normalisiert).", "Erster aussagekräftiger Absatz des Wikipedia-Artikels (N).", #Q
"Komma-separierte Liste der Kategorien, denen der Artikel in Wikipedia zugewiesen wurde...", # (wie gehabt) "Aus der Wikipedia-Infobox extrahierte Branche(n).", #R
"Ergebnis der ChatGPT-Prüfung, ob der Wiki-Artikel (M) zum Unternehmen passt. Mögliche Werte: 'OK', 'X', '?' (Verifizierung ausstehend/erneut nötig), 'X (URL Copied)', 'X (Invalid Suggestion)', 'FEHLER'.", "Aus der Wikipedia-Infobox extrahierter Umsatz (normalisiert in Mio. €).", #S
"Von ChatGPT generierte Begründung, falls der Wiki-Artikel (M) als inkonsistent zum Unternehmen bewertet wurde.", "Aus der Wikipedia-Infobox extrahierte Mitarbeiterzahl (normalisiert).", #T
"Von ChatGPT vorgeschlagene alternative Wikipedia-URL, falls der Artikel in M als unpassend bewertet wurde. Kann auch 'Kein passender Artikel gefunden' enthalten.", "Komma-separierte Liste der Kategorien, denen der Artikel in Wikipedia zugewiesen wurde...", #U
"Wird derzeit primär geleert bei Wiki-Updates/-Verifizierung. Ursprünglich gedacht für Begründung bei Abweichung CRM-Vorschlag-URL (L) vs. gefundener Wiki-URL (M).", "Zeitstempel der letzten Wikipedia-Suche und Datenextraktion für diese Zeile.", #V
"Branchenvorschlag von ChatGPT basierend auf allen verfügbaren Informationen (CRM, Wiki, Website), abgeglichen mit dem Ziel-Branchenschema.", "Zeitstempel der letzten Wikipedia-Artikel-Verifizierung durch ChatGPT (Spalten Y-AA).", #W
"Konsistenzprüfung: 'ok', wenn ChatGPT-Vorschlag (W) mit der extrahierten CRM-Kurzform (aus G) übereinstimmt; 'X' bei Abweichung; oder spezifischer Status bei Fallback-Logik in `evaluate_branche_chatgpt`.", "Zeitstempel des letzten Versuchs, eine fehlende Wiki-URL (N) über SerpAPI zu suchen.", #X
"Von ChatGPT generierte Begründung für den Branchenvorschlag (W) und ggf. für die Abweichung zur CRM-Branche.", "Ergebnis der ChatGPT-Prüfung, ob der Wiki-Artikel (N) zum Unternehmen passt. ('OK', 'X', '?', 'FEHLER', etc.)", #Y
"Bewertung der FSM-Relevanz durch ChatGPT (z.B. 'Ja', 'Nein', 'Vielleicht'). Platzhalter für zukünftige Implementierung.", "Von ChatGPT generierte Begründung, falls der Wiki-Artikel (N) als inkonsistent zum Unternehmen bewertet wurde.", #Z
"Von ChatGPT generierte Begründung für die Einschätzung der FSM-Relevanz. Platzhalter.", "Von ChatGPT vorgeschlagene alternative Wikipedia-URL, falls der Artikel in N als unpassend bewertet wurde.", #AA
"Von ChatGPT geschätzte Anzahl der Mitarbeiter. Platzhalter für zukünftige Implementierung.", "Wird derzeit primär geleert. Ursprünglich für Begründung bei Abweichung CRM Vorschlag Wiki URL (M alt) vs. gefundener Wiki-URL (N).", #AB
"Konsistenzprüfung der von ChatGPT geschätzten Mitarbeiterzahl (AB) mit CRM (K) und Wiki (Q) Werten. Platzhalter.", "Roh extrahierter Textinhalt der Website. Basis für Zusammenfassung. Kann auch Fehlermeldungen oder Marker enthalten.", #AC
"Von ChatGPT generierte Begründung bei signifikanter Abweichung der geschätzten Mitarbeiterzahl. Platzhalter.", "KI-generierte Zusammenfassung des Website-Rohtextes (AC).", #AD
"Von ChatGPT geschätzte Anzahl der Servicetechniker (als Bucket oder konkrete Zahl). Platzhalter für zukünftige Implementierung.", "Extrahierte Meta-Daten der Website: Title, Meta-Description, H1-H3 Überschriften.", #AE NEU
"Von ChatGPT generierte Begründung für die Einschätzung der Servicetechniker-Anzahl, insbesondere bei Abweichung zu CRM (I). Platzhalter.", "Zeitstempel des letzten Website-Scraping/Summarization-Versuchs (für AC, AD).", #AF
"Von ChatGPT geschätzter Umsatz. Platzhalter für zukünftige Implementierung.", "Status der URL-Prüfung (z.B. 'URL_CHECK_NEEDED', 'URL_OK').", #AG NEU
"Von ChatGPT generierte Begründung bei signifikanter Abweichung der geschätzten Umsatzzahlen. Platzhalter.", "Branchenvorschlag von ChatGPT basierend auf allen verfügbaren Informationen.", #AH
"Anzahl der via SerpAPI gefundenen LinkedIn-Kontakte für die Kategorie 'Serviceleiter'.", "Konsistenzprüfung: 'ok', wenn ChatGPT-Vorschlag (AH) mit CRM-Branche (H) übereinstimmt.", #AI
"Anzahl der via SerpAPI gefundenen LinkedIn-Kontakte für die Kategorie 'IT-Leiter'.", "Von ChatGPT generierte Begründung für den Branchenvorschlag (AH).", #AJ
"Anzahl der via SerpAPI gefundenen LinkedIn-Kontakte für die Kategorie 'Management'.", "Bewertung der FSM-Relevanz durch ChatGPT. (Platzhalter)", #AK
"Anzahl der via SerpAPI gefundenen LinkedIn-Kontakte für die Kategorie 'Disponent'.", "Von ChatGPT generierte Begründung für die Einschätzung der FSM-Relevanz. (Platzhalter)", #AL
"Zeitstempel der letzten Kontaktsuche via SerpAPI für diese Zeile.", "Von ChatGPT geschätzte Anzahl der Mitarbeiter. (Platzhalter)", #AM
"Zeitstempel der letzten Wikipedia-Suche und Datenextraktion für diese Zeile.", "Konsistenzprüfung der von ChatGPT geschätzten Mitarbeiterzahl (AM). (Platzhalter)", #AN
"Zeitstempel der letzten übergreifenden Prüfung/Bewertung durch ChatGPT (z.B. Branchenevaluation).", "Von ChatGPT generierte Begründung bei signifikanter Abweichung der geschätzten Mitarbeiterzahl. (Platzhalter)", #AO
"Version des Skripts, die diese Zeile zuletzt signifikant bearbeitet hat.", "Von ChatGPT geschätzte Anzahl der Servicetechniker. (Platzhalter)", #AP
"Geschätzte oder gezählte Anzahl der Tokens, die für OpenAI API-Aufrufe für diese Zeile verbraucht wurden (kumulativ oder letzter Call).", "Von ChatGPT generierte Begründung für die Einschätzung der Servicetechniker-Anzahl. (Platzhalter)", #AQ
"Roh extrahierter, unformatierter Textinhalt des Haupt-Content-Bereichs der Unternehmenswebsite (nach Entfernung von Bannern, Skripten, Styles). Dient als Basis für die KI-Zusammenfassung. Kann auch Fehlermeldungen enthalten (z.B. \"k.A. (Timeout)\", \"URL_CHECK_NEEDED\").", "Von ChatGPT geschätzter Umsatz. (Platzhalter)", #AR
"KI-generierte, prägnante Zusammenfassung des Website-Rohtextes (AR). Fokus auf Haupttätigkeit, Produkte/Dienstleistungen, Zielgruppe.", "Von ChatGPT generierte Begründung bei signifikanter Abweichung der geschätzten Umsatzzahlen. (Platzhalter)", #AS
"Zeitstempel des letzten Versuchs, die Website zu scrapen und den Rohtext (AR) sowie die Zusammenfassung (AS) zu generieren.", "Anzahl der via SerpAPI gefundenen LinkedIn-Kontakte für die Kategorie 'Serviceleiter'.", #AT
"Ergebnis der Schätzung durch das trainierte Machine-Learning-Modell. Gibt den wahrscheinlichsten Bucket für die Anzahl der Servicetechniker an.", "Anzahl der via SerpAPI gefundenen LinkedIn-Kontakte für die Kategorie 'IT-Leiter'.", #AU
"Konsolidierter Umsatzwert in Mio. €. Priorisiert den Wert aus Wikipedia (P), falls vorhanden und numerisch, ansonsten den Wert aus CRM (J).", "Anzahl der via SerpAPI gefundenen LinkedIn-Kontakte für die Kategorie 'Management'.", #AV
"Konsolidierte Mitarbeiterzahl. Priorisiert den Wert aus Wikipedia (Q), falls vorhanden und numerisch, ansonsten den Wert aus CRM (K).", "Anzahl der via SerpAPI gefundenen LinkedIn-Kontakte für die Kategorie 'Disponent'.", #AW
"Zeitstempel der letzten Wikipedia-Artikel-Verifizierung durch ChatGPT (Spalten S-U).", "Konsolidierter Umsatzwert in Mio. €. Priorisiert Wiki (S) > CRM (K).", #AX
"Zeitstempel des letzten Versuchs, eine fehlende Wikipedia-URL (M) über SerpAPI zu suchen (Modi `find_wiki_serp` oder `check_urls`).", "Konsolidierte Mitarbeiterzahl. Priorisiert Wiki (T) > CRM (L).", #AY
"Extrahierte Meta-Daten der Website: Title, Meta-Description, H1-H3 Überschriften. Wird vom Modus 'website_details' befüllt." # <<< NEUE SPALTE AZ "Ergebnis der Schätzung durch das trainierte Machine-Learning-Modell.", #AZ
"Zeitstempel der letzten Kontaktsuche via SerpAPI für diese Zeile.", #BA
"Zeitstempel der letzten übergreifenden Prüfung/Bewertung durch ChatGPT (z.B. Branchenevaluation AH-AS).", #BB
"Version des Skripts, die diese Zeile zuletzt signifikant bearbeitet hat.", #BC
"Verbrauchte Tokens für OpenAI API-Aufrufe für diese Zeile." #BD
], ],
[ # Zeile 5: Aufgabe / Funktion [ # Zeile 5: Aufgabe / Funktion
"Datenquelle/Prozesssteuerung: 'x' markiert Zeile für Re-Evaluation in Modus 'reeval'.", "Datenquelle/Prozesssteuerung: 'x' markiert Zeile für Re-Evaluation in Modus 'reeval'.", #A
"Datenquelle: Firmenname aus CRM.", # (wie gehabt) "Datenquelle: Firmenname aus CRM.", #B
"Datenquelle: Manuell gepflegte Kurzform des Firmennamens, primär für API-Suchen (LinkedIn, SerpAPI) genutzt.", # (wie gehabt) "Datenquelle: Manuell gepflegte Kurzform des Firmennamens, primär für API-Suchen (LinkedIn, SerpAPI) genutzt.", #C
"Datenquelle/Ziel: Website des Unternehmens. Kann durch 'website_lookup' oder 'check_urls' aktualisiert werden.", "Datenquelle/Ziel: Website des Unternehmens. Kann durch 'website_lookup' oder 'check_urls' aktualisiert werden.", #D
"Datenquelle: Ort des Unternehmens aus CRM.", "Datenquelle: Ort des Unternehmens aus CRM.", #E
"Datenquelle: Beschreibung aus CRM. Input für KI-Analysen.", "Datenquelle: Land des Unternehmenssitzes laut CRM (manuell pflegen). Wichtig für DACH-Region-Analyse.", #F NEU
"Datenquelle: Branchenkategorie aus CRM. Referenz für KI-Branchenbewertung.", "Datenquelle: Beschreibung aus CRM. Input für KI-Analysen.", #G
"Datenquelle: Externe Branchenbeschreibung (z.B. Dealfront). Input für KI-Branchenbewertung.", "Datenquelle: Branchenkategorie aus CRM. Referenz für KI-Branchenbewertung.", #H
"Datenquelle: Recherchierte Anzahl Servicetechniker. Dient als Ground Truth für ML-Training und Validierung der KI-Schätzung.", "Datenquelle: Externe Branchenbeschreibung (z.B. Dealfront). Input für KI-Branchenbewertung.", #I
"Datenquelle: Umsatz aus CRM. Input für Konsolidierung und ML.", "Datenquelle: Recherchierte Anzahl Servicetechniker. Dient als Ground Truth für ML-Training und Validierung der KI-Schätzung.", #J
"Datenquelle: Mitarbeiterzahl aus CRM. Input für Konsolidierung und ML.", "Datenquelle: Umsatz aus CRM. Input für Konsolidierung und ML.", #K
"Datenquelle: Alte/vorgeschlagene Wiki-URL aus CRM. Dient als initialer Input für Wiki-Prozess.", "Datenquelle: Mitarbeiterzahl aus CRM. Input für Konsolidierung und ML.", #L
"Ziel/Quelle: Finale, als relevant erachtete Wikipedia-URL. Quelle: Wikipedia-Scraper (Suche/Extraktion), SerpAPI (Neusuche), ChatGPT (Vorschlag U nach Prüfung) oder manuelle Eingabe.", "Datenquelle: Alte/vorgeschlagene Wiki-URL aus CRM. Dient als initialer Input für Wiki-Prozess.", #M
"Quelle: Erster Absatz des Wikipedia-Artikels (M). Input für KI-Analysen, z.B. Wiki-Verifizierung.", "Ziel/Quelle: Finale, als relevant erachtete Wikipedia-URL. Quelle: Wikipedia-Scraper (Suche/Extraktion), SerpAPI (Neusuche), ChatGPT (Vorschlag AA nach Prüfung), oder manuelle Eingabe.", #N
"Quelle: Aus Wikipedia-Infobox extrahierte Branche(n). Input für KI-Branchenbewertung.", "Quelle: Aus Wikipedia-Infobox extrahierte Stadt des Unternehmenssitzes. Ziel: Geografische Analyse.", #O NEU
"Quelle: Aus Wikipedia-Infobox extrahierter Umsatz. Input für Konsolidierung und ML.", "Quelle: Aus Wikipedia-Infobox extrahiertes Land des Unternehmenssitzes. Ziel: Geografische Analyse (DACH).", #P NEU
"Quelle: Aus Wikipedia-Infobox extrahierte Mitarbeiterzahl. Input für Konsolidierung und ML.", "Quelle: Erster aussagekräftiger Absatz des Wikipedia-Artikels (N). Input für KI-Analysen, z.B. Wiki-Verifizierung.", #Q
"Quelle: Wikipedia-Kategorien des Artikels (M). Input für KI-Analysen, z.B. Wiki-Verifizierung und Branchenbewertung.", "Quelle: Aus der Wikipedia-Infobox extrahierte Branche(n). Input für KI-Branchenbewertung.", #R
"Ziel: Ergebnis der ChatGPT-Konsistenzprüfung für Wiki-Artikel (M). Status '?' triggert erneute Prüfung im Modus 'wiki_verify'.", "Quelle: Aus der Wikipedia-Infobox extrahierter Umsatz. Input für Konsolidierung und ML.", #S
"Ziel: Begründung von ChatGPT, falls Wiki-Artikel (M) als inkonsistent bewertet wurde.", "Quelle: Aus der Wikipedia-Infobox extrahierte Mitarbeiterzahl. Input für Konsolidierung und ML.", #T
"Ziel: Von ChatGPT vorgeschlagene alternative Wiki-URL. Wird von Modus 'update_wiki_suggestions' verarbeitet.", "Quelle: Wikipedia-Kategorien des Artikels (N). Input für KI-Analysen, z.B. Wiki-Verifizierung und Branchenbewertung.", #U
"Ziel/Info: Wird aktuell primär geleert. Könnte für detaillierte Begründungen bei URL-Abweichungen (z.B. CRM-Vorschlag vs. finaler URL) genutzt werden.", "System: Timestamp der letzten Wikipedia-Suche/Datenextraktion (für N-U). Steuert Wiederholung von Wiki-Extraktion.", #V
"Ziel: Von ChatGPT final vorgeschlagene Branche gemäß Zielschema. Hauptziel der Branchenklassifizierung.", "System: Timestamp der letzten ChatGPT-Verifizierung des Wiki-Artikels (N) (Ergebnis in Y-AA). Steuert Wiederholung der Verifizierung.", #W
"Ziel: Ergebnis des Abgleichs zwischen KI-Branchenvorschlag (W) und CRM-Branche (G).", "System: Timestamp des letzten Versuchs, eine fehlende Wiki-URL (N) via SerpAPI zu suchen. Steuert Wiederholung der SerpAPI-Suche.", #X
"Ziel: Von ChatGPT generierte Begründung für den Branchenvorschlag (W).", "Ziel: Ergebnis der ChatGPT-Konsistenzprüfung für Wiki-Artikel (N). Status '?' triggert erneute Prüfung im Modus 'wiki_verify'.", #Y
"Ziel: Ergebnis der FSM-Relevanzprüfung durch ChatGPT. (Platzhalter)", "Ziel: Begründung von ChatGPT, falls Wiki-Artikel (N) als inkonsistent bewertet wurde.", #Z
"Ziel: Begründung von ChatGPT für die FSM-Relevanz. (Platzhalter)", "Ziel: Von ChatGPT vorgeschlagene alternative Wikipedia-URL. Wird von Modus 'update_wiki_suggestions' verarbeitet.", #AA
"Ziel: Von ChatGPT geschätzte Mitarbeiterzahl. (Platzhalter)", "Ziel/Info: Wird aktuell primär geleert. Kann für spezifische Begründungen bei URL-Abweichungen genutzt werden.", #AB
"Ziel: Konsistenzprüfung der KI-Mitarbeiterschätzung. (Platzhalter)", "Ziel: Rohtext der Website. Input für Zusammenfassung (AD).", #AC
"Ziel: Begründung von ChatGPT bei Abweichung der Mitarbeiterschätzung. (Platzhalter)", "Ziel: KI-generierte Zusammenfassung des Website-Rohtextes (AC). Input für Branchenbewertung (AH).", #AD
"Ziel: Von ChatGPT geschätzte Anzahl Servicetechniker. (Platzhalter)", "Ziel: Strukturierte Meta-Daten der Website (Title, Description, H-Tags). Für schnelle Analyse & Validierung.", #AE NEU
"Ziel: Begründung von ChatGPT bei Abweichung der Technikerzahl-Schätzung. (Platzhalter)", "System: Timestamp des letzten Website-Scraping/Summarization-Versuchs (für AC, AD, AE). Steuert Wiederholung.", #AF
"Ziel: Von ChatGPT geschätzter Umsatz. (Platzhalter)", "System/Ziel: Status der URL-Prüfung. 'URL_CHECK_NEEDED' triggert Neusuche im Modus 'check_urls'. Wird dort aktualisiert.", #AG NEU
"Ziel: Begründung von ChatGPT bei Abweichung der Umsatzschätzung. (Platzhalter)", "Ziel: Von ChatGPT final vorgeschlagene Branche gemäß Zielschema. Hauptziel der Branchenklassifizierung.", #AH
"Ziel: Anzahl gefundener LinkedIn-Kontakte (Serviceleiter) via SerpAPI.", "Ziel: Ergebnis des Abgleichs zwischen KI-Branchenvorschlag (AH) und CRM-Branche (H).", #AI
"Ziel: Anzahl gefundener LinkedIn-Kontakte (IT-Leiter) via SerpAPI.", "Ziel: Von ChatGPT generierte Begründung für den Branchenvorschlag (AH).", #AJ
"Ziel: Anzahl gefundener LinkedIn-Kontakte (Management) via SerpAPI.", "Ziel: Ergebnis der FSM-Relevanzprüfung durch ChatGPT. (Platzhalter)", #AK
"Ziel: Anzahl gefundener LinkedIn-Kontakte (Disponent) via SerpAPI.", "Ziel: Begründung von ChatGPT für die FSM-Relevanz. (Platzhalter)", #AL
"System: Timestamp der letzten Kontaktsuche (Modus 'contacts'). Steuert Wiederholung.", "Ziel: Von ChatGPT geschätzte Mitarbeiterzahl. (Platzhalter)", #AM
"System: Timestamp der letzten Wikipedia-Suche/Extraktion (Modi 'wiki', 'full_run', 'reeval', 'wiki_reextract_missing_an'). Steuert Wiederholung.", "Ziel: Konsistenzprüfung der KI-Mitarbeiterschätzung. (Platzhalter)", #AN
"System: Timestamp der letzten übergreifenden ChatGPT-Evaluation (Modi 'chat', 'full_run', 'reeval', 'branch_eval'). Steuert Wiederholung.", "Ziel: Begründung von ChatGPT bei Abweichung der Mitarbeiterschätzung. (Platzhalter)", #AO
"System: Skriptversion, die die Zeile zuletzt signifikant bearbeitet hat.", "Ziel: Von ChatGPT geschätzte Anzahl Servicetechniker. (Platzhalter)", #AP
"System: Verbrauchte Tokens für OpenAI-Aufrufe für diese Zeile. (Implementierung ausstehend)", "Ziel: Begründung von ChatGPT bei Abweichung der Technikerzahl-Schätzung. (Platzhalter)", #AQ
"Ziel: Rohtext der Website. Input für Zusammenfassung (AS).", "Ziel: Von ChatGPT geschätzter Umsatz. (Platzhalter)", #AR
"Ziel: KI-generierte Zusammenfassung des Website-Rohtextes (AR). Input für Branchenbewertung (W).", "Ziel: Begründung von ChatGPT bei Abweichung der Umsatzschätzung. (Platzhalter)", #AS
"System: Timestamp des letzten Website-Scraping/Summarization-Versuchs. Steuert Wiederholung.", "Ziel: Anzahl gefundener LinkedIn-Kontakte (Serviceleiter) via SerpAPI.", #AT
"Ziel: Vom ML-Modell vorhergesagter Bucket für die Anzahl der Servicetechniker.", "Ziel: Anzahl gefundener LinkedIn-Kontakte (IT-Leiter) via SerpAPI.", #AU
"Ziel: Konsolidierter Umsatz (Wiki-Wert > CRM-Wert). Input für ML-Modell.", "Ziel: Anzahl gefundener LinkedIn-Kontakte (Management) via SerpAPI.", #AV
"Ziel: Konsolidierte Mitarbeiterzahl (Wiki-Wert > CRM-Wert). Input für ML-Modell.", "Ziel: Anzahl gefundener LinkedIn-Kontakte (Disponent) via SerpAPI.", #AW
"System: Timestamp der letzten Wiki-Verifizierung durch ChatGPT (Modus 'wiki_verify'). Steuert Wiederholung.", "Ziel: Konsolidierter Umsatz (Wiki-Wert (S) > CRM-Wert (K)). Input für ML-Modell.", #AX
"System: Timestamp der letzten SerpAPI-Suche nach einer fehlenden Wiki-URL (Modi 'find_wiki_serp', 'check_urls'). Steuert Wiederholung.", "Ziel: Konsolidierte Mitarbeiterzahl (Wiki-Wert (T) > CRM-Wert (L)). Input für ML-Modell.", #AY
"Quelle/Ziel: Strukturierte Meta-Daten der Website (Title, Description, H-Tags). Wird vom Modus 'website_details' befüllt und kann für Analysen/Validierungen genutzt werden." # <<< NEUE SPALTE AZ "Ziel: Vom ML-Modell vorhergesagter Bucket für die Anzahl der Servicetechniker.", #AZ
"System: Timestamp der letzten Kontaktsuche (Modus 'contacts'). Steuert Wiederholung.", #BA
"System: Timestamp der letzten übergreifenden ChatGPT-Evaluation (Branchen, FSM etc.). Steuert Wiederholung.", #BB
"System: Skriptversion, die die Zeile zuletzt signifikant bearbeitet hat.", #BC
"System: Verbrauchte Tokens für OpenAI API-Aufrufe für diese Zeile." #BD
] ]
] ]
# Sicherstellen, dass die Anzahl der Spalten in allen Header-Zeilen gleich ist
# (Rest der Funktion bleibt gleich wie in meinem vorherigen Vorschlag)
# ... (colnum_string, header_range Berechnung, sheet.update call) ...
num_cols = len(new_headers[0]) num_cols = len(new_headers[0])
if not all(len(row) == num_cols for row in new_headers): if not all(len(row) == num_cols for row in new_headers):
logger.critical(f"FEHLER in alignment_demo: Die Anzahl der Spalten in den Header-Zeilen ist nicht konsistent! Erwartet {num_cols} Spalten pro Zeile, aber Längen sind: {[len(row) for row in new_headers]}.") logger.critical(f"FEHLER in alignment_demo: Die Anzahl der Spalten in den Header-Zeilen ist nicht konsistent! Erwartet {num_cols} Spalten pro Zeile, aber Längen sind: {[len(row) for row in new_headers]}.")
@@ -2550,18 +2604,9 @@ def alignment_demo(sheet):
string = chr(65 + remainder) + string string = chr(65 + remainder) + string
return string return string
end_col_letter = colnum_string(num_cols) # Sollte jetzt "AY" oder "AZ" sein, je nach Zählung
# Da wir jetzt Spalte AZ (Index 51) haben, ist die letzte Spalte AZ.
# Die Anzahl der Spalten ist 52 (Index 0 bis 51).
# colnum_string(52) sollte "AZ" ergeben.
# Wenn num_cols = 51 (für Index 0-50), dann end_col_letter = "AY"
# Wenn num_cols = 52 (für Index 0-51), dann end_col_letter = "AZ"
# Korrekte Berechnung für den Bereich, wenn num_cols die Anzahl der Spalten ist:
end_col_letter = colnum_string(num_cols) end_col_letter = colnum_string(num_cols)
header_range = f"A1:{end_col_letter}{len(new_headers)}" header_range = f"A1:{end_col_letter}{len(new_headers)}"
logger.info(f"Schreibe Alignment-Demo Header in Bereich {header_range}...") logger.info(f"Schreibe Alignment-Demo Header in Bereich {header_range}...")
try: try:
sheet.update(values=new_headers, range_name=header_range, value_input_option='USER_ENTERED') sheet.update(values=new_headers, range_name=header_range, value_input_option='USER_ENTERED')