Skip to content

Creación de PQRs - pqr-v3-create

Información del Servicio

Endpoint: /api/pqr/v3/create
Método: POST
Versión: v3
Categoría: Gestión de PQRs

Documentación del Servicio

Descripción general

El servicio pqr-v3-create es un endpoint para crear PQRs (Peticiones, Quejas y Reclamos) de forma asíncrona. Este servicio permite la creación de PQRs con validaciones de duplicidad, gestión de adjuntos, y soporte para fallas técnicas.

Categoría de negocio: Gestión de PQRs y atención al cliente.

Casos de uso principales:

  • Creación de PQRs por fallas técnicas
  • Creación de PQRs con adjuntos (PDF)
  • Validación de duplicidad de PQRs
  • Gestión de PQRs hijas para fallas masivas
  • Creación de PQRs sin servicio asociado (sistema MAX)

Especificación técnica

  • Endpoint completo: /api/pqr/v3/create
  • Método HTTP: POST
  • Capas involucradas:
    • Controlador: PQRController.Create_v3
    • Lógica de negocio: PQRBusiness.Create_v3
    • Acceso a datos: PQRUtil, ServiceUtil, CustomerUtil

Flujo de procesamiento:

  1. Validación de datos de entrada y auditoría
  2. Consulta de origen y configuración
  3. Validación de API activa/inactiva
  4. Consulta de servicio por número de conexión
  5. Consulta de cliente y validación de contacto
  6. Validación de titularidad del servicio
  7. Consulta de tipología de PQR
  8. Validación de duplicidad de PQRs
  9. Creación de PQR en base de datos
  10. Determinación de tipo de falla (lógica/física)
  11. Procesamiento de adjuntos
  12. Respuesta final con datos de la PQR creada

Dependencias principales:

  • PQRUtil para gestión de PQRs
  • ServiceUtil para consulta de servicios
  • CustomerUtil para gestión de clientes
  • StorageUtil para gestión de adjuntos
  • ConfigurationUtil para parámetros

Consideraciones de seguridad:

  • Validación de titularidad del servicio
  • Auditoría completa de entrada y salida
  • Validación de origen de la petición
  • Control de acceso por sistema

Autenticación y Autorización

Bearer Token Authentication

El servicio requiere autenticación mediante Bearer Token JWT. El sistema implementa un TokenValidationHandler que valida los tokens en cada petición.

Headers de autenticación:

  • Authorization: Bearer token estándar
  • Authorization-BOT: Token cifrado específico para sistemas BOT

Validaciones implementadas:

  • Verificación de firma JWT con clave secreta
  • Validación de audiencia y emisor del token
  • Control de tiempo de vida del token (30 minutos por defecto)
  • Validación de IP y User-Agent para sistemas específicos
  • Control de duplicidad de tokens en cache

Configuración JWT:

  • JWT_SECRET_KEY: Clave secreta para firma
  • JWT_AUDIENCE_TOKEN: Audiencia del token
  • JWT_ISSUER_TOKEN: Emisor del token
  • JWT_EXPIRE_MINUTES: Tiempo de vida (30 minutos)
  • JWT_SYSTEMS: Sistemas con validación activa (MIETB, TIENDA)

Ejemplo de header de autenticación:

http
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Authorization-BOT: Bearer [token_cifrado_con_AES]

Casos de Uso Específicos

1. Chatbot (Luz - MAX)

Características específicas:

  • Sistema: MAX
  • Canal: chatbot
  • Validaciones especiales para conversaciones automáticas
  • Soporte para fallas masivas con CUN padre

Ejemplo de request para chatbot:

json
{
  "WSRequestHeader": {
    "System": {
      "name": "MAX",
      "correlationID": "MAX-CHAT-20241219-001",
      "processingServer": "MAX-SERVER"
    }
  },
  "WSRequestBody": {
    "Audit": {
      "Canal": "chatbot",
      "Id_Device": "MAX-LUZ-001",
      "SO": "MAX-LUZ",
      "IP_Address": "192.168.1.100"
    },
    "Contact": {
      "Document_Number": "12345678",
      "Document_Type": "CC",
      "Email": "cliente@email.com",
      "Phone": "3001234567"
    },
    "Failure": {
      "BOT_Peticion": "FALLA_INTERNET",
      "Causal": "FALLA_TECNICA",
      "Class": "INTERNET",
      "Description": "No tengo conexión a internet",
      "Reason": "FALLA TECNICA",
      "Symptom": "SIN_CONEXION"
    },
    "Phone": "3057000421",
    "State": "ABIERTA",
    "User": "MAX-LUZ"
  }
}

