Feature - Dedicated FSM Pitch Generation Mode

- FEATURE: Neuer Modus `fsm_pitch` in `brancheneinstufung.py` und `data_processor.py` implementiert.
- Dieser Modus durchläuft das gesamte Sheet und generiert gezielt nur die fehlenden, personalisierten FSM-Pitch-Sätze.
- Die Methode ist für die Ausführung als Hintergrundprozess optimiert.
This commit is contained in:
2025-07-01 18:58:26 +00:00
parent 02251df7dc
commit 3d5661decf

View File

@@ -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):
"""