from django.db.models.signals import post_save from django.dispatch import receiver from django.db import transaction from time import sleep from api.customs.models import EstadoDeProcesamiento, Pedimento, ProcesamientoPedimento, Cove, EDocument from api.customs.tasks.internal_services import ( crear_procesamiento_remesa, crear_procesamiento_partida, crear_procesamiento_cove, crear_procesamiento_acuse_cove, crear_procesamiento_acuse, crear_procesamiento_edocument ) from api.customs.tasks.microservice import ( ejecutar_pedimento_completo, procesar_pedimento_completo_individual ) @receiver(post_save, sender=Pedimento) def trigger_celery_task_on_create(sender, instance, created, **kwargs): if not created: import logging logger = logging.getLogger('api.customs.async_operations') logger.info("NO es creación de pedimento, no se crea procesamiento.") return def crear_procesamiento(): import logging logger = logging.getLogger('api.customs.async_operations') logger.info(f"Pedimento confirmado en BD: {instance.id}, creando procesamiento...") try: estado, _ = EstadoDeProcesamiento.objects.get_or_create( estado='En Espera' ) except Exception: estado = EstadoDeProcesamiento.objects.first() try: ProcesamientoPedimento.objects.get_or_create( pedimento=instance, organizacion=instance.organizacion, defaults={ 'estado': estado, 'servicio_id': 3, 'tipo_procesamiento_id': 2, } ) except Exception as e: logger.exception( f"No se pudo crear ProcesamientoPedimento " f"para pedimento {instance.id}: {e}" ) # Disparar la tarea asíncrona existente try: procesar_pedimento_completo_individual.apply_async(args=[instance.id, instance.organizacion.id]) except Exception as e: logger.exception(f"Error al encolar procesar_pedimento_completo_individual: {e}") transaction.on_commit(crear_procesamiento) @receiver(post_save, sender=Pedimento) def trigger_celery_task_on_update(sender, instance, created,**kwargs): if not created: import logging logger = logging.getLogger('api.customs.async_operations') logger.info(f"Pedimento actualizado: {instance.id}, verificando servicios a crear...") sleep(4) def enqueue_tasks(): if instance.remesas: logger.info(f"Creando proceso de remesas para pedimento {instance.id}") crear_procesamiento_remesa.apply_async(args=[str(instance.id)]) if hasattr(instance, 'numero_partidas') and instance.numero_partidas and instance.numero_partidas > 0: logger.info(f"Creando proceso de partida para pedimento {instance.id}") crear_procesamiento_partida.apply_async(args=[str(instance.id)]) transaction.on_commit(enqueue_tasks) @receiver(post_save, sender=Cove) def trigger_celery_task_on_cove_create(sender, instance, created, **kwargs): if created: import logging logger = logging.getLogger('api.customs.async_operations') logger.info(f"Cove creado: {instance.id}, creando procesamiento...") crear_procesamiento_cove.apply_async(args=[str(instance.pedimento.id)]) crear_procesamiento_acuse_cove.apply_async(args=[str(instance.pedimento.id)]) @receiver(post_save, sender=EDocument) def trigger_celery_task_on_edocument_create(sender, instance, created, **kwargs): if created: import logging logger = logging.getLogger('api.customs.async_operations') logger.info(f"EDocument creado: {instance.id}, creando procesamiento...") crear_procesamiento_edocument.apply_async(args=[str(instance.pedimento.id)]) crear_procesamiento_acuse.apply_async(args=[str(instance.pedimento.id)])