2. Portal Web

Características específicas:

  • Sistema: PORTALWEB
  • Canal: web
  • Validación estricta de titularidad del servicio
  • Soporte para adjuntos PDF

Ejemplo de request para portal web:

json
{
  "WSRequestHeader": {
    "System": {
      "name": "PORTALWEB",
      "correlationID": "PORTALWEB-20241219-001",
      "processingServer": "WEB-SERVER"
    }
  },
  "WSRequestBody": {
    "Audit": {
      "Canal": "web",
      "Id_Device": "WEB-BROWSER",
      "SO": "Windows 10",
      "IP_Address": "192.168.1.101"
    },
    "Contact": {
      "Document_Number": "87654321",
      "Document_Type": "CC",
      "Email": "cliente@email.com",
      "Phone": "3001234567"
    },
    "Failure": {
      "BOT_Peticion": "FALLA_TELEFONIA",
      "Causal": "FALLA_TECNICA",
      "Class": "TELEFONIA",
      "Description": "No tengo señal telefónica",
      "Reason": "FALLA TECNICA",
      "Symptom": "SIN_SENAL"
    },
    "Phone": "3057000421",
    "State": "ABIERTA",
    "User": "PORTALWEB",
    "Attachments": [
      {
        "File": "JVBERi0xLjQKJcOkw7zDtsO...",
        "Filename": "evidencia_falla.pdf",
        "Filesize": 2048,
        "Filetype": "pdf"
      }
    ]
  }
}

3. Aplicación Móvil

Características específicas:

  • Sistema: MIETB
  • Canal: app
  • Validación de dispositivo móvil
  • Soporte para geolocalización

Ejemplo de request para app móvil:

json
{
  "WSRequestHeader": {
    "System": {
      "name": "MIETB",
      "correlationID": "MIETB-APP-20241219-001",
      "processingServer": "APP-SERVER"
    }
  },
  "WSRequestBody": {
    "Audit": {
      "Canal": "app",
      "Id_Device": "MIETB-APP-ANDROID-001",
      "SO": "Android 12",
      "IP_Address": "192.168.1.102",
      "IP_Latitude": "4.7110",
      "IP_Longitude": "-74.0721"
    },
    "Contact": {
      "Document_Number": "11223344",
      "Document_Type": "CC",
      "Email": "cliente@email.com",
      "Phone": "3001234567"
    },
    "Failure": {
      "BOT_Peticion": "FALLA_TV",
      "Causal": "FALLA_TECNICA",
      "Class": "TV",
      "Description": "No tengo señal de TV",
      "Reason": "FALLA TECNICA",
      "Symptom": "SIN_SENAL_TV"
    },
    "Phone": "3057000421",
    "State": "ABIERTA",
    "User": "MIETB-APP"
  }
}

Estructura Simplificada para Casos Básicos

Request Simplificado (Mínimo)

Para casos básicos donde no se requieren adjuntos ni información adicional:

json
{
  "WSRequestHeader": {
    "System": {
      "name": "SISTEMA_CLIENTE",
      "correlationID": "REQ-20241219-001",
      "processingServer": "SERVER01"
    }
  },
  "WSRequestBody": {
    "Audit": {
      "Canal": "web"
    },
    "Contact": {
      "Document_Number": "12345678",
      "Document_Type": "CC"
    },
    "Failure": {
      "BOT_Peticion": "FALLA_INTERNET"
    },
    "Phone": "3057000421"
  }
}

Request Completo (Avanzado)

Para casos que requieren toda la información disponible:

