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 459acedcb1
commit 34ce2c5d32

View File

@@ -265,7 +265,7 @@ class DataProcessor:
website_url = new_website
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': [
[website_url]]})
url_pruefstatus = "URL_OK_SERP"
@@ -294,12 +294,12 @@ class DataProcessor:
website_raw, company_name) or "k.A. (Keine Zusammenfassung erhalten)"
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': [
[website_meta_details]]})
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': [
[website_summary]]})
else:
@@ -308,12 +308,12 @@ class DataProcessor:
website_summary, website_meta_details = "k.A.", "k.A."
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': [
[website_summary]]})
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': [
[website_meta_details]]})
except Exception as e_scrape_web:
@@ -323,17 +323,17 @@ class DataProcessor:
url_pruefstatus = "URL_SCRAPE_ERROR"
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': [
[website_summary]]})
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': [
[website_meta_details]]})
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': [
[website_raw]]})
else:
@@ -344,28 +344,28 @@ class DataProcessor:
url_pruefstatus = "URL_MISSING"
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': [
[website_raw]]})
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': [
[website_summary]]})
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': [
[website_meta_details]]})
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': [
[url_pruefstatus]]})
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': [
[now_timestamp]]})
@@ -444,9 +444,9 @@ class DataProcessor:
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.')
)
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'{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'{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("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 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("Wiki Verif. Timestamp") + 1)}{row_num_in_sheet}', 'values': [[now_timestamp]]})
# --- Finales Schreiben ins Sheet ---
key_mapping = {
@@ -457,9 +457,9 @@ class DataProcessor:
for sheet_col_name, data_key in key_mapping.items():
col_idx = get_col_idx(sheet_col_name)
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 ---
run_chat_step = 'chat' in steps_to_run
@@ -505,10 +505,10 @@ class DataProcessor:
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'{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'{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'{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 Vorschlag Branche") + 1)}{row_num_in_sheet}', 'values': [[branch_result.get('branch', 'FEHLER')]]})
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'{_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 Begruendung Abweichung Branche") + 1)}{row_num_in_sheet}', 'values': [[branch_result.get('justification', 'k.A.')]]})
except Exception as 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"])
if col_idx is not None:
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"]]]
})
@@ -549,13 +549,13 @@ class DataProcessor:
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'{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") + 1)}{row_num_in_sheet}', 'values': [[fsm_pitch_text]]})
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
chat_eval_just_ran = True # Signal, dass eine KI-Aktion stattfand
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}")
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.'
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': [
[final_umsatz_str_konsolidiert]]})
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': [
[final_ma_str_konsolidiert]]})
except Exception as e_consolidate:
@@ -614,12 +614,12 @@ class DataProcessor:
final_umsatz_str_konsolidiert, final_ma_str_konsolidiert = "FEHLER_KONSO", "FEHLER_KONSO"
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': [
['FEHLER_KONSO']]})
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': [
['FEHLER_KONSO']]})
@@ -653,7 +653,7 @@ class DataProcessor:
plausi_input_data)
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': [
[
plausi_results.get(
@@ -661,7 +661,7 @@ class DataProcessor:
"ERR_FLAG")]]})
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': [
[
plausi_results.get(
@@ -669,7 +669,7 @@ class DataProcessor:
"ERR_FLAG")]]})
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': [
[
plausi_results.get(
@@ -677,7 +677,7 @@ class DataProcessor:
"ERR_FLAG")]]})
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': [
[
plausi_results.get(
@@ -685,7 +685,7 @@ class DataProcessor:
"ERR_FLAG")]]})
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': [
[
plausi_results.get(
@@ -693,7 +693,7 @@ class DataProcessor:
"ERR_FLAG")]]})
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': [
[
plausi_results.get(
@@ -705,12 +705,12 @@ class DataProcessor:
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': [
[now_timestamp]]})
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': [
[now_timestamp]]})
@@ -730,7 +730,7 @@ class DataProcessor:
str) and not predicted_bucket.startswith("FEHLER"):
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': [
[predicted_bucket]]})
self.logger.info(
@@ -740,7 +740,7 @@ class DataProcessor:
f" -> ML-Schaetzung lieferte kein gueltiges Ergebnis: '{predicted_bucket}'.")
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': [
['k.A. (Schaetzung fehlgeschlagen)']]})
except Exception as e_ml:
@@ -749,7 +749,7 @@ class DataProcessor:
self.logger.debug(traceback.format_exc())
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': [
[f'FEHLER Schaetzung: {str(e_ml)[:50]}...']]})
@@ -763,7 +763,7 @@ class DataProcessor:
if version_col_idx is not None:
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': [
[
getattr(
@@ -778,7 +778,7 @@ class DataProcessor:
# KORRIGIERT: Nutze die sichere get_col_idx Funktion
reeval_col_idx = get_col_idx("ReEval Flag")
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)
if flag_col_letter:
updates.append(
@@ -848,11 +848,11 @@ class DataProcessor:
return
# --- 2. Spalten-Indizes und Buchstaben vorbereiten ---
rohtext_col_letter = self.sheet_handler._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)
pruefstatus_col_letter = self.sheet_handler._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)
timestamp_col_letter = self.sheet_handler._get_col_letter(get_col_idx("Website Scrape Timestamp") + 1)
rohtext_col_letter = _get_col_letter(get_col_idx("Website Rohtext") + 1)
metadetails_col_letter = _get_col_letter(get_col_idx("Website Meta-Details") + 1)
pruefstatus_col_letter = _get_col_letter(get_col_idx("URL Prüfstatus") + 1) # NEU
version_col_letter = _get_col_letter(get_col_idx("Version") + 1)
timestamp_col_letter = _get_col_letter(get_col_idx("Website Scrape Timestamp") + 1)
# --- 3. Tasks sammeln ---
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
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'{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'{self.sheet_handler._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("Chat Wiki Konsistenzpruefung") + 1)}{current_row_num}', 'values': [[verification_result.get("consistency")]]},
{'range': f'{_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 Vorschlag Wiki Artikel") + 1)}{current_row_num}', 'values': [[final_suggested_url]]},
{'range': f'{_get_col_letter(get_col_idx("Wiki Verif. Timestamp") + 1)}{current_row_num}', 'values': [[now_timestamp]]}
]
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")
)
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:
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
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
# Batch-Update Logik
@@ -1528,18 +1528,18 @@ class DataProcessor:
row_num = task['row_num']
result = results_by_row.get(row_num)
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'{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'{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 Vorschlag Branche"]["index"] + 1)}{row_num}', 'values': [[result.get('Branche')]]})
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'{_get_col_letter(COLUMN_MAP["Chat Begruendung Abweichung Branche"]["index"] + 1)}{row_num}', 'values': [[result.get('Begruendung')]]})
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'{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["Chat Vorschlag Branche"]["index"] + 1)}{row_num}', 'values': [['FEHLER (Batch-Antwort)']]} )
all_sheet_updates.append({'range': f'{_get_col_letter(COLUMN_MAP["Timestamp letzte Pruefung"]["index"] + 1)}{row_num}', 'values': [[now_timestamp]]})
else:
self.logger.error(f"Batch-Verarbeitung fehlgeschlagen. Setze Fehlerstatus.")
for task in batch_tasks:
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'{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["Chat Vorschlag Branche"]["index"] + 1)}{row_num}', 'values': [['FEHLER (Batch-API)']]} )
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:
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
# 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)
s_letter = self.sheet_handler._get_col_letter(
s_letter = _get_col_letter(
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
u_letter = self.sheet_handler._get_col_letter(
u_letter = _get_col_letter(
col_indices["Chat Vorschlag Wiki Artikel"] + 1) # Vorschlag U
# Spalten V-Y leeren (werden in diesem Modus nicht neu befuellt).
@@ -1936,8 +1936,8 @@ class DataProcessor:
# Block 1 Column Map
y_idx = col_indices["Chat Begruendung Abweichung Branche"]
# Erstellen Sie den Bereichsnamen (z.B. "V:Y")
v_letter = self.sheet_handler._get_col_letter(v_idx + 1)
y_letter = self.sheet_handler._get_col_letter(y_idx + 1)
v_letter = _get_col_letter(v_idx + 1)
y_letter = _get_col_letter(y_idx + 1)
v_y_range_letter = f'{v_letter}:{y_letter}' # z.B. V:Y
# Erstellen Sie eine Liste von leeren Strings fuer diesen Bereich
# 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,
# um sicherzustellen, dass die Zeile bei Bedarf von diesen anderen
# 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)
ao_letter = self.sheet_handler._get_col_letter(
ao_letter = _get_col_letter(
col_indices["Timestamp letzte Pruefung"] +
1) # AO (Chat Evaluation TS)
ap_letter = self.sheet_handler._get_col_letter(
ap_letter = _get_col_letter(
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"] +
1) # AY (SerpAPI Wiki TS)
@@ -2365,10 +2365,10 @@ class DataProcessor:
return
# --- 2. Spalten-Indizes und Buchstaben vorbereiten ---
summary_col_letter = self.sheet_handler._get_col_letter(get_col_idx("Website Zusammenfassung") + 1)
version_col_letter = self.sheet_handler._get_col_letter(get_col_idx("Version") + 1)
summary_col_letter = _get_col_letter(get_col_idx("Website Zusammenfassung") + 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.
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 ---
@@ -2657,7 +2657,7 @@ class DataProcessor:
self.logger.debug(f" Zeile {rn} (Ergebnis): {res}")
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': [
[
res.get(
@@ -2665,7 +2665,7 @@ class DataProcessor:
"ERR BR")]]})
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': [
[
res.get(
@@ -2673,7 +2673,7 @@ class DataProcessor:
"N/A CO")]]})
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': [
[
res.get(
@@ -2681,7 +2681,7 @@ class DataProcessor:
"err CO")]]})
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': [
[
res.get(
@@ -2689,12 +2689,12 @@ class DataProcessor:
"No JU")]]})
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': [
[ts]]})
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': [
[ver]]})
@@ -2948,12 +2948,12 @@ class DataProcessor:
# Ermitteln Sie die Spaltenbuchstaben fuer Updates und Leerung (nutzt
# 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"] +
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)
a_letter = self.sheet_handler._get_col_letter(
a_letter = _get_col_letter(
col_indices["ReEval Flag"] + 1) # ReEval Flag (A)
# Spalten N-V leeren.
@@ -2961,22 +2961,22 @@ class DataProcessor:
n_idx = col_indices["Wiki Absatz"]
v_idx = col_indices["Begruendung bei Abweichung"]
# Erstellen Sie den Bereichsnamen (z.B. "N:V")
n_letter = self.sheet_handler._get_col_letter(n_idx + 1)
v_letter = self.sheet_handler._get_col_letter(v_idx + 1)
n_letter = _get_col_letter(n_idx + 1)
v_letter = _get_col_letter(v_idx + 1)
nv_range_letter = f'{n_letter}:{v_letter}' # z.B. N:V
# Erstellen Sie eine Liste von leeren Strings fuer diesen Bereich
# Anzahl der Spalten = V_Index - N_Index + 1
empty_nv_values = [''] * (v_idx - n_idx + 1)
# 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)
ao_letter = self.sheet_handler._get_col_letter(
ao_letter = _get_col_letter(
col_indices["Timestamp letzte Pruefung"] +
1) # AO (Chat Evaluation TS)
ap_letter = self.sheet_handler._get_col_letter(
ap_letter = _get_col_letter(
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)
# --- Verarbeitung ---
@@ -3345,15 +3345,15 @@ class DataProcessor:
# Ermitteln Sie die Spaltenbuchstaben fuer Updates (AI-AL, AM) (nutzt
# 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
ai_letter = self.sheet_handler._get_col_letter(
ai_letter = _get_col_letter(
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
ak_letter = self.sheet_handler._get_col_letter(
ak_letter = _get_col_letter(
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
# Positionen, nach denen gesucht wird (kann in Config verschoben werden Block 1)
@@ -3408,7 +3408,7 @@ class DataProcessor:
# (Block 14)
contacts_sheet.update(
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
self.logger.info(
"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.")
return
ar_letter = self.sheet_handler._get_col_letter(
ar_letter = _get_col_letter(
col_indices["Website Rohtext"] + 1)
d_letter = self.sheet_handler._get_col_letter(
d_letter = _get_col_letter(
col_indices["CRM Website"] + 1)
a_letter = self.sheet_handler._get_col_letter(
a_letter = _get_col_letter(
col_indices["ReEval Flag"] + 1)
at_letter = self.sheet_handler._get_col_letter(
at_letter = _get_col_letter(
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)
an_letter = self.sheet_handler._get_col_letter(
an_letter = _get_col_letter(
col_indices["Wikipedia Timestamp"] + 1)
ax_letter = self.sheet_handler._get_col_letter(
ax_letter = _get_col_letter(
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"] +
1) # Timestamp dieser Funktion
ap_letter = self.sheet_handler._get_col_letter(
ap_letter = _get_col_letter(
col_indices["Version"] + 1)
ka_error_patterns = [
@@ -4131,11 +4131,11 @@ class DataProcessor:
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}'")
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]]
})
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]]
})
updated_rows_count += 1
@@ -4515,12 +4515,12 @@ class DataProcessor:
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': [
[final_umsatz_str_konsolidiert]]})
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': [
[final_ma_str_konsolidiert]]})
@@ -4544,7 +4544,7 @@ class DataProcessor:
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': [
[
plausi_results.get(
@@ -4552,7 +4552,7 @@ class DataProcessor:
"ERR_FLAG")]]})
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': [
[
plausi_results.get(
@@ -4560,7 +4560,7 @@ class DataProcessor:
"ERR_FLAG")]]})
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': [
[
plausi_results.get(
@@ -4568,7 +4568,7 @@ class DataProcessor:
"ERR_FLAG")]]})
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': [
[
plausi_results.get(
@@ -4576,7 +4576,7 @@ class DataProcessor:
"ERR_FLAG")]]})
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': [
[
plausi_results.get(
@@ -4584,7 +4584,7 @@ class DataProcessor:
"ERR_FLAG")]]})
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': [
[
plausi_results.get(
@@ -4602,12 +4602,12 @@ class DataProcessor:
"Abweichung MA CRM/Wiki"]:
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': [
['FEHLER_CALL']]})
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': [
[f"Systemfehler: {str(e_plausi_run_batch)[:100]}"]]})
else: # Fehler bei Konsolidierung
@@ -4621,18 +4621,18 @@ class DataProcessor:
"Abweichung MA CRM/Wiki"]:
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': [
['INPUT_FEHLER_KONSO']]})
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': [
["Konsolidierung fehlgeschlagen"]]})
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': [
[now_timestamp_str]]})
@@ -4862,11 +4862,11 @@ class DataProcessor:
f"FEHLER: Spaltenschlüssel für Parent Suggestion Batch fehlen: {missing}. Abbruch.")
return
col_o_letter = self.sheet_handler._get_col_letter(
col_o_letter = _get_col_letter(
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)
col_q_letter = self.sheet_handler._get_col_letter(
col_q_letter = _get_col_letter(
COLUMN_MAP[col_q_key] + 1)
openai_sem = threading.Semaphore(
@@ -5874,15 +5874,15 @@ class DataProcessor:
"FEHLER: Weder 'Website Details' noch 'Website Rohtext' Spaltenindex in COLUMN_MAP gefunden.") # <<< GEÄNDERT
return # Beende die Methode bei kritischem Fehler
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:
# Logge die Verwendung der dedizierten Spalte
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
# 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)
# --- Verarbeitung ---
@@ -6181,13 +6181,13 @@ class DataProcessor:
# Ermitteln Sie die Spaltenbuchstaben fuer Updates/Leerung (nutzt
# 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
u_letter = self.sheet_handler._get_col_letter(
u_letter = _get_col_letter(
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
a_letter = self.sheet_handler._get_col_letter(
a_letter = _get_col_letter(
col_indices["ReEval Flag"] + 1) # ReEval Flag A
# Spalten N-V leeren.
@@ -6195,24 +6195,24 @@ class DataProcessor:
n_idx = col_indices["Wiki Absatz"]
v_idx = col_indices["Begruendung bei Abweichung"]
# Erstellen Sie den Bereichsnamen (z.B. "N:V")
n_letter = self.sheet_handler._get_col_letter(n_idx + 1)
v_letter = self.sheet_handler._get_col_letter(v_idx + 1)
n_letter = _get_col_letter(n_idx + 1)
v_letter = _get_col_letter(v_idx + 1)
nv_range_letter = f'{n_letter}:{v_letter}' # z.B. N:V
# Erstellen Sie eine Liste von leeren Strings fuer diesen Bereich
# Anzahl der Spalten = V_Index - N_Index + 1
empty_nv_values = [''] * (v_idx - n_idx + 1)
# 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)
ao_letter = self.sheet_handler._get_col_letter(
ao_letter = _get_col_letter(
col_indices["Timestamp letzte Pruefung"] +
1) # AO (Chat Evaluation TS)
ap_letter = self.sheet_handler._get_col_letter(
ap_letter = _get_col_letter(
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)
ay_letter = self.sheet_handler._get_col_letter(
ay_letter = _get_col_letter(
col_indices["SerpAPI Wiki Search Timestamp"] +
1) # AY (SerpAPI Wiki TS)