From 34ce2c5d3295ceb33c6f450737114529f960dd28 Mon Sep 17 00:00:00 2001 From: Floke Date: Mon, 4 Aug 2025 17:07:07 +0000 Subject: [PATCH] data_processor.py aktualisiert Regex suche "self\.sheet_handler\._get_col_letter" replace by "_get_col_letter" --- data_processor.py | 274 +++++++++++++++++++++++----------------------- 1 file changed, 137 insertions(+), 137 deletions(-) diff --git a/data_processor.py b/data_processor.py index 39f79292..efb4d861 100644 --- a/data_processor.py +++ b/data_processor.py @@ -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)