100 lines
4.0 KiB
Python
100 lines
4.0 KiB
Python
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)]) |