json
{
  "WSRequestHeader": {
    "System": {
      "name": "SISTEMA_CLIENTE",
      "correlationID": "REQ-20241219-001",
      "processingServer": "SERVER01"
    },
    "Property": [
      {
        "Name": "ActivityS1N",
        "Value": "ACTIVIDAD_ESPECIAL"
      }
    ]
  },
  "WSRequestBody": {
    "Audit": {
      "Canal": "web",
      "Id_Device": "DEVICE-001",
      "SO": "Windows 10",
      "IP_Address": "192.168.1.100",
      "WhatsApp_Phone_Number": "3001234567"
    },
    "Contact": {
      "Document_Number": "12345678",
      "Document_Type": "CC",
      "Email": "cliente@email.com",
      "Phone": "3001234567"
    },
    "CUN_Massive_Failure": "CUN-MASIVA-001",
    "CUN_Related": "CUN-RELACIONADO-001",
    "Description": "Descripción detallada del problema",
    "Document_Number": "87654321",
    "Document_Type": "CC",
    "Failure": {
      "BOT_Peticion": "FALLA_INTERNET",
      "Causal": "FALLA_TECNICA",
      "Class": "INTERNET",
      "Description": "No tengo conexión a internet",
      "Reason": "FALLA TECNICA",
      "Symptom": "SIN_CONEXION"
    },
    "Phone": "3057000421",
    "Product": "INTERNET_FIBRA",
    "Solution": "Solución aplicada",
    "State": "ABIERTA",
    "User": "USUARIO_SISTEMA",
    "Attachments": [
      {
        "File": "JVBERi0xLjQKJcOkw7zDtsO...",
        "Filename": "evidencia.pdf",
        "Filesize": 2048,
        "Filetype": "pdf"
      }
    ]
  }
}

Parámetros de entrada (Request)

Headers

CampoTipoObligatorioDescripción
AuthorizationstringBearer token JWT para autenticación
WSRequestHeaderobjectCabecera de la petición con información del sistema

Body

CampoTipoObligatorioDescripción
AttachmentsarrayNoListado de adjuntos de la PQR
AuditobjectAuditoría de la aplicación
ContactobjectDatos del contacto creador de la PQR
CUN_Massive_FailurestringNoCUN de falla masiva
CUN_RelatedstringNoCUN relacionado
DescriptionstringNoDescripción de la PQR
Document_NumberstringNoNúmero de identificación del cliente
Document_TypestringNoTipo de documento del cliente
FailureobjectSintomas y causales asociados a la PQR
PhonestringNoNúmero de conexión del servicio
ProductstringNoProducto asociado a la PQR
SolutionstringNoDescripción de cierre de la PQR
StatestringNoEstado de la PQR (ABIERTA o CERRADO)
UserstringNoUsuario de la PQR

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

Estructura de Contact

CampoTipoObligatorioDescripción
Document_NumberstringNúmero de documento del contacto
Document_TypestringTipo de documento del contacto
EmailstringNoCorreo electrónico del contacto
PhonestringNoTeléfono de contacto

Estructura de Failure

CampoTipoObligatorioDescripción
BOT_PeticionstringNoPetición del bot
CausalstringNoCausal asociada a la PQR
ClassstringNoClase asociada a la PQR
DescriptionstringNoDescripción de la PQR
ReasonstringNoRazón asociada a la PQR
SymptomstringNoSíntoma asociado a la PQR

Estructura de Attachments

CampoTipoObligatorioDescripción
FilestringArchivo en base 64
FilenamestringNombre del archivo
FilesizeintNoTamaño del archivo
FiletypestringTipo del archivo (PDF, XML, etc.)

Respuesta esperada (Response)

Headers

CampoTipoObligatorioDescripción
WSResponseHeaderobjectCabecera de la respuesta

Body

CampoTipoObligatorioDescripción
AuditobjectNoAuditoría de la aplicación
CausalstringNoCausal de la PQR
Contact_Document_NumberstringNoNúmero de identificación del contacto
Contact_Document_TypestringNoTipo de identificación del contacto
Creation_DateDateTimeNoFecha de creación de la PQR
CUNstringNoCUN asociado a la PQR
DescriptionstringNoDescripción de la PQR
Document_NumberstringNoNúmero de identificación del cliente
Document_TypestringNoTipo de identificación del cliente
IdstringNoNúmero de la PQR
Is_SonboolNoBandera que determina si es una PQR hija
KindstringNoClase de la PQR
PhonestringNoNúmero de conexión asociado a la PQR
ReasonstringNoRazón de creación de la PQR
Solution_DateDateTimeNoFecha de solución de la PQR
StatestringNoEstado de la PQR
SymptomstringNoSíntoma de la PQR
TypestringNoTipo de la PQR

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
ResponseDateDateTimeNoFecha de la respuesta
ProcessingServerstringNoServidor de procesamiento de la solicitud
StatusDetailarrayNoDetalle del procesamiento de la solicitud

Estructura de WSResponseHeader.Service.StatusDetail

CampoTipoObligatorioDescripción
ErrorCodestringNoCódigo del error
ErrorDetailCodestringNoDetalle del error
ErrorMessagestringNoMensaje del error
ErrorMessageUserstringNoMensaje del error para usuario

