se estan creando el registro de las tareas sin problemas
This commit is contained in:
@@ -5,6 +5,7 @@ from typing import Dict, Any, List, Optional
|
||||
|
||||
|
||||
from api.api_v2.modules.authentication.services import get_current_user
|
||||
from api.api_v2.modules.tasks.services import register_task
|
||||
from .schemas import PartidaRequestSchema, PartidaListSchema
|
||||
from .tasks import process_partida_request
|
||||
|
||||
@@ -19,6 +20,15 @@ async def obtener_partida(partida_request: PartidaRequestSchema):
|
||||
acuse_dict = partida_request.model_dump()
|
||||
# Ejecuta la tarea de Celery de forma asíncrona
|
||||
task = process_partida_request.delay(acuse_dict)
|
||||
# Registrar la tarea en el servicio de seguimiento
|
||||
await register_task(
|
||||
task_id=task.id,
|
||||
message=f"Procesando partida {acuse_dict.get('partida', {}).get('numero', 'N/A')} para pedimento {acuse_dict.get('pedimento', {}).get('pedimento_app', 'N/A')}",
|
||||
status="submitted",
|
||||
pedimento_id=acuse_dict.get('pedimento', {}).get('id'),
|
||||
organizacion_id=acuse_dict.get('pedimento', {}).get('organizacion'),
|
||||
servicio=4 # 4 corresponde a "Pedimento Partidas"
|
||||
)
|
||||
# Puedes devolver el ID de la tarea para consultar el estado después
|
||||
return {"task_id": task.id, "status": "submitted"}
|
||||
|
||||
@@ -39,5 +49,14 @@ async def obtener_partidas(partidas_request: PartidaListSchema):
|
||||
}
|
||||
task = process_partida_request.delay(partida_dict)
|
||||
task_ids.append(task.id)
|
||||
# Registrar cada tarea en el servicio de seguimiento
|
||||
await register_task(
|
||||
task_id=task.id,
|
||||
message=f"Procesando partida masiva {partida.get('numero', 'N/A')} para pedimento {partida_request_dict.get('pedimento', {}).get('pedimento_app', 'N/A')}",
|
||||
status="submitted",
|
||||
pedimento_id=partida_request_dict.get('pedimento', {}).get('id'),
|
||||
organizacion_id=partida_request_dict.get('pedimento', {}).get('organizacion'),
|
||||
servicio=4 # 4 corresponde a "Pedimento Partidas"
|
||||
)
|
||||
|
||||
return {"task_ids": task_ids, "status": "submitted", "total": len(task_ids)}
|
||||
@@ -1,18 +1,8 @@
|
||||
import base64
|
||||
import os
|
||||
import logging
|
||||
import re
|
||||
import xml.etree.ElementTree as ET
|
||||
from fastapi import HTTPException
|
||||
from controllers.RESTController import rest_controller
|
||||
from controllers.SOAPController import soap_controller
|
||||
from cryptography.hazmat.primitives import serialization, hashes
|
||||
from cryptography.hazmat.primitives.asymmetric import padding
|
||||
from cryptography.hazmat.primitives.serialization import load_der_private_key
|
||||
import tempfile
|
||||
|
||||
from utils.helpers import soap_error
|
||||
from .controllers import partida_rest_controller, partida_vu_controller
|
||||
from ..common import create_service_response, create_error_response
|
||||
|
||||
# Logger para el módulo
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -30,99 +20,168 @@ async def consume_ws_get_partida(**kwargs):
|
||||
Raises:
|
||||
Exception: Si hay errores en el procesamiento
|
||||
"""
|
||||
try:
|
||||
logger.info("Iniciando procesamiento de partidas")
|
||||
credenciales = kwargs.get('credencial')
|
||||
username = credenciales.get('user')
|
||||
pedimento_app = kwargs.get('pedimento', {}).get('pedimento_app', 'N/A')
|
||||
partida = kwargs.get('partida', {})
|
||||
logger.info("Iniciando procesamiento de partidas")
|
||||
credenciales = kwargs.get('credencial')
|
||||
username = credenciales.get('user')
|
||||
pedimento_app = kwargs.get('pedimento', {}).get('pedimento_app', 'N/A')
|
||||
partida = kwargs.get('partida', {})
|
||||
|
||||
if not credenciales or not username or not partida:
|
||||
raise Exception("Credenciales o Partida no proporcionados correctamente")
|
||||
if not credenciales or not username or not partida:
|
||||
logger.error("Credenciales o Partida faltantes")
|
||||
raise HTTPException(
|
||||
status_code=400,
|
||||
detail=create_error_response(
|
||||
message="Datos incompletos para procesar la partida",
|
||||
errors=["Credenciales o datos de partida no proporcionados correctamente"],
|
||||
metadata={
|
||||
"has_credentials": bool(credenciales),
|
||||
"has_username": bool(username),
|
||||
"has_partida": bool(partida)
|
||||
}
|
||||
)
|
||||
)
|
||||
|
||||
logger.info(f"Procesando Partida: {partida} para usuario: {username}")
|
||||
logger.info(f"Procesando Partida {partida.get('numero', 'N/A')} para usuario {username}")
|
||||
|
||||
# Generar template SOAP
|
||||
# Generar template SOAP
|
||||
soap_xml = partida_vu_controller.generate_partidas_template(
|
||||
username=username,
|
||||
password=credenciales.get('password'),
|
||||
aduana=kwargs.get('pedimento', {}).get('aduana', 'N/A'),
|
||||
patente=kwargs.get('pedimento', {}).get('patente', 'N/A'),
|
||||
pedimento=kwargs.get('pedimento', {}).get('pedimento', 'N/A'),
|
||||
numero_operacion=kwargs.get('pedimento', {}).get('numero_operacion', ''),
|
||||
partida=partida.get('numero', '')
|
||||
)
|
||||
|
||||
soap_xml = partida_vu_controller.generate_partidas_template(
|
||||
username=username,
|
||||
password=credenciales.get('password'),
|
||||
aduana=kwargs.get('pedimento', {}).get('aduana', 'N/A'),
|
||||
patente=kwargs.get('pedimento', {}).get('patente', 'N/A'),
|
||||
pedimento=kwargs.get('pedimento', {}).get('pedimento', 'N/A'),
|
||||
numero_operacion=kwargs.get('pedimento', {}).get('numero_operacion', ''),
|
||||
partida=partida.get('numero', '')
|
||||
)
|
||||
soap_headers = {
|
||||
'Content-Type': 'text/xml; charset=utf-8'
|
||||
}
|
||||
|
||||
soap_headers = {
|
||||
'Content-Type': 'text/xml; charset=utf-8'
|
||||
}
|
||||
logger.info("Enviando petición SOAP a VUCEM")
|
||||
soap_response = await partida_vu_controller.make_request_async(
|
||||
"/ventanilla-ws-pedimentos/ConsultarPartidaService",
|
||||
data=soap_xml,
|
||||
headers=soap_headers
|
||||
)
|
||||
|
||||
logger.info("Enviando petición SOAP a VUCEM")
|
||||
soap_response = await partida_vu_controller.make_request_async(
|
||||
"/ventanilla-ws-pedimentos/ConsultarPartidaService",
|
||||
data=soap_xml,
|
||||
headers=soap_headers
|
||||
)
|
||||
if not soap_response:
|
||||
logger.error("No se recibió respuesta del servicio SOAP")
|
||||
raise HTTPException(
|
||||
status_code=500,
|
||||
detail=create_error_response(
|
||||
message="Error al contactar el servicio SOAP",
|
||||
errors=["No se obtuvo respuesta del servicio"],
|
||||
metadata={
|
||||
"partida_numero": partida.get('numero'),
|
||||
"username": username
|
||||
}
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
if not soap_response:
|
||||
raise Exception("No se recibió respuesta del servicio SOAP")
|
||||
|
||||
if soap_error(soap_response):
|
||||
if soap_error(soap_response):
|
||||
error_file_name = f"vu_PT_{pedimento_app}_{partida.get('numero', '')}_ERROR.xml"
|
||||
try:
|
||||
document_response = await partida_rest_controller.post_document(
|
||||
soap_response=soap_response,
|
||||
organizacion=kwargs.get('pedimento').get('organizacion'),
|
||||
pedimento=kwargs.get('pedimento').get('id'),
|
||||
file_name=f"vu_PT_{pedimento_app}_{partida.get('numero', '')}_ERROR.xml",
|
||||
file_name=error_file_name,
|
||||
document_type=10,
|
||||
)
|
||||
raise Exception("Error en la respuesta del servicio SOAP")
|
||||
|
||||
logger.info("Respuesta SOAP exitosa, enviando documento")
|
||||
|
||||
# Enviar documento
|
||||
_file_name = f"vu_PT_{pedimento_app}_{partida.get('numero', '')}.xml"
|
||||
try:
|
||||
|
||||
document_response = await partida_rest_controller.post_document(
|
||||
soap_response=soap_response,
|
||||
organizacion=kwargs.get('pedimento').get('organizacion'),
|
||||
pedimento=kwargs.get('pedimento').get('id'),
|
||||
file_name=_file_name,
|
||||
document_type=1,
|
||||
)
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error detectado en la respuesta SOAP: {str(e)}")
|
||||
raise Exception(f"Error en la respuesta SOAP: {str(e)}")
|
||||
logger.error(f"Error al guardar la respuesta de error: {e}")
|
||||
# Continuamos con el error original
|
||||
|
||||
logger.error("Error en la respuesta del servicio SOAP")
|
||||
raise HTTPException(
|
||||
status_code=500,
|
||||
detail=create_error_response(
|
||||
message="Error en la respuesta del servicio SOAP",
|
||||
errors=["La respuesta contiene un error de VUCEM"],
|
||||
data={"soap_response": soap_response.text[:500] if hasattr(soap_response, 'text') else None},
|
||||
metadata={
|
||||
"partida_numero": partida.get('numero'),
|
||||
"error_file": error_file_name
|
||||
}
|
||||
)
|
||||
)
|
||||
|
||||
logger.info("Respuesta SOAP exitosa, enviando documento")
|
||||
|
||||
# Enviar documento
|
||||
_file_name = f"vu_PT_{pedimento_app}_{partida.get('numero', '')}.xml"
|
||||
try:
|
||||
document_response = await partida_rest_controller.post_document(
|
||||
soap_response=soap_response,
|
||||
organizacion=kwargs.get('pedimento').get('organizacion'),
|
||||
pedimento=kwargs.get('pedimento').get('id'),
|
||||
file_name=_file_name,
|
||||
document_type=1,
|
||||
)
|
||||
except Exception as e:
|
||||
logger.error(f"Error al enviar documento: {e}")
|
||||
raise HTTPException(
|
||||
status_code=500,
|
||||
detail=create_error_response(
|
||||
message="Error al guardar el documento",
|
||||
errors=[str(e)],
|
||||
metadata={
|
||||
"file_name": _file_name,
|
||||
"partida_numero": partida.get('numero')
|
||||
}
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
logger.info("Documento enviado, actualizando status de Partida")
|
||||
|
||||
# Actualizar status del partida
|
||||
logger.info("Documento enviado, actualizando status de Partida")
|
||||
|
||||
# Actualizar status de la partida
|
||||
try:
|
||||
partida_status_response = await change_partida_status(
|
||||
partida=kwargs.get('partida'),
|
||||
status=True,
|
||||
pedimento=kwargs.get('pedimento')
|
||||
)
|
||||
|
||||
logger.info(f"Partida {partida.get('numero', '')} procesado exitosamente")
|
||||
|
||||
# Asegurar que la respuesta sea serializable
|
||||
result = {
|
||||
"documento": document_response if document_response else None,
|
||||
"partida_update_response": partida_status_response if partida_status_response else None
|
||||
}
|
||||
|
||||
return result
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error procesando la partida: {str(e)}", exc_info=True)
|
||||
# Asegurar que no se retornen datos binarios en el error
|
||||
raise Exception(f"Error interno al procesar la partida: {str(e)}")
|
||||
logger.warning(f"Error al actualizar estado de la partida: {e}")
|
||||
# No fallamos aquí porque el documento ya se guardó exitosamente
|
||||
partida_status_response = None
|
||||
|
||||
logger.info(f"Partida {partida.get('numero', '')} procesada exitosamente")
|
||||
|
||||
return create_service_response(
|
||||
message=f"Partida {partida.get('numero', '')} procesada exitosamente",
|
||||
data={
|
||||
"documento": document_response,
|
||||
"partida_update_response": partida_status_response,
|
||||
"file_name": _file_name
|
||||
},
|
||||
metadata={
|
||||
"document_type": 1,
|
||||
"pedimento_app": pedimento_app,
|
||||
"organizacion": kwargs.get('pedimento').get('organizacion'),
|
||||
"content_type": "application/xml"
|
||||
}
|
||||
)
|
||||
|
||||
async def change_partida_status(partida: dict, status: bool, pedimento: dict):
|
||||
"""
|
||||
Actualiza el estado de una partida.
|
||||
"""
|
||||
if not partida or not pedimento:
|
||||
logger.error("Datos insuficientes para actualizar estado de partida")
|
||||
raise HTTPException(
|
||||
status_code=400,
|
||||
detail=create_error_response(
|
||||
message="Datos incompletos para actualizar estado",
|
||||
errors=["Faltan datos de partida o pedimento"],
|
||||
metadata={
|
||||
"has_partida": bool(partida),
|
||||
"has_pedimento": bool(pedimento)
|
||||
}
|
||||
)
|
||||
)
|
||||
|
||||
data = {
|
||||
"id": partida.get("id"),
|
||||
"numero_partida": partida.get("numero"),
|
||||
@@ -130,7 +189,18 @@ async def change_partida_status(partida: dict, status: bool, pedimento: dict):
|
||||
"pedimento": pedimento.get("id"),
|
||||
"organizacion": pedimento.get("organizacion"),
|
||||
}
|
||||
print(data)
|
||||
|
||||
response = await partida_rest_controller.put_partida(partida_id=partida.get("id"), data=data)
|
||||
|
||||
if not response:
|
||||
logger.error("Error al actualizar estado de la partida")
|
||||
raise HTTPException(
|
||||
status_code=500,
|
||||
detail=create_error_response(
|
||||
message="Error al actualizar estado de la partida",
|
||||
errors=["No se recibió respuesta del servicio"],
|
||||
metadata={"partida_id": partida.get("id")}
|
||||
)
|
||||
)
|
||||
|
||||
return response
|
||||
Reference in New Issue
Block a user