Modelos de Arquitectura - JuanHerreraP/Proyecto-MISO-Solventa-Grupo-11 GitHub Wiki

1. Vista funcional general

Descripción

La vista funcional general muestra cómo se divide Solventa en componentes y cómo estos colaboran para atender el portal web, la aplicación Android y los sistemas de socios.

Los tres canales ingresan mediante un API Gateway. Desde allí, las solicitudes se dirigen al BFF Web, al BFF Móvil o al componente de Distribución y Socios. Estos componentes utilizan los mismos servicios de dominio para evitar duplicar las reglas de cotización, perfilamiento, suscripción, pólizas, pagos y siniestros.

Diagrama

flowchart TD
subgraph Canales["Canales"]
    Web["Portal Web"]
    Movil["App Móvil (cámara, GPS, biometría, modo offline)"]
    Socios["Sistemas de socios (embedded)"]
end

subgraph Gateway["API y Ruteo"]
    ApiGW["API Gateway (auth, rate limiting, scopes)"]
    BFF_Web["BFF Web"]
    BFF_Movil["BFF Móvil"]
end

subgraph Core["Servicios de Dominio"]
    MS_Auth["Identidad, KYC y Consentimiento"]
    MS_Risk["Perfilamiento de Riesgo"]
    MS_Rating["Cotización y Precio"]
    MS_Under["Suscripción"]
    MS_Policy["Emisión y Ciclo de Vida"]
    MS_Pay["Cobros y Pagos"]
    MS_Claims["Siniestros"]
    MS_Partners["Distribución y Socios"]
end

EventBus["Event Bus"]

subgraph Adaptadores["Adaptadores (aislamiento de terceros)"]
    Ad_OF["Adaptador Open Finance"]
    Ad_OD["Adaptador Open Data"]
    Ad_KYC["Adaptador KYC / AML"]
    Ad_Pay["Adaptador Pagos"]
    Ad_Sign["Adaptador Firma Electrónica"]
    Ad_Tele["Adaptador Telemetría"]
end

subgraph Externos["Proveedores Externos"]
    Ext_OF["Open Finance"]
    Ext_OD["Open Data"]
    Ext_KYC["Proveedor KYC / AML"]
    Ext_Pay["Pasarela de Pagos"]
    Ext_Sign["Firma Electrónica"]
    Ext_Tele["Telemetría / IoT"]
end

%% Conectores Capa 1 a Capa 2
Web -->|HTTPS / REST| ApiGW
Movil -->|HTTPS / REST| ApiGW
Socios -->|HTTPS / REST| ApiGW

%% Conectores Internos de Capa 2
ApiGW -->|Filtro & Enrutamiento Seguro| BFF_Web
ApiGW -->|Filtro & Enrutamiento Seguro| BFF_Movil

%% Flujo de Control: BFF Web hacia el Core
BFF_Web -->|1. Solicitar Emisión| MS_Policy
BFF_Web -->|2. Evaluar Viabilidad| MS_Under
BFF_Web -->|3. Consultar Tarifas| MS_Rating
BFF_Web -->|4. Sincronizar Alianzas| MS_Partners

%% Flujo de Control: BFF Móvil hacia el Core
BFF_Movil -->|1. Reportar Reclamación| MS_Claims
BFF_Movil -->|2. Autenticación Biométrica| MS_Auth
BFF_Movil -->|3. Consultar Cotización| MS_Rating
BFF_Movil -->|4. Descargar Certificados| MS_Policy

%% Flujo de Control Interno del Core transaccional
MS_Partners -->|Cargar Parámetros del Socio| MS_Rating
MS_Risk -->|Suministrar Perfil para Tarifación| MS_Rating
MS_Rating -->|Enviar Prima Calculada| MS_Under
MS_Under -->|Aprobar Riesgo Técnico| MS_Policy
MS_Policy -->|Gatillar Cobro de Cobertura| MS_Pay
MS_Claims -->|Dispersar Pago de Indemnización| MS_Pay

%% Conexiones con el Event Bus (Siniestralidad Paramétrica)
MS_Claims -.->|Publicar evento paramétrico asíncrono| EventBus
EventBus -.->|Disparar pago automático asíncrono| MS_Pay

%% Conexiones e Integración de Adaptadores del Core
MS_Risk -->|Verificar Historial Financiero| Ad_OF
MS_Rating -->|Enriquecer Análisis con Open Finance| Ad_OF
Ad_OF -->|Llamada API Externa HTTPS / TLS 1.3| Ext_OF

