diff --git a/data_processor.py b/data_processor.py index ac5325b5..d29c805d 100644 --- a/data_processor.py +++ b/data_processor.py @@ -1462,6 +1462,78 @@ class DataProcessor: self.logger.info(f"FSM-Pitch-Generierung abgeschlossen. {processed_count} Zeilen bearbeitet.") + def reclassify_all_branches(self, start_sheet_row=None, limit=None): + """ + Führt für alle relevanten Zeilen eine neue Brancheneinstufung (v2.0) durch. + Dieser Modus ist ideal, um nach einer Änderung der Branchen-Definitionen + den gesamten Datenbestand zu aktualisieren. + """ + self.logger.info(f"Starte Modus 'reclassify_branches'. Bereich: {start_sheet_row or 'Start'}, Limit: {limit or 'Unbegrenzt'}") + + if not self.sheet_handler.load_data(): + return + + all_data = self.sheet_handler.get_all_data_with_headers() + header_rows = self.sheet_handler._header_rows + + effective_start = start_sheet_row if start_sheet_row is not None else header_rows + 1 + + tasks = [] + for i in range(effective_start - 1, len(all_data)): + if limit is not None and len(tasks) >= limit: + break + + row_data = all_data[i] + company_name = self._get_cell_value_safe(row_data, "CRM Name").strip() + if company_name: + tasks.append({'row_num': i + 1, 'data': row_data}) + + if not tasks: + self.logger.info("Keine Zeilen zur Neubewertung gefunden.") + return + + self.logger.info(f"{len(tasks)} Zeilen für die Neubewertung der Branche identifiziert.") + + all_sheet_updates = [] + now_timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + + for task in tasks: + row_num = task['row_num'] + row_data = task['data'] + + self.logger.debug(f"Bewerte Branche für Zeile {row_num}...") + + try: + result = evaluate_branche_chatgpt( + company_name=self._get_cell_value_safe(row_data, "CRM Name"), + website_summary=self._get_cell_value_safe(row_data, "Website Zusammenfassung"), + wiki_absatz=self._get_cell_value_safe(row_data, "Wiki Absatz") + ) + + # Updates für die drei Zielspalten vorbereiten + all_sheet_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Vorschlag Branche"] + 1)}{row_num}', 'values': [[result.get('branch')]]}) + all_sheet_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Branche Konfidenz"] + 1)}{row_num}', 'values': [[result.get('confidence')]]}) + all_sheet_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Begruendung Abweichung Branche"] + 1)}{row_num}', 'values': [[result.get('justification')]]}) + # Auch den Timestamp aktualisieren + all_sheet_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Timestamp letzte Pruefung"] + 1)}{row_num}', 'values': [[now_timestamp]]}) + + except Exception as e: + self.logger.error(f"FEHLER bei Branchen-Neubewertung für Zeile {row_num}: {e}") + all_sheet_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Vorschlag Branche"] + 1)}{row_num}', 'values': [['FEHLER (Prozess)']]} ) + + # Batch-Update Logik (vereinfacht, um es hier zu zeigen) + if len(all_sheet_updates) >= 200: # 50 Zeilen * 4 Updates pro Zeile + self.logger.info(f"Sende Batch-Update für {len(all_sheet_updates)//4} Branchen...") + self.sheet_handler.batch_update_cells(all_sheet_updates) + all_sheet_updates = [] + time.sleep(1) + + # Letzten Batch senden + if all_sheet_updates: + self.logger.info(f"Sende finalen Batch-Update für {len(all_sheet_updates)//4} Branchen...") + self.sheet_handler.batch_update_cells(all_sheet_updates) + + self.logger.info("Branchen-Neubewertung abgeschlossen.") # ==========================================================================