data_processor.py aktualisiert

Regex suche "self\.sheet_handler\._get_col_letter" replace by "_get_col_letter"
This commit is contained in:
2025-08-04 17:07:07 +00:00
parent ae99f138a3
commit 3d5716c777

View File

@@ -265,7 +265,7 @@ class DataProcessor:
website_url = new_website website_url = new_website
updates.append( updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("CRM Website") + 1)}{row_num_in_sheet}', 'range': f'{_get_col_letter(get_col_idx("CRM Website") + 1)}{row_num_in_sheet}',
'values': [ 'values': [
[website_url]]}) [website_url]]})
url_pruefstatus = "URL_OK_SERP" url_pruefstatus = "URL_OK_SERP"
@@ -294,12 +294,12 @@ class DataProcessor:
website_raw, company_name) or "k.A. (Keine Zusammenfassung erhalten)" website_raw, company_name) or "k.A. (Keine Zusammenfassung erhalten)"
updates.append( updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Website Meta-Details") + 1)}{row_num_in_sheet}', 'range': f'{_get_col_letter(get_col_idx("Website Meta-Details") + 1)}{row_num_in_sheet}',
'values': [ 'values': [
[website_meta_details]]}) [website_meta_details]]})
updates.append( updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Website Zusammenfassung") + 1)}{row_num_in_sheet}', 'range': f'{_get_col_letter(get_col_idx("Website Zusammenfassung") + 1)}{row_num_in_sheet}',
'values': [ 'values': [
[website_summary]]}) [website_summary]]})
else: else:
@@ -308,12 +308,12 @@ class DataProcessor:
website_summary, website_meta_details = "k.A.", "k.A." website_summary, website_meta_details = "k.A.", "k.A."
updates.append( updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Website Zusammenfassung") + 1)}{row_num_in_sheet}', 'range': f'{_get_col_letter(get_col_idx("Website Zusammenfassung") + 1)}{row_num_in_sheet}',
'values': [ 'values': [
[website_summary]]}) [website_summary]]})
updates.append( updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Website Meta-Details") + 1)}{row_num_in_sheet}', 'range': f'{_get_col_letter(get_col_idx("Website Meta-Details") + 1)}{row_num_in_sheet}',
'values': [ 'values': [
[website_meta_details]]}) [website_meta_details]]})
except Exception as e_scrape_web: except Exception as e_scrape_web:
@@ -323,17 +323,17 @@ class DataProcessor:
url_pruefstatus = "URL_SCRAPE_ERROR" url_pruefstatus = "URL_SCRAPE_ERROR"
updates.append( updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Website Zusammenfassung") + 1)}{row_num_in_sheet}', 'range': f'{_get_col_letter(get_col_idx("Website Zusammenfassung") + 1)}{row_num_in_sheet}',
'values': [ 'values': [
[website_summary]]}) [website_summary]]})
updates.append( updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Website Meta-Details") + 1)}{row_num_in_sheet}', 'range': f'{_get_col_letter(get_col_idx("Website Meta-Details") + 1)}{row_num_in_sheet}',
'values': [ 'values': [
[website_meta_details]]}) [website_meta_details]]})
updates.append( updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Website Rohtext") + 1)}{row_num_in_sheet}', 'range': f'{_get_col_letter(get_col_idx("Website Rohtext") + 1)}{row_num_in_sheet}',
'values': [ 'values': [
[website_raw]]}) [website_raw]]})
else: else:
@@ -344,28 +344,28 @@ class DataProcessor:
url_pruefstatus = "URL_MISSING" url_pruefstatus = "URL_MISSING"
updates.append( updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Website Rohtext") + 1)}{row_num_in_sheet}', 'range': f'{_get_col_letter(get_col_idx("Website Rohtext") + 1)}{row_num_in_sheet}',
'values': [ 'values': [
[website_raw]]}) [website_raw]]})
updates.append( updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Website Zusammenfassung") + 1)}{row_num_in_sheet}', 'range': f'{_get_col_letter(get_col_idx("Website Zusammenfassung") + 1)}{row_num_in_sheet}',
'values': [ 'values': [
[website_summary]]}) [website_summary]]})
updates.append( updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Website Meta-Details") + 1)}{row_num_in_sheet}', 'range': f'{_get_col_letter(get_col_idx("Website Meta-Details") + 1)}{row_num_in_sheet}',
'values': [ 'values': [
[website_meta_details]]}) [website_meta_details]]})
updates.append( updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("URL Prüfstatus") + 1)}{row_num_in_sheet}', 'range': f'{_get_col_letter(get_col_idx("URL Prüfstatus") + 1)}{row_num_in_sheet}',
'values': [ 'values': [
[url_pruefstatus]]}) [url_pruefstatus]]})
updates.append( updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Website Scrape Timestamp") + 1)}{row_num_in_sheet}', 'range': f'{_get_col_letter(get_col_idx("Website Scrape Timestamp") + 1)}{row_num_in_sheet}',
'values': [ 'values': [
[now_timestamp]]}) [now_timestamp]]})
@@ -444,9 +444,9 @@ class DataProcessor:
company_name=company_name, parent_name=parent_name_for_search, website=website_url, company_name=company_name, parent_name=parent_name_for_search, website=website_url,
wiki_title=final_wiki_data.get('title', 'k.A.'), wiki_summary=final_wiki_data.get('first_paragraph', 'k.A.') wiki_title=final_wiki_data.get('title', 'k.A.'), wiki_summary=final_wiki_data.get('first_paragraph', 'k.A.')
) )
updates.append({'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Chat Wiki Konsistenzpruefung") + 1)}{row_num_in_sheet}', 'values': [[verification_result.get('consistency', 'X')]]}) updates.append({'range': f'{_get_col_letter(get_col_idx("Chat Wiki Konsistenzpruefung") + 1)}{row_num_in_sheet}', 'values': [[verification_result.get('consistency', 'X')]]})
updates.append({'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Chat Begründung Wiki Inkonsistenz") + 1)}{row_num_in_sheet}', 'values': [[verification_result.get('justification', 'Fehler')]]}) updates.append({'range': f'{_get_col_letter(get_col_idx("Chat Begründung Wiki Inkonsistenz") + 1)}{row_num_in_sheet}', 'values': [[verification_result.get('justification', 'Fehler')]]})
updates.append({'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Wiki Verif. Timestamp") + 1)}{row_num_in_sheet}', 'values': [[now_timestamp]]}) updates.append({'range': f'{_get_col_letter(get_col_idx("Wiki Verif. Timestamp") + 1)}{row_num_in_sheet}', 'values': [[now_timestamp]]})
# --- Finales Schreiben ins Sheet --- # --- Finales Schreiben ins Sheet ---
key_mapping = { key_mapping = {
@@ -457,9 +457,9 @@ class DataProcessor:
for sheet_col_name, data_key in key_mapping.items(): for sheet_col_name, data_key in key_mapping.items():
col_idx = get_col_idx(sheet_col_name) col_idx = get_col_idx(sheet_col_name)
if col_idx is not None: if col_idx is not None:
updates.append({'range': f'{self.sheet_handler._get_col_letter(col_idx + 1)}{row_num_in_sheet}', 'values': [[final_wiki_data.get(data_key, 'k.A.')]]}) updates.append({'range': f'{_get_col_letter(col_idx + 1)}{row_num_in_sheet}', 'values': [[final_wiki_data.get(data_key, 'k.A.')]]})
updates.append({'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Wikipedia Timestamp") + 1)}{row_num_in_sheet}', 'values': [[now_timestamp]]}) updates.append({'range': f'{_get_col_letter(get_col_idx("Wikipedia Timestamp") + 1)}{row_num_in_sheet}', 'values': [[now_timestamp]]})
# --- 3. ChatGPT Evaluationen (Branch, FSM, etc.) & Plausi --- # --- 3. ChatGPT Evaluationen (Branch, FSM, etc.) & Plausi ---
run_chat_step = 'chat' in steps_to_run run_chat_step = 'chat' in steps_to_run
@@ -505,10 +505,10 @@ class DataProcessor:
schema_data=self.schema_data schema_data=self.schema_data
) )
updates.append({'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Chat Vorschlag Branche") + 1)}{row_num_in_sheet}', 'values': [[branch_result.get('branch', 'FEHLER')]]}) updates.append({'range': f'{_get_col_letter(get_col_idx("Chat Vorschlag Branche") + 1)}{row_num_in_sheet}', 'values': [[branch_result.get('branch', 'FEHLER')]]})
updates.append({'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Chat Branche Konfidenz") + 1)}{row_num_in_sheet}', 'values': [[branch_result.get('confidence', 'N/A')]]}) updates.append({'range': f'{_get_col_letter(get_col_idx("Chat Branche Konfidenz") + 1)}{row_num_in_sheet}', 'values': [[branch_result.get('confidence', 'N/A')]]})
updates.append({'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Chat Konsistenz Branche") + 1)}{row_num_in_sheet}', 'values': [[branch_result.get('consistency', 'error')]]}) updates.append({'range': f'{_get_col_letter(get_col_idx("Chat Konsistenz Branche") + 1)}{row_num_in_sheet}', 'values': [[branch_result.get('consistency', 'error')]]})
updates.append({'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Chat Begruendung Abweichung Branche") + 1)}{row_num_in_sheet}', 'values': [[branch_result.get('justification', 'k.A.')]]}) updates.append({'range': f'{_get_col_letter(get_col_idx("Chat Begruendung Abweichung Branche") + 1)}{row_num_in_sheet}', 'values': [[branch_result.get('justification', 'k.A.')]]})
except Exception as e_branch_eval: except Exception as e_branch_eval:
self.logger.error(f"FEHLER bei Branchen-Einstufung für Zeile {row_num_in_sheet}: {e_branch_eval}") self.logger.error(f"FEHLER bei Branchen-Einstufung für Zeile {row_num_in_sheet}: {e_branch_eval}")
@@ -523,7 +523,7 @@ class DataProcessor:
col_idx = get_col_idx(item["key"]) col_idx = get_col_idx(item["key"])
if col_idx is not None: if col_idx is not None:
updates.append({ updates.append({
'range': f'{self.sheet_handler._get_col_letter(col_idx + 1)}{row_num_in_sheet}', 'range': f'{_get_col_letter(col_idx + 1)}{row_num_in_sheet}',
'values': [[item["value"]]] 'values': [[item["value"]]]
}) })
@@ -549,13 +549,13 @@ class DataProcessor:
techniker_bucket_ml=self._get_cell_value_safe(row_data, "Geschaetzter Techniker Bucket") techniker_bucket_ml=self._get_cell_value_safe(row_data, "Geschaetzter Techniker Bucket")
) )
updates.append({'range': f'{self.sheet_handler._get_col_letter(get_col_idx("FSM Pitch") + 1)}{row_num_in_sheet}', 'values': [[fsm_pitch_text]]}) updates.append({'range': f'{_get_col_letter(get_col_idx("FSM Pitch") + 1)}{row_num_in_sheet}', 'values': [[fsm_pitch_text]]})
updates.append({'range': f'{self.sheet_handler._get_col_letter(get_col_idx("FSM Pitch Timestamp") + 1)}{row_num_in_sheet}', 'values': [[now_timestamp]]}) updates.append({'range': f'{_get_col_letter(get_col_idx("FSM Pitch Timestamp") + 1)}{row_num_in_sheet}', 'values': [[now_timestamp]]})
any_processing_done = True any_processing_done = True
chat_eval_just_ran = True # Signal, dass eine KI-Aktion stattfand chat_eval_just_ran = True # Signal, dass eine KI-Aktion stattfand
except Exception as e_fsm_pitch: except Exception as e_fsm_pitch:
self.logger.error(f"FEHLER bei FSM-Pitch-Generierung für Zeile {row_num_in_sheet}: {e_fsm_pitch}") self.logger.error(f"FEHLER bei FSM-Pitch-Generierung für Zeile {row_num_in_sheet}: {e_fsm_pitch}")
updates.append({'range': f'{self.sheet_handler._get_col_letter(get_col_idx("FSM Pitch") + 1)}{row_num_in_sheet}', 'values': [['FEHLER (Generierung)']]} ) updates.append({'range': f'{_get_col_letter(get_col_idx("FSM Pitch") + 1)}{row_num_in_sheet}', 'values': [['FEHLER (Generierung)']]} )
@@ -600,12 +600,12 @@ class DataProcessor:
int(round(final_num_ma))) if final_num_ma > 0 else 'k.A.' int(round(final_num_ma))) if final_num_ma > 0 else 'k.A.'
updates.append( updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Finaler Umsatz (Wiki>CRM)") + 1)}{row_num_in_sheet}', 'range': f'{_get_col_letter(get_col_idx("Finaler Umsatz (Wiki>CRM)") + 1)}{row_num_in_sheet}',
'values': [ 'values': [
[final_umsatz_str_konsolidiert]]}) [final_umsatz_str_konsolidiert]]})
updates.append( updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Finaler Mitarbeiter (Wiki>CRM)") + 1)}{row_num_in_sheet}', 'range': f'{_get_col_letter(get_col_idx("Finaler Mitarbeiter (Wiki>CRM)") + 1)}{row_num_in_sheet}',
'values': [ 'values': [
[final_ma_str_konsolidiert]]}) [final_ma_str_konsolidiert]]})
except Exception as e_consolidate: except Exception as e_consolidate:
@@ -614,12 +614,12 @@ class DataProcessor:
final_umsatz_str_konsolidiert, final_ma_str_konsolidiert = "FEHLER_KONSO", "FEHLER_KONSO" final_umsatz_str_konsolidiert, final_ma_str_konsolidiert = "FEHLER_KONSO", "FEHLER_KONSO"
updates.append( updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Finaler Umsatz (Wiki>CRM)") + 1)}{row_num_in_sheet}', 'range': f'{_get_col_letter(get_col_idx("Finaler Umsatz (Wiki>CRM)") + 1)}{row_num_in_sheet}',
'values': [ 'values': [
['FEHLER_KONSO']]}) ['FEHLER_KONSO']]})
updates.append( updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Finaler Mitarbeiter (Wiki>CRM)") + 1)}{row_num_in_sheet}', 'range': f'{_get_col_letter(get_col_idx("Finaler Mitarbeiter (Wiki>CRM)") + 1)}{row_num_in_sheet}',
'values': [ 'values': [
['FEHLER_KONSO']]}) ['FEHLER_KONSO']]})
@@ -653,7 +653,7 @@ class DataProcessor:
plausi_input_data) plausi_input_data)
updates.append( updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Plausibilität Umsatz") + 1)}{row_num_in_sheet}', 'range': f'{_get_col_letter(get_col_idx("Plausibilität Umsatz") + 1)}{row_num_in_sheet}',
'values': [ 'values': [
[ [
plausi_results.get( plausi_results.get(
@@ -661,7 +661,7 @@ class DataProcessor:
"ERR_FLAG")]]}) "ERR_FLAG")]]})
updates.append( updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Plausibilität Mitarbeiter") + 1)}{row_num_in_sheet}', 'range': f'{_get_col_letter(get_col_idx("Plausibilität Mitarbeiter") + 1)}{row_num_in_sheet}',
'values': [ 'values': [
[ [
plausi_results.get( plausi_results.get(
@@ -669,7 +669,7 @@ class DataProcessor:
"ERR_FLAG")]]}) "ERR_FLAG")]]})
updates.append( updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Plausibilität Umsatz/MA Ratio") + 1)}{row_num_in_sheet}', 'range': f'{_get_col_letter(get_col_idx("Plausibilität Umsatz/MA Ratio") + 1)}{row_num_in_sheet}',
'values': [ 'values': [
[ [
plausi_results.get( plausi_results.get(
@@ -677,7 +677,7 @@ class DataProcessor:
"ERR_FLAG")]]}) "ERR_FLAG")]]})
updates.append( updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Abweichung Umsatz CRM/Wiki") + 1)}{row_num_in_sheet}', 'range': f'{_get_col_letter(get_col_idx("Abweichung Umsatz CRM/Wiki") + 1)}{row_num_in_sheet}',
'values': [ 'values': [
[ [
plausi_results.get( plausi_results.get(
@@ -685,7 +685,7 @@ class DataProcessor:
"ERR_FLAG")]]}) "ERR_FLAG")]]})
updates.append( updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Abweichung MA CRM/Wiki") + 1)}{row_num_in_sheet}', 'range': f'{_get_col_letter(get_col_idx("Abweichung MA CRM/Wiki") + 1)}{row_num_in_sheet}',
'values': [ 'values': [
[ [
plausi_results.get( plausi_results.get(
@@ -693,7 +693,7 @@ class DataProcessor:
"ERR_FLAG")]]}) "ERR_FLAG")]]})
updates.append( updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Plausibilität Begründung") + 1)}{row_num_in_sheet}', 'range': f'{_get_col_letter(get_col_idx("Plausibilität Begründung") + 1)}{row_num_in_sheet}',
'values': [ 'values': [
[ [
plausi_results.get( plausi_results.get(
@@ -705,12 +705,12 @@ class DataProcessor:
updates.append( updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Plausibilität Prüfdatum") + 1)}{row_num_in_sheet}', 'range': f'{_get_col_letter(get_col_idx("Plausibilität Prüfdatum") + 1)}{row_num_in_sheet}',
'values': [ 'values': [
[now_timestamp]]}) [now_timestamp]]})
updates.append( updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Timestamp letzte Pruefung") + 1)}{row_num_in_sheet}', 'range': f'{_get_col_letter(get_col_idx("Timestamp letzte Pruefung") + 1)}{row_num_in_sheet}',
'values': [ 'values': [
[now_timestamp]]}) [now_timestamp]]})
@@ -730,7 +730,7 @@ class DataProcessor:
str) and not predicted_bucket.startswith("FEHLER"): str) and not predicted_bucket.startswith("FEHLER"):
updates.append( updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Geschaetzter Techniker Bucket") + 1)}{row_num_in_sheet}', 'range': f'{_get_col_letter(get_col_idx("Geschaetzter Techniker Bucket") + 1)}{row_num_in_sheet}',
'values': [ 'values': [
[predicted_bucket]]}) [predicted_bucket]]})
self.logger.info( self.logger.info(
@@ -740,7 +740,7 @@ class DataProcessor:
f" -> ML-Schaetzung lieferte kein gueltiges Ergebnis: '{predicted_bucket}'.") f" -> ML-Schaetzung lieferte kein gueltiges Ergebnis: '{predicted_bucket}'.")
updates.append( updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Geschaetzter Techniker Bucket") + 1)}{row_num_in_sheet}', 'range': f'{_get_col_letter(get_col_idx("Geschaetzter Techniker Bucket") + 1)}{row_num_in_sheet}',
'values': [ 'values': [
['k.A. (Schaetzung fehlgeschlagen)']]}) ['k.A. (Schaetzung fehlgeschlagen)']]})
except Exception as e_ml: except Exception as e_ml:
@@ -749,7 +749,7 @@ class DataProcessor:
self.logger.debug(traceback.format_exc()) self.logger.debug(traceback.format_exc())
updates.append( updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Geschaetzter Techniker Bucket") + 1)}{row_num_in_sheet}', 'range': f'{_get_col_letter(get_col_idx("Geschaetzter Techniker Bucket") + 1)}{row_num_in_sheet}',
'values': [ 'values': [
[f'FEHLER Schaetzung: {str(e_ml)[:50]}...']]}) [f'FEHLER Schaetzung: {str(e_ml)[:50]}...']]})
@@ -763,7 +763,7 @@ class DataProcessor:
if version_col_idx is not None: if version_col_idx is not None:
updates.append( updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(version_col_idx + 1)}{row_num_in_sheet}', 'range': f'{_get_col_letter(version_col_idx + 1)}{row_num_in_sheet}',
'values': [ 'values': [
[ [
getattr( getattr(
@@ -778,7 +778,7 @@ class DataProcessor:
# KORRIGIERT: Nutze die sichere get_col_idx Funktion # KORRIGIERT: Nutze die sichere get_col_idx Funktion
reeval_col_idx = get_col_idx("ReEval Flag") reeval_col_idx = get_col_idx("ReEval Flag")
if reeval_col_idx is not None: if reeval_col_idx is not None:
flag_col_letter = self.sheet_handler._get_col_letter( flag_col_letter = _get_col_letter(
reeval_col_idx + 1) reeval_col_idx + 1)
if flag_col_letter: if flag_col_letter:
updates.append( updates.append(
@@ -848,11 +848,11 @@ class DataProcessor:
return return
# --- 2. Spalten-Indizes und Buchstaben vorbereiten --- # --- 2. Spalten-Indizes und Buchstaben vorbereiten ---
rohtext_col_letter = self.sheet_handler._get_col_letter(get_col_idx("Website Rohtext") + 1) rohtext_col_letter = _get_col_letter(get_col_idx("Website Rohtext") + 1)
metadetails_col_letter = self.sheet_handler._get_col_letter(get_col_idx("Website Meta-Details") + 1) metadetails_col_letter = _get_col_letter(get_col_idx("Website Meta-Details") + 1)
pruefstatus_col_letter = self.sheet_handler._get_col_letter(get_col_idx("URL Prüfstatus") + 1) # NEU pruefstatus_col_letter = _get_col_letter(get_col_idx("URL Prüfstatus") + 1) # NEU
version_col_letter = self.sheet_handler._get_col_letter(get_col_idx("Version") + 1) version_col_letter = _get_col_letter(get_col_idx("Version") + 1)
timestamp_col_letter = self.sheet_handler._get_col_letter(get_col_idx("Website Scrape Timestamp") + 1) timestamp_col_letter = _get_col_letter(get_col_idx("Website Scrape Timestamp") + 1)
# --- 3. Tasks sammeln --- # --- 3. Tasks sammeln ---
processing_batch_size = getattr(Config, 'PROCESSING_BATCH_SIZE', 20) processing_batch_size = getattr(Config, 'PROCESSING_BATCH_SIZE', 20)
@@ -1351,10 +1351,10 @@ class DataProcessor:
# Ihre bestehende Update-Logik, aber mit der sicheren get_col_idx Funktion # Ihre bestehende Update-Logik, aber mit der sicheren get_col_idx Funktion
updates_for_row = [ updates_for_row = [
{'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Chat Wiki Konsistenzpruefung") + 1)}{current_row_num}', 'values': [[verification_result.get("consistency")]]}, {'range': f'{_get_col_letter(get_col_idx("Chat Wiki Konsistenzpruefung") + 1)}{current_row_num}', 'values': [[verification_result.get("consistency")]]},
{'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Chat Begründung Wiki Inkonsistenz") + 1)}{current_row_num}', 'values': [[verification_result.get("justification")]]}, {'range': f'{_get_col_letter(get_col_idx("Chat Begründung Wiki Inkonsistenz") + 1)}{current_row_num}', 'values': [[verification_result.get("justification")]]},
{'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Chat Vorschlag Wiki Artikel") + 1)}{current_row_num}', 'values': [[final_suggested_url]]}, {'range': f'{_get_col_letter(get_col_idx("Chat Vorschlag Wiki Artikel") + 1)}{current_row_num}', 'values': [[final_suggested_url]]},
{'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Wiki Verif. Timestamp") + 1)}{current_row_num}', 'values': [[now_timestamp]]} {'range': f'{_get_col_letter(get_col_idx("Wiki Verif. Timestamp") + 1)}{current_row_num}', 'values': [[now_timestamp]]}
] ]
all_updates.extend(updates_for_row) all_updates.extend(updates_for_row)
@@ -1444,13 +1444,13 @@ class DataProcessor:
techniker_bucket_ml=self._get_cell_value_safe(row_data, "Geschaetzter Techniker Bucket") techniker_bucket_ml=self._get_cell_value_safe(row_data, "Geschaetzter Techniker Bucket")
) )
all_sheet_updates.append({'range': f'{self.sheet_handler._get_col_letter(get_col_idx("FSM Pitch") + 1)}{row_num}', 'values': [[fsm_pitch_text]]}) all_sheet_updates.append({'range': f'{_get_col_letter(get_col_idx("FSM Pitch") + 1)}{row_num}', 'values': [[fsm_pitch_text]]})
except Exception as e: except Exception as e:
self.logger.error(f"FEHLER bei FSM-Pitch-Generierung für Zeile {row_num}: {e}") self.logger.error(f"FEHLER bei FSM-Pitch-Generierung für Zeile {row_num}: {e}")
all_sheet_updates.append({'range': f'{self.sheet_handler._get_col_letter(get_col_idx("FSM Pitch") + 1)}{row_num}', 'values': [['FEHLER (Generierung)']]} ) all_sheet_updates.append({'range': f'{_get_col_letter(get_col_idx("FSM Pitch") + 1)}{row_num}', 'values': [['FEHLER (Generierung)']]} )
# IMMER den Timestamp setzen, auch bei Fehler, um Endlosschleifen zu vermeiden # IMMER den Timestamp setzen, auch bei Fehler, um Endlosschleifen zu vermeiden
all_sheet_updates.append({'range': f'{self.sheet_handler._get_col_letter(get_col_idx("FSM Pitch Timestamp") + 1)}{row_num}', 'values': [[now_timestamp]]}) all_sheet_updates.append({'range': f'{_get_col_letter(get_col_idx("FSM Pitch Timestamp") + 1)}{row_num}', 'values': [[now_timestamp]]})
processed_count += 1 processed_count += 1
# Batch-Update Logik # Batch-Update Logik
@@ -1528,18 +1528,18 @@ class DataProcessor:
row_num = task['row_num'] row_num = task['row_num']
result = results_by_row.get(row_num) result = results_by_row.get(row_num)
if result: if result:
all_sheet_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Vorschlag Branche"]["index"] + 1)}{row_num}', 'values': [[result.get('Branche')]]}) all_sheet_updates.append({'range': f'{_get_col_letter(COLUMN_MAP["Chat Vorschlag Branche"]["index"] + 1)}{row_num}', 'values': [[result.get('Branche')]]})
all_sheet_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Branche Konfidenz"]["index"] + 1)}{row_num}', 'values': [[result.get('Konfidenz')]]}) all_sheet_updates.append({'range': f'{_get_col_letter(COLUMN_MAP["Chat Branche Konfidenz"]["index"] + 1)}{row_num}', 'values': [[result.get('Konfidenz')]]})
all_sheet_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Begruendung Abweichung Branche"]["index"] + 1)}{row_num}', 'values': [[result.get('Begruendung')]]}) all_sheet_updates.append({'range': f'{_get_col_letter(COLUMN_MAP["Chat Begruendung Abweichung Branche"]["index"] + 1)}{row_num}', 'values': [[result.get('Begruendung')]]})
else: else:
all_sheet_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Vorschlag Branche"]["index"] + 1)}{row_num}', 'values': [['FEHLER (Batch-Antwort)']]} ) all_sheet_updates.append({'range': f'{_get_col_letter(COLUMN_MAP["Chat Vorschlag Branche"]["index"] + 1)}{row_num}', 'values': [['FEHLER (Batch-Antwort)']]} )
all_sheet_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Timestamp letzte Pruefung"]["index"] + 1)}{row_num}', 'values': [[now_timestamp]]}) all_sheet_updates.append({'range': f'{_get_col_letter(COLUMN_MAP["Timestamp letzte Pruefung"]["index"] + 1)}{row_num}', 'values': [[now_timestamp]]})
else: else:
self.logger.error(f"Batch-Verarbeitung fehlgeschlagen. Setze Fehlerstatus.") self.logger.error(f"Batch-Verarbeitung fehlgeschlagen. Setze Fehlerstatus.")
for task in batch_tasks: for task in batch_tasks:
row_num = task['row_num'] row_num = task['row_num']
all_sheet_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Vorschlag Branche"]["index"] + 1)}{row_num}', 'values': [['FEHLER (Batch-API)']]} ) all_sheet_updates.append({'range': f'{_get_col_letter(COLUMN_MAP["Chat Vorschlag Branche"]["index"] + 1)}{row_num}', 'values': [['FEHLER (Batch-API)']]} )
all_sheet_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Timestamp letzte Pruefung"]["index"] + 1)}{row_num}', 'values': [[now_timestamp]]}) all_sheet_updates.append({'range': f'{_get_col_letter(COLUMN_MAP["Timestamp letzte Pruefung"]["index"] + 1)}{row_num}', 'values': [[now_timestamp]]})
if all_sheet_updates: if all_sheet_updates:
self.logger.info(f"Sende finales Batch-Update für {len(tasks)} bewertete Branchen...") self.logger.info(f"Sende finales Batch-Update für {len(tasks)} bewertete Branchen...")
@@ -1920,13 +1920,13 @@ class DataProcessor:
# Ermitteln Sie die Spaltenbuchstaben fuer Updates und Leerung (nutzt # Ermitteln Sie die Spaltenbuchstaben fuer Updates und Leerung (nutzt
# interne Helfer _get_col_letter Block 14) # interne Helfer _get_col_letter Block 14)
ts_ax_letter = self.sheet_handler._get_col_letter( ts_ax_letter = _get_col_letter(
col_indices["Wiki Verif. Timestamp"] + 1) # Timestamp zu setzen (AX) col_indices["Wiki Verif. Timestamp"] + 1) # Timestamp zu setzen (AX)
s_letter = self.sheet_handler._get_col_letter( s_letter = _get_col_letter(
col_indices["Chat Wiki Konsistenzpruefung"] + 1) # Status S col_indices["Chat Wiki Konsistenzpruefung"] + 1) # Status S
t_letter = self.sheet_handler._get_col_letter( t_letter = _get_col_letter(
col_indices["Chat Begründung Wiki Inkonsistenz"] + 1) # Begruendung T col_indices["Chat Begründung Wiki Inkonsistenz"] + 1) # Begruendung T
u_letter = self.sheet_handler._get_col_letter( u_letter = _get_col_letter(
col_indices["Chat Vorschlag Wiki Artikel"] + 1) # Vorschlag U col_indices["Chat Vorschlag Wiki Artikel"] + 1) # Vorschlag U
# Spalten V-Y leeren (werden in diesem Modus nicht neu befuellt). # Spalten V-Y leeren (werden in diesem Modus nicht neu befuellt).
@@ -1936,8 +1936,8 @@ class DataProcessor:
# Block 1 Column Map # Block 1 Column Map
y_idx = col_indices["Chat Begruendung Abweichung Branche"] y_idx = col_indices["Chat Begruendung Abweichung Branche"]
# Erstellen Sie den Bereichsnamen (z.B. "V:Y") # Erstellen Sie den Bereichsnamen (z.B. "V:Y")
v_letter = self.sheet_handler._get_col_letter(v_idx + 1) v_letter = _get_col_letter(v_idx + 1)
y_letter = self.sheet_handler._get_col_letter(y_idx + 1) y_letter = _get_col_letter(y_idx + 1)
v_y_range_letter = f'{v_letter}:{y_letter}' # z.B. V:Y v_y_range_letter = f'{v_letter}:{y_letter}' # z.B. V:Y
# Erstellen Sie eine Liste von leeren Strings fuer diesen Bereich # Erstellen Sie eine Liste von leeren Strings fuer diesen Bereich
# Anzahl der Spalten = Y_Index - V_Index + 1 # Anzahl der Spalten = Y_Index - V_Index + 1
@@ -1947,14 +1947,14 @@ class DataProcessor:
# Diese werden von anderen Schritten gesetzt und sollen hier zurueckgesetzt werden, # Diese werden von anderen Schritten gesetzt und sollen hier zurueckgesetzt werden,
# um sicherzustellen, dass die Zeile bei Bedarf von diesen anderen # um sicherzustellen, dass die Zeile bei Bedarf von diesen anderen
# Schritten erneut bearbeitet wird. # Schritten erneut bearbeitet wird.
an_letter = self.sheet_handler._get_col_letter( an_letter = _get_col_letter(
col_indices["Wikipedia Timestamp"] + 1) # AN (Wiki Extraction TS) col_indices["Wikipedia Timestamp"] + 1) # AN (Wiki Extraction TS)
ao_letter = self.sheet_handler._get_col_letter( ao_letter = _get_col_letter(
col_indices["Timestamp letzte Pruefung"] + col_indices["Timestamp letzte Pruefung"] +
1) # AO (Chat Evaluation TS) 1) # AO (Chat Evaluation TS)
ap_letter = self.sheet_handler._get_col_letter( ap_letter = _get_col_letter(
col_indices["Version"] + 1) # AP (Version) col_indices["Version"] + 1) # AP (Version)
ay_letter = self.sheet_handler._get_col_letter( ay_letter = _get_col_letter(
col_indices["SerpAPI Wiki Search Timestamp"] + col_indices["SerpAPI Wiki Search Timestamp"] +
1) # AY (SerpAPI Wiki TS) 1) # AY (SerpAPI Wiki TS)
@@ -2365,10 +2365,10 @@ class DataProcessor:
return return
# --- 2. Spalten-Indizes und Buchstaben vorbereiten --- # --- 2. Spalten-Indizes und Buchstaben vorbereiten ---
summary_col_letter = self.sheet_handler._get_col_letter(get_col_idx("Website Zusammenfassung") + 1) summary_col_letter = _get_col_letter(get_col_idx("Website Zusammenfassung") + 1)
version_col_letter = self.sheet_handler._get_col_letter(get_col_idx("Version") + 1) version_col_letter = _get_col_letter(get_col_idx("Version") + 1)
# Wir benötigen auch einen Timestamp für die Zusammenfassung. Da keiner existiert, nutzen wir den Scrape-Timestamp neu. # Wir benötigen auch einen Timestamp für die Zusammenfassung. Da keiner existiert, nutzen wir den Scrape-Timestamp neu.
timestamp_col_letter = self.sheet_handler._get_col_letter(get_col_idx("Website Scrape Timestamp") + 1) timestamp_col_letter = _get_col_letter(get_col_idx("Website Scrape Timestamp") + 1)
# --- 3. Tasks sammeln --- # --- 3. Tasks sammeln ---
@@ -2657,7 +2657,7 @@ class DataProcessor:
self.logger.debug(f" Zeile {rn} (Ergebnis): {res}") self.logger.debug(f" Zeile {rn} (Ergebnis): {res}")
updates_this_batch.append( updates_this_batch.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Chat Vorschlag Branche") + 1)}{rn}', 'range': f'{_get_col_letter(get_col_idx("Chat Vorschlag Branche") + 1)}{rn}',
'values': [ 'values': [
[ [
res.get( res.get(
@@ -2665,7 +2665,7 @@ class DataProcessor:
"ERR BR")]]}) "ERR BR")]]})
updates_this_batch.append( updates_this_batch.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Chat Branche Konfidenz") + 1)}{rn}', 'range': f'{_get_col_letter(get_col_idx("Chat Branche Konfidenz") + 1)}{rn}',
'values': [ 'values': [
[ [
res.get( res.get(
@@ -2673,7 +2673,7 @@ class DataProcessor:
"N/A CO")]]}) "N/A CO")]]})
updates_this_batch.append( updates_this_batch.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Chat Konsistenz Branche") + 1)}{rn}', 'range': f'{_get_col_letter(get_col_idx("Chat Konsistenz Branche") + 1)}{rn}',
'values': [ 'values': [
[ [
res.get( res.get(
@@ -2681,7 +2681,7 @@ class DataProcessor:
"err CO")]]}) "err CO")]]})
updates_this_batch.append( updates_this_batch.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Chat Begruendung Abweichung Branche") + 1)}{rn}', 'range': f'{_get_col_letter(get_col_idx("Chat Begruendung Abweichung Branche") + 1)}{rn}',
'values': [ 'values': [
[ [
res.get( res.get(
@@ -2689,12 +2689,12 @@ class DataProcessor:
"No JU")]]}) "No JU")]]})
updates_this_batch.append( updates_this_batch.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Timestamp letzte Pruefung") + 1)}{rn}', 'range': f'{_get_col_letter(get_col_idx("Timestamp letzte Pruefung") + 1)}{rn}',
'values': [ 'values': [
[ts]]}) [ts]]})
updates_this_batch.append( updates_this_batch.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Version") + 1)}{rn}', 'range': f'{_get_col_letter(get_col_idx("Version") + 1)}{rn}',
'values': [ 'values': [
[ver]]}) [ver]]})
@@ -2948,12 +2948,12 @@ class DataProcessor:
# Ermitteln Sie die Spaltenbuchstaben fuer Updates und Leerung (nutzt # Ermitteln Sie die Spaltenbuchstaben fuer Updates und Leerung (nutzt
# interne Helfer _get_col_letter Block 14) # interne Helfer _get_col_letter Block 14)
ts_ay_letter = self.sheet_handler._get_col_letter( ts_ay_letter = _get_col_letter(
col_indices["SerpAPI Wiki Search Timestamp"] + col_indices["SerpAPI Wiki Search Timestamp"] +
1) # Timestamp zu setzen (AY) 1) # Timestamp zu setzen (AY)
m_letter = self.sheet_handler._get_col_letter( m_letter = _get_col_letter(
col_indices["Wiki URL"] + 1) # Wiki URL Spalte (M) col_indices["Wiki URL"] + 1) # Wiki URL Spalte (M)
a_letter = self.sheet_handler._get_col_letter( a_letter = _get_col_letter(
col_indices["ReEval Flag"] + 1) # ReEval Flag (A) col_indices["ReEval Flag"] + 1) # ReEval Flag (A)
# Spalten N-V leeren. # Spalten N-V leeren.
@@ -2961,22 +2961,22 @@ class DataProcessor:
n_idx = col_indices["Wiki Absatz"] n_idx = col_indices["Wiki Absatz"]
v_idx = col_indices["Begruendung bei Abweichung"] v_idx = col_indices["Begruendung bei Abweichung"]
# Erstellen Sie den Bereichsnamen (z.B. "N:V") # Erstellen Sie den Bereichsnamen (z.B. "N:V")
n_letter = self.sheet_handler._get_col_letter(n_idx + 1) n_letter = _get_col_letter(n_idx + 1)
v_letter = self.sheet_handler._get_col_letter(v_idx + 1) v_letter = _get_col_letter(v_idx + 1)
nv_range_letter = f'{n_letter}:{v_letter}' # z.B. N:V nv_range_letter = f'{n_letter}:{v_letter}' # z.B. N:V
# Erstellen Sie eine Liste von leeren Strings fuer diesen Bereich # Erstellen Sie eine Liste von leeren Strings fuer diesen Bereich
# Anzahl der Spalten = V_Index - N_Index + 1 # Anzahl der Spalten = V_Index - N_Index + 1
empty_nv_values = [''] * (v_idx - n_idx + 1) empty_nv_values = [''] * (v_idx - n_idx + 1)
# Timestamps AN, AO, AP, AX leeren. # Timestamps AN, AO, AP, AX leeren.
an_letter = self.sheet_handler._get_col_letter( an_letter = _get_col_letter(
col_indices["Wikipedia Timestamp"] + 1) # AN (Wiki Extraction TS) col_indices["Wikipedia Timestamp"] + 1) # AN (Wiki Extraction TS)
ao_letter = self.sheet_handler._get_col_letter( ao_letter = _get_col_letter(
col_indices["Timestamp letzte Pruefung"] + col_indices["Timestamp letzte Pruefung"] +
1) # AO (Chat Evaluation TS) 1) # AO (Chat Evaluation TS)
ap_letter = self.sheet_handler._get_col_letter( ap_letter = _get_col_letter(
col_indices["Version"] + 1) # AP (Version) col_indices["Version"] + 1) # AP (Version)
ax_letter = self.sheet_handler._get_col_letter( ax_letter = _get_col_letter(
col_indices["Wiki Verif. Timestamp"] + 1) # AX (Wiki Verif. TS) col_indices["Wiki Verif. Timestamp"] + 1) # AX (Wiki Verif. TS)
# --- Verarbeitung --- # --- Verarbeitung ---
@@ -3345,15 +3345,15 @@ class DataProcessor:
# Ermitteln Sie die Spaltenbuchstaben fuer Updates (AI-AL, AM) (nutzt # Ermitteln Sie die Spaltenbuchstaben fuer Updates (AI-AL, AM) (nutzt
# interne Helfer _get_col_letter Block 14) # interne Helfer _get_col_letter Block 14)
ts_am_letter = self.sheet_handler._get_col_letter( ts_am_letter = _get_col_letter(
col_indices["Contact Search Timestamp"] + 1) # AM col_indices["Contact Search Timestamp"] + 1) # AM
ai_letter = self.sheet_handler._get_col_letter( ai_letter = _get_col_letter(
col_indices["Linked Serviceleiter gefunden"] + 1) # AI col_indices["Linked Serviceleiter gefunden"] + 1) # AI
aj_letter = self.sheet_handler._get_col_letter( aj_letter = _get_col_letter(
col_indices["Linked It-Leiter gefunden"] + 1) # AJ col_indices["Linked It-Leiter gefunden"] + 1) # AJ
ak_letter = self.sheet_handler._get_col_letter( ak_letter = _get_col_letter(
col_indices["Linked Management gefunden"] + 1) # AK col_indices["Linked Management gefunden"] + 1) # AK
al_letter = self.sheet_handler._get_col_letter( al_letter = _get_col_letter(
col_indices["Linked Disponent gefunden"] + 1) # AL col_indices["Linked Disponent gefunden"] + 1) # AL
# Positionen, nach denen gesucht wird (kann in Config verschoben werden Block 1) # Positionen, nach denen gesucht wird (kann in Config verschoben werden Block 1)
@@ -3408,7 +3408,7 @@ class DataProcessor:
# (Block 14) # (Block 14)
contacts_sheet.update( contacts_sheet.update(
values=[contacts_header], values=[contacts_header],
range_name=f"A1:{self.sheet_handler._get_col_letter(num_cols_contacts_sheet)}1") range_name=f"A1:{_get_col_letter(num_cols_contacts_sheet)}1")
# <<< GEÄNDERT # <<< GEÄNDERT
self.logger.info( self.logger.info(
"Neues Blatt 'Contacts' erstellt und Header eingetragen.") "Neues Blatt 'Contacts' erstellt und Header eingetragen.")
@@ -3860,24 +3860,24 @@ class DataProcessor:
f"FEHLER: Benoetigte Spaltenschluessel fehlen in COLUMN_MAP fuer process_url_check: {missing}. Breche ab.") f"FEHLER: Benoetigte Spaltenschluessel fehlen in COLUMN_MAP fuer process_url_check: {missing}. Breche ab.")
return return
ar_letter = self.sheet_handler._get_col_letter( ar_letter = _get_col_letter(
col_indices["Website Rohtext"] + 1) col_indices["Website Rohtext"] + 1)
d_letter = self.sheet_handler._get_col_letter( d_letter = _get_col_letter(
col_indices["CRM Website"] + 1) col_indices["CRM Website"] + 1)
a_letter = self.sheet_handler._get_col_letter( a_letter = _get_col_letter(
col_indices["ReEval Flag"] + 1) col_indices["ReEval Flag"] + 1)
at_letter = self.sheet_handler._get_col_letter( at_letter = _get_col_letter(
col_indices["Website Scrape Timestamp"] + 1) col_indices["Website Scrape Timestamp"] + 1)
ao_letter = self.sheet_handler._get_col_letter( ao_letter = _get_col_letter(
col_indices["Timestamp letzte Pruefung"] + 1) col_indices["Timestamp letzte Pruefung"] + 1)
an_letter = self.sheet_handler._get_col_letter( an_letter = _get_col_letter(
col_indices["Wikipedia Timestamp"] + 1) col_indices["Wikipedia Timestamp"] + 1)
ax_letter = self.sheet_handler._get_col_letter( ax_letter = _get_col_letter(
col_indices["Wiki Verif. Timestamp"] + 1) col_indices["Wiki Verif. Timestamp"] + 1)
ay_letter = self.sheet_handler._get_col_letter( ay_letter = _get_col_letter(
col_indices["SerpAPI Wiki Search Timestamp"] + col_indices["SerpAPI Wiki Search Timestamp"] +
1) # Timestamp dieser Funktion 1) # Timestamp dieser Funktion
ap_letter = self.sheet_handler._get_col_letter( ap_letter = _get_col_letter(
col_indices["Version"] + 1) col_indices["Version"] + 1)
ka_error_patterns = [ ka_error_patterns = [
@@ -4131,11 +4131,11 @@ class DataProcessor:
self.logger.info( self.logger.info(
f"Zeile {row_num_sheet}: SITZ-UPDATE. Input: '{input_sitz_string[:60]}...' Alt: '{aktuelle_stadt} / {aktuelle_land}' -> Neu: '{neue_stadt} / {neues_land}'") f"Zeile {row_num_sheet}: SITZ-UPDATE. Input: '{input_sitz_string[:60]}...' Alt: '{aktuelle_stadt} / {aktuelle_land}' -> Neu: '{neue_stadt} / {neues_land}'")
updates_fuer_sheet.append({ updates_fuer_sheet.append({
'range': f'{self.sheet_handler._get_col_letter(stadt_col_idx + 1)}{row_num_sheet}', 'range': f'{_get_col_letter(stadt_col_idx + 1)}{row_num_sheet}',
'values': [[neue_stadt]] 'values': [[neue_stadt]]
}) })
updates_fuer_sheet.append({ updates_fuer_sheet.append({
'range': f'{self.sheet_handler._get_col_letter(land_col_idx + 1)}{row_num_sheet}', 'range': f'{_get_col_letter(land_col_idx + 1)}{row_num_sheet}',
'values': [[neues_land]] 'values': [[neues_land]]
}) })
updated_rows_count += 1 updated_rows_count += 1
@@ -4515,12 +4515,12 @@ class DataProcessor:
current_row_updates.append( current_row_updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Finaler Umsatz (Wiki>CRM)") + 1)}{row_num_sheet}', 'range': f'{_get_col_letter(get_col_idx("Finaler Umsatz (Wiki>CRM)") + 1)}{row_num_sheet}',
'values': [ 'values': [
[final_umsatz_str_konsolidiert]]}) [final_umsatz_str_konsolidiert]]})
current_row_updates.append( current_row_updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Finaler Mitarbeiter (Wiki>CRM)") + 1)}{row_num_sheet}', 'range': f'{_get_col_letter(get_col_idx("Finaler Mitarbeiter (Wiki>CRM)") + 1)}{row_num_sheet}',
'values': [ 'values': [
[final_ma_str_konsolidiert]]}) [final_ma_str_konsolidiert]]})
@@ -4544,7 +4544,7 @@ class DataProcessor:
current_row_updates.append( current_row_updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Plausibilität Umsatz") + 1)}{row_num_sheet}', 'range': f'{_get_col_letter(get_col_idx("Plausibilität Umsatz") + 1)}{row_num_sheet}',
'values': [ 'values': [
[ [
plausi_results.get( plausi_results.get(
@@ -4552,7 +4552,7 @@ class DataProcessor:
"ERR_FLAG")]]}) "ERR_FLAG")]]})
current_row_updates.append( current_row_updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Plausibilität Mitarbeiter") + 1)}{row_num_sheet}', 'range': f'{_get_col_letter(get_col_idx("Plausibilität Mitarbeiter") + 1)}{row_num_sheet}',
'values': [ 'values': [
[ [
plausi_results.get( plausi_results.get(
@@ -4560,7 +4560,7 @@ class DataProcessor:
"ERR_FLAG")]]}) "ERR_FLAG")]]})
current_row_updates.append( current_row_updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Plausibilität Umsatz/MA Ratio") + 1)}{row_num_sheet}', 'range': f'{_get_col_letter(get_col_idx("Plausibilität Umsatz/MA Ratio") + 1)}{row_num_sheet}',
'values': [ 'values': [
[ [
plausi_results.get( plausi_results.get(
@@ -4568,7 +4568,7 @@ class DataProcessor:
"ERR_FLAG")]]}) "ERR_FLAG")]]})
current_row_updates.append( current_row_updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Abweichung Umsatz CRM/Wiki") + 1)}{row_num_sheet}', 'range': f'{_get_col_letter(get_col_idx("Abweichung Umsatz CRM/Wiki") + 1)}{row_num_sheet}',
'values': [ 'values': [
[ [
plausi_results.get( plausi_results.get(
@@ -4576,7 +4576,7 @@ class DataProcessor:
"ERR_FLAG")]]}) "ERR_FLAG")]]})
current_row_updates.append( current_row_updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Abweichung MA CRM/Wiki") + 1)}{row_num_sheet}', 'range': f'{_get_col_letter(get_col_idx("Abweichung MA CRM/Wiki") + 1)}{row_num_sheet}',
'values': [ 'values': [
[ [
plausi_results.get( plausi_results.get(
@@ -4584,7 +4584,7 @@ class DataProcessor:
"ERR_FLAG")]]}) "ERR_FLAG")]]})
current_row_updates.append( current_row_updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Plausibilität Begründung") + 1)}{row_num_sheet}', 'range': f'{_get_col_letter(get_col_idx("Plausibilität Begründung") + 1)}{row_num_sheet}',
'values': [ 'values': [
[ [
plausi_results.get( plausi_results.get(
@@ -4602,12 +4602,12 @@ class DataProcessor:
"Abweichung MA CRM/Wiki"]: "Abweichung MA CRM/Wiki"]:
current_row_updates.append( current_row_updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP[key_flag] + 1)}{row_num_sheet}', 'range': f'{_get_col_letter(COLUMN_MAP[key_flag] + 1)}{row_num_sheet}',
'values': [ 'values': [
['FEHLER_CALL']]}) ['FEHLER_CALL']]})
current_row_updates.append( current_row_updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Plausibilität Begründung") + 1)}{row_num_sheet}', 'range': f'{_get_col_letter(get_col_idx("Plausibilität Begründung") + 1)}{row_num_sheet}',
'values': [ 'values': [
[f"Systemfehler: {str(e_plausi_run_batch)[:100]}"]]}) [f"Systemfehler: {str(e_plausi_run_batch)[:100]}"]]})
else: # Fehler bei Konsolidierung else: # Fehler bei Konsolidierung
@@ -4621,18 +4621,18 @@ class DataProcessor:
"Abweichung MA CRM/Wiki"]: "Abweichung MA CRM/Wiki"]:
current_row_updates.append( current_row_updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP[key_flag] + 1)}{row_num_sheet}', 'range': f'{_get_col_letter(COLUMN_MAP[key_flag] + 1)}{row_num_sheet}',
'values': [ 'values': [
['INPUT_FEHLER_KONSO']]}) ['INPUT_FEHLER_KONSO']]})
current_row_updates.append( current_row_updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Plausibilität Begründung") + 1)}{row_num_sheet}', 'range': f'{_get_col_letter(get_col_idx("Plausibilität Begründung") + 1)}{row_num_sheet}',
'values': [ 'values': [
["Konsolidierung fehlgeschlagen"]]}) ["Konsolidierung fehlgeschlagen"]]})
current_row_updates.append( current_row_updates.append(
{ {
'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Plausibilität Prüfdatum") + 1)}{row_num_sheet}', 'range': f'{_get_col_letter(get_col_idx("Plausibilität Prüfdatum") + 1)}{row_num_sheet}',
'values': [ 'values': [
[now_timestamp_str]]}) [now_timestamp_str]]})
@@ -4862,11 +4862,11 @@ class DataProcessor:
f"FEHLER: Spaltenschlüssel für Parent Suggestion Batch fehlen: {missing}. Abbruch.") f"FEHLER: Spaltenschlüssel für Parent Suggestion Batch fehlen: {missing}. Abbruch.")
return return
col_o_letter = self.sheet_handler._get_col_letter( col_o_letter = _get_col_letter(
COLUMN_MAP[col_o_key] + 1) COLUMN_MAP[col_o_key] + 1)
col_p_letter = self.sheet_handler._get_col_letter( col_p_letter = _get_col_letter(
COLUMN_MAP[col_p_key] + 1) COLUMN_MAP[col_p_key] + 1)
col_q_letter = self.sheet_handler._get_col_letter( col_q_letter = _get_col_letter(
COLUMN_MAP[col_q_key] + 1) COLUMN_MAP[col_q_key] + 1)
openai_sem = threading.Semaphore( openai_sem = threading.Semaphore(
@@ -5874,15 +5874,15 @@ class DataProcessor:
"FEHLER: Weder 'Website Details' noch 'Website Rohtext' Spaltenindex in COLUMN_MAP gefunden.") # <<< GEÄNDERT "FEHLER: Weder 'Website Details' noch 'Website Rohtext' Spaltenindex in COLUMN_MAP gefunden.") # <<< GEÄNDERT
return # Beende die Methode bei kritischem Fehler return # Beende die Methode bei kritischem Fehler
self.logger.warning( self.logger.warning(
f"Keine Spalte 'Website Details' in COLUMN_MAP, nutze '{details_col_key_for_logging}' ({self.sheet_handler._get_col_letter(details_col_idx+1)}) als Fallback.") # <<< GEÄNDERT f"Keine Spalte 'Website Details' in COLUMN_MAP, nutze '{details_col_key_for_logging}' ({_get_col_letter(details_col_idx+1)}) als Fallback.") # <<< GEÄNDERT
else: else:
# Logge die Verwendung der dedizierten Spalte # Logge die Verwendung der dedizierten Spalte
self.logger.info( self.logger.info(
f"Nutze Spalte '{details_col_key_for_logging}' ({self.sheet_handler._get_col_letter(details_col_idx+1)}) fuer Website Details.") # <<< GEÄNDERT f"Nutze Spalte '{details_col_key_for_logging}' ({_get_col_letter(details_col_idx+1)}) fuer Website Details.") # <<< GEÄNDERT
# Ermitteln Sie den Spaltenbuchstaben der Zielspalte (nutzt interne # Ermitteln Sie den Spaltenbuchstaben der Zielspalte (nutzt interne
# Helfer _get_col_letter Block 14) # Helfer _get_col_letter Block 14)
details_col_letter = self.sheet_handler._get_col_letter( details_col_letter = _get_col_letter(
details_col_idx + 1) details_col_idx + 1)
# --- Verarbeitung --- # --- Verarbeitung ---
@@ -6181,13 +6181,13 @@ class DataProcessor:
# Ermitteln Sie die Spaltenbuchstaben fuer Updates/Leerung (nutzt # Ermitteln Sie die Spaltenbuchstaben fuer Updates/Leerung (nutzt
# interne Helfer _get_col_letter Block 14) # interne Helfer _get_col_letter Block 14)
s_letter = self.sheet_handler._get_col_letter( s_letter = _get_col_letter(
col_indices["Chat Wiki Konsistenzpruefung"] + 1) # Status S col_indices["Chat Wiki Konsistenzpruefung"] + 1) # Status S
u_letter = self.sheet_handler._get_col_letter( u_letter = _get_col_letter(
col_indices["Chat Vorschlag Wiki Artikel"] + 1) # Vorschlag U col_indices["Chat Vorschlag Wiki Artikel"] + 1) # Vorschlag U
m_letter = self.sheet_handler._get_col_letter( m_letter = _get_col_letter(
col_indices["Wiki URL"] + 1) # Wiki URL M col_indices["Wiki URL"] + 1) # Wiki URL M
a_letter = self.sheet_handler._get_col_letter( a_letter = _get_col_letter(
col_indices["ReEval Flag"] + 1) # ReEval Flag A col_indices["ReEval Flag"] + 1) # ReEval Flag A
# Spalten N-V leeren. # Spalten N-V leeren.
@@ -6195,24 +6195,24 @@ class DataProcessor:
n_idx = col_indices["Wiki Absatz"] n_idx = col_indices["Wiki Absatz"]
v_idx = col_indices["Begruendung bei Abweichung"] v_idx = col_indices["Begruendung bei Abweichung"]
# Erstellen Sie den Bereichsnamen (z.B. "N:V") # Erstellen Sie den Bereichsnamen (z.B. "N:V")
n_letter = self.sheet_handler._get_col_letter(n_idx + 1) n_letter = _get_col_letter(n_idx + 1)
v_letter = self.sheet_handler._get_col_letter(v_idx + 1) v_letter = _get_col_letter(v_idx + 1)
nv_range_letter = f'{n_letter}:{v_letter}' # z.B. N:V nv_range_letter = f'{n_letter}:{v_letter}' # z.B. N:V
# Erstellen Sie eine Liste von leeren Strings fuer diesen Bereich # Erstellen Sie eine Liste von leeren Strings fuer diesen Bereich
# Anzahl der Spalten = V_Index - N_Index + 1 # Anzahl der Spalten = V_Index - N_Index + 1
empty_nv_values = [''] * (v_idx - n_idx + 1) empty_nv_values = [''] * (v_idx - n_idx + 1)
# Timestamps AN, AO, AX, AP, AY leeren. # Timestamps AN, AO, AX, AP, AY leeren.
an_letter = self.sheet_handler._get_col_letter( an_letter = _get_col_letter(
col_indices["Wikipedia Timestamp"] + 1) # AN (Wiki Extraction TS) col_indices["Wikipedia Timestamp"] + 1) # AN (Wiki Extraction TS)
ao_letter = self.sheet_handler._get_col_letter( ao_letter = _get_col_letter(
col_indices["Timestamp letzte Pruefung"] + col_indices["Timestamp letzte Pruefung"] +
1) # AO (Chat Evaluation TS) 1) # AO (Chat Evaluation TS)
ap_letter = self.sheet_handler._get_col_letter( ap_letter = _get_col_letter(
col_indices["Version"] + 1) # AP (Version) col_indices["Version"] + 1) # AP (Version)
ax_letter = self.sheet_handler._get_col_letter( ax_letter = _get_col_letter(
col_indices["Wiki Verif. Timestamp"] + 1) # AX (Wiki Verif. TS) col_indices["Wiki Verif. Timestamp"] + 1) # AX (Wiki Verif. TS)
ay_letter = self.sheet_handler._get_col_letter( ay_letter = _get_col_letter(
col_indices["SerpAPI Wiki Search Timestamp"] + col_indices["SerpAPI Wiki Search Timestamp"] +
1) # AY (SerpAPI Wiki TS) 1) # AY (SerpAPI Wiki TS)