""" Servicio para monitorear carpetas y procesar nuevos archivos """ import time from pathlib import Path from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler from django.conf import settings from .pdf_parser import PDFPedidoParser from .albaran_processor import AlbaranProcessor import logging logger = logging.getLogger(__name__) class PDFPedidoHandler(FileSystemEventHandler): """Handler para procesar nuevos PDFs de pedidos de cliente""" def __init__(self): self.parser = PDFPedidoParser() self.procesados = set() def on_created(self, event): if event.is_directory: return file_path = Path(event.src_path) # Solo procesar PDFs if file_path.suffix.lower() != '.pdf': return # Evitar procesar el mismo archivo múltiples veces if str(file_path) in self.procesados: return # Esperar un poco para asegurar que el archivo esté completamente escrito time.sleep(1) try: logger.info(f"Procesando nuevo PDF: {file_path}") pedido = self.parser.create_pedido_from_pdf(file_path) logger.info(f"Pedido creado exitosamente: {pedido.numero_pedido}") self.procesados.add(str(file_path)) except Exception as e: logger.error(f"Error al procesar PDF {file_path}: {e}") class AlbaranHandler(FileSystemEventHandler): """Handler para procesar nuevos albaranes""" def __init__(self): self.processor = AlbaranProcessor() self.procesados = set() def on_created(self, event): if event.is_directory: return file_path = Path(event.src_path) # Procesar imágenes y PDFs if file_path.suffix.lower() not in ['.pdf', '.jpg', '.jpeg', '.png']: return if str(file_path) in self.procesados: return time.sleep(1) try: logger.info(f"Procesando nuevo albarán: {file_path}") albaran = self.processor.process_albaran_file(file_path) logger.info(f"Albarán procesado: {albaran.id}") self.procesados.add(str(file_path)) except Exception as e: logger.error(f"Error al procesar albarán {file_path}: {e}") class FileWatcherService: """Servicio para monitorear carpetas""" def __init__(self): self.observer = Observer() self.running = False def start(self): """Inicia el monitoreo de carpetas""" if self.running: return # Monitorear carpeta de pedidos de cliente pedidos_dir = settings.PEDIDOS_CLIENTES_PDF_DIR pedidos_handler = PDFPedidoHandler() self.observer.schedule(pedidos_handler, str(pedidos_dir), recursive=False) # Monitorear carpeta de albaranes albaranes_dir = settings.ALBARANES_ESCANEADOS_DIR albaranes_handler = AlbaranHandler() self.observer.schedule(albaranes_handler, str(albaranes_dir), recursive=False) self.observer.start() self.running = True logger.info("File watcher iniciado") def stop(self): """Detiene el monitoreo""" if self.running: self.observer.stop() self.observer.join() self.running = False logger.info("File watcher detenido")