96 lines
3.1 KiB
Python
96 lines
3.1 KiB
Python
"""
|
|
Servicio para procesar PDFs de pedidos de cliente
|
|
"""
|
|
import json
|
|
from pathlib import Path
|
|
from typing import Dict, Optional
|
|
from django.utils import timezone
|
|
from datetime import datetime
|
|
from .ocr_service import OCRService
|
|
from ..models import Cliente, PedidoCliente, ReferenciaPedidoCliente
|
|
|
|
|
|
class PDFPedidoParser:
|
|
"""Parser para procesar PDFs de pedidos de cliente"""
|
|
|
|
def __init__(self):
|
|
self.ocr_service = OCRService()
|
|
|
|
def parse_pdf(self, pdf_path: Path) -> Dict:
|
|
"""
|
|
Parsea un PDF de pedido de cliente
|
|
|
|
Returns:
|
|
Dict con los datos extraídos
|
|
"""
|
|
return self.ocr_service.process_pdf_pedido_cliente(pdf_path)
|
|
|
|
def create_pedido_from_pdf(self, pdf_path: Path) -> PedidoCliente:
|
|
"""
|
|
Crea un PedidoCliente y sus referencias desde un PDF
|
|
|
|
Returns:
|
|
PedidoCliente creado
|
|
"""
|
|
# Parsear PDF
|
|
datos = self.parse_pdf(pdf_path)
|
|
|
|
# Obtener o crear cliente
|
|
matricula = datos.get('matricula', '').strip().upper()
|
|
if not matricula:
|
|
raise ValueError("No se pudo extraer la matrícula del PDF")
|
|
|
|
cliente, _ = Cliente.objects.get_or_create(
|
|
matricula_vehiculo=matricula,
|
|
defaults={
|
|
'nombre': datos.get('nombre_cliente', f'Cliente {matricula}'),
|
|
}
|
|
)
|
|
|
|
# Parsear fecha de cita
|
|
fecha_cita = None
|
|
fecha_cita_str = datos.get('fecha_cita')
|
|
if fecha_cita_str:
|
|
try:
|
|
# Intentar diferentes formatos
|
|
for fmt in ['%Y-%m-%d %H:%M', '%Y-%m-%d', '%d/%m/%Y %H:%M', '%d/%m/%Y']:
|
|
try:
|
|
fecha_cita = datetime.strptime(fecha_cita_str, fmt)
|
|
fecha_cita = timezone.make_aware(fecha_cita)
|
|
break
|
|
except ValueError:
|
|
continue
|
|
except Exception:
|
|
pass
|
|
|
|
# Crear pedido
|
|
numero_pedido = datos.get('numero_pedido', '').strip()
|
|
if not numero_pedido:
|
|
raise ValueError("No se pudo extraer el número de pedido del PDF")
|
|
|
|
# Verificar si ya existe
|
|
if PedidoCliente.objects.filter(numero_pedido=numero_pedido).exists():
|
|
raise ValueError(f"El pedido {numero_pedido} ya existe")
|
|
|
|
pedido = PedidoCliente.objects.create(
|
|
numero_pedido=numero_pedido,
|
|
cliente=cliente,
|
|
fecha_cita=fecha_cita,
|
|
estado='pendiente_revision',
|
|
archivo_pdf_path=str(pdf_path),
|
|
)
|
|
|
|
# Crear referencias
|
|
referencias_data = datos.get('referencias', [])
|
|
for ref_data in referencias_data:
|
|
ReferenciaPedidoCliente.objects.create(
|
|
pedido_cliente=pedido,
|
|
referencia=ref_data.get('referencia', '').strip(),
|
|
denominacion=ref_data.get('denominacion', '').strip(),
|
|
unidades_solicitadas=int(ref_data.get('unidades', 1)),
|
|
unidades_en_stock=0,
|
|
)
|
|
|
|
return pedido
|
|
|