from celery import group from celery import shared_task, group from api.customs.models import * from api.record.models import * from api.customs.serializers import PedimentoSerializer from api.vucem.models import * import requests from config.settings import SERVICE_API_URL_V2 from datetime import datetime import json def credenciales_to_dict(credenciales): if not credenciales: return {} return { "id": str(credenciales.id), "user": credenciales.usuario, "password": credenciales.password, "efirma": credenciales.efirma, "key": credenciales.key.url if credenciales.key else None, "cer": credenciales.cer.url if credenciales.cer else None, "is_active": credenciales.is_active, "organizacion": str(credenciales.organizacion.id) if credenciales.organizacion else None, } def pedimento_to_dict(pedimento): return { "id": str(pedimento.id), "pedimento": str(pedimento.pedimento), "pedimento_app": str(pedimento.pedimento_app), "aduana": str(pedimento.aduana), "patente": str(pedimento.patente), "organizacion": str(pedimento.organizacion.id), # nunca None "regimen": str(pedimento.regimen or ""), "clave_pedimento": str(pedimento.clave_pedimento or ""), "numero_operacion": str(pedimento.numero_operacion or "") } def cove_to_dict(cove): return { "id": cove.id, "cove": str(cove.numero_cove), } def edoc_to_dict(edoc): return { "id": edoc.id, "numero_edocument": str(edoc.numero_edocument), } def partida_to_dict(partida): return { "id": partida.id, "numero": partida.numero_partida, } @shared_task def procesar_coves_pedimento(pedimento_id): pedimento = Pedimento.objects.get(id=pedimento_id) if pedimento.coves.filter(cove_descargado=False).exists(): pedimento_dict = pedimento_to_dict(pedimento) credenciales = Vucem.objects.filter( id=CredencialesImportador.objects.filter(rfc=pedimento.contribuyente).first().vucem.id ).first() credenciales_dict = credenciales_to_dict(credenciales) payload = { "coves": [cove_to_dict(cove) for cove in pedimento.coves.filter(cove_descargado=False)], "pedimento": pedimento_dict, "credencial": credenciales_dict } response = requests.post( f"{SERVICE_API_URL_V2}/services/all/coves", data=json.dumps(payload), headers={"Content-Type": "application/json"} ) print(f"Servicio de COVEs enviado para pedimento {pedimento.pedimento}") @shared_task def procesar_acuse_coves_pedimento(pedimento_id): pedimento = Pedimento.objects.get(id=pedimento_id) if pedimento.coves.filter(acuse_cove_descargado=False).exists(): pedimento_dict = pedimento_to_dict(pedimento) credenciales = Vucem.objects.filter( id=CredencialesImportador.objects.filter(rfc=pedimento.contribuyente).first().vucem.id ).first() credenciales_dict = credenciales_to_dict(credenciales) payload = { "coves": [cove_to_dict(cove) for cove in pedimento.coves.filter(acuse_cove_descargado=False)], "pedimento": pedimento_dict, "credencial": credenciales_dict } response = requests.post( f"{SERVICE_API_URL_V2}/services/all/acuse/cove/", data=json.dumps(payload), headers={"Content-Type": "application/json"} ) print(f"Servicio de acuses de COVEs enviado para pedimento {pedimento.pedimento}") @shared_task def procesar_edocs_pedimento(pedimento_id): pedimento = Pedimento.objects.get(id=pedimento_id) if pedimento.documentos.filter(edocument_descargado=False).exists(): pedimento_dict = pedimento_to_dict(pedimento) credenciales = Vucem.objects.filter( id=CredencialesImportador.objects.filter(rfc=pedimento.contribuyente).first().vucem.id ).first() credenciales_dict = credenciales_to_dict(credenciales) payload = { "edocs": [edoc_to_dict(edoc) for edoc in pedimento.documentos.filter(edocument_descargado=False)], "pedimento": pedimento_dict, "credencial": credenciales_dict } response = requests.post( f"{SERVICE_API_URL_V2}/services/download/edoc/", data=json.dumps(payload), headers={"Content-Type": "application/json"} ) print(f"Servicio de E-documents enviado para pedimento {pedimento.pedimento}") @shared_task def procesar_acuses_pedimento(pedimento_id): pedimento = Pedimento.objects.get(id=pedimento_id) if pedimento.documentos.filter(acuse_descargado=False).exists(): pedimento_dict = pedimento_to_dict(pedimento) credenciales = Vucem.objects.filter( id=CredencialesImportador.objects.filter(rfc=pedimento.contribuyente).first().vucem.id ).first() credenciales_dict = credenciales_to_dict(credenciales) payload = { "edocs": [edoc_to_dict(edoc) for edoc in pedimento.documentos.filter(acuse_descargado=False)], "pedimento": pedimento_dict, "credencial": credenciales_dict } response = requests.post( f"{SERVICE_API_URL_V2}/services/all/acuse/pedimento/", data=json.dumps(payload), headers={"Content-Type": "application/json"} ) print(f"Servicio de acuses enviado para pedimento {pedimento.pedimento}") @shared_task def procesar_partidas_pedimento(pedimento_id): pedimento = Pedimento.objects.get(id=pedimento_id) if pedimento.partidas.filter(descargado=False).exists(): pedimento_dict = pedimento_to_dict(pedimento) credenciales = Vucem.objects.filter( id=CredencialesImportador.objects.filter(rfc=pedimento.contribuyente).first().vucem.id ).first() credenciales_dict = credenciales_to_dict(credenciales) payload = { "partidas": [partida_to_dict(partida) for partida in pedimento.partidas.filter(descargado=False)], "pedimento": pedimento_dict, "credencial": credenciales_dict } response = requests.post( f"{SERVICE_API_URL_V2}/services/all/partidas/", data=json.dumps(payload), headers={"Content-Type": "application/json"} ) print(f"Servicio de partidas enviado para pedimento {pedimento.pedimento}") @shared_task def procesar_remesas_pedimento(pedimento_id): pedimento = Pedimento.objects.get(id=pedimento_id) if not pedimento.documents.filter(document_type=3).exists(): # Tipo 3: Remesa pedimento_dict = pedimento_to_dict(pedimento) credenciales = Vucem.objects.filter( id=CredencialesImportador.objects.filter(rfc=pedimento.contribuyente).first().vucem.id ).first() credenciales_dict = credenciales_to_dict(credenciales) payload = { "pedimento": pedimento_dict, "credencial": credenciales_dict } response = requests.post( f"{SERVICE_API_URL_V2}/services/remesas", data=json.dumps(payload), headers={"Content-Type": "application/json"} ) print(f"Servicio de remesas enviado para pedimento {pedimento.pedimento}") @shared_task def procesar_pedimento_completo_individual(pedimento_id): pedimento = Pedimento.objects.get(id=pedimento_id) if not pedimento.documents.filter(document_type=2).exists(): # Tipo 2: Pedimento Completo pedimento_dict = pedimento_to_dict(pedimento) credenciales = Vucem.objects.filter( id=CredencialesImportador.objects.filter(rfc=pedimento.contribuyente).first().vucem.id ).first() credenciales_dict = credenciales_to_dict(credenciales) payload = { "pedimento": pedimento_dict, "credencial": credenciales_dict } response = requests.post( f"{SERVICE_API_URL_V2}/services/pedimento_completo", data=json.dumps(payload), headers={"Content-Type": "application/json"} ) print(f"Servicio enviado para pedimento {pedimento.pedimento}") return response @shared_task def procesar_pedimentos_completos(organizacion_id): pedimentos = Pedimento.objects.filter(organizacion_id=organizacion_id) respuestas = [] for pedimento in pedimentos: if not pedimento.documents.filter(document_type=2).exists(): # Tipo 2: Pedimento Completo # Convertir el pedimento a JSON usando el serializer pedimento_dict = pedimento_to_dict(pedimento) credenciales = Vucem.objects.filter(id=CredencialesImportador.objects.filter(rfc=pedimento.contribuyente).first().vucem.id).first() if not credenciales: print(f"No se encontraron credenciales para el pedimento {pedimento.pedimento_app}") continue credenciales_dict = credenciales_to_dict(credenciales) payload = { "pedimento": pedimento_dict, "credencial": credenciales_dict } response = requests.post( f"{SERVICE_API_URL_V2}/services/pedimento_completo", data=json.dumps(payload), headers={"Content-Type": "application/json"} ) # Aquí puedes continuar con el resto de tu lógica print(f"Servicio enviado para pedimento {pedimento.pedimento}") @shared_task def procesar_remesas(organizacion_id): pedimentos = Pedimento.objects.filter(organizacion_id=organizacion_id) for pedimento in pedimentos: if not pedimento.documents.filter(document_type=3).exists(): # Tipo 3: Remesa # Convertir el pedimento a JSON usando el serializer pedimento_dict = pedimento_to_dict(pedimento) credenciales = Vucem.objects.filter(id=CredencialesImportador.objects.filter(rfc=pedimento.contribuyente).first().vucem.id).first() credenciales_dict = credenciales_to_dict(credenciales) payload = { "pedimento": pedimento_dict, "credencial": credenciales_dict } response = requests.post( f"{SERVICE_API_URL_V2}/services/remesas", data=json.dumps(payload), headers={"Content-Type": "application/json"} ) # Aquí puedes continuar con el resto de tu lógica print(f"Servicio enviado para pedimento {pedimento.pedimento}") @shared_task def procesar_coves(organizacion_id): pedimentos = Pedimento.objects.filter( organizacion_id=organizacion_id, coves__isnull=False ).distinct() for pedimento in pedimentos: if pedimento.coves.filter(cove_descargado=False).exists(): # Tipo 3: Remesa # Convertir el pedimento a JSON usando el serializer pedimento_dict = pedimento_to_dict(pedimento) credenciales = Vucem.objects.filter(id=CredencialesImportador.objects.filter(rfc=pedimento.contribuyente).first().vucem.id).first() credenciales_dict = credenciales_to_dict(credenciales) payload = { "coves": [cove_to_dict(cove) for cove in pedimento.coves.filter(cove_descargado=False)], "pedimento": pedimento_dict, "credencial": credenciales_dict } response = requests.post( f"{SERVICE_API_URL_V2}/services/all/coves", data=json.dumps(payload), headers={"Content-Type": "application/json"} ) # Aquí puedes continuar con el resto de tu lógica print(f"Servicio enviado para pedimento {pedimento.pedimento}") @shared_task def procesar_acuse_coves(organizacion_id): pedimentos = Pedimento.objects.filter( organizacion_id=organizacion_id, coves__isnull=False ).distinct() for pedimento in pedimentos: if pedimento.coves.filter(acuse_cove_descargado=False).exists(): # Tipo 3: Remesa # Convertir el pedimento a JSON usando el serializer pedimento_dict = pedimento_to_dict(pedimento) credenciales = Vucem.objects.filter(id=CredencialesImportador.objects.filter(rfc=pedimento.contribuyente).first().vucem.id).first() credenciales_dict = credenciales_to_dict(credenciales) payload = { "coves": [cove_to_dict(cove) for cove in pedimento.coves.filter(acuse_cove_descargado=False)], "pedimento": pedimento_dict, "credencial": credenciales_dict } response = requests.post( f"{SERVICE_API_URL_V2}/services/all/acuse/cove/", data=json.dumps(payload), headers={"Content-Type": "application/json"} ) # Aquí puedes continuar con el resto de tu lógica print(f"Servicio enviado para pedimento {pedimento.pedimento}") @shared_task def procesar_acuses(organizacion_id): pedimentos = Pedimento.objects.filter( organizacion_id=organizacion_id, documentos__isnull=False ).distinct() for pedimento in pedimentos: if pedimento.documentos.filter(acuse_descargado=False).exists(): # Tipo 3: Remesa # Convertir el pedimento a JSON usando el serializer pedimento_dict = pedimento_to_dict(pedimento) credenciales = Vucem.objects.filter(id=CredencialesImportador.objects.filter(rfc=pedimento.contribuyente).first().vucem.id).first() credenciales_dict = credenciales_to_dict(credenciales) payload = { "edocs": [edoc_to_dict(edoc) for edoc in pedimento.documentos.filter(acuse_descargado=False)], "pedimento": pedimento_dict, "credencial": credenciales_dict } response = requests.post( f"{SERVICE_API_URL_V2}/services/all/acuse/pedimento/", data=json.dumps(payload), headers={"Content-Type": "application/json"} ) # Aquí puedes continuar con el resto de tu lógica print(f"Servicio enviado para pedimento {pedimento.pedimento}") @shared_task def procesar_edocs(organizacion_id): pedimentos = Pedimento.objects.filter( organizacion_id=organizacion_id, documentos__isnull=False ).distinct() for pedimento in pedimentos: if pedimento.documentos.filter(edocument_descargado=False).exists(): # Tipo 3: Remesa # Convertir el pedimento a JSON usando el serializer pedimento_dict = pedimento_to_dict(pedimento) credenciales = Vucem.objects.filter(id=CredencialesImportador.objects.filter(rfc=pedimento.contribuyente).first().vucem.id).first() credenciales_dict = credenciales_to_dict(credenciales) payload = { "edocs": [edoc_to_dict(edoc) for edoc in pedimento.documentos.filter(edocument_descargado=False)], "pedimento": pedimento_dict, "credencial": credenciales_dict } response = requests.post( f"{SERVICE_API_URL_V2}/services/download/all/edocs/", data=json.dumps(payload), headers={"Content-Type": "application/json"} ) # Aquí puedes continuar con el resto de tu lógica print(f"Servicio enviado para pedimento {pedimento.pedimento}") @shared_task def procesar_partidas(organizacion_id): pedimentos = Pedimento.objects.filter( organizacion_id=organizacion_id, partidas__isnull=False ).distinct() for pedimento in pedimentos: if pedimento.partidas.filter(descargado=False).exists(): # Tipo 4: Partidas # Convertir el pedimento a JSON usando el serializer pedimento_dict = pedimento_to_dict(pedimento) credenciales = Vucem.objects.filter(id=CredencialesImportador.objects.filter(rfc=pedimento.contribuyente).first().vucem.id).first() credenciales_dict = credenciales_to_dict(credenciales) payload = { "partidas": [partida_to_dict(partida) for partida in pedimento.partidas.filter(descargado=False)], "pedimento": pedimento_dict, "credencial": credenciales_dict } response = requests.post( f"{SERVICE_API_URL_V2}/services/all/partidas/", data=json.dumps(payload), headers={"Content-Type": "application/json"} ) # Aquí puedes continuar con el resto de tu lógica print(f"Servicio enviado para pedimento {pedimento.pedimento}") @shared_task def documentos_con_errores(organizacion_id): documentos = Document.objects.filter(organizacion_id=organizacion_id) for doc in documentos: if doc.document_type is None or doc.size is None or doc.archivo is None: print(f"Documento con error: {doc.id} en organización {organizacion_id}") # Aquí puedes agregar lógica adicional para manejar documentos con errores # como enviar notificaciones, registrar en un log, etc. @shared_task def procesar_procesamiento_pedimento(organizacion_id): # print("Creando procesamientos de pedimentos para organización:", organizacion_id) pedimentos = Pedimento.objects.filter(organizacion_id=organizacion_id) # pedimentos = Pedimento.objects.filter(id='1c061182-ac68-45b0-b3d7-35bf2264982b') if not pedimentos.exists(): print("No se encontraron pedimentos para la organización:", organizacion_id) return for pedimento in pedimentos: if not pedimento.documents.filter(document_type=2).exists(): # Tipo 2: Pedimento Completo procesamiento_pedimento = ProcesamientoPedimento.objects.filter( pedimento_id=pedimento.id, servicio_id=3, # servicio 3: Pedimento Completo ) if not procesamiento_pedimento.exists(): ProcesamientoPedimento.objects.create( pedimento_id=pedimento.id , organizacion_id=pedimento.organizacion_id , estado_id =1 , servicio_id=3 , tipo_procesamiento_id=2) # servicio 3: Pedimento Completo # print("Procesamiento creado para pedimento:", pedimento.pedimento_app) procesar_pedimentos_completos.delay(organizacion_id) def ejecutar_por_organizacion_y_procesamiento(organizacion_id, procesamiento): if procesamiento == 'coves': procesar_coves.delay(organizacion_id) elif procesamiento == 'edocs': procesar_edocs.delay(organizacion_id) elif procesamiento == 'acuses': procesar_acuses.delay(organizacion_id) elif procesamiento == 'acuse_coves': procesar_acuse_coves.delay(organizacion_id) elif procesamiento == 'partidas': procesar_partidas.delay(organizacion_id) elif procesamiento == 'pedimentos_completos': procesar_pedimentos_completos.delay(organizacion_id) elif procesamiento == 'remesas': procesar_remesas.delay(organizacion_id) elif procesamiento == 'procesamiento_pedimento': procesar_procesamiento_pedimento.delay(organizacion_id) else: # Procesamiento no reconocido # print(f"Procesamiento no reconocido: {procesamiento}") pass def ejecutar_todos_por_organizacion(organizacion_id): procesar_coves.delay(organizacion_id) procesar_edocs.delay(organizacion_id) procesar_acuses.delay(organizacion_id) procesar_acuse_coves.delay(organizacion_id) procesar_partidas.delay(organizacion_id) procesar_pedimentos_completos.delay(organizacion_id) procesar_remesas.delay(organizacion_id)