Rollback auf 1.2.4
This commit is contained in:
@@ -14,7 +14,7 @@ import csv
|
|||||||
|
|
||||||
# ==================== KONFIGURATION ====================
|
# ==================== KONFIGURATION ====================
|
||||||
class Config:
|
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"
|
LANG = "de"
|
||||||
CREDENTIALS_FILE = "service_account.json"
|
CREDENTIALS_FILE = "service_account.json"
|
||||||
SHEET_URL = "https://docs.google.com/spreadsheets/d/1u_gHr9JUfmV1-iviRzbSe3575QEp7KLhK5jFV_gJcgo"
|
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):
|
def extract_numeric_value(raw_value, is_umsatz=False):
|
||||||
raw_value = raw_value.strip()
|
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."
|
return "k.A."
|
||||||
# Entferne Texte wie "ca.", "circa", etc.
|
# Entferne gängige Zusätze wie "ca.", "circa", "über" etc.
|
||||||
raw_value = re.sub(r'\b(ca\.?|circa|etwa|über|rund)\b', '', raw_value, flags=re.IGNORECASE)
|
raw_value = re.sub(r'\b(ca\.?|circa|über)\b', '', raw_value, flags=re.IGNORECASE)
|
||||||
raw_value = raw_value.replace("\xa0", " ").strip()
|
raw = raw_value.lower().replace("\xa0", " ")
|
||||||
# Entferne Textteile in Klammern
|
match = re.search(r'([\d.,]+)', raw, flags=re.UNICODE)
|
||||||
raw_value = re.sub(r'\(.*?\)', '', raw_value).strip()
|
if not match or not match.group(1).strip():
|
||||||
# Extrahiere den numerischen Teil
|
|
||||||
match = re.search(r'([\d.,]+)', raw_value)
|
|
||||||
if not match:
|
|
||||||
debug_print(f"Keine numerischen Zeichen gefunden im Rohtext: '{raw_value}'")
|
debug_print(f"Keine numerischen Zeichen gefunden im Rohtext: '{raw_value}'")
|
||||||
return "k.A."
|
return "k.A."
|
||||||
num_str = match.group(1)
|
num_str = match.group(1)
|
||||||
# Wenn ein einzelnes Komma als Dezimaltrenner und kein Punkt vorhanden ist
|
if ',' in num_str:
|
||||||
if ',' in num_str and '.' not in num_str and len(num_str.split(',')[1]) <= 2:
|
num_str = num_str.replace('.', '').replace(',', '.')
|
||||||
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
|
||||||
else:
|
else:
|
||||||
num_str = num_str.replace(',', '')
|
num_str = num_str.replace(' ', '').replace('.', '')
|
||||||
try:
|
try:
|
||||||
num = float(num_str)
|
num = float(num_str)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
debug_print(f"Fehler bei der Umwandlung von '{num_str}' (Rohtext: '{raw_value}'): {e}")
|
debug_print(f"Fehler bei der Umwandlung von '{num_str}' (Rohtext: '{raw_value}'): {e}")
|
||||||
return raw_value
|
return raw_value
|
||||||
if is_umsatz:
|
if is_umsatz:
|
||||||
raw_lower = raw_value.lower()
|
if "mrd" in raw or "milliarden" in raw:
|
||||||
if "mrd" in raw_lower or "milliarden" in raw_lower:
|
|
||||||
num *= 1000
|
num *= 1000
|
||||||
elif "mio" in raw_lower or "millionen" in raw_lower:
|
elif "mio" in raw or "millionen" in raw:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
num /= 1e6
|
num /= 1e6
|
||||||
@@ -172,18 +172,41 @@ class GoogleSheetHandler:
|
|||||||
# ==================== ALIGNMENT DEMO (Modus 3) ====================
|
# ==================== ALIGNMENT DEMO (Modus 3) ====================
|
||||||
def alignment_demo(sheet):
|
def alignment_demo(sheet):
|
||||||
new_headers = [
|
new_headers = [
|
||||||
"Spalte A (ReEval Flag)", "Spalte B (Firmenname)", "Spalte C (Website)", "Spalte D (Ort)", "Spalte E (Beschreibung)",
|
"Spalte A (ReEval Flag)",
|
||||||
"Spalte F (Aktuelle Branche)", "Spalte G (Beschreibung Branche extern)", "Spalte H (Anzahl Techniker CRM)",
|
"Spalte B (Firmenname)",
|
||||||
"Spalte I (Umsatz CRM)", "Spalte J (Anzahl Mitarbeiter CRM)", "Spalte K (Vorschlag Wiki URL)",
|
"Spalte C (Website)",
|
||||||
"Spalte L (Wikipedia URL)", "Spalte M (Wikipedia Absatz)", "Spalte N (Wikipedia Branche)",
|
"Spalte D (Ort)",
|
||||||
"Spalte O (Wikipedia Umsatz)", "Spalte P (Wikipedia Mitarbeiter)", "Spalte Q (Wikipedia Kategorien)",
|
"Spalte E (Beschreibung)",
|
||||||
"Spalte R (Konsistenzprüfung)", "Spalte S (Begründung bei Inkonsistenz)", "Spalte T (Vorschlag Wiki Artikel ChatGPT)",
|
"Spalte F (Aktuelle Branche)",
|
||||||
"Spalte U (Begründung bei Abweichung)", "Spalte V (Vorschlag neue Branche)", "Spalte W (Konsistenzprüfung Branche)",
|
"Spalte G (Beschreibung Branche extern)",
|
||||||
"Spalte X (Begründung Abweichung Branche)", "Spalte Y (FSM Relevanz Ja / Nein)", "Spalte Z (Begründung für FSM Relevanz)",
|
"Spalte H (Anzahl Techniker CRM)",
|
||||||
"Spalte AA (Schätzung Anzahl Mitarbeiter)", "Spalte AB (Konsistenzprüfung Mitarbeiterzahl)",
|
"Spalte I (Umsatz CRM)",
|
||||||
"Spalte AC (Begründung für Abweichung Mitarbeiterzahl)", "Spalte AD (Einschätzung Anzahl Servicetechniker)",
|
"Spalte J (Anzahl Mitarbeiter CRM)",
|
||||||
"Spalte AE (Begründung bei Abweichung Anzahl Servicetechniker)", "Spalte AF (Schätzung Umsatz ChatGPT)",
|
"Spalte K (Vorschlag Wiki URL)",
|
||||||
"Spalte AG (Begründung für Abweichung Umsatz)", "Spalte AH (Timestamp letzte Prüfung)", "Spalte AI (Version)"
|
"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"
|
header_range = "A11200:AI11200"
|
||||||
sheet.update(values=[new_headers], range_name=header_range)
|
sheet.update(values=[new_headers], range_name=header_range)
|
||||||
@@ -380,6 +403,13 @@ class DataProcessor:
|
|||||||
if i >= self.sheet_handler.get_start_index():
|
if i >= self.sheet_handler.get_start_index():
|
||||||
self._process_single_row(i, row)
|
self._process_single_row(i, row)
|
||||||
def _process_single_row(self, row_num, row_data):
|
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 ""
|
company_name = row_data[1] if len(row_data) > 1 else ""
|
||||||
website = row_data[2] if len(row_data) > 2 else ""
|
website = row_data[2] if len(row_data) > 2 else ""
|
||||||
wiki_update_range = f"K{row_num}:Q{row_num}"
|
wiki_update_range = f"K{row_num}:Q{row_num}"
|
||||||
@@ -411,16 +441,18 @@ class DataProcessor:
|
|||||||
company_data.get('categories', 'k.A.')
|
company_data.get('categories', 'k.A.')
|
||||||
]
|
]
|
||||||
self.sheet_handler.sheet.update(values=[wiki_values], range_name=wiki_update_range)
|
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.')
|
wiki_umsatz = company_data.get('umsatz', 'k.A.')
|
||||||
if wiki_umsatz != "k.A.":
|
if wiki_umsatz != "k.A.":
|
||||||
chatgpt_umsatz = evaluate_umsatz_chatgpt(company_name, wiki_umsatz)
|
chatgpt_umsatz = evaluate_umsatz_chatgpt(company_name, wiki_umsatz)
|
||||||
else:
|
else:
|
||||||
chatgpt_umsatz = "k.A."
|
chatgpt_umsatz = "k.A."
|
||||||
self.sheet_handler.sheet.update(values=[[chatgpt_umsatz]], range_name=chatgpt_range)
|
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."
|
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, company_data.get('umsatz', 'k.A.'))
|
||||||
abgleich_result = compare_umsatz_values(crm_umsatz, wiki_umsatz)
|
|
||||||
self.sheet_handler.sheet.update(values=[[abgleich_result]], range_name=abgleich_range)
|
self.sheet_handler.sheet.update(values=[[abgleich_result]], range_name=abgleich_range)
|
||||||
current_dt = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
current_dt = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||||
self.sheet_handler.sheet.update(values=[[current_dt]], range_name=dt_range)
|
self.sheet_handler.sheet.update(values=[[current_dt]], range_name=dt_range)
|
||||||
|
|||||||
Reference in New Issue
Block a user