Skip to content

Consulta de Saldos de Línea Móvil - services-v2-getbalance

Información del Servicio

Endpoint: /api/services/v2/getbalance
Método: POST
Versión: v2
Categoría: Consulta de Saldos

Documentación del Servicio

Descripción general

El servicio services-v2-getbalance es un endpoint para consultar los saldos de una línea móvil. A diferencia de la primera versión, esta versión proporciona los totales agregados de los recursos disponibles.

Categoría de negocio: Consulta de Saldos de Servicios Móviles.

Casos de uso principales:

  • Consulta de saldos monetarios disponibles
  • Consulta de recursos de datos (3G/4G)
  • Consulta de minutos disponibles
  • Consulta de saldos promocionales
  • Consulta de recursos adicionales (WhatsApp, redes sociales, etc.)

Especificación técnica

  • Endpoint completo: /api/services/v2/getbalance
  • Método HTTP: POST
  • Capas involucradas:
    • Controlador: ServicesController.GetBalance_v2()
    • Lógica de negocio: ServiceBusiness.GetBalance_v2()
    • Acceso a datos: ServiceUtil2.GetBalance()

Flujo de procesamiento:

  1. Validación de la petición y auditoría de entrada
  2. Conversión de datos del request
  3. Obtención del origen de la petición
  4. Consulta del servicio móvil
  5. Procesamiento de saldos y recursos
  6. Generación de respuesta con totales agregados
  7. Auditoría de salida

Dependencias principales:

  • BotModel.Services.Service.GetBalance_v2
  • BotBusiness.Controllers.ServiceBusiness
  • BotBusiness.Util.ServiceUtil2
  • BotBusiness.Util.AuditUtil

Consideraciones de seguridad:

  • Validación de autenticación SOAP (para endpoints SOAP)
  • Auditoría completa de entrada y salida
  • Validación de datos de entrada
  • Manejo de excepciones controlado

Parámetros de entrada (Request)

Headers

CampoTipoObligatorioDescripción
WSRequestHeaderobjectCabecera de la petición con información del sistema

Body

CampoTipoObligatorioDescripción
AuditobjectNoAuditoría de la aplicación
PhonestringNúmero de conexión del servicio (ejemplo: 3102001010)

Estructura de objetos anidados:

Estructura de WSRequestHeader

CampoTipoObligatorioDescripción
SystemobjectInformación asociada al sistema
PropertyarrayNoPropiedades asociadas al consumo del servicio web

Estructura de WSRequestHeader.System

CampoTipoObligatorioDescripción
NamestringNombre del sistema
CorrelationIDstringIdentificador de la petición
ProcessingServerstringServidor de procesamiento del sistema

Estructura de WSRequestHeader.Property

CampoTipoObligatorioDescripción
NamestringNombre de la propiedad
ValuestringValor de la propiedad

Estructura de Audit

CampoTipoObligatorioDescripción
CanalstringNoCanal sobre el cual se hizo la petición
Id_DevicestringNoIdentificador del dispositivo móvil
SOstringNoSistema operativo del dispositivo
IP_AddressstringNoDirección IP desde donde se realiza la petición
WhatsApp_Phone_NumberstringNoNúmero de WhatsApp desde donde se realiza la petición

Respuesta esperada (Response)

Headers

CampoTipoObligatorioDescripción
WSResponseHeaderobjectCabecera de la respuesta con información del sistema y servicio

Body

CampoTipoObligatorioDescripción
Available_CoinstringNoTotal en saldo monetario (formato string)
Available_Coin_Valuedouble?NoTotal en saldo monetario (valor numérico)
DetailedobjectNoInformación detallada de los recursos
Promotion_CoinstringNoSaldo promocional valor string
Promotion_Coin_Valuedouble?NoSaldo promocional
ResumeobjectNoInformación resumida de los recursos

Estructura de objetos anidados:

Estructura de WSResponseHeader

CampoTipoObligatorioDescripción
SystemobjectNoInformación asociada al sistema
ServiceobjectNoInformación asociada a la ejecución del servicio
PropertyarrayNoArreglo de propiedades asociado al servicio

Estructura de WSResponseHeader.System

CampoTipoObligatorioDescripción
NamestringNoNombre del sistema
CorrelationIDstringNoIdentificador de la petición
ProcessingServerstringNoServidor de procesamiento del sistema

