From b37163e4af99a2309cea380f4d08a3c57fd8a472 Mon Sep 17 00:00:00 2001 From: Floke Date: Wed, 2 Apr 2025 06:31:37 +0000 Subject: [PATCH] Rollback auf 1.2.4 --- brancheneinstufung.py | 106 +++++++++++++++++++++++++++--------------- 1 file changed, 69 insertions(+), 37 deletions(-) diff --git a/brancheneinstufung.py b/brancheneinstufung.py index 24559b49..d10d83c0 100644 --- a/brancheneinstufung.py +++ b/brancheneinstufung.py @@ -14,7 +14,7 @@ import csv # ==================== KONFIGURATION ==================== class Config: - VERSION = "v1.2.8" # v1.2.8: Verbesserte numerische Extraktion für Umsatz und Mitarbeiter; robustere Vergleichslogik + VERSION = "v1.2.5" # v1.2.5: Umsatzvergleich verbessert; 1 Sekunde Pause + zusätzliche Debug-Ausgabe LANG = "de" CREDENTIALS_FILE = "service_account.json" SHEET_URL = "https://docs.google.com/spreadsheets/d/1u_gHr9JUfmV1-iviRzbSe3575QEp7KLhK5jFV_gJcgo" @@ -73,34 +73,34 @@ def normalize_company_name(name): def extract_numeric_value(raw_value, is_umsatz=False): raw_value = raw_value.strip() - if not raw_value or raw_value.lower() in ["k.a.", "n.a."]: + if not raw_value: return "k.A." - # Entferne Texte wie "ca.", "circa", etc. - raw_value = re.sub(r'\b(ca\.?|circa|etwa|über|rund)\b', '', raw_value, flags=re.IGNORECASE) - raw_value = raw_value.replace("\xa0", " ").strip() - # Entferne Textteile in Klammern - raw_value = re.sub(r'\(.*?\)', '', raw_value).strip() - # Extrahiere den numerischen Teil - match = re.search(r'([\d.,]+)', raw_value) - if not match: + # Entferne gängige Zusätze wie "ca.", "circa", "über" etc. + raw_value = re.sub(r'\b(ca\.?|circa|über)\b', '', raw_value, flags=re.IGNORECASE) + raw = raw_value.lower().replace("\xa0", " ") + match = re.search(r'([\d.,]+)', raw, flags=re.UNICODE) + if not match or not match.group(1).strip(): debug_print(f"Keine numerischen Zeichen gefunden im Rohtext: '{raw_value}'") return "k.A." num_str = match.group(1) - # Wenn ein einzelnes Komma als Dezimaltrenner und kein Punkt vorhanden ist - if ',' in num_str and '.' not in num_str and len(num_str.split(',')[1]) <= 2: - num_str = num_str.replace(',', '.') + if ',' in num_str: + num_str = num_str.replace('.', '').replace(',', '.') + try: + num = float(num_str) + except Exception as e: + debug_print(f"Fehler bei der Umwandlung von '{num_str}' (Rohtext: '{raw_value}'): {e}") + return raw_value else: - num_str = num_str.replace(',', '') - try: - num = float(num_str) - except Exception as e: - debug_print(f"Fehler bei der Umwandlung von '{num_str}' (Rohtext: '{raw_value}'): {e}") - return raw_value + num_str = num_str.replace(' ', '').replace('.', '') + try: + num = float(num_str) + except Exception as e: + debug_print(f"Fehler bei der Umwandlung von '{num_str}' (Rohtext: '{raw_value}'): {e}") + return raw_value if is_umsatz: - raw_lower = raw_value.lower() - if "mrd" in raw_lower or "milliarden" in raw_lower: + if "mrd" in raw or "milliarden" in raw: num *= 1000 - elif "mio" in raw_lower or "millionen" in raw_lower: + elif "mio" in raw or "millionen" in raw: pass else: num /= 1e6 @@ -172,18 +172,41 @@ class GoogleSheetHandler: # ==================== ALIGNMENT DEMO (Modus 3) ==================== def alignment_demo(sheet): new_headers = [ - "Spalte A (ReEval Flag)", "Spalte B (Firmenname)", "Spalte C (Website)", "Spalte D (Ort)", "Spalte E (Beschreibung)", - "Spalte F (Aktuelle Branche)", "Spalte G (Beschreibung Branche extern)", "Spalte H (Anzahl Techniker CRM)", - "Spalte I (Umsatz CRM)", "Spalte J (Anzahl Mitarbeiter CRM)", "Spalte K (Vorschlag Wiki URL)", - "Spalte L (Wikipedia URL)", "Spalte M (Wikipedia Absatz)", "Spalte N (Wikipedia Branche)", - "Spalte O (Wikipedia Umsatz)", "Spalte P (Wikipedia Mitarbeiter)", "Spalte Q (Wikipedia Kategorien)", - "Spalte R (Konsistenzprüfung)", "Spalte S (Begründung bei Inkonsistenz)", "Spalte T (Vorschlag Wiki Artikel ChatGPT)", - "Spalte U (Begründung bei Abweichung)", "Spalte V (Vorschlag neue Branche)", "Spalte W (Konsistenzprüfung Branche)", - "Spalte X (Begründung Abweichung Branche)", "Spalte Y (FSM Relevanz Ja / Nein)", "Spalte Z (Begründung für FSM Relevanz)", - "Spalte AA (Schätzung Anzahl Mitarbeiter)", "Spalte AB (Konsistenzprüfung Mitarbeiterzahl)", - "Spalte AC (Begründung für Abweichung Mitarbeiterzahl)", "Spalte AD (Einschätzung Anzahl Servicetechniker)", - "Spalte AE (Begründung bei Abweichung Anzahl Servicetechniker)", "Spalte AF (Schätzung Umsatz ChatGPT)", - "Spalte AG (Begründung für Abweichung Umsatz)", "Spalte AH (Timestamp letzte Prüfung)", "Spalte AI (Version)" + "Spalte A (ReEval Flag)", + "Spalte B (Firmenname)", + "Spalte C (Website)", + "Spalte D (Ort)", + "Spalte E (Beschreibung)", + "Spalte F (Aktuelle Branche)", + "Spalte G (Beschreibung Branche extern)", + "Spalte H (Anzahl Techniker CRM)", + "Spalte I (Umsatz CRM)", + "Spalte J (Anzahl Mitarbeiter CRM)", + "Spalte K (Vorschlag Wiki URL)", + "Spalte L (Wikipedia URL)", + "Spalte M (Wikipedia Absatz)", + "Spalte N (Wikipedia Branche)", + "Spalte O (Wikipedia Umsatz)", + "Spalte P (Wikipedia Mitarbeiter)", + "Spalte Q (Wikipedia Kategorien)", + "Spalte R (Konsistenzprüfung)", + "Spalte S (Begründung bei Inkonsistenz)", + "Spalte T (Vorschlag Wiki Artikel ChatGPT)", + "Spalte U (Begründung bei Abweichung)", + "Spalte V (Vorschlag neue Branche)", + "Spalte W (Konsistenzprüfung Branche)", + "Spalte X (Begründung Abweichung Branche)", + "Spalte Y (FSM Relevanz Ja / Nein)", + "Spalte Z (Begründung für FSM Relevanz)", + "Spalte AA (Schätzung Anzahl Mitarbeiter)", + "Spalte AB (Konsistenzprüfung Mitarbeiterzahl)", + "Spalte AC (Begründung für Abweichung Mitarbeiterzahl)", + "Spalte AD (Einschätzung Anzahl Servicetechniker)", + "Spalte AE (Begründung bei Abweichung Anzahl Servicetechniker)", + "Spalte AF (Schätzung Umsatz ChatGPT)", + "Spalte AG (Begründung für Abweichung Umsatz)", + "Spalte AH (Timestamp letzte Prüfung)", + "Spalte AI (Version)" ] header_range = "A11200:AI11200" sheet.update(values=[new_headers], range_name=header_range) @@ -380,6 +403,13 @@ class DataProcessor: if i >= self.sheet_handler.get_start_index(): self._process_single_row(i, row) def _process_single_row(self, row_num, row_data): + # Neues Schema: + # B: Firmenname, C: Website + # Wikipedia-Daten: Spalten K bis Q + # ChatGPT Umsatz: Spalte AF + # CRM Umsatz in Spalte I (Index 8) + # Umsatz-Abgleich: Spalte AG + # Timestamp in Spalte AH, Version in Spalte AI. company_name = row_data[1] if len(row_data) > 1 else "" website = row_data[2] if len(row_data) > 2 else "" wiki_update_range = f"K{row_num}:Q{row_num}" @@ -411,16 +441,18 @@ class DataProcessor: company_data.get('categories', 'k.A.') ] self.sheet_handler.sheet.update(values=[wiki_values], range_name=wiki_update_range) - time.sleep(1) # Sicherstellen, dass Werte synchronisiert werden + # Pause einbauen, damit die Werte in Google Sheets aktualisiert werden. + time.sleep(1) + # ChatGPT API: Umsatzbewertung basierend auf Firmenname und Wikipedia-Umsatz wiki_umsatz = company_data.get('umsatz', 'k.A.') if wiki_umsatz != "k.A.": chatgpt_umsatz = evaluate_umsatz_chatgpt(company_name, wiki_umsatz) else: chatgpt_umsatz = "k.A." self.sheet_handler.sheet.update(values=[[chatgpt_umsatz]], range_name=chatgpt_range) + # Umsatz-Abgleich: CRM-Umsatz aus Spalte I und Wikipedia-Umsatz crm_umsatz = row_data[8] if len(row_data) > 8 else "k.A." - debug_print(f"Bereinigte Vergleichswerte vor Umwandlung: CRM Umsatz: '{crm_umsatz}', Wiki Umsatz: '{wiki_umsatz}'") - abgleich_result = compare_umsatz_values(crm_umsatz, wiki_umsatz) + abgleich_result = compare_umsatz_values(crm_umsatz, company_data.get('umsatz', 'k.A.')) self.sheet_handler.sheet.update(values=[[abgleich_result]], range_name=abgleich_range) current_dt = datetime.now().strftime("%Y-%m-%d %H:%M:%S") self.sheet_handler.sheet.update(values=[[current_dt]], range_name=dt_range)