MS_Risk -->|Consultar Datos Públicos y Prediales| Ad_OD
Ad_OD -->|Consulta Abierta HTTPS| Ext_OD

MS_Auth -->|Validar Identidad en Onboarding| Ad_KYC
Ad_KYC -->|Onboarding Síncrono HTTPS| Ext_KYC

MS_Pay -->|Procesar Recaudo / Indemnizaciones| Ad_Pay
Ad_Pay -->|Pasarela Segura HTTPS / Estándar PCI-DSS| Ext_Pay

MS_Policy -->|Firmar Póliza Emitida| Ad_Sign
Ad_Sign -->|Firma Digital XML Criptográfica| Ext_Sign

MS_Claims -->|Monitorear Telemetría Satelital / Vuelos| Ad_Tele
Ad_Tele -->|Conexión Activa de Escucha / Webhook| Ext_Tele

%% Clases de Estilo de Colores Originales
classDef canal fill:#eef2f8,stroke:#5b6b8c,stroke-width:1.5px,color:#233047;
classDef gateway fill:#eaf1fb,stroke:#3866a3,stroke-width:1.5px,color:#173252;
classDef core fill:#eefaf1,stroke:#2f8f52,stroke-width:1.5px,color:#144d28;
classDef msg fill:#fdf3e7,stroke:#c98a2b,stroke-width:1.5px,color:#5c3d0e,stroke-dasharray: 4 3;
classDef adapter fill:#f3eefb,stroke:#7a52b8,stroke-width:1.5px,color:#3b1f66;
classDef ext fill:#f7f7f8,stroke:#8a8f98,stroke-width:1.5px,color:#3a3d42;

class Web,Movil,Socios canal;
class ApiGW,BFF_Web,BFF_Movil gateway;
class MS_Auth,MS_Risk,MS_Rating,MS_Under,MS_Policy,MS_Pay,MS_Claims,MS_Partners core;
class EventBus msg;
class Ad_OF,Ad_OD,Ad_KYC,Ad_Pay,Ad_Sign,Ad_Tele adapter;
class Ext_OF,Ext_OD,Ext_KYC,Ext_Pay,Ext_Sign,Ext_Tele ext;

Patrón 1: API Gateway para centralizar el acceso

Patrón 2: Backend for Frontend para web y Android

Patrón 3: Puertos y Adaptadores


2. Vista funcional móvil

Descripción

La vista funcional móvil muestra cómo se organizan los componentes de la aplicación Android y cómo se comunican con los servicios de Solventa.

La aplicación utiliza capacidades locales como cámara, GPS, biometría, notificaciones y almacenamiento offline. Las operaciones en línea ingresan mediante el API Gateway y son atendidas por el BFF Móvil.

Cuando no existe conexión, la información se guarda localmente y se sincroniza automáticamente al recuperar el acceso a internet.

flowchart TD
ApiGW["API Gateway"]
BFF_Movil["BFF Móvil"]

subgraph AppMovil["App Móvil Nativa (Android)"]
    UI["Interfaz de Usuario"]

    subgraph OnDevice["Capacidades locales (on-device)"]
        Cam["Cámara"]
        GPS["Geolocalización / GPS"]
        Bio["Biometría (Face ID / Touch ID)"]
        Push["Notificaciones push"]
    end

    DB_Off["Almacenamiento local (modo offline)"]
    Sync["Sincronizador offline"]
end

%% Conexiones locales del dispositivo (On-Device)
UI -->|Llamada nativa de API del sistema operativo| OnDevice
UI -->|Lectura y escritura de datos locales síncrona| DB_Off
DB_Off -->|Lectura de transacciones encoladas| Sync

%% Flujo de comunicación transaccional y de sincronización hacia el backend
UI -->|Peticiones transaccionales síncronas HTTPS REST| ApiGW
Sync -.->|Envío diferido de transacciones por lotes HTTPS| ApiGW
ApiGW -->|Ruteo y propagación de token de seguridad JWT| BFF_Movil

%% Flujos de datos lógicos desde capacidades locales al backend
Cam -.->|Carga de imágenes multipart/form-data HTTPS| BFF_Movil
GPS -.->|Envío de coordenadas de ubicación geográfica HTTPS| BFF_Movil
Bio -.->|Envío de firma criptográfica y token de autenticación HTTPS| BFF_Movil
Push -.->|Suscripción de token de dispositivo y registro de alertas HTTPS| BFF_Movil

