Files
backend/api/customs/tasks/microservice_v2.py

495 lines
20 KiB
Python

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)