Appearance
Requisitos Tecnicos
Requisitos de infraestructura, integraciones y configuracion que Ontime debe resolver para desplegar PROXIMITI en produccion. Cada seccion describe el estado actual (v2.5 local), lo que debe cambiar, y el esfuerzo estimado.
Resumen de Esfuerzo
| Punto de integracion | Esfuerzo | Descripcion |
|---|---|---|
| Autenticacion (Keycloak → Azure AD) | ALTO | Reescritura de role converter, cambio de issuer en 11 componentes, mapeo de claims |
| Integracion ERP — ALINA | MEDIO | Outbox pattern ya implementado; solo requiere HTTP client real + credenciales |
| Notificaciones — NOVA | MEDIO | Stub reemplazado por HTTP client real; canales email/SMS por definir |
| Proveedores — Kanguro / Hublocker | BAJO | Solo cambiar URLs y credenciales; adapter framework ya operativo |
| Almacenamiento — MinIO → Azure Blob | MEDIO | Nueva implementacion de DocumentStoragePort para Azure Blob + SAS tokens |
| Base de datos — PostgreSQL 16 | MUY BAJO | Mantener PostgreSQL en produccion; migracion a Oracle seria ESFUERZO MUY ALTO |
| Variables de entorno | BAJO | ~50 variables a configurar en el orquestador de produccion |
| Red, CORS y despliegue | ALTO | SSL/TLS, load balancing, K8s, secrets management, monitoring — nada existe aun |
| Chat de soporte | BAJO | Stub devuelve token fake; requiere proveedor real |
1. Autenticacion e Identidad (Keycloak → Azure AD)
Estado actual
Keycloak 24.0.5 como Identity Provider local. Todos los servicios validan JWTs con:
yaml
issuer-uri: http://keycloak:8080/realms/proximiti
jwk-set-uri: http://keycloak:8080/realms/proximiti/protocol/openid-connect/certsLos roles se extraen de realm_access.roles (estructura anidada en el JWT de Keycloak) mediante un KeycloakRoleConverter custom en cada servicio.
Que debe cambiar
| Elemento | Valor actual (Keycloak) | Valor produccion (Azure AD) |
|---|---|---|
| Issuer URI | http://keycloak:8080/realms/proximiti | https://login.microsoftonline.com/{tenant-id}/v2.0 |
| JWKS URI | .../protocol/openid-connect/certs | https://login.microsoftonline.com/{tenant-id}/discovery/v2.0/keys |
| Token endpoint | .../protocol/openid-connect/token | https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token |
| Role claim path | realm_access.roles (anidado) | roles (top-level) o appRoles segun configuracion Azure AD |
| Custom claim | center_code (user attribute mapper) | center_code (extension attribute o claims mapping policy) |
| Client ID | proximiti-bff | App Registration client ID de Azure AD |
Roles requeridos
| Rol | Descripcion | Endpoints protegidos |
|---|---|---|
USER_PUDO | Operador de punto PUDO | Envios, recepcion, entrega, capacidad |
USER_CARRIER | Transportista / conductor | Multi-drop, handshake, recogida caducados |
USER_ADMIN | Administrador de plataforma | Panel admin, gestion usuarios, integraciones |
USER_CUSTOMER | Cliente / remitente | Portal cliente, mis envios, direcciones |
USER_BILLING | Facturacion | Endpoints de billing |
Componentes afectados (11 total)
| Componente | Archivo a modificar | Cambio requerido |
|---|---|---|
| ws-pprx-bff | SecurityConfig.java → KeycloakRoleConverter | Reescribir para Azure AD claim structure |
| ws-pprx-shipments | SecurityConfig.java → KeycloakRoleConverter | Idem |
| ws-pprx-centers | SecurityConfig.java → KeycloakRoleConverter | Idem |
| ws-pprx-users | SecurityConfig.java → KeycloakRoleConverter | Idem |
| ws-pprx-notifications | SecurityConfig.java → KeycloakRoleConverter | Idem |
| ws-pprx-expired | SecurityConfig.java → KeycloakRoleConverter | Idem |
| ws-pprx-issues | SecurityConfig.java → KeycloakRoleConverter | Idem |
| ws-pprx-adapter | SecurityConfig.java → KeycloakRoleConverter | Idem |
| client-portal | src/config/oidc.ts | Cambiar authority, metadata endpoints, client_id |
| pudo-manager-app | lib/config/app_config.dart | Cambiar keycloakIssuer, clientId, redirectUri |
| carrier-app | lib/config/app_config.dart | Cambiar keycloakIssuer, clientId, redirectUri |
Cambios de codigo necesarios
KeycloakRoleConverter— reescribir para leer roles desde claim top-level (roles) en lugar derealm_access.roles. Renombrar la clase aAzureAdRoleConvertero parametrizar el claim path.center_codeclaim — actualmente mapeado como user attribute en Keycloak. Azure AD requiere: extension attribute en App Registration, o claims mapping policy, o Graph API lookup en runtime.Client portal
oidc.ts— las URLs de metadata estan hardcodeadas con path Keycloak (/protocol/openid-connect/*). Cambiar a OIDC discovery automatico o URLs Azure AD.Flutter
app_config.dart—keycloakIssueryclientIdson constantes compiladas viaString.fromEnvironment. Requiere cambio de valores en build flags.Flutter
redirectUri— actualmentecom.proximiti.pudomanager://callback. Debe registrarse como redirect URI valido en Azure AD App Registration.
2. Integracion ERP — ALINA
Estado actual
El servicio ws-pprx-expired implementa el transactional outbox pattern completo. La tabla tp_pprx_alina_outbox almacena ordenes de recogida para envios caducados.
Tabla outbox:
| Columna | Tipo | Descripcion |
|---|---|---|
id | BIGINT IDENTITY | PK |
shipment_id | BIGINT | FK al envio caducado |
alina_order_id | VARCHAR | ID de orden ALINA (idempotency key) |
estado | VARCHAR | PENDING → SENT → CONFIRMED / DEAD_LETTER |
payload | JSONB | Payload completo para ALINA |
attempt_count | INTEGER | Intentos realizados |
next_attempt_at | TIMESTAMPTZ | Siguiente intento programado |
error_class | VARCHAR | NON_RETRYABLE o TRANSIENT_EXHAUSTED |
error_detail | TEXT | Detalle del error |
dead_letter_at | TIMESTAMPTZ | Timestamp de DLQ |
Que hace el stub
AlinaOutboxProcessor.dispatchToAlina() solo escribe un log:
java
// In production, this would be an HTTP call to ALINA API:
// alinaClient.post().uri("/api/pickup-requests")...Que necesita produccion
| Aspecto | Implementacion requerida |
|---|---|
| HTTP client | WebClient o RestClient hacia endpoint ALINA real |
| Endpoint | POST /api/pickup-requests (confirmacion pendiente con equipo ALINA) |
| Autenticacion | Por definir (API key, OAuth2, certificado mutuo) |
| Idempotency | Header X-Idempotency-Key: {alinaOrderId}:{attemptCount} |
| Retry | Exponential backoff: base 30s, max 900s, max 5 intentos |
| DLQ | Records con DEAD_LETTER — panel admin para retrigger manual |
| Correlation | X-Correlation-Id en cada request |
CronJobs (ya implementados)
| Job | Schedule | Funcion |
|---|---|---|
| mark-expired | Diario 02:00 | Marca envios caducados, crea outbox records |
| notify-alina | Cada 15 min | Procesa batch de outbox (max 200 records/batch) |
Informacion que el cliente debe proporcionar
- URL base del API ALINA
- Credenciales de autenticacion (tipo y valores)
- Schema del payload esperado por ALINA
- Contrato de respuesta (codigos HTTP, body de confirmacion)
- Contacto tecnico para validacion de integracion
3. Notificaciones — NOVA (Mulesoft)
Estado actual
NotificationService en ws-pprx-notifications es un stub que solo escribe logs. El flag nova.enabled: false esta desactivado.
Patron de comunicacion
Pattern B: Fire-and-forget — el servicio de notificaciones NO bloquea la accion principal del negocio.
| Parametro | Valor |
|---|---|
| Timeout | 500ms maximo |
| Impacto en negocio | Ninguno — si falla, el envio sigue su flujo normal |
| Reintentos | Responsabilidad de NOVA, no de PROXIMITI |
| Deduplicacion | X-Idempotency-Key en cada trigger |
Eventos que generan notificaciones
| Evento | Trigger | Destinatario |
|---|---|---|
| Envio creado | Cambio estado → CREADO | Remitente |
| Envio en transito | Cambio estado → EN_TRANSITO | Remitente |
| Envio recepcionado | Cambio estado → RECEPCIONADO | Destinatario |
| Envio entregado | Cambio estado → ENTREGADO | Remitente + destinatario |
| Envio caducado | Cambio estado → CADUCADO | Remitente + operador PUDO |
| Proximidad caducidad | 24h antes de expirar | Destinatario |
Notificaciones in-app (YA funcionales)
La tabla tp_pprx_notificacion_usuario almacena notificaciones in-app que SI funcionan en v2.5. Estas son independientes de NOVA y no requieren integracion externa.
Informacion que el cliente debe proporcionar
| Elemento | Descripcion |
|---|---|
| URL NOVA Mulesoft | Endpoint base del API |
| Autenticacion NOVA | OAuth2 client credentials, API key, o equivalente |
| Canal email | SMTP o API (SendGrid, AWS SES, etc.) |
| Canal SMS | Gateway SMS (Twilio, etc.) |
| Canal push | Firebase Cloud Messaging o APNs (para apps Flutter) |
| Templates | Definir contenido por idioma (ES, EN, CA, EU, GL) |
4. Proveedores — Kanguro y Hublocker
Estado actual
El servicio ws-pprx-adapter implementa un framework completo de integracion con proveedores externos. Cada proveedor tiene un adapter que implementa la interfaz ProviderAdapter:
java
public interface ProviderAdapter {
String getProviderCode();
AvailabilityResponse getAvailability(String centerCode);
ReceptionAckResponse notifyReception(String barcode, String centerCode);
TrackingResponse getTracking(String barcode);
CatalogSyncResult syncCatalog();
}Kanguro (OAuth2 client_credentials)
| Endpoint stub | Metodo | Path | Funcion |
|---|---|---|---|
| Auth | POST | /token | Obtener access token |
| Catalog | GET | /catalog | Lista de puntos Kanguro |
| Availability | GET | /{code}/availability | Disponibilidad del punto |
| Reception | POST | /reception | Notificar recepcion de paquete |
| Tracking | GET | /{barcode}/tracking | Estado del envio |
Configuracion actual:
yaml
adapter.kanguro:
base-url: http://stub-kanguro:8098 # → URL real Kanguro
client-id: kanguro-client # → Client ID real
client-secret: kanguro-secret # → Client secret real
webhook-secret: kanguro-webhook-hmac-key # → HMAC key realHublocker (API Key)
| Endpoint stub | Metodo | Path | Funcion |
|---|---|---|---|
| Catalog | GET | /catalog | Lista de lockers |
| Availability | GET | /{code}/compartments/availability | Compartimentos disponibles |
| Reserve | POST | /{code}/reserve | Reservar compartimento |
| Status | GET | /{barcode}/status | Estado del paquete |
Configuracion actual:
yaml
adapter.hublocker:
base-url: http://stub-hublocker:8097 # → URL real Hublocker
api-key: hublocker-api-key # → API key real
webhook-api-key: hublocker-webhook-key # → Webhook validation keyResilience
Circuit breakers Resilience4j ya configurados por proveedor:
| Parametro | Valor |
|---|---|
| Failure rate threshold | 50% |
| Sliding window | 10 calls (COUNT_BASED) |
| Wait in open state | 30s |
| Half-open calls | 3 |
Catalogo sync
| Parametro | Valor |
|---|---|
| Frecuencia | Cada 5 minutos (0 */5 * * * *) |
| Stale threshold | 15 minutos |
| Error failure count | 3 consecutivos → circuit open |
| Error timeout | 30 minutos |
Esfuerzo: BAJO
Solo cambiar URLs base y credenciales en variables de entorno. El codigo no requiere cambios si los APIs reales respetan los contratos de los stubs.
5. Almacenamiento — MinIO → Azure Blob
Buckets actuales
| Bucket | Retencion | Contenido |
|---|---|---|
proximiti-pod-signatures | 90 dias (ILM) | Firmas digitales de POD (signature, photo, ID) |
proximiti-evidence | 90 dias (ILM) | Evidencia de entrega |
proximiti-documents | 30 dias (ILM) | Documentos temporales |
proximiti-profile-photos | Permanente | Fotos de perfil de usuario |
Abstraccion de storage
La interfaz DocumentStoragePort existe en dos servicios:
ws-pprx-shipments/storage/DocumentStoragePort.java— POD, evidenciaws-pprx-centers/storage/DocumentStoragePort.java— documentos de centro
java
public interface DocumentStoragePort {
UploadTokenResponse generateUploadToken(String container, String blobPath, Duration ttl);
InputStream download(String container, String blobPath);
void delete(String container, String blobPath);
}Actualmente implementado por MinioS3StorageAdapter (usa AWS S3 SDK compatible con MinIO).
Que necesita produccion
| Tarea | Descripcion |
|---|---|
AzureBlobStorageAdapter | Nueva implementacion de DocumentStoragePort usando Azure Storage SDK |
| Presigned URLs → SAS tokens | generateUploadToken() debe generar SAS tokens en lugar de presigned S3 URLs |
| BFF profile photos | ProfilePhotoStorage en BFF usa MinIO directamente — necesita refactoring al port |
| Lifecycle management | Configurar lifecycle rules en Azure Blob equivalentes a ILM de MinIO |
| CORS en storage | Azure Blob necesita CORS configurado para upload directo desde Flutter |
Informacion que el cliente debe proporcionar
| Elemento | Descripcion |
|---|---|
| Storage account name | Nombre de la cuenta Azure Storage |
| Access key o connection string | Credencial de acceso |
| Container names | 4 containers equivalentes a los buckets |
| Region | Region Azure para el storage account |
6. Base de Datos — PostgreSQL 16 + PostGIS
Recomendacion: mantener PostgreSQL en produccion
PROXIMITI utiliza funcionalidades especificas de PostgreSQL. La recomendacion es desplegar Azure Database for PostgreSQL — Flexible Server en produccion.
Funcionalidades PostgreSQL utilizadas
| Funcionalidad | Uso en PROXIMITI | Equivalente Oracle | Complejidad migracion |
|---|---|---|---|
BIGINT GENERATED ALWAYS AS IDENTITY | Todas las PKs (30+ tablas) | GENERATED ALWAYS AS IDENTITY | BAJA — Oracle 12c+ soporta |
JSONB | Horarios, payloads, configuracion | JSON (Oracle 21c+) o CLOB | MEDIA — operadores JSONB incompatibles |
geometry(Polygon, 4326) PostGIS | Poligonos de clusters | Oracle Spatial SDO_GEOMETRY | ALTA — API completamente diferente |
| Partial unique indexes | Contratos activos, T&C vigente | Function-based index | MEDIA — reescritura de DDL |
PARTITION BY RANGE | Tracking events por fecha | Particionado Oracle | BAJA — sintaxis similar |
TIMESTAMPTZ | Todos los timestamps | TIMESTAMP WITH TIME ZONE | BAJA — equivalente directo |
pgcrypto extension | Generacion UUID | SYS_GUID() o DBMS_CRYPTO | BAJA |
| GiST spatial indexes | idx_cluster_polygon | Spatial indexes Oracle | ALTA — requiere Oracle Spatial |
CHECK constraints con strings | Estados (e.g., CREADO, EN_TRANSITO) | CHECK constraints | BAJA — equivalente |
| PL/pgSQL functions | Migraciones, triggers | PL/SQL | MEDIA — reescritura |
Esfuerzo total migracion a Oracle: MUY ALTO — se desaconseja. PostGIS y JSONB son los principales obstaculos.
Nota sobre busqueda de proximidad
La busqueda de puntos PUDO cercanos usa calculo Haversine a nivel de aplicacion (no PostGIS). Esto es database-agnostic. PostGIS solo se usa para los poligonos de clusters del Network Manager.
7. Variables de Entorno
Infraestructura (todos los servicios Java)
| Variable | Ejemplo produccion | Servicios |
|---|---|---|
SPRING_DATASOURCE_URL | jdbc:postgresql://{host}:5432/proximiti | 8 servicios |
SPRING_DATASOURCE_USERNAME | (secreto) | 8 servicios |
SPRING_DATASOURCE_PASSWORD | (secreto) | 8 servicios |
SPRING_ZIPKIN_BASE_URL | http://{zipkin-host}:9411 | 8 servicios |
TRACING_SAMPLING_PROBABILITY | 0.1 (10%) | 8 servicios |
SPRING_PROFILES_ACTIVE | production | 8 servicios |
Autenticacion OIDC (todos los servicios Java)
| Variable | Ejemplo produccion | Servicios |
|---|---|---|
SPRING_SECURITY_OAUTH2_RESOURCESERVER_JWT_ISSUER_URI | https://login.microsoftonline.com/{tid}/v2.0 | 8 servicios |
SPRING_SECURITY_OAUTH2_RESOURCESERVER_JWT_JWK_SET_URI | https://login.microsoftonline.com/{tid}/discovery/v2.0/keys | 8 servicios |
KEYCLOAK_CLIENT_SECRET | (secreto — BFF Swagger OAuth) | BFF |
BFF (ws-pprx-bff)
| Variable | Ejemplo produccion |
|---|---|
WS_CENTERS_URL | http://ws-pprx-centers:8091 |
WS_SHIPMENTS_URL | http://ws-pprx-shipments:8092 |
WS_USERS_URL | http://ws-pprx-users:8093 |
WS_NOTIFICATIONS_URL | http://ws-pprx-notifications:8094 |
WS_ISSUES_URL | http://ws-pprx-issues:8096 |
ADAPTER_SERVICE_URL | http://ws-pprx-adapter:8086 |
MINIO_ENDPOINT | Azure Blob endpoint |
MINIO_ACCESS_KEY | (secreto) |
MINIO_SECRET_KEY | (secreto) |
MINIO_PROFILE_BUCKET | proximiti-profile-photos |
MINIO_REGION | westeurope |
CORS_ALLOWED_ORIGINS | https://app.proximiti.ontime.es |
Adaptador (ws-pprx-adapter)
| Variable | Ejemplo produccion |
|---|---|
ADAPTER_KANGURO_BASE_URL | https://api.kanguro.com |
ADAPTER_KANGURO_CLIENT_ID | (secreto) |
ADAPTER_KANGURO_CLIENT_SECRET | (secreto) |
ADAPTER_KANGURO_WEBHOOK_SECRET | (secreto) |
ADAPTER_HUBLOCKER_BASE_URL | https://api.hublocker.com |
ADAPTER_HUBLOCKER_API_KEY | (secreto) |
ADAPTER_HUBLOCKER_WEBHOOK_API_KEY | (secreto) |
ADAPTER_STALE_THRESHOLD_MINUTES | 15 |
ADAPTER_CB_FAILURE_RATE | 50 |
ADAPTER_CB_WINDOW_SIZE | 10 |
Caducidad (ws-pprx-expired)
| Variable | Ejemplo produccion |
|---|---|
EXPIRY_WINDOW_HOURS | 24 |
EXPIRY_BATCH_SIZE | 5000 |
OUTBOX_BATCH_SIZE | 200 |
WS_CENTERS_URL | http://ws-pprx-centers:8091 |
Incidencias (ws-pprx-issues)
| Variable | Ejemplo produccion |
|---|---|
SUPPORT_CHAT_PROVIDER_URL | URL del proveedor de chat real |
SUPPORT_CHAT_FALLBACK_MODE | MODE_A |
ISSUES_SHIPMENTS_BASE_URL | http://ws-pprx-shipments:8092 |
Expediciones (ws-pprx-shipments)
| Variable | Ejemplo produccion |
|---|---|
PROXIMITI_TRANSIT_DAYS | 3 |
PROXIMITI_RETENTION_DAYS | 7 |
STORAGE_MINIO_ENDPOINT | Azure Blob endpoint |
STORAGE_MINIO_ACCESS_KEY | (secreto) |
STORAGE_MINIO_SECRET_KEY | (secreto) |
WS_CENTERS_URL | http://ws-pprx-centers:8091 |
WS_NOTIFICATIONS_URL | http://ws-pprx-notifications:8094 |
Portal cliente (client-portal — compile-time)
| Variable | Ejemplo produccion |
|---|---|
VITE_KEYCLOAK_AUTHORITY | https://login.microsoftonline.com/{tid}/v2.0 |
VITE_KEYCLOAK_CLIENT_ID | App Registration client ID |
VITE_API_BASE_URL | https://api.proximiti.ontime.es |
Flutter apps (compile-time — --dart-define)
| Variable | Ejemplo produccion |
|---|---|
BASE_URL | https://api.proximiti.ontime.es |
MINIO_HOST | Azure Blob endpoint |
KEYCLOAK_ISSUER | https://login.microsoftonline.com/{tid}/v2.0 |
8. Red, CORS y Despliegue
Mapa de puertos
| Componente | Puerto | Protocolo | Exposicion |
|---|---|---|---|
| ws-pprx-bff | 8090 | HTTP | Unico punto de entrada para clientes |
| ws-pprx-centers | 8091 | HTTP | Solo red interna |
| ws-pprx-shipments | 8092 | HTTP | Solo red interna |
| ws-pprx-users | 8093 | HTTP | Solo red interna |
| ws-pprx-notifications | 8094 | HTTP | Solo red interna |
| ws-pprx-expired | 8095 | HTTP | Solo red interna |
| ws-pprx-issues | 8096 | HTTP | Solo red interna |
| ws-pprx-adapter | 8086 | HTTP | Solo red interna |
| stub-kanguro | 8098 | HTTP | Eliminar en produccion |
| stub-hublocker | 8097 | HTTP | Eliminar en produccion |
| client-portal | 80 (nginx) | HTTP | Detras de CDN/reverse proxy |
| PostgreSQL | 5432 | TCP | Solo red interna |
| MinIO / Azure Blob | 9000 | HTTP/HTTPS | Solo red interna + CORS para upload |
| Zipkin | 9411 | HTTP | Solo red interna (perfil observability) |
| Prometheus | 9090 | HTTP | Solo red interna (perfil observability) |
| Grafana | 3002 | HTTP | Solo red interna (perfil observability) |
| Loki | 3100 | HTTP | Solo red interna (perfil observability) |
| Keycloak | 8080 | HTTP | Eliminar en produccion (usar Azure AD) |
| docs-site | 4173 | HTTP | Opcional — solo desarrollo |
CORS
Configuracion actual en BFF:
yaml
cors:
allowed-origins: http://localhost:3000,http://localhost:5173
allowed-methods: GET,POST,PUT,DELETE,PATCH,OPTIONS
allowed-headers: "*"
allow-credentials: trueProduccion: cambiar allowed-origins a dominios reales (https://app.proximiti.ontime.es). Los headers expuestos (ETag, Location, X-Correlation-Id, Retry-After) deben mantenerse.
Health checks
Todos los servicios Java exponen:
| Endpoint | Funcion | Uso |
|---|---|---|
/actuator/health | Health general | Monitoreo |
/actuator/health/live | Liveness probe | K8s liveness |
/actuator/health/ready | Readiness probe (DB + disk) | K8s readiness |
/actuator/metrics | Metricas Micrometer | Prometheus scraping |
/actuator/prometheus | Metricas formato Prometheus | Prometheus scraping |
Rate limiting
Solo aplicado a endpoints del PUDO selector widget (acceso publico):
| Parametro | Valor |
|---|---|
| Per-IP burst | 60 requests |
| Per-IP sustained | 300 requests / 5 min |
| Per-subject (autenticado) | 120 requests |
Infraestructura NO incluida (debe implementarse para produccion)
| Elemento | Descripcion | Prioridad |
|---|---|---|
| SSL/TLS termination | Certificados HTTPS para BFF y portal | Critico |
| Reverse proxy / load balancer | Nginx, Azure Application Gateway, o equivalente | Critico |
| Kubernetes manifests | Deployments, Services, Ingress, HPA | Alta |
| Secrets management | Azure Key Vault o equivalente | Critico |
| Log aggregation | Loki + Promtail implementado en dev; produccion requiere almacenamiento persistente | Alta |
| APM / monitoring | Prometheus + Grafana implementado en dev; produccion requiere alertas y retencion | Alta |
| Database backups | pg_dump automatizado o Azure Backup | Alta |
| CI/CD pipeline | Build, test, deploy automatizado | Alta |
| Container registry | Azure Container Registry o equivalente | Alta |
| DNS | Registros A/CNAME para dominios publicos | Critico |
9. Chat de Soporte (Stub)
Estado actual
SupportChatService en ws-pprx-issues devuelve un token falso para inicializar sesiones de chat.
Configuracion:
yaml
support:
chat:
provider-url: http://stub-chat:8099 # No existe — retorna fake token
fallback-mode: MODE_APara produccion
Seleccionar un proveedor de chat (Zendesk, Intercom, LiveChat, etc.) e implementar el client real en SupportChatService. La interfaz ya espera un ChatTokenResponse con token + URL de sesion.
10. Acciones Prioritarias para Go-Live
Critico (bloquea produccion)
| Accion | Componentes | Esfuerzo |
|---|---|---|
| Migrar autenticacion a Azure AD | 8 servicios Java + React + 2 Flutter | 2-3 semanas |
| Implementar client HTTP real para ALINA | ws-pprx-expired | 1 semana |
| Implementar client HTTP real para NOVA | ws-pprx-notifications | 1 semana |
| SSL/TLS termination + reverse proxy | Infraestructura | 1 semana |
| Secrets management (Azure Key Vault) | Todos los servicios | 1 semana |
| Configurar CORS con dominios de produccion | ws-pprx-bff | 1 dia |
| Registrar bundle IDs Flutter en Azure AD | Apps Flutter | 1 dia |
Configurar X-Frame-Options (re-enable) | ws-pprx-bff SecurityConfig | 1 dia |
Alta prioridad (primera semana post-launch)
| Accion | Componentes | Esfuerzo |
|---|---|---|
Implementar AzureBlobStorageAdapter | ws-pprx-shipments, ws-pprx-centers | 1-2 semanas |
| Kubernetes manifests + HPA | Infraestructura | 2 semanas |
| Credenciales DB de produccion | PostgreSQL + todos los servicios | 1 dia |
| Publicar apps en stores (TestFlight, Play Console) | Flutter apps | 1 semana |
| Log aggregation — almacenamiento persistente para Loki | Infraestructura | 2-3 dias |
| Monitoring — reglas de alerta en Grafana + retencion Prometheus | Infraestructura | 1 semana |
| Metricas de negocio custom + spans personalizados | Servicios Java | 1 semana |
Media prioridad (primer mes)
| Accion | Componentes | Esfuerzo |
|---|---|---|
| Validar integracion real con Kanguro | ws-pprx-adapter | 2-3 dias |
| Validar integracion real con Hublocker | ws-pprx-adapter | 2-3 dias |
| Proveedor de chat real | ws-pprx-issues | 1 semana |
| Backups automatizados de BD | PostgreSQL | 2 dias |
| Rate limiting avanzado (API Gateway) | Infraestructura | 1 semana |
| Push notifications (FCM / APNs) | Flutter apps + ws-pprx-notifications | 2 semanas |
Baja prioridad (roadmap futuro)
| Accion | Componentes | Esfuerzo |
|---|---|---|
| Migracion a Oracle (si requerido) | Toda la BD + ORMs | 3-6 meses |
| Dark mode | React + Flutter apps | 2 semanas |
| Tests unitarios Flutter (cobertura >80%) | Flutter apps | 2-3 semanas |
| Flutter web builds | Flutter apps (bloqueado por mobile_scanner) | Dependencia externa |
| Internacionalizacion completa (5 idiomas) | React + Flutter apps | 2-3 semanas |