%% Definición de estilos originales
classDef canal fill:#eef2f8,stroke:#5b6b8c,stroke-width:1.5px,color:#233047;
classDef ondevice fill:#f4f7fb,stroke:#7c8aa8,stroke-width:1.5px,color:#2d3752;
classDef gateway fill:#eaf1fb,stroke:#3866a3,stroke-width:1.5px,color:#173252;

class UI,DB_Off,Sync canal;
class Cam,GPS,Bio,Push ondevice;
class ApiGW,BFF_Movil gateway;

Patrón 4: Offline-First con sincronización


3. Vista de despliegue

Descripción

La vista de despliegue muestra dónde se ejecutan los componentes de Solventa y cómo se comunican dentro de AWS.

El portal web y Android ingresan por el API Gateway. Los BFF y servicios de dominio se ejecutan en ECS Fargate, mientras PostgreSQL, Redis y SNS/SQS soportan persistencia, caché y mensajería.

La infraestructura se distribuye en varias zonas de disponibilidad para mejorar la continuidad y permitir el escalamiento automático.

flowchart TB
subgraph Canales["Canales y Dispositivos"]
    Web["Portal Web (navegador)"]
    subgraph Movil["App Móvil Nativa"]
        SQLiteLoc[("Almacenamiento local (billetera offline)")]
        BioLoc["Enclave seguro (biometría local)"]
    end
end

subgraph VPC["VPC Solventa (región principal)"]

    subgraph DMZ["Subred pública (DMZ)"]
        ApiGW["API Gateway (OAuth 2.0, rate limiting)"]
        ALB["Application Load Balancer"]
        ApiGW -->|"Ruteo Privado HTTP / Puerto 80"| ALB
    end

    subgraph Computo["Cómputo — ECS Fargate (autoescalado)"]
        BFF_Web["BFF Web"]
        BFF_Movil["BFF Móvil"]
        MS_Auth["Identidad, KYC y Consentimiento"]
        MS_Risk["Perfilamiento de Riesgo"]
        MS_Rating["Cotización y Precio"]
        MS_Under["Suscripción"]
        MS_Policy["Emisión y Ciclo de Vida"]
        MS_Pay["Cobros y Pagos"]
        MS_Claims["Siniestros"]
        MS_Partners["Distribución y Socios"]
    end

    AZ_B["Zona de disponibilidad secundaria (réplica en caliente, failover automático)"]

    subgraph Mensajeria["Mensajería (SNS + SQS)"]
        SNS_Eventos["Amazon SNS (tópico de eventos de negocio)"]
        SQS_Pagos["Amazon SQS (cola de pagos automáticos)"]
        SQS_Telemetria["Amazon SQS (cola de eventos de telemetría)"]
        SQS_Perfilamiento["Amazon SQS (cola de solicitudes de perfilamiento)"]

        SNS_Eventos -.->|"fan-out (Integración interna AWS)"| SQS_Pagos
    end

    subgraph Datos["Persistencia y Caché"]
        DB_Store[("Base de datos relacional (Aurora PostgreSQL, Multi-AZ)")]
        RedisCache[("ElastiCache Redis (caché + idempotencia)")]
    end
end

%% Conectores de Entrada (Canales a API Gateway)
Web -->|"HTTPS / TLS 1.3 / Puerto 443"| ApiGW
Movil -->|"HTTPS / TLS 1.3 / Puerto 443"| ApiGW

%% Conectores de Balanceo de Carga a BFFs (DMZ a Cómputo Privado)
ALB -->|"HTTP / REST / Puerto 80"| BFF_Web
ALB -->|"HTTP / REST / Puerto 80"| BFF_Movil

%% Alta Disponibilidad (Cómputo a AZ Secundaria)
Computo -.->|"replicación Multi-AZ (Sincronización AWS)"| AZ_B

%% Conectores de Mensajería Asíncrona (Event-Driven)
MS_Claims -.->|"publica evento paramétrico (HTTPS / AWS SDK)"| SNS_Eventos
SQS_Pagos -.->|"consume para pago automático (HTTPS Long Polling)"| MS_Pay
SQS_Telemetria -.->|"consume (HTTPS Long Polling)"| MS_Claims
MS_Rating -.->|"publica solicitud de perfilamiento (HTTPS / AWS SDK)"| SQS_Perfilamiento
SQS_Perfilamiento -.->|"consume solicitud (HTTPS Long Polling)"| MS_Risk

