306 lines
12 KiB
Python
306 lines
12 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_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}")
|
|
|
|
def procesar_pedimentos_completos_en_lotes(organizacion_id, batch_size=20):
|
|
pedimentos = Pedimento.objects.filter(organizacion_id=organizacion_id)
|
|
ids = list(pedimentos.values_list('id', flat=True))
|
|
for i in range(0, len(ids), batch_size):
|
|
batch = ids[i:i+batch_size]
|
|
job = group(
|
|
procesar_pedimento_completo_individual.s(ped_id)
|
|
for ped_id in batch
|
|
)
|
|
job.apply_async()
|
|
|
|
@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()
|
|
|
|
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/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_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.
|
|
# documentos = Document.objects.all() --- IGNORE ---
|