Se agregaron cambios
This commit is contained in:
@@ -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")
|
||||
|
||||
logger.info("Petición SOAP completada exitosamente")
|
||||
raise HTTPException(status_code=500, detail="Error en la petición SOAP para remesas")
|
||||
|
||||
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"Documento completo procesado exitosamente- Servicio: {service_data['id']}")
|
||||
return JSONResponse(content=response_data, status_code=200)
|
||||
|
||||
logger.info(f"Pedimento completo procesado exitosamente - Servicio: {service_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}")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user