%% Conectores de Persistencia y Bases de Datos (Microservicios a Datos)
MS_Auth -->|"TCP / JDBC PostgreSQL / Puerto 5432"| DB_Store
MS_Under -->|"TCP / JDBC PostgreSQL / Puerto 5432"| DB_Store
MS_Policy -->|"TCP / JDBC PostgreSQL / Puerto 5432"| DB_Store
MS_Pay -->|"TCP / JDBC PostgreSQL / Puerto 5432"| DB_Store
MS_Claims -->|"TCP / JDBC PostgreSQL / Puerto 5432"| DB_Store
MS_Partners -->|"TCP / JDBC PostgreSQL / Puerto 5432"| DB_Store

%% Conectores de Caché y Baja Latencia
MS_Rating -->|"TCP / Protocolo Redis / Puerto 6379"| RedisCache
MS_Risk -->|"TCP / Protocolo Redis / Puerto 6379"| RedisCache

subgraph LambdaAdapters["Adaptadores Serverless (AWS Lambda)"]
    Lambda_OF["Lambda — Open Finance"]
    Lambda_OD["Lambda — Open Data"]
    Lambda_KYC["Lambda — KYC / AML"]
    Lambda_Pay["Lambda — Pasarelas de Pago"]
    Lambda_Sign["Lambda — Firma Electrónica"]
end

%% Conector de Core a Adaptadores Serverless
Computo -->|"Invocación de Función Serverless (HTTPS / AWS SDK)"| LambdaAdapters

classDef canal fill:#eef2f8,stroke:#5b6b8c,stroke-width:1.5px,color:#233047;
classDef ondevice fill:#f4f7fb,stroke:#7c8aa8,stroke-width:1.5px,color:#2d3752;
classDef edge fill:#eaf7f6,stroke:#2f9e94,stroke-width:1.5px,color:#0d4a44;
classDef gateway fill:#eaf1fb,stroke:#3866a3,stroke-width:1.5px,color:#173252;
classDef compute fill:#eefaf1,stroke:#2f8f52,stroke-width:1.5px,color:#144d28;
classDef ha fill:#f2f2f2,stroke:#8a8f98,stroke-width:1.5px,color:#3a3d42,stroke-dasharray: 3 3;
classDef msg fill:#fdf3e7,stroke:#c98a2b,stroke-width:1.5px,color:#5c3d0e,stroke-dasharray: 4 3;
classDef data fill:#eaf6fb,stroke:#2b7aa8,stroke-width:1.5px,color:#123c52;
classDef adapter fill:#f3eefb,stroke:#7a52b8,stroke-width:1.5px,color:#3b1f66;
classDef ext fill:#f7f7f8,stroke:#8a8f98,stroke-width:1.5px,color:#3a3d42;

class Web canal;
class SQLiteLoc,BioLoc ondevice;
class Route53,WAF,CloudFront,S3Web edge;
class ApiGW,ALB gateway;
class BFF_Web,BFF_Movil,MS_Auth,MS_Risk,MS_Rating,MS_Under,MS_Policy,MS_Pay,MS_Claims,MS_Partners compute;
class AZ_B ha;
class SNS_Eventos,SQS_Pagos,SQS_Telemetria,SQS_Perfilamiento msg;
class DB_Store,RedisCache data;
class Lambda_OF,Lambda_OD,Lambda_KYC,Lambda_Pay,Lambda_Sign adapter;
class ExtOF,ExtOD,ExtKYC,ExtPay,ExtSign,ExtTelemetry ext;

Patrón 5: Mensajería asíncrona con consumidor idempotente

Patrón 6: Cache-Aside

Patrón 7: Redundancia Multi-AZ y Autoescalado


4. Vista de información

Descripción

La vista de información muestra las principales entidades de Solventa, sus atributos y las relaciones existentes entre clientes, cotizaciones, suscripciones, pólizas, pagos y siniestros.

El modelo permite identificar cómo se genera y relaciona la información durante el ciclo de vida del seguro, desde el consentimiento y perfilamiento del cliente hasta la emisión de la póliza y el pago de una indemnización.

También permite reconocer los datos sensibles que requieren cifrado, control de acceso, integridad y trazabilidad.

