Se agregaron cambios

This commit is contained in:
2025-08-01 10:53:53 -06:00
committed by Kevin Rosales
parent 5b492b0caa
commit 543a3558ca

View File

@@ -283,8 +283,8 @@ async def get_listar_pedimentos(request: ServiceRemesaSchema):
raise HTTPException(status_code=500, detail=f"Error interno en {operation_name}: {str(e)}")
@router.post("/services/pedimento_completo")
async def get_pedimento_completo(request: ServiceBaseSchema):
@router.post("/services/pedimento")
async def get_pedimento(request: ServiceBaseSchema):
"""
Obtiene el pedimento completo de VUCEM y procesa todos los documentos asociados.
@@ -306,15 +306,13 @@ async def get_pedimento_completo(request: ServiceBaseSchema):
HTTPException: En caso de errores de validación o procesamiento
"""
service_id = None
operation_name = "pedimento_completo"
operation_name = "pedimento"
try:
# Validar datos de entrada
request_data = request.model_dump()
await _validate_request_data(request_data)
logger.info(f"Iniciando procesamiento de pedimento completo - Pedimento: {request_data['pedimento']}")
# Crear servicio de pedimento completo
logger.info("Creando servicio de pedimento completo...")
try:
@@ -329,50 +327,84 @@ async def get_pedimento_completo(request: ServiceBaseSchema):
except Exception as e:
logger.error(f"Error al crear servicio de pedimento completo: {e}")
raise HTTPException(status_code=500, detail="Error al crear el servicio de pedimento")
except HTTPException:
# Re-lanzar HTTPExceptions sin modificar
raise
return JSONResponse(content={"message": "Se creo el servicio para pedimento completo."}, status_code=202)
@router.post("/services/pedimento_completo")
async def get_pedimento_completo(request: ServiceRemesaSchema):
"""
Reintenta obtener el pedimento completo de VUCEM y procesa todos los documentos asociados.
Utiliza la lógica de get_pedimento_completo, pero con manejo de errores y respuesta como get_remesas.
"""
operation_name = "pedimento_completo_retry"
operation_name = "pedimento_completo"
service_data = None
try:
# Validar datos de entrada
request_data = request.model_dump()
await _validate_request_data(request_data)
logger.info(f"Iniciando procesamiento de pedimento completo - Pedimento: {request_data['pedimento']}")
# Obtener servicio de remesas existente
service_data = await _get_pedimento_service(
pedimento_id=request_data['pedimento'],
service_type=3,
operation_name=operation_name
)
# Actualizar estado a "En proceso"
update_success = await _update_service_status(
service_id, ESTADO_EN_PROCESO, response_service, operation_name
service_data['id'], ESTADO_EN_PROCESO, service_data, operation_name
)
if not update_success:
raise HTTPException(status_code=500, detail="Error al actualizar estado del servicio")
# Obtener credenciales VUCEM
contribuyente_id = response_service['pedimento']['contribuyente']
contribuyente_id = service_data.get('pedimento', {}).get('contribuyente', '')
if not contribuyente_id:
logger.error("No se encontró ID de contribuyente en los datos del servicio")
await _update_service_status(service_data['id'], ESTADO_ERROR, service_data, operation_name)
raise HTTPException(status_code=400, detail="ID de contribuyente no encontrado")
credentials = await _get_vucem_credentials(contribuyente_id, operation_name)
# Procesar petición SOAP para obtener pedimento completo
logger.info("Realizando petición SOAP para pedimento completo...")
# Procesar petición SOAP para remesas
logger.info("Realizando petición SOAP para remesas...")
try:
soap_response = await get_soap_pedimento_completo(
credenciales=credentials,
response_service=response_service,
response_service=service_data,
soap_controller=soap_controller
)
if not soap_response:
raise HTTPException(status_code=500, detail="Error en la petición SOAP al servicio VUCEM")
raise HTTPException(status_code=500, detail="Error en la petición SOAP para remesas")
logger.info("Petición SOAP completada exitosamente")
logger.info("Petición SOAP para remesas completada exitosamente")
except HTTPException:
await _update_service_status(service_id, ESTADO_ERROR, response_service, operation_name)
await _update_service_status(service_data['id'], ESTADO_ERROR, service_data, operation_name)
raise
except Exception as e:
logger.error(f"Error en petición SOAP: {e}")
await _update_service_status(service_id, ESTADO_ERROR, response_service, operation_name)
logger.error(f"Error en petición SOAP para remesas: {e}")
await _update_service_status(service_data['id'], ESTADO_ERROR, service_data, operation_name)
raise HTTPException(status_code=500, detail="Error en la petición SOAP al servicio VUCEM")
# Actualizar datos del pedimento con información del XML
logger.info("Actualizando datos del pedimento...")
try:
xml_content = soap_response.get('xml_content', {})
if xml_content:
# Excluir 'identificadores_ed' del contenido a enviar
update_content = {k: v for k, v in xml_content.items() if k != 'identificadores_ed'}
update_content['existe_expediente'] = True
pedimento_response = await rest_controller.put_pedimento(
response_service['pedimento']['id'],
service_data['pedimento']['id'],
update_content
)
logger.info("Pedimento actualizado exitosamente")
@@ -393,7 +425,7 @@ async def get_pedimento_completo(request: ServiceBaseSchema):
if identificadores_ed:
logger.info(f"Procesando {len(identificadores_ed)} documentos digitalizados...")
edocuments_result = await _post_edocuments(
response_service=response_service,
response_service=service_data,
identificadores_ed=identificadores_ed
)
logger.info(f"Se procesaron exitosamente {len(edocuments_result)} documentos digitalizados")
@@ -416,95 +448,29 @@ async def get_pedimento_completo(request: ServiceBaseSchema):
# Aquí podrías guardar el COVE en la base de datos o hacer algo con él
# Por ejemplo, podrías crear un servicio específico para manejar los coves
cove_result = await _post_coves(
response_service=response_service,
response_service=service_data,
coves=coves
)
except Exception as e:
logger.error(f"Error al procesar COVEs: {e}")
# No fallar todo el proceso por este error
cove_result = None
# Crear servicios adicionales automáticamente
servicios_adicionales = {}
servicios_error = None
try:
logger.info("Creando servicios adicionales...")
new_service_base = {
"pedimento": response_service['pedimento']['id'],
"organizacion": response_service['organizacion'],
"estado": ESTADO_CREADO,
"tipo_procesamiento": 2,
}
# Mapeo de servicios a crear
servicios_config = [
(4, "partidas"), # Tipo 4 para partidas
(6, "acuse"), # Tipo 6 para acuse
(1, "estado_pedimento"), # Tipo 1 para estado_pedimento
(7, "edocument"),# Tipo 7 para edocument
]
# Agregar servicio de remesas solo si el pedimento tiene remesas
if xml_content.get('remesas', 0):
servicios_config.append((5, "remesas"))
for servicio_tipo, servicio_nombre in servicios_config:
try:
logger.info(f"Creando servicio {servicio_nombre} (tipo {servicio_tipo})...")
new_service = {**new_service_base, "servicio": servicio_tipo}
service_response = await rest_controller.post_pedimento_service(new_service)
if service_response:
servicios_adicionales[f"servicio_{servicio_nombre}"] = service_response['id']
logger.info(f"✅ Servicio {servicio_nombre} (tipo {servicio_tipo}) creado exitosamente con ID: {service_response['id']}")
else:
logger.error(f"❌ No se pudo crear el servicio {servicio_nombre} (tipo {servicio_tipo}) - respuesta vacía")
except Exception as e:
logger.error(f"❌ Error al crear servicio {servicio_nombre} (tipo {servicio_tipo}): {e}")
logger.error(f"Traceback: {traceback.format_exc()}")
except Exception as e:
logger.error(f"Error al crear servicios adicionales: {e}")
servicios_error = str(e)
# No fallar todo el proceso por este error
# Log resumen de servicios creados
logger.info(f"📋 Resumen servicios creados: {len(servicios_adicionales)} de {len(servicios_config)} servicios")
for servicio_nombre, servicio_id in servicios_adicionales.items():
logger.info(f"{servicio_nombre}: ID {servicio_id}")
# Finalizar servicio exitosamente
await _update_service_status(service_id, ESTADO_FINALIZADO, response_service, operation_name)
await _update_service_status(service_data['id'], ESTADO_FINALIZADO, service_data, operation_name)
# Programar servicios automáticos en segundo plano
logger.info("Programando ejecución automática de servicios de seguimiento...")
try:
await _schedule_follow_up_services(
pedimento_id=response_service['pedimento']['id'],
organizacion_id=response_service['organizacion'],
xml_content=xml_content
)
logger.info("Servicios automáticos programados exitosamente")
except Exception as e:
logger.warning(f"No se pudieron programar servicios automáticos: {e}")
# No fallar el proceso principal por esto
# Construir respuesta final
# Crear respuesta estandarizada
response_data = await _create_response(
service_data=response_service,
service_data=service_data,
additional_data={
"documento": soap_response.get('documento', {}),
"xml_content": xml_content,
"edocuments": edocuments_result
"remesas": soap_response,
"documento": soap_response.get('documento', {})
},
success_message="Pedimento completo procesado exitosamente. Servicios automáticos programados."
success_message="Documento completo procesado exitosamente"
)
logger.info(f"Pedimento completo procesado exitosamente - Servicio: {service_id}")
logger.info(f"Documento completo procesado exitosamente- Servicio: {service_data['id']}")
return JSONResponse(content=response_data, status_code=200)
except HTTPException:
# Re-lanzar HTTPExceptions sin modificar
raise
@@ -512,12 +478,10 @@ async def get_pedimento_completo(request: ServiceBaseSchema):
logger.error(f"Error inesperado en {operation_name}: {e}")
logger.error(f"Traceback: {traceback.format_exc()}")
# Actualizar estado a error si tenemos el service_id
if service_id:
# Actualizar estado a error si tenemos service_data
if service_data:
try:
# Necesitamos response_service para actualizar estado
if 'response_service' in locals():
await _update_service_status(service_id, ESTADO_ERROR, response_service, operation_name)
await _update_service_status(service_data['id'], ESTADO_ERROR, service_data, operation_name)
except Exception as update_error:
logger.error(f"Error al actualizar estado del servicio tras fallo: {update_error}")