diff --git a/data_processor.py b/data_processor.py index 36f564fa..52bf3708 100644 --- a/data_processor.py +++ b/data_processor.py @@ -1023,10 +1023,94 @@ class DataProcessor: self.logger.info(f"Re-Evaluierung abgeschlossen. {processed_count_actual} Zeilen verarbeitet.") + def process_fsm_pitch_generation(self, start_sheet_row=None, end_sheet_row=None, limit=None): + """ + Generiert FSM-Pitches für alle Zeilen, bei denen dieser fehlt, aber die + notwendigen Daten vorhanden sind. + """ + self.logger.info(f"Starte Modus 'fsm_pitch'. Bereich: {start_sheet_row or 'Start'}-{end_sheet_row or 'Ende'}, Limit: {limit or 'Unbegrenzt'}") + + if not self.sheet_handler.load_data(): + self.logger.error("Fehler beim Laden der Daten für FSM-Pitch-Generierung.") + 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 + effective_end = end_sheet_row if end_sheet_row is not None else len(all_data) + + tasks = [] + # Sammle alle Zeilen, die für die Verarbeitung in Frage kommen + for i in range(effective_start - 1, effective_end): + if limit is not None and len(tasks) >= limit: + self.logger.info(f"Limit von {limit} zu verarbeitenden Zeilen erreicht. Stoppe das Sammeln von Tasks.") + break + + row_data = all_data[i] + fsm_pitch = self._get_cell_value_safe(row_data, "FSM Pitch").strip() + + # Bedingung: Pitch fehlt, aber Name und Branche sind vorhanden + if not fsm_pitch: + company_name = self._get_cell_value_safe(row_data, "CRM Name").strip() + branche = self._get_cell_value_safe(row_data, "Chat Vorschlag Branche").strip() or self._get_cell_value_safe(row_data, "CRM Branche").strip() + + if company_name and branche: + tasks.append({'row_num': i + 1, 'data': row_data}) + + if not tasks: + self.logger.info("Keine Zeilen gefunden, die eine FSM-Pitch-Generierung erfordern.") + return + + self.logger.info(f"{len(tasks)} Zeilen für FSM-Pitch-Generierung identifiziert. Starte Verarbeitung...") + + all_sheet_updates = [] + processed_count = 0 + + for task in tasks: + row_num = task['row_num'] + row_data = task['data'] + + self.logger.debug(f"Verarbeite FSM-Pitch für Zeile {row_num}...") + + try: + # Extrahiere alle notwendigen Daten für den Pitch + company_name = self._get_cell_value_safe(row_data, "CRM Name") + branche = self._get_cell_value_safe(row_data, "Chat Vorschlag Branche") or self._get_cell_value_safe(row_data, "CRM Branche") + website_summary = self._get_cell_value_safe(row_data, "Website Zusammenfassung") + wiki_absatz = self._get_cell_value_safe(row_data, "Wiki Absatz") + final_ma_val = self._get_cell_value_safe(row_data, "Finaler Mitarbeiter (Wiki>CRM)") + crm_techniker_val = self._get_cell_value_safe(row_data, "CRM Anzahl Techniker") + + fsm_pitch_text = generate_fsm_argument( + company_name, branche, website_summary, wiki_absatz, final_ma_val, crm_techniker_val + ) + + all_sheet_updates.append({ + 'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["FSM Pitch"] + 1)}{row_num}', + 'values': [[fsm_pitch_text]] + }) + processed_count += 1 + 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': [['k.A. (Fehler bei Generierung)']] + }) + + if all_sheet_updates: + self.logger.info(f"Sende Batch-Update für {processed_count} generierte FSM-Pitches...") + self.sheet_handler.batch_update_cells(all_sheet_updates) + + self.logger.info(f"FSM-Pitch-Generierung abgeschlossen. {processed_count} Pitches erstellt.") + + + # ========================================================================== # === Batch Processing Methods =========================================== # ========================================================================== + @retry_on_failure def _process_verification_openai_batch(self, batch_data): """