diff --git a/data_processor.py b/data_processor.py index d3c8f55c..89b2c9e8 100644 --- a/data_processor.py +++ b/data_processor.py @@ -442,9 +442,9 @@ class DataProcessor: 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(COLUMN_MAP["Chat Wiki Konsistenzpruefung"] + 1)}{row_num_in_sheet}', 'values': [[verification_result.get('consistency', 'X')]]}) - updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Begruendung Wiki Inkonsistenz"] + 1)}{row_num_in_sheet}', 'values': [[verification_result.get('justification', 'Fehler')]]}) - updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Wiki Verif. Timestamp"] + 1)}{row_num_in_sheet}', 'values': [[now_timestamp]]}) + 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 Begruendung 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]]}) # --- Finales Schreiben ins Sheet --- if wiki_data_was_extracted_or_updated: @@ -464,7 +464,7 @@ class DataProcessor: }) updates.append({ - 'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Wikipedia Timestamp"] + 1)}{row_num_in_sheet}', + 'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Wikipedia Timestamp") + 1)}{row_num_in_sheet}', 'values': [[now_timestamp]] }) @@ -554,13 +554,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(COLUMN_MAP["FSM Pitch"] + 1)}{row_num_in_sheet}', 'values': [[fsm_pitch_text]]}) - updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["FSM Pitch Timestamp"] + 1)}{row_num_in_sheet}', 'values': [[now_timestamp]]}) + 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]]}) 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(COLUMN_MAP["FSM Pitch"] + 1)}{row_num_in_sheet}', 'values': [['FEHLER (Generierung)']]} ) + updates.append({'range': f'{self.sheet_handler._get_col_letter(get_col_idx("FSM Pitch") + 1)}{row_num_in_sheet}', 'values': [['FEHLER (Generierung)']]} ) @@ -605,12 +605,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(COLUMN_MAP["Finaler Umsatz (Wiki>CRM)"] + 1)}{row_num_in_sheet}', + 'range': f'{self.sheet_handler._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(COLUMN_MAP["Finaler Mitarbeiter (Wiki>CRM)"] + 1)}{row_num_in_sheet}', + 'range': f'{self.sheet_handler._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: @@ -619,12 +619,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(COLUMN_MAP["Finaler Umsatz (Wiki>CRM)"] + 1)}{row_num_in_sheet}', + 'range': f'{self.sheet_handler._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(COLUMN_MAP["Finaler Mitarbeiter (Wiki>CRM)"] + 1)}{row_num_in_sheet}', + 'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Finaler Mitarbeiter (Wiki>CRM)") + 1)}{row_num_in_sheet}', 'values': [ ['FEHLER_KONSO']]}) @@ -658,7 +658,7 @@ class DataProcessor: plausi_input_data) updates.append( { - 'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Plausibilität Umsatz"] + 1)}{row_num_in_sheet}', + 'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Plausibilität Umsatz") + 1)}{row_num_in_sheet}', 'values': [ [ plausi_results.get( @@ -666,7 +666,7 @@ class DataProcessor: "ERR_FLAG")]]}) updates.append( { - 'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Plausibilität Mitarbeiter"] + 1)}{row_num_in_sheet}', + 'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Plausibilität Mitarbeiter") + 1)}{row_num_in_sheet}', 'values': [ [ plausi_results.get( @@ -674,7 +674,7 @@ class DataProcessor: "ERR_FLAG")]]}) updates.append( { - 'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Plausibilität Umsatz/MA Ratio"] + 1)}{row_num_in_sheet}', + 'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Plausibilität Umsatz/MA Ratio") + 1)}{row_num_in_sheet}', 'values': [ [ plausi_results.get( @@ -682,7 +682,7 @@ class DataProcessor: "ERR_FLAG")]]}) updates.append( { - 'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Abweichung Umsatz CRM/Wiki"] + 1)}{row_num_in_sheet}', + 'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Abweichung Umsatz CRM/Wiki") + 1)}{row_num_in_sheet}', 'values': [ [ plausi_results.get( @@ -690,7 +690,7 @@ class DataProcessor: "ERR_FLAG")]]}) updates.append( { - 'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Abweichung MA CRM/Wiki"] + 1)}{row_num_in_sheet}', + 'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Abweichung MA CRM/Wiki") + 1)}{row_num_in_sheet}', 'values': [ [ plausi_results.get( @@ -698,7 +698,7 @@ class DataProcessor: "ERR_FLAG")]]}) updates.append( { - 'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Plausibilität Begründung"] + 1)}{row_num_in_sheet}', + 'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Plausibilität Begründung") + 1)}{row_num_in_sheet}', 'values': [ [ plausi_results.get( @@ -710,12 +710,12 @@ class DataProcessor: updates.append( { - 'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Plausibilität Prüfdatum"] + 1)}{row_num_in_sheet}', + 'range': f'{self.sheet_handler._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(COLUMN_MAP["Timestamp letzte Pruefung"] + 1)}{row_num_in_sheet}', + 'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Timestamp letzte Pruefung") + 1)}{row_num_in_sheet}', 'values': [ [now_timestamp]]}) @@ -735,7 +735,7 @@ class DataProcessor: str) and not predicted_bucket.startswith("FEHLER"): updates.append( { - 'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Geschaetzter Techniker Bucket"] + 1)}{row_num_in_sheet}', + 'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Geschaetzter Techniker Bucket") + 1)}{row_num_in_sheet}', 'values': [ [predicted_bucket]]}) self.logger.info( @@ -745,7 +745,7 @@ class DataProcessor: f" -> ML-Schaetzung lieferte kein gueltiges Ergebnis: '{predicted_bucket}'.") updates.append( { - 'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Geschaetzter Techniker Bucket"] + 1)}{row_num_in_sheet}', + 'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Geschaetzter Techniker Bucket") + 1)}{row_num_in_sheet}', 'values': [ ['k.A. (Schaetzung fehlgeschlagen)']]}) except Exception as e_ml: @@ -754,7 +754,7 @@ class DataProcessor: self.logger.debug(traceback.format_exc()) updates.append( { - 'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Geschaetzter Techniker Bucket"] + 1)}{row_num_in_sheet}', + 'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Geschaetzter Techniker Bucket") + 1)}{row_num_in_sheet}', 'values': [ [f'FEHLER Schaetzung: {str(e_ml)[:50]}...']]}) @@ -1087,11 +1087,11 @@ class DataProcessor: now_timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") updates_for_row = [ - {'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Wiki Konsistenzpruefung"]["index"] + 1)}{current_row_num}', 'values': [[verification_result.get("consistency")]]}, - {'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Begründung Wiki Inkonsistenz"]["index"] + 1)}{current_row_num}', 'values': [[verification_result.get("justification")]]}, + {'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Chat Wiki Konsistenzpruefung")["index"] + 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")["index"] + 1)}{current_row_num}', 'values': [[verification_result.get("justification")]]}, # Verwende die validierte URL - {'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Vorschlag Wiki Artikel"]["index"] + 1)}{current_row_num}', 'values': [[final_suggested_url]]}, - {'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Wiki Verif. Timestamp"]["index"] + 1)}{current_row_num}', 'values': [[now_timestamp]]} + {'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Chat Vorschlag Wiki Artikel")["index"] + 1)}{current_row_num}', 'values': [[final_suggested_url]]}, + {'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Wiki Verif. Timestamp")["index"] + 1)}{current_row_num}', 'values': [[now_timestamp]]} ] all_updates.extend(updates_for_row) @@ -1184,13 +1184,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(COLUMN_MAP["FSM Pitch"] + 1)}{row_num}', 'values': [[fsm_pitch_text]]}) + all_sheet_updates.append({'range': f'{self.sheet_handler._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(COLUMN_MAP["FSM Pitch"] + 1)}{row_num}', 'values': [['FEHLER (Generierung)']]} ) + all_sheet_updates.append({'range': f'{self.sheet_handler._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(COLUMN_MAP["FSM Pitch Timestamp"] + 1)}{row_num}', 'values': [[now_timestamp]]}) + all_sheet_updates.append({'range': f'{self.sheet_handler._get_col_letter(get_col_idx("FSM Pitch Timestamp") + 1)}{row_num}', 'values': [[now_timestamp]]}) processed_count += 1 # Batch-Update Logik @@ -3069,7 +3069,7 @@ class DataProcessor: self.logger.debug(f" Zeile {rn} (Ergebnis): {res}") updates_this_batch.append( { - 'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Vorschlag Branche"] + 1)}{rn}', + 'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Chat Vorschlag Branche") + 1)}{rn}', 'values': [ [ res.get( @@ -3077,7 +3077,7 @@ class DataProcessor: "ERR BR")]]}) updates_this_batch.append( { - 'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Branche Konfidenz"] + 1)}{rn}', + 'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Chat Branche Konfidenz") + 1)}{rn}', 'values': [ [ res.get( @@ -3085,7 +3085,7 @@ class DataProcessor: "N/A CO")]]}) updates_this_batch.append( { - 'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Konsistenz Branche"] + 1)}{rn}', + 'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Chat Konsistenz Branche") + 1)}{rn}', 'values': [ [ res.get( @@ -3093,7 +3093,7 @@ class DataProcessor: "err CO")]]}) updates_this_batch.append( { - 'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Begruendung Abweichung Branche"] + 1)}{rn}', + 'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Chat Begruendung Abweichung Branche") + 1)}{rn}', 'values': [ [ res.get( @@ -3101,12 +3101,12 @@ class DataProcessor: "No JU")]]}) updates_this_batch.append( { - 'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Timestamp letzte Pruefung"] + 1)}{rn}', + 'range': f'{self.sheet_handler._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(COLUMN_MAP["Version"] + 1)}{rn}', + 'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Version") + 1)}{rn}', 'values': [ [ver]]}) @@ -4927,12 +4927,12 @@ class DataProcessor: current_row_updates.append( { - 'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Finaler Umsatz (Wiki>CRM)"] + 1)}{row_num_sheet}', + 'range': f'{self.sheet_handler._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(COLUMN_MAP["Finaler Mitarbeiter (Wiki>CRM)"] + 1)}{row_num_sheet}', + 'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Finaler Mitarbeiter (Wiki>CRM)") + 1)}{row_num_sheet}', 'values': [ [final_ma_str_konsolidiert]]}) @@ -4956,7 +4956,7 @@ class DataProcessor: current_row_updates.append( { - 'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Plausibilität Umsatz"] + 1)}{row_num_sheet}', + 'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Plausibilität Umsatz") + 1)}{row_num_sheet}', 'values': [ [ plausi_results.get( @@ -4964,7 +4964,7 @@ class DataProcessor: "ERR_FLAG")]]}) current_row_updates.append( { - 'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Plausibilität Mitarbeiter"] + 1)}{row_num_sheet}', + 'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Plausibilität Mitarbeiter") + 1)}{row_num_sheet}', 'values': [ [ plausi_results.get( @@ -4972,7 +4972,7 @@ class DataProcessor: "ERR_FLAG")]]}) current_row_updates.append( { - 'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Plausibilität Umsatz/MA Ratio"] + 1)}{row_num_sheet}', + 'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Plausibilität Umsatz/MA Ratio") + 1)}{row_num_sheet}', 'values': [ [ plausi_results.get( @@ -4980,7 +4980,7 @@ class DataProcessor: "ERR_FLAG")]]}) current_row_updates.append( { - 'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Abweichung Umsatz CRM/Wiki"] + 1)}{row_num_sheet}', + 'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Abweichung Umsatz CRM/Wiki") + 1)}{row_num_sheet}', 'values': [ [ plausi_results.get( @@ -4988,7 +4988,7 @@ class DataProcessor: "ERR_FLAG")]]}) current_row_updates.append( { - 'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Abweichung MA CRM/Wiki"] + 1)}{row_num_sheet}', + 'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Abweichung MA CRM/Wiki") + 1)}{row_num_sheet}', 'values': [ [ plausi_results.get( @@ -4996,7 +4996,7 @@ class DataProcessor: "ERR_FLAG")]]}) current_row_updates.append( { - 'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Plausibilität Begründung"] + 1)}{row_num_sheet}', + 'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Plausibilität Begründung") + 1)}{row_num_sheet}', 'values': [ [ plausi_results.get( @@ -5019,7 +5019,7 @@ class DataProcessor: ['FEHLER_CALL']]}) current_row_updates.append( { - 'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Plausibilität Begründung"] + 1)}{row_num_sheet}', + 'range': f'{self.sheet_handler._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 @@ -5038,13 +5038,13 @@ class DataProcessor: ['INPUT_FEHLER_KONSO']]}) current_row_updates.append( { - 'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Plausibilität Begründung"] + 1)}{row_num_sheet}', + 'range': f'{self.sheet_handler._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(COLUMN_MAP["Plausibilität Prüfdatum"] + 1)}{row_num_sheet}', + 'range': f'{self.sheet_handler._get_col_letter(get_col_idx("Plausibilität Prüfdatum") + 1)}{row_num_sheet}', 'values': [ [now_timestamp_str]]}) @@ -5667,7 +5667,7 @@ class DataProcessor: # DACH-Filter (basierend auf CRM Land - Spalte G) # Holt den tatsächlichen Spaltennamen - crm_land_col_header = headers[COLUMN_MAP["CRM Land"]] + crm_land_col_header = headers[get_col_idx("CRM Land")] # Erlaubte Werte für DACH-Länder (Groß- und Kleinschreibung wird durch # .str.upper() behandelt) dach_countries = [ @@ -5695,8 +5695,8 @@ class DataProcessor: return None # Plausibilitätsfilter (basierend auf Spalten BG und BH) - plausi_umsatz_col_header = headers[COLUMN_MAP["Plausibilität Umsatz"]] - plausi_ma_col_header = headers[COLUMN_MAP["Plausibilität Mitarbeiter"]] + plausi_umsatz_col_header = headers[get_col_idx("Plausibilität Umsatz")] + plausi_ma_col_header = headers[get_col_idx("Plausibilität Mitarbeiter")] # Sicherstellen, dass die Spalten existieren if plausi_umsatz_col_header in df.columns and plausi_ma_col_header in df.columns: