Lo mismo que COVE_XML

This commit is contained in:
2025-07-31 08:39:22 -06:00
parent abb34c3afe
commit ea0c02a9be
6 changed files with 279 additions and 3 deletions

View File

@@ -9,7 +9,7 @@ from typing import Dict, Any, List, Optional
from contextlib import asynccontextmanager
from controllers.RESTController import rest_controller
from controllers.SOAPController import soap_controller
from utils.peticiones import get_soap_acuseCOVE, get_soap_pedimento_completo, get_soap_remesas, get_soap_partidas, get_soap_acuse, get_soap_edocument
from utils.peticiones import get_soap_acuseCOVE, get_soap_cove, get_soap_pedimento_completo, get_soap_remesas, get_soap_partidas, get_soap_acuse, get_soap_edocument
from fastapi.responses import JSONResponse
from utils.servicios import (
_validate_request_data,
@@ -1175,10 +1175,120 @@ async def get_cove(request: ServiceRemesaSchema):
raise HTTPException(status_code=400, detail="ID de contribuyente no encontrado")
credentials = await _get_vucem_credentials(contribuyente_id, operation_name)
# Obtener COVES
logger.info("Obteniendo COVES...")
try:
coves = await rest_controller.get_coves(service_data['pedimento']['id'])
if not coves:
logger.warning("No se encontraron COVES para el pedimento")
await _update_service_status(service_data['id'], ESTADO_ERROR, service_data, operation_name)
raise HTTPException(status_code=404, detail="No se encontraron COVES para el pedimento")
logger.info(f"Se encontraron {len(coves)} COVES")
except HTTPException:
raise
except Exception as e:
logger.error(f"Error al obtener COVES: {e}")
await _update_service_status(service_data['id'], ESTADO_ERROR, service_data, operation_name)
raise HTTPException(status_code=500, detail="Error al obtener COVES")
# Procesar acuses de documentos digitalizados
documentos_procesados = []
documentos_exitosos = 0
logger.info(f"Procesando acuses COVE para {len(coves)} documentos...")
for idx, cove in enumerate(coves):
documento_info = {
#"clave": cove.get('clave', 'N/A'),
#"descripcion": cove.get('descripcion', 'N/A'),
"numero_cove": cove.get('numero_cove', 'N/A'),
"procesado": False,
"error": None
}
# Verificar que el documento tenga número de cove
if not cove.get('numero_cove'):
logger.warning(f"Documento {idx + 1} no tiene numero_cove, saltando...")
documento_info["error"] = "Sin número de cove"
documentos_procesados.append(documento_info)
continue
try:
logger.info(f"Procesando cove para documento {idx + 1}: {cove['numero_cove']}")
soap_response = await get_soap_cove(
credenciales=credentials,
response_service=service_data,
soap_controller=soap_controller,
cove=cove,
idx=idx + 1
)
if soap_response:
documento_info["procesado"] = True
documento_info["documento"] = soap_response.get('documento', {})
documentos_exitosos += 1
logger.info(f"cove del documento {idx + 1} procesado exitosamente")
else:
documento_info["error"] = "Error en petición SOAP"
logger.warning(f"No se pudo procesar el cove del documento {idx + 1}")
except Exception as e:
logger.error(f"Error al procesar cove del documento {idx + 1}: {e}")
documento_info["error"] = str(e)
# Continuar con los siguientes documentos
documentos_procesados.append(documento_info)
# Verificar si se procesó al menos un documento
if documentos_exitosos == 0:
logger.error("No se pudo procesar ningún cove de documento digitalizado")
await _update_service_status(service_data['id'], ESTADO_ERROR, service_data, operation_name)
raise HTTPException(status_code=500, detail="No se pudo procesar ningún acuse cove de documento digitalizado")
# Finalizar servicio exitosamente
await _update_service_status(service_data['id'], ESTADO_FINALIZADO, service_data, operation_name)
# Crear respuesta estandarizada
response_data = await _create_response(
service_data=service_data,
additional_data={
"covesDocs": documentos_procesados,
"total_documentos": len(coves),
"documentos_exitosos": documentos_exitosos,
"documentos_fallidos": len(coves) - documentos_exitosos
},
success_message=f"Se procesaron {documentos_exitosos}/{len(coves)} acuses cove de documentos exitosamente"
)
# Agregar advertencias si hubo documentos fallidos
if documentos_exitosos < len(coves):
response_data["warnings"] = [
f"Se procesaron solo {documentos_exitosos} de {len(coves)} coves"
]
logger.info(f"Procesamiento de acuses cove completado - Exitosos: {documentos_exitosos}/{len(coves)}")
return JSONResponse(content=response_data, status_code=200)
except HTTPException:
# Re-lanzar HTTPExceptions sin modificar
raise
except Exception as e:
logger.error(f"Error inesperado en {operation_name}: {e}")
logger.error(f"Traceback: {traceback.format_exc()}")
# Actualizar estado a error si tenemos service_data
if service_data:
try:
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}")
raise HTTPException(status_code=500, detail=f"Error interno en {operation_name}: {str(e)}")
@router.post("/services/acuseCove") # Sin Testear
async def get_Acusecove(request: ServiceRemesaSchema):