Estructura de WSResponseHeader.Property

CampoTipoObligatorioDescripción
NamestringNoNombre de la propiedad
ValuestringNoValor de la propiedad

Manejo de errores

CódigoDescripciónEjemplo
ERROR_04El request es nuloError en la conversión de datos
ERROR_06Servicio no encontradoEl número de conexión no existe
ERROR_07Cliente no encontradoEl cliente no existe en el sistema
ERROR_08Error de titularidadEl documento no corresponde al titular del servicio
ERROR_10Tipología no encontradaLa combinación de causal, clase, razón y síntoma no es válida
ERROR_11PQR duplicadaYa existe una PQR abierta con la misma tipología
ERROR_92Error en la creaciónError al crear la PQR en el sistema
ERROR_93Estado inválidoEl estado de la PQR no es válido
BOTERRORExcepción no controladaError interno del sistema

Análisis de Componentes

Modelos y componentes

Modelos base utilizados:

  • BaseRequestCreatePQR_v3
  • CreatePQRRequest_v3
  • CreatePQRResponse_v3
  • BotBaseRequestHeader
  • BotBaseResponseHeader

Utilidades y servicios comunes:

  • PQRUtil para gestión de PQRs
  • ServiceUtil para consulta de servicios
  • CustomerUtil para gestión de clientes
  • StorageUtil para gestión de adjuntos
  • ConfigurationUtil para parámetros

Patrones de diseño implementados:

  • Singleton para PQRBusiness
  • Factory para creación de modelos
  • Strategy para manejo de diferentes tipos de fallas

Componentes reutilizados:

  • Audit para auditoría
  • BotBaseRequestHeader/ResponseHeader para cabeceras
  • PQRModel para modelo de datos

Referencias cruzadas:

  • PQRController para endpoint
  • PQRBusiness para lógica de negocio
  • PQRUtil para operaciones de base de datos

Ejemplos de Request/Response

Solicitud (request)

json
{
  "WSRequestHeader": {
    "System": {
      "name": "Kioskos",
      "correlationID": "Kioskos-21062022-20451",
      "processingServer": "SERVER01"
    },
    "Property": []
  },
  "WSRequestBody": {
    "Audit": {
      "Canal": "web",
      "Id_Device": null,
      "SO": null,
      "IP_Address": null,
      "WhatsApp_Phone_Number": null
    },
    "Contact": {
      "Document_Number": "12345678",
      "Document_Type": "CC",
      "Email": "cliente@email.com",
      "Phone": "3001234567"
    },
    "Failure": {
      "BOT_Peticion": "FALLA_INTERNET",
      "Causal": "FALLA_TECNICA",
      "Class": "INTERNET",
      "Description": "No tengo conexión a internet",
      "Reason": "FALLA TECNICA",
      "Symptom": "SIN_CONEXION"
    },
    "Phone": "3057000421",
    "State": "ABIERTA",
    "User": "PORTALWEB"
  }
}

Respuesta exitosa

json
{
  "WSResponseHeader": {
    "System": {
      "name": "Kioskos",
      "correlationID": "Kioskos-21062022-20451",
      "processingServer": "SERVER01"
    },
    "Service": {
      "status": "OK",
      "responseDate": "2024-12-19T10:30:00",
      "processingServer": "SERVER01",
      "statusDetail": [
        {
          "errorCode": "OK_01",
          "errorDetailCode": "PQR creada exitosamente",
          "errorMessage": "La PQR ha sido creada correctamente",
          "errorMessageUser": "Su PQR ha sido creada exitosamente"
        }
      ]
    },
    "Property": []
  },
  "WSResponseBody": {
    "Audit": {
      "Canal": "web",
      "Id_Device": null,
      "SO": null,
      "IP_Address": null,
      "WhatsApp_Phone_Number": null
    },
    "Causal": "FALLA_TECNICA",
    "Contact_Document_Number": "12345678",
    "Contact_Document_Type": "CC",
    "Creation_Date": "2024-12-19T10:30:00",
    "CUN": "CUN-2024-001234",
    "Description": "No tengo conexión a internet",
    "Document_Number": "87654321",
    "Document_Type": "CC",
    "Id": "PQR-2024-001234",
    "Is_Son": false,
    "Kind": "INTERNET",
    "Phone": "3057000421",
    "Reason": "FALLA TECNICA",
    "Solution_Date": null,
    "State": "ABIERTA",
    "Symptom": "SIN_CONEXION",
    "Type": "FALLA_TECNICA"
  }
}

