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:
- Validación de datos de entrada y auditoría
- Consulta de origen y configuración
- Validación de API activa/inactiva
- Consulta de servicio por número de conexión
- Consulta de cliente y validación de contacto
- Validación de titularidad del servicio
- Consulta de tipología de PQR
- Validación de duplicidad de PQRs
- Creación de PQR en base de datos
- Determinación de tipo de falla (lógica/física)
- Procesamiento de adjuntos
- 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ándarAuthorization-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 firmaJWT_AUDIENCE_TOKEN: Audiencia del tokenJWT_ISSUER_TOKEN: Emisor del tokenJWT_EXPIRE_MINUTES: Tiempo de vida (30 minutos)JWT_SYSTEMS: Sistemas con validación activa (MIETB, TIENDA)
Ejemplo de header de autenticación:
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:
{
"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:
{
"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:
{
"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:
{
"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:
{
"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
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| Authorization | string | Sí | Bearer token JWT para autenticación |
| WSRequestHeader | object | Sí | Cabecera de la petición con información del sistema |
Body
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| Attachments | array | No | Listado de adjuntos de la PQR |
| Audit | object | Sí | Auditoría de la aplicación |
| Contact | object | Sí | Datos del contacto creador de la PQR |
| CUN_Massive_Failure | string | No | CUN de falla masiva |
| CUN_Related | string | No | CUN relacionado |
| Description | string | No | Descripción de la PQR |
| Document_Number | string | No | Número de identificación del cliente |
| Document_Type | string | No | Tipo de documento del cliente |
| Failure | object | Sí | Sintomas y causales asociados a la PQR |
| Phone | string | No | Número de conexión del servicio |
| Product | string | No | Producto asociado a la PQR |
| Solution | string | No | Descripción de cierre de la PQR |
| State | string | No | Estado de la PQR (ABIERTA o CERRADO) |
| User | string | No | Usuario de la PQR |
Estructura de objetos anidados:
Estructura de WSRequestHeader
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| System | object | Sí | Información asociada al sistema |
| Property | array | No | Propiedades asociadas al consumo del servicio web |
Estructura de WSRequestHeader.System
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| Name | string | Sí | Nombre del sistema |
| CorrelationID | string | Sí | Identificador de la petición |
| ProcessingServer | string | Sí | Servidor de procesamiento del sistema |
Estructura de WSRequestHeader.Property
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| Name | string | Sí | Nombre de la propiedad |
| Value | string | Sí | Valor de la propiedad |
Estructura de Audit
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| Canal | string | No | Canal sobre el cual se hizo la petición |
| Id_Device | string | No | Identificador del dispositivo móvil |
| SO | string | No | Sistema operativo del dispositivo |
| IP_Address | string | No | Dirección IP desde donde se realiza la petición |
| WhatsApp_Phone_Number | string | No | Número de Whatsapp desde donde se realiza la petición |
Estructura de Contact
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| Document_Number | string | Sí | Número de documento del contacto |
| Document_Type | string | Sí | Tipo de documento del contacto |
| string | No | Correo electrónico del contacto | |
| Phone | string | No | Teléfono de contacto |
Estructura de Failure
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| BOT_Peticion | string | No | Petición del bot |
| Causal | string | No | Causal asociada a la PQR |
| Class | string | No | Clase asociada a la PQR |
| Description | string | No | Descripción de la PQR |
| Reason | string | No | Razón asociada a la PQR |
| Symptom | string | No | Síntoma asociado a la PQR |
Estructura de Attachments
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| File | string | Sí | Archivo en base 64 |
| Filename | string | Sí | Nombre del archivo |
| Filesize | int | No | Tamaño del archivo |
| Filetype | string | Sí | Tipo del archivo (PDF, XML, etc.) |
Respuesta esperada (Response)
Headers
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| WSResponseHeader | object | Sí | Cabecera de la respuesta |
Body
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| Audit | object | No | Auditoría de la aplicación |
| Causal | string | No | Causal de la PQR |
| Contact_Document_Number | string | No | Número de identificación del contacto |
| Contact_Document_Type | string | No | Tipo de identificación del contacto |
| Creation_Date | DateTime | No | Fecha de creación de la PQR |
| CUN | string | No | CUN asociado a la PQR |
| Description | string | No | Descripción de la PQR |
| Document_Number | string | No | Número de identificación del cliente |
| Document_Type | string | No | Tipo de identificación del cliente |
| Id | string | No | Número de la PQR |
| Is_Son | bool | No | Bandera que determina si es una PQR hija |
| Kind | string | No | Clase de la PQR |
| Phone | string | No | Número de conexión asociado a la PQR |
| Reason | string | No | Razón de creación de la PQR |
| Solution_Date | DateTime | No | Fecha de solución de la PQR |
| State | string | No | Estado de la PQR |
| Symptom | string | No | Síntoma de la PQR |
| Type | string | No | Tipo de la PQR |
Estructura de objetos anidados:
Estructura de WSResponseHeader
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| System | object | No | Información asociada al sistema |
| Service | object | No | Información asociada a la ejecución del servicio |
| Property | array | No | Arreglo de propiedades asociado al servicio |
Estructura de WSResponseHeader.System
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| Name | string | No | Nombre del sistema |
| CorrelationID | string | No | Identificador de la petición |
| ProcessingServer | string | No | Servidor de procesamiento del sistema |
Estructura de WSResponseHeader.Service
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| Status | string | No | Estado de la ejecución del servicio web |
| ResponseDate | DateTime | No | Fecha de la respuesta |
| ProcessingServer | string | No | Servidor de procesamiento de la solicitud |
| StatusDetail | array | No | Detalle del procesamiento de la solicitud |
Estructura de WSResponseHeader.Service.StatusDetail
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| ErrorCode | string | No | Código del error |
| ErrorDetailCode | string | No | Detalle del error |
| ErrorMessage | string | No | Mensaje del error |
| ErrorMessageUser | string | No | Mensaje del error para usuario |
Estructura de WSResponseHeader.Property
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| Name | string | No | Nombre de la propiedad |
| Value | string | No | Valor de la propiedad |
Manejo de errores
| Código | Descripción | Ejemplo |
|---|---|---|
| ERROR_04 | El request es nulo | Error en la conversión de datos |
| ERROR_06 | Servicio no encontrado | El número de conexión no existe |
| ERROR_07 | Cliente no encontrado | El cliente no existe en el sistema |
| ERROR_08 | Error de titularidad | El documento no corresponde al titular del servicio |
| ERROR_10 | Tipología no encontrada | La combinación de causal, clase, razón y síntoma no es válida |
| ERROR_11 | PQR duplicada | Ya existe una PQR abierta con la misma tipología |
| ERROR_92 | Error en la creación | Error al crear la PQR en el sistema |
| ERROR_93 | Estado inválido | El estado de la PQR no es válido |
| BOTERROR | Excepción no controlada | Error 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)
{
"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
{
"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
{
"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
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:#ffcdd23.2 Arquitectura de clases mejorada
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 : uses3.3 Secuencia de ejecución detallada
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 ResponsePolí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:
- Implementar validación más robusta de adjuntos
- Mejorar el manejo de excepciones específicas
- Optimizar consultas de base de datos
- Implementar cache para tipologías frecuentes
- Implementar rate limiting más granular por sistema
- Mejorar la validación de contenido de adjuntos
Optimizaciones posibles:
- Uso de async/await en todas las operaciones de I/O
- Implementación de circuit breaker para servicios externos
- Optimización de consultas de base de datos
- Implementación de cache distribuido
- Implementar cache de tokens válidos
- Optimizar validaciones de seguridad
Consideraciones de mantenimiento importantes:
- Mantener actualizada la configuración de tipologías
- Monitorear el rendimiento de las consultas
- Revisar periódicamente los logs de auditoría
- Validar la integridad de los datos de PQRs
- Monitorear el rendimiento de validaciones JWT
- Revisar logs de autenticación periódicamente
Sugerencias de seguridad aplicables:
- Implementar rate limiting más granular
- Validar el contenido de los adjuntos
- Implementar logging de seguridad
- Reforzar la validación de entrada de datos
- Implementar rotación de claves JWT
- Agregar validación de geolocalización para tokens
- Implementar blacklist de tokens revocados