From 543a3558ca89182c04c1165cb6b4b5b52e56379b Mon Sep 17 00:00:00 2001 From: Kevin Rosales Date: Fri, 1 Aug 2025 10:53:53 -0600 Subject: [PATCH] Se agregaron cambios --- api/api_v1/endpoints/pedimentos.py | 164 +++++++++++------------------ 1 file changed, 64 insertions(+), 100 deletions(-) diff --git a/api/api_v1/endpoints/pedimentos.py b/api/api_v1/endpoints/pedimentos.py index ed86e6a..0431e2a 100644 --- a/api/api_v1/endpoints/pedimentos.py +++ b/api/api_v1/endpoints/pedimentos.py @@ -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}")