Respuesta de error

json
{
  "WSResponseHeader": {
    "System": {
      "name": "Kioskos",
      "correlationID": "Kioskos-21062022-20451",
      "processingServer": "SERVER01"
    },
    "Service": {
      "status": "ERROR",
      "responseDate": "2024-12-19T10:30:00",
      "processingServer": "SERVER01",
      "statusDetail": [
        {
          "errorCode": "ERROR_11",
          "errorDetailCode": "Ya existe una PQR abierta con la misma tipología",
          "errorMessage": "El cliente ya tiene una PQR abierta con CUN CUN-2024-001234",
          "errorMessageUser": "Ya existe una PQR abierta para este servicio"
        }
      ]
    },
    "Property": []
  },
  "WSResponseBody": null
}

Diagramas Técnicos Mejorados

3.1 Flujo de datos detallado

mermaid
graph TD
  A[Cliente envía request] --> B[TokenValidationHandler]
  B --> C{Token válido?}
  C -->|No| D[Error 401 Unauthorized]
  C -->|Sí| E[PQRController.Create_v3]
  E --> F[PQRBusiness.Create_v3]
  F --> G[Auditoría de entrada]
  G --> H[Validación de datos]
  H --> I{Request válido?}
  I -->|No| J[Error ERROR_04]
  I -->|Sí| K[Consulta de origen]
  K --> L[Validación API activa]
  L --> M{API activa?}
  M -->|No| N[Error API desactivada]
  M -->|Sí| O[Consulta de servicio]
  O --> P{¿Servicio existe?}
  P -->|No| Q[Error ERROR_06]
  P -->|Sí| R[Consulta de cliente]
  R --> S{¿Cliente existe?}
  S -->|No| T[Error ERROR_07]
  S -->|Sí| U[Validación titularidad]
  U --> V{¿Es titular?}
  V -->|No| W[Error ERROR_08]
  V -->|Sí| X[Consulta tipología]
  X --> Y{¿Tipología válida?}
  Y -->|No| Z[Error ERROR_10]
  Y -->|Sí| AA[Validación duplicidad]
  AA --> BB{¿PQR duplicada?}
  BB -->|Sí| CC[Error ERROR_11]
  BB -->|No| DD[Creación PQR]
  DD --> EE[Determinación tipo falla]
  EE --> FF[Procesamiento adjuntos]
  FF --> GG[Respuesta exitosa]
  
  style A fill:#e1f5fe
  style GG fill:#c8e6c9
  style D fill:#ffcdd2
  style J fill:#ffcdd2
  style N fill:#ffcdd2
  style Q fill:#ffcdd2
  style T fill:#ffcdd2
  style W fill:#ffcdd2
  style Z fill:#ffcdd2
  style CC fill:#ffcdd2

3.2 Arquitectura de clases mejorada

mermaid
classDiagram
  class PQRController {
    +Create_v3(BaseRequestCreatePQR_v3) Task~BaseResponseCreatePQR_v3~
    +[Authorize] attribute
  }
  class TokenValidationHandler {
    +TryRetrieveToken(HttpRequestMessage) bool
    +ValidateToken(HttpRequestMessage, string) bool
    +SendAsync(HttpRequestMessage, CancellationToken) Task~HttpResponseMessage~
  }
  class PQRBusiness {
    +Create_v3(BaseRequest, string) Task~BaseResponseCreatePQR_v3~
    +GetInstance singleton
  }
  class PQRUtil {
    +Create(RequestModel, CustomerModel, ContactModel, ServiceModel, PQRModel) bool
    +Get_Typology(string, string, string, string, string, string, string) PQRModel
    +Get_By_Customer(string, string, string) List~PQRModel~
  }
  class ServiceUtil {
    +Get_By_Phone(RequestModel, string, bool) ServiceModel
  }
  class CustomerUtil {
    +Get(string, string) CustomerModel
    +Check_Contact(CustomerModel, ContactModel) ContactModel
  }
  class StorageUtil {
    +Upload_File(string, string, string, string, string, string, bool) bool
  }
  class ConfigurationUtil {
    +Get_Origin(BaseRequest, Audit, string, RequestModel) string
    +Is_Api_Turned_On(RequestModel, string) bool
  }
  
  PQRController --> TokenValidationHandler : uses
  PQRController --> PQRBusiness : calls
  PQRBusiness --> PQRUtil : uses
  PQRBusiness --> ServiceUtil : uses
  PQRBusiness --> CustomerUtil : uses
  PQRBusiness --> StorageUtil : uses
  PQRBusiness --> ConfigurationUtil : uses