classDiagram
    direction TB

    class SocioDistribucion {
        +String idSocio
        +String nombre
        +String categoria
        +Double comisionPorcentaje
        +Boolean activo
    }

    class ClienteAsegurado {
        +String idCliente
        +String nombreCompleto
        +String tipoIdentificacion
        +String numeroIdentificacion
        +String correoElectronico
        +String numeroCelular
        +String hashHuellaBiometrica
        +DateTime fechaRegistro
    }

    class ConsentimientoHabeasData {
        +String idConsentimiento
        +String idCliente
        +DateTime fechaOtorgado
        +DateTime fechaVencimiento
        +String ambitosAutorizadosJson
        +String estadoConsentimiento
    }

    class PerfilRiesgoIndividual {
        +String idPerfil
        +String idCliente
        +String idConsentimiento
        +String clasificacionRiesgo
        +Integer puntajeRiesgo
        +String señalesOpenFinanceCifradas
        +String señalesOpenDataCifradas
        +DateTime fechaCalculo
    }

    class Cotizacion {
        +String idCotizacion
        +String idSocio
        +String idCliente
        +String idPerfil
        +Double primaCalculada
        +String codigoRamo
        +String coberturasSolicitadasJson
        +DateTime fechaCreacion
        +String estado
    }

    class Suscripcion {
        +String idSuscripcion
        +String idCotizacion
        +String dictamenSuscripcion
        +DateTime fechaEvaluacion
        +String justificacionExplicable
        +String evaluadorResponsable
    }

    class Poliza {
        +String numeroPoliza
        +String idSuscripcion
        +DateTime fechaEmision
        +DateTime inicioVigencia
        +DateTime finVigencia
        +String estadoContrato
    }

    class Endoso {
        +String idEndoso
        +String numeroPoliza
        +DateTime fechaEndoso
        +String tipoModificacion
        +String coberturasAjustadasJson
        +String estado
    }

    class Factura {
        +String idFactura
        +String numeroPoliza
        +Double valorTotal
        +DateTime fechaEmision
        +DateTime fechaVencimiento
        +String estadoPago
    }

    class Recaudo {
        +String idRecaudo
        +String idFactura
        +Double valorPagado
        +String claveIdempotencia
        +String idTransaccionPasarela
        +DateTime fechaPago
        +String estadoTransaccion
    }

    class Siniestro {
        +String radicadoSiniestro
        +String numeroPoliza
        +DateTime fechaOcurrencia
        +String descripcionHechos
        +Double estimacionDañosPreliminar
        +String tipoSiniestro
        +String estadoSiniestro
    }

    class EvidenciaDigital {
        +String idEvidencia
        +String radicadoSiniestro
        +String urlArchivoSeguro
        +String metadataGeoetiquetado
        +DateTime fechaCarga
        +String tipoArchivo
    }

    class EventoExterno {
        +String idEvento
        +String fuenteProveedor
        +String tipoEvento
        +Double parametroMedido
        +Double umbralDefinido
        +DateTime fechaEvento
        +String numeroPolizaAfectada
    }

    class Indemnizacion {
        +String idIndemnizacion
        +String radicadoSiniestro
        +Double valorIndemnizado
        +String cuentaDestinoTokenizada
        +String idTransaccionDispersora
        +DateTime fechaDispersión
        +String estadoPago
    }

    class Notificacion {
        +String idNotificacion
        +String idCliente
        +String tipoCanal
        +String contenidoCifrado
        +DateTime fechaEnvio
        +String estadoEntrega
    }

    %% Relaciones de Dominio Lineales y Limpias
    SocioDistribucion "1" --> "*" Cotizacion : Origina
    ClienteAsegurado "1" --> "*" ConsentimientoHabeasData : Otorga
    ConsentimientoHabeasData "1" --> "1" PerfilRiesgoIndividual : Habilita
    PerfilRiesgoIndividual "1" --> "1" Cotizacion : Alimenta
    ClienteAsegurado "1" --> "*" Cotizacion : Solicita

    Cotizacion "1" --> "0..1" Suscripcion : Se evalua en
    Suscripcion "1" --> "1" Poliza : Emite
    Poliza "1" --> "*" Endoso : Registra cambios con
    Poliza "1" --> "*" Factura : Ampara cobros de
    Factura "1" --> "*" Recaudo : Liquidada por

    Poliza "1" --> "*" Siniestro : Registra reclamacion de
    Siniestro "1" --> "*" EvidenciaDigital : Soportado por
    Siniestro "1" --> "0..1" Indemnizacion : Genera pago de

    EventoExterno "1" --> "0..1" Siniestro : Gatilla automaticamente
    ClienteAsegurado "1" --> "*" Notificacion : Recibe