From 318cbe5fea3e67ddc16533f1a31e1af026cc2f7a Mon Sep 17 00:00:00 2001 From: Floke Date: Thu, 28 Aug 2025 05:25:45 +0000 Subject: [PATCH] brancheneinstufung2.py aktualisiert --- brancheneinstufung2.py | 60 ++++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 35 deletions(-) diff --git a/brancheneinstufung2.py b/brancheneinstufung2.py index e2b93579..aedfcf02 100644 --- a/brancheneinstufung2.py +++ b/brancheneinstufung2.py @@ -67,15 +67,14 @@ def main(): import argparse import time import logging - import os # <<< NEU: für Dateipfad-Prüfung - from config import Config - from helpers import log_module_versions, create_log_filename + import os + from config import Config, log_module_versions, create_log_filename from google_sheet_handler import GoogleSheetHandler from wikipedia_scraper import WikipediaScraper from data_processor import DataProcessor - from sync_manager import SyncManager # <<< NEU: SyncManager importieren + from sync_manager import SyncManager import helpers - import google_sheet_handler # Für Version-Logging + import google_sheet_handler # --- Argument Parser --- parser = argparse.ArgumentParser( @@ -83,7 +82,7 @@ def main(): formatter_class=argparse.RawTextHelpFormatter ) mode_categories = { - "Daten-Synchronisation": ["sync"], # <<< NEU: Eigene Kategorie für den Sync + "Daten-Synchronisation": ["sync"], "Batch-Verarbeitung": ["wiki_verify", "website_scraping", "summarize_website", "branch_eval", "suggest_parents", "fsm_pitch"], "Sequentielle Verarbeitung": ["full_run"], "Re-Evaluation": ["reeval"], @@ -105,8 +104,6 @@ def main(): parser.add_argument("--steps", type=str, help=f"Schritte für 'reeval'/'full_run' (z.B. 'wiki,chat'). Optionen: {', '.join(valid_steps)}.", default=','.join(valid_steps)) parser.add_argument("--min_umsatz", type=float, help="Mindestumsatz in MIO € für 'find_wiki_serp'.", default=200.0) parser.add_argument("--min_employees", type=int, help="Mindest-MA für 'find_wiki_serp'.", default=500) - - # <<< NEU: Argument für den Pfad der Sync-Datei parser.add_argument("--sync_file", type=str, help="Pfad zur D365 Excel-Exportdatei für den 'sync'-Modus.", default="d365_export.xlsx") args = parser.parse_args() @@ -142,13 +139,11 @@ def main(): return # --- Logging Konfiguration --- - # Definiere hier die Logging-Konstanten, falls sie nicht global sind LOG_LEVEL = logging.DEBUG if Config.DEBUG else logging.INFO LOG_FORMAT = '%(asctime)s - %(levelname)-8s - %(name)-25s - %(message)s' logging.basicConfig(level=LOG_LEVEL, format=LOG_FORMAT) logger = logging.getLogger(__name__) - # --- Logdatei-Konfiguration abschließen --- log_file_path = create_log_filename(selected_mode) if log_file_path: file_handler = logging.FileHandler(log_file_path, mode='a', encoding='utf-8') @@ -163,15 +158,21 @@ def main(): # --- Hauptlogik --- try: - # --- Vorbereitung & Initialisierung --- Config.load_api_keys() - sheet_handler = GoogleSheetHandler() - # <<< NEU: Früher Ausstieg für den Sync-Modus, da er keine Scraper/Prozessoren braucht - print("DEBUG: Bin direkt vor der 'if selected_mode == sync'-Abfrage.") # <<< HINZUGEFÜGT + # --- Modus-Dispatching --- + start_time = time.time() + if selected_mode == "sync": - print("DEBUG: Sync-Modus wurde betreten.") # <<< HINZUGEFÜGT + # --- SPEZIFISCHE LOGIK FÜR DEN SYNC-MODUS --- + logger.info("Führe Initialisierung für Sync-Modus durch...") + + # KORREKTUR: Explizites Laden der Sheet-Daten, da der DataProcessor umgangen wird. + if not sheet_handler.load_data(): + logger.critical("Konnte initiale Daten aus dem Google Sheet nicht laden. Sync-Prozess wird abgebrochen.") + return + d365_file_path = args.sync_file if not os.path.exists(d365_file_path): logger.critical(f"Export-Datei nicht gefunden: {d365_file_path}") @@ -180,16 +181,13 @@ def main(): sync_manager = SyncManager(sheet_handler, d365_file_path) sync_manager.run_sync() else: - # Bisherige Initialisierung für alle anderen Modi + # --- BISHERIGE LOGIK FÜR ALLE ANDEREN MODI --- wiki_scraper = WikipediaScraper() data_processor = DataProcessor(sheet_handler=sheet_handler, wiki_scraper=wiki_scraper) - # --- Modul-Versionen loggen --- modules_to_log = { - "DataProcessor": data_processor, - "GoogleSheetHandler": google_sheet_handler, - "WikipediaScraper": wikipedia_scraper, - "Helpers": helpers + "DataProcessor": data_processor, "GoogleSheetHandler": google_sheet_handler, + "WikipediaScraper": wikipedia_scraper, "Helpers": helpers } log_module_versions(modules_to_log) @@ -197,12 +195,10 @@ def main(): logger.critical("Setup des DataProcessors fehlgeschlagen. Das Skript wird beendet.") return - # --- Modus-Dispatching --- - start_time = time.time() - steps_to_run_set = set(step.strip().lower() for step in args.steps.split(',') if step.strip() in valid_steps) if args.steps else set(valid_steps) if selected_mode == "full_run": + # ... (Rest der Logik bleibt unverändert) start_row = args.start_sheet_row or sheet_handler.get_start_row_index("Timestamp letzte Pruefung") + sheet_handler._header_rows + 1 num_to_process = args.limit or (len(sheet_handler.get_all_data_with_headers()) - start_row + 1) data_processor.process_rows_sequentially( @@ -220,21 +216,15 @@ def main(): process_website_steps='web' in steps_to_run_set, process_ml_steps='ml_predict' in steps_to_run_set ) - # ... (alle anderen elif-Blöcke bleiben wie sie sind) ... + # ... (usw. für alle anderen Modi) elif selected_mode == "reclassify_branches": - data_processor.reclassify_all_branches( - start_sheet_row=args.start_sheet_row, - limit=args.limit - ) + data_processor.reclassify_all_branches(start_sheet_row=args.start_sheet_row, limit=args.limit) elif selected_mode == "alignment": alignment_demo(sheet_handler) elif selected_mode == "train_technician_model": data_processor.train_technician_model() elif selected_mode == "predict_technicians": - data_processor.process_predict_technicians( - start_sheet_row=args.start_sheet_row, - limit=args.limit - ) + data_processor.process_predict_technicians(start_sheet_row=args.start_sheet_row, limit=args.limit) elif hasattr(data_processor, f"process_{selected_mode}"): method_to_call = getattr(data_processor, f"process_{selected_mode}") method_args = {} @@ -250,8 +240,8 @@ def main(): else: logger.error(f"Unbekannter Modus '{selected_mode}' im Dispatcher.") - duration = time.time() - start_time - logger.info(f"Verarbeitung im Modus '{selected_mode}' abgeschlossen. Dauer: {duration:.2f} Sekunden.") + duration = time.time() - start_time + logger.info(f"Verarbeitung im Modus '{selected_mode}' abgeschlossen. Dauer: {duration:.2f} Sekunden.") except (KeyboardInterrupt, EOFError): logger.warning("Skript durch Benutzer unterbrochen.")