3.3 Secuencia de ejecución detallada

mermaid
sequenceDiagram
  participant Client as Cliente
  participant Gateway as API Gateway
  participant Auth as TokenValidationHandler
  participant Controller as PQRController
  participant Business as PQRBusiness
  participant PQRUtil as PQRUtil
  participant ServiceUtil as ServiceUtil
  participant CustomerUtil as CustomerUtil
  participant StorageUtil as StorageUtil
  participant DB as Base de Datos
  
  Client->>Gateway: POST /api/pqr/v3/create
  Gateway->>Auth: Validate Bearer Token
  Auth->>Auth: Decrypt & Validate JWT
  Auth-->>Gateway: Token Valid/Invalid
  Gateway->>Controller: Route to Controller
  Controller->>Controller: FillBaseRequest()
  Controller->>Business: Create_v3()
  Business->>Business: Audit Entry
  Business->>ServiceUtil: Get_By_Phone()
  ServiceUtil->>DB: Query Service
  DB-->>ServiceUtil: Service Data
  ServiceUtil-->>Business: ServiceModel
  Business->>CustomerUtil: Get()
  CustomerUtil->>DB: Query Customer
  DB-->>CustomerUtil: Customer Data
  CustomerUtil-->>Business: CustomerModel
  Business->>PQRUtil: Get_Typology()
  PQRUtil->>DB: Query Typology
  DB-->>PQRUtil: Typology Data
  PQRUtil-->>Business: PQRModel
  Business->>PQRUtil: Create()
  PQRUtil->>DB: Insert PQR
  DB-->>PQRUtil: PQR Created
  PQRUtil-->>Business: PQR Created
  Business->>StorageUtil: Upload_File() (if attachments)
  StorageUtil-->>Business: File Uploaded
  Business->>Business: Audit Exit
  Business-->>Controller: Response
  Controller-->>Gateway: HTTP Response
  Gateway-->>Client: Final Response

Políticas y Consideraciones

Políticas de seguridad

Mecanismos de autenticación y autorización:

  • Validación de origen de la petición
  • Validación de titularidad del servicio
  • Control de acceso por sistema
  • Bearer Token JWT con validación completa
  • Cifrado AES para tokens especiales
  • Validación de IP y User-Agent para sistemas específicos

Validaciones de seguridad implementadas:

  • Validación de datos de entrada
  • Auditoría completa de entrada y salida
  • Validación de duplicidad de PQRs
  • Control de estados válidos
  • Validación de tiempo de vida del token
  • Control de duplicidad de tokens en cache

Límites de tasa (rate limits):

  • Configuración por parámetros del sistema
  • Control de API activa/inactiva
  • Rate limiting por sistema y usuario

SLAs aplicables:

  • Tiempo de respuesta: < 30 segundos
  • Disponibilidad: 99.9%
  • Tolerancia a fallos: Configurable por parámetros

Recomendaciones y mejores prácticas

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

  1. Implementar validación más robusta de adjuntos
  2. Mejorar el manejo de excepciones específicas
  3. Optimizar consultas de base de datos
  4. Implementar cache para tipologías frecuentes
  5. Implementar rate limiting más granular por sistema
  6. Mejorar la validación de contenido de adjuntos

Optimizaciones posibles:

  1. Uso de async/await en todas las operaciones de I/O
  2. Implementación de circuit breaker para servicios externos
  3. Optimización de consultas de base de datos
  4. Implementación de cache distribuido
  5. Implementar cache de tokens válidos
  6. Optimizar validaciones de seguridad

Consideraciones de mantenimiento importantes:

  1. Mantener actualizada la configuración de tipologías
  2. Monitorear el rendimiento de las consultas
  3. Revisar periódicamente los logs de auditoría
  4. Validar la integridad de los datos de PQRs
  5. Monitorear el rendimiento de validaciones JWT
  6. Revisar logs de autenticación periódicamente

Sugerencias de seguridad aplicables:

  1. Implementar rate limiting más granular
  2. Validar el contenido de los adjuntos
  3. Implementar logging de seguridad
  4. Reforzar la validación de entrada de datos
  5. Implementar rotación de claves JWT
  6. Agregar validación de geolocalización para tokens
  7. Implementar blacklist de tokens revocados