Estructura de WSResponseHeader.Service

CampoTipoObligatorioDescripción
StatusstringNoEstado de la ejecución del servicio web
ResponseDateDateTime?NoFecha de la respuesta
ProcessingServerstringNoServidor de procesamiento de la solicitud
StatusDetailarrayNoDetalle del procesamiento de la solicitud

Estructura de WSResponseHeader.Property

CampoTipoObligatorioDescripción
NamestringNoNombre de la propiedad
ValuestringNoValor de la propiedad

Estructura de Detailed

CampoTipoObligatorioDescripción
DetailarrayNoDetalle de los saldos

Estructura de Detailed.Detail

CampoTipoObligatorioDescripción
BoxsarrayNoAgrupaciones de ofertas
Section_NamestringNoNombre de la sección (Estructurales, Promocionales, Adicionales, Linea)

Estructura de Detailed.Detail.Boxs

CampoTipoObligatorioDescripción
AvailablestringNoRecurso disponible
Box_NamestringNoNombre de la agrupación
ConsumestringNoConsumo realizado
Group_NamestringNoNombre del grupo para sumatoria
OffersarrayNoOfertas asociadas
ProvisionedstringNoProvisionado
Unity_TypestringNoTipo de unidad (MIN, DAT, SMS, $)

Estructura de Detailed.Detail.Boxs.Offers

CampoTipoObligatorioDescripción
Available_Balance_UserstringNoSaldo disponible en Charging a mostrar al usuario
Available_Balance_Chargingdouble?NoSaldo disponible en Charging
Balance_Consumeddouble?NoSaldo consumido en Charging
Balance_Consumed_UserstringNoSaldo consumido en Charging a mostrar al usuario
Expiration_DatestringNoFecha de expiración de la oferta
Max_Capacity_ChargingstringNoMáxima capacidad en Charging
Offer_IdstringNoIdentificador de la oferta
Unity_TypestringNoTipo de unidad

Estructura de Resume

CampoTipoObligatorioDescripción
ResourcearrayNoRecursos del servicio

Estructura de Resume.Resource

CampoTipoObligatorioDescripción
AdditionalobjectNoDetalle del recurso (adicional)
AvailablestringNoCantidad disponible
ConsumedstringNoCantidad consumida
Expiration_DatestringNoFecha de expiración de la oferta
NamestringNoRecurso asociado
PromotionobjectNoDetalle del recurso (promocional)
ProvisionedstringNoCantidad adquirida
RolloverobjectNoDetalle del recurso (salva recursos)
StructuralobjectNoDetalle del recurso (estructural)

Manejo de errores

CódigoDescripciónEjemplo
ERROR_04La solicitud no fue exitosa. Fueron enviados objetos no acordes a la peticiónRequest nulo o Phone vacío
ERROR_03La solicitud no fue exitosa. No fue posible validar la peticiónError en descifrado de petición
ERROR_02La solicitud no fue exitosa. No fue posible obtener el origenError al obtener origen de la petición
ERROR_01La solicitud no fue exitosa. No fue posible obtener el usuario asociadoError de autenticación
ERROR_00La solicitud no fue exitosa. Se ha generado una excepción técnicaExcepción no controlada
BOTERRORSe ha generado una excepción no controladaError interno del sistema

Análisis de Componentes

Modelos y componentes

Modelos base utilizados:

  • BotModel.Services.Service.GetBalance_v2.BaseRequestGetBalance_v2
  • BotModel.Services.Service.GetBalance_v2.BaseResponseGetBalance_v2
  • BotModel.Services.Service.GetBalance_v2.GetBalanceRequest_v2
  • BotModel.Services.Service.GetBalance_v2.GetBalanceResponse_v2

Utilidades y servicios comunes:

  • BotBusiness.Util.ServiceUtil2.GetBalance()
  • BotBusiness.Util.AuditUtil.Save_Request_Async()
  • BotBusiness.Util.ConfigurationUtil.Get_Tipology()

Patrones de diseño implementados:

  • Patrón Singleton para ServiceBusiness
  • Patrón Factory para creación de respuestas
  • Patrón Strategy para manejo de diferentes tipos de saldos

Componentes reutilizados:

  • BotBaseRequestHeader/BotBaseResponseHeader
  • BotBaseRequestSystem/BotBaseResponseSystem
  • BotBaseResponseService para manejo de errores

Referencias cruzadas:

  • Servicio GetBalance_v1 (versión anterior)
  • Servicio GetBalanceTransferHistory_v1
  • Servicio ServicesGetBalance (MiETB API)

Ejemplos de Request/Response

Solicitud (request)

json
{
  "WSRequestHeader": {
    "System": {
      "name": "MAX",
      "correlationID": "LUZ-0.5058314057277247",
      "processingServer": null
    },
    "Property": [
      {
        "name": null,
        "value": null
      }
    ]
  },
  "WSRequestBody": {
    "Phone": "3160009921",
    "Audit": {
      "Canal": null,
      "IP_Address": "169.60.82.89",
      "IP_Latitud": "4.8094",
      "IP_Longitude": "-74.0980",
      "IP_City": "COTA",
      "IP_Country": "COLOMBIA",
      "Date": "2025-07-31",
      "Hour": "18:25:53",
      "WhatsApp_Phone_Number": null,
      "Facebook_User": "",
      "Twitter_User": ""
    }
  }
}

Respuesta exitosa

json
{
  "WSResponseHeader": {
    "System": {
      "Name": "SISTEMA_CLIENTE",
      "CorrelationID": "123456789",
      "ProcessingServer": "SERVER_01"
    },
    "Service": {
      "Status": "OK",
      "ResponseDate": "2024-12-19T10:30:00",
      "ProcessingServer": "SERVER_01",
      "StatusDetail": []
    },
    "Property": [
      {
        "Name": "CHANNEL",
        "Value": "WEB"
      }
    ]
  },
  "WSResponseBody": {
    "Available_Coin": "50000",
    "Available_Coin_Value": 50000.0,
    "Promotion_Coin": "10000",
    "Promotion_Coin_Value": 10000.0,
    "Detailed": {
      "Detail": [
        {
          "Section_Name": "Estructurales",
          "Boxs": [
            {
              "Box_Name": "DATOS 4G",
              "Available": "5GB",
              "Consume": "2GB",
              "Provisioned": "7GB",
              "Unity_Type": "DAT",
              "Group_Name": "DATOS 4G",
              "Offers": [
                {
                  "Offer_Id": "OFFER_001",
                  "Available_Balance_User": "5GB",
                  "Available_Balance_Charging": 5.0,
                  "Balance_Consumed": 2.0,
                  "Balance_Consumed_User": "2GB",
                  "Max_Capacity_Charging": "7GB",
                  "Unity_Type": "DAT",
                  "Expiration_Date": "2024-12-31"
                }
              ]
            }
          ]
        }
      ]
    },
    "Resume": {
      "Resource": [
        {
          "Name": "DATOS 4G",
          "Available": "5GB",
          "Consumed": "2GB",
          "Provisioned": "7GB",
          "Expiration_Date": "2024-12-31",
          "Structural": {
            "Available": "5GB",
            "Consumed": "2GB",
            "Provisioned": "7GB"
          }
        }
      ]
    }
  }
}

Respuesta de error

json
{
  "WSResponseHeader": {
    "System": {
      "Name": "SISTEMA_CLIENTE",
      "CorrelationID": "123456789",
      "ProcessingServer": "SERVER_01"
    },
    "Service": {
      "Status": "FAIL",
      "ResponseDate": "2024-12-19T10:30:00",
      "ProcessingServer": "SERVER_01",
      "StatusDetail": [
        {
          "ErrorCode": "ERROR_04",
          "ErrorMessage": "La solicitud 123456789 no fue exitosa. Fueron enviados objetos no acordes a la petición",
          "ErrorMessageUser": "La solicitud 123456789 no fue exitosa. Fueron enviados objetos no acordes a la petición"
        }
      ]
    },
    "Property": []
  },
  "WSResponseBody": null
}

Diagramas Técnicos

3.1 Flujo de datos

mermaid
graph TD
  A[Recepción de la solicitud] --> B[ServicesController.GetBalance_v2]
  B --> C[Auditoría de entrada]
  C --> D[Conversión de datos]
  D --> E[Validación de request]
  E --> F[Obtención del origen]
  F --> G[Consulta del servicio móvil]
  G --> H[ServiceUtil2.GetBalance]
  H --> I[Procesamiento de saldos]
  I --> J[Generación de respuesta]
  J --> K[Auditoría de salida]
  K --> L[Respuesta al cliente]

3.2 Arquitectura de clases

mermaid
classDiagram
  class ServicesController {
    +GetBalance_v2(BaseRequestGetBalance_v2)
  }
  class ServiceBusiness {
    +GetBalance_v2(BaseRequest, string)
  }
  class ServiceUtil2 {
    +GetBalance(RequestModel, ServiceModel)
  }
  class GetBalanceRequest_v2 {
    +Audit Audit
    +string Phone
  }
  class GetBalanceResponse_v2 {
    +string Available_Coin
    +double? Available_Coin_Value
    +GetBalanceGroupDetailResponse_v2 Detailed
    +string Promotion_Coin
    +double? Promotion_Coin_Value
    +GetBalanceGroupResourceResponse_v2 Resume
  }
  ServicesController --> ServiceBusiness
  ServiceBusiness --> ServiceUtil2
  ServiceBusiness --> GetBalanceRequest_v2
  ServiceBusiness --> GetBalanceResponse_v2

3.3 Secuencia de ejecución

mermaid
sequenceDiagram
  participant Cliente
  participant ServicesController
  participant ServiceBusiness
  participant ServiceUtil2
  participant AuditUtil
  participant ConfigurationUtil
  
  Cliente->>ServicesController: POST /api/services/v2/getbalance
  ServicesController->>AuditUtil: Save_Request_Async (entrada)
  ServicesController->>ServiceBusiness: GetBalance_v2()
  ServiceBusiness->>ServiceBusiness: Validación de datos
  ServiceBusiness->>ServiceBusiness: Conversión de request
  ServiceBusiness->>ServiceBusiness: Obtención del origen
  ServiceBusiness->>ServiceUtil2: GetBalance()
  ServiceUtil2-->>ServiceBusiness: Datos del servicio
  ServiceBusiness->>ServiceBusiness: Procesamiento de saldos
  ServiceBusiness->>ConfigurationUtil: Get_Tipology("OK_01")
  ServiceBusiness->>AuditUtil: Save_Request_Async (salida)
  ServiceBusiness-->>ServicesController: BaseResponseGetBalance_v2
  ServicesController-->>Cliente: Respuesta JSON

Políticas y Consideraciones

Políticas de seguridad

Mecanismos de autenticación y autorización:

  • Validación de headers de autenticación para endpoints SOAP
  • Validación de token Bearer para endpoints REST
  • Validación de usuario MiETB para endpoints protegidos

Validaciones de seguridad implementadas:

  • Validación de IP de origen
  • Auditoría completa de todas las transacciones
  • Validación de datos de entrada
  • Sanitización de parámetros

Límites de tasa (rate limits):

  • No se implementan rate limits específicos
  • Se recomienda implementar throttling por IP/usuario

SLAs aplicables:

  • Tiempo de respuesta esperado: < 2 segundos
  • Disponibilidad: 99.9%
  • Tolerancia a fallos: 3 reintentos automáticos

Recomendaciones y mejores prácticas

Puntos de mejora específicos en el código:

  1. Implementar rate limiting para prevenir abuso del servicio
  2. Agregar validación de formato de número telefónico
  3. Implementar caché para consultas frecuentes del mismo número
  4. Mejorar el manejo de excepciones con logging estructurado

Optimizaciones posibles:

  1. Implementar paginación para respuestas con muchos recursos
  2. Agregar compresión de respuesta para reducir ancho de banda
  3. Implementar versionado de API más robusto
  4. Agregar métricas de rendimiento y monitoreo

Consideraciones de mantenimiento importantes:

  1. Mantener compatibilidad con versiones anteriores
  2. Documentar cambios en la estructura de respuesta
  3. Implementar tests automatizados para validar regresiones
  4. Monitorear el uso de recursos del servicio

Sugerencias de seguridad aplicables:

  1. Implementar autenticación OAuth 2.0
  2. Agregar validación de JWT tokens
  3. Implementar rate limiting por IP y usuario
  4. Agregar logging de auditoría más detallado
  5. Implementar encriptación de datos sensibles en tránsito