LBC Seguros · La Boliviana Ciacruz — Desgravamen Hipotecario

El viaje de un siniestro,
de la denuncia al pago.

DHLBC gestiona los siniestros del seguro de desgravamen: cuando un deudor bancario fallece o queda inválido, el seguro paga el saldo de su deuda al banco. Esta presentación documenta el sistema completo — roles, flujo, pantallas, datos e integración con SISE — para que cualquier persona (o agente) lo entienda de principio a fin.

Generado el 2026-07-11 desde: código de ambos repos · snapshot de producción · 622 Work Items de Azure DevOps · documentación interna · exploración viva del ambiente QA. La versión operativa para agentes vive en docs-funcional/agentes/.
8etapas del flujo
4roles operativos
~90endpoints REST
1.157casos reales en QA
22tipos de documento
4bancos aliados

1Qué es el sistema

Un banco presta plata. El deudor firma un seguro de desgravamen. Si muere o queda inválido, el seguro paga la deuda — y este sistema gestiona todo ese proceso.

Los bancos aliados (Banco Sol, Banco Fie, Banco Ecofuturo y Banco Estatal) envían periódicamente planillas Excel con las denuncias de siniestros de sus deudores. El sistema las carga masivamente, crea un caso por cada denuncia y lo asigna a un analista (round-robin). A partir de ahí el caso recorre un flujo de etapas: análisis documental asistido por OCR, gestión médica cuando hace falta, pronunciamiento (aprobar o rechazar), aceptación del banco tomador, tesorería (pago) y cierre.

En el camino, el sistema crea el siniestro en SISE (el core asegurador de Mapfre), genera cartas y documentos PDF, y mantiene la trazabilidad completa en un historial de 7 etapas por caso.

Dos coberturas, dos caminosEl caso puede ser por MUERTE (documento central: Certificado de Defunción) o por INVALIDEZ (Cédula de Identidad + Informe de Discapacidad). Además, si el monto está bajo el umbral FreeCover del banco (ej. Bs 174.000 en Banco Sol), el caso es fast-track: salta la auditoría médica.

2Arquitectura

Dos repositorios propios, tres sistemas externos y un pipeline de OCR.

Front — LBC.DESGRAVAMEN

Angular 17 (template daxa) · routing por hash (/#/…) · Angular Material + Syncfusion · sesión en sessionStorage · deploy Azure Static Web Apps.

API — LBC.DESGRAVAMEN.API

.NET 8 hexagonal · EF Core + SQL Server · JWT (un rol, 200 min) · Mapster · Result<T>/ErrorOr · Serilog+Seq · PDFs con iText (AcroForm).

Base de datos

SQL Server. Prod: DHLBC. QA: LBCDEV (snapshot de prod 30/12/2025 + pase WI #1229). ~45 entidades.

SISE (Mapfre)

Core asegurador. Recibe la creación del siniestro, sub-siniestros, solicitudes de pago y liquidaciones vía REST.

LDAP + SharePoint

LDAP autentica el login (uid={user},ou=users,dc=mycompany,dc=com). SharePoint/Graph almacena documentos (con alternativa local del WI #1240).

vision-gpt (Python)

Pipeline CLI de OCR: Google Cloud Vision + OpenAI leen los documentos escaneados y alimentan POST /Documents y POST /Batch.

Peligro operativo conocidoArrancar la API con environment Development, Testing, CI o LBCQA ejecuta EnsureDeleted() + EnsureCreated(): borra y recrea la base de datos completa. Production/Preprod solo corren BankInitial(). Nunca apuntar esos environments a una base con datos valiosos.

3Roles y usuarios

Cuatro roles operativos. El JWT lleva UN solo rol; el guard del front cierra la sesión si el rol intenta entrar a una ruta ajena.

Rol (exacto en código)Quién esLanding tras loginQué hace
AnalystAnalista de siniestros/#/dashboard-pageEl protagonista: gestiona la bandeja de 7 etapas (/#/home-page), completa el análisis documental, aprueba/rechaza pronunciamientos, envía a SISE, arma lotes y agrupa para tesorería.
SupervisorSupervisor / administrador/#/dashboard-pageDashboard y reportes analíticos, administración de usuarios, configuración (FreeCover por banco, motivos de rechazo), reasignaciones. Es el rol "admin" — no existe un rol Administrator aparte.
MedicalAuditor médico/#/medical-home-pageEvalúa los casos en Gestión Médica: emite el informe médico (PDF), pide documentación adicional o devuelve el caso. No aprueba/rechaza — eso lo hace el analista.
TreasuryTesorero/#/tesorery-home-pageRecibe grupos de pago, registra el pago (comprobante vía dropzone) o lo rechaza, y descarga los soportes Excel/PDF del grupo.

Usuarios del ambiente QA (snapshot de producción)

UsuarioNombreRolActivoPassword QACasos asignadosBanco
analista.extra4Analista Extra 4Analyst123456528Banco Sol
andres.daleneyAndrés DaleneyAnalystdesconocida301Banco Fie
reina.santiReina SantiSupervisor1234560
auditor.medico1Auditor Médico 1Medical123456
auditor.medico2Auditor Médico 2Medicaldesconocida
treasury1Tesorero 1Treasury123456
testUserNameTestAnalysttest0
+ 8 usuarios inactivos más (marcela.flores con 158 casos históricos, tahia.rojas, analista.extra1-3/5, leonardo.vela, gon.cons). La password se valida contra LDAP — no vive en la base.
Hallazgo (candidato a tech-debt)El usuario test tiene Active = 0 y aun así puede iniciar sesión: el login valida LDAP + existencia en la tabla User, pero no filtra por Active.

4El flujo del siniestro

Ocho etapas (ClaimState) y veinte estados finos (ClaimStatus). Las transiciones viven como guardas en el agregado Claim del dominio; la UI las dispara con acciones dinámicas que el propio backend decide por caso.

1 · nace
Clasificación y análisis
Carga masiva Excel → caso asignado. Análisis documental data-driven.
Analyst
2
En proceso
Caso aprobado en análisis. Envío a SISE, cartas, decisión de pronunciamiento.
Analyst
3 · opcional
Gestión médica
Auditoría médica (se salta con FreeCover). Informe, doc adicional o devolución.
Medical
4
Pronunciamiento
Aprobado/Rechazado. Lotes de casos del mismo banco.
Analyst
5
Aceptación
El tomador (banco) acepta o rebate el pronunciamiento.
Analyst Supervisor
6
Tesorería
Grupos de pago mismo-banco → pago o rechazo con comprobante.
Treasury
7-8 · fin
Cierre
Dos cierres: Closure (resuelto) y Close (definitivo, con fecha y tiempo transcurrido).
Sistema

Atajos reales del flujo: FreeCover salta la Gestión Médica · un caso Rechazado cuya carta el tomador acepta va directo a Cierre (no pasa por Tesorería) · Recalculation devuelve un caso hacia atrás para recalcular.

Cómo nace un caso

El banco envía su planilla Excel. El analista la sube en Ingresar denuncia (chip "Carga masiva" — la carga individual fue eliminada del producto). El backend la parsea con un mapper específico por banco (ExcelMapperFactory), crea InsuranceFileHeader/Record y por cada fila un Claim con su TechnicalSheet y ClaimAnalysisData, en etapa Clasificación y análisis, status Assignated, repartido round-robin entre los analistas del banco. En paralelo, el pipeline vision-gpt hace OCR de los documentos escaneados y puebla los atributos que el analista después verifica en pantalla.

El análisis documental (gestion-page)

Es la pantalla data-driven del analista: renderiza un panel por documento del caso (Certificado de Defunción, Cédula, Hoja de Riesgo…), y dentro, un campo por cada DocumentField definido en la base — el orden lo decide DisplayOrder (del back) y las etiquetas se traducen por banco vía i18n (documentAttributes.{DocumentType}-{FieldName}). Los campos DataType = "select" se vuelven combos: Causa→Cobertura y País→Provincia (encadenados; el municipio lo auto-resuelve el back). Guardar y continuar persiste parcial (y recarga la página); Aprobar ejecuta el análisis y mueve el caso a En proceso.

Las acciones son del backend, no del front

Cada fila de la bandeja trae del backend su lista actions[] según el estado del caso (statementapproved, statementrejected, generaterejectionletter, reassign, view, delete, sendtosise…). El front solo las mapea a íconos con tooltip. Por eso dos casos de la misma bandeja pueden mostrar acciones distintas — y por eso las pruebas E2E localizan las acciones por su tooltip.

Gestión médica

Si el caso lo requiere (y no es FreeCover), el analista lo envía al médico (endpoint con typo real: PUT /{claimId}/medicalMamagement/user/{userId}). El médico ve su propia bandeja con estados MedicalEvaluation, MedicalInformationRequest y AdditionalMedicalInformation; emite el informe médico (PDF generado desde plantilla AcroForm), pide documentación adicional o devuelve el caso ("Devuelto por Médico"). La decisión final sigue siendo del analista.

Pronunciamiento, aceptación y tesorería

El analista aprueba o rechaza el pronunciamiento por caso. Los casos pronunciados se agrupan en lotes del mismo banco que van a Aceptación del tomador; ahí se aprueban o rechazan por caso. Los aceptados llegan a Tesorería, donde conviven dos agrupaciones distintas: "Agrupar para tesorería" (grupo de pago interno: Creado → En Tesorería → Pagado/Rechazado, con numeración tipo 001/2024) y "Agrupar liquidación" (solicitud masiva de pago a SISE). El tesorero registra el pago con su comprobante, y el cierre del grupo lleva cada caso a Cierre.

5Integración SISE

SISE es el core asegurador de Mapfre: el siniestro "oficial" vive ahí. DHLBC le crea el siniestro, el sub-siniestro y las solicitudes de pago.

Número SISE visibleEl caso muestra su SiseNumber (ej. 2025-2746) en caso-page, editable por el analista junto con el número de solicitud de pago.

6Pantallas

Capturas reales del ambiente QA (2026-07-11), con la base migrada y datos de producción.

Login
Login/#/. Usuario + contraseña contra LDAP. Selectores: #User, #Password, button[type=submit]. Cada rol aterriza en su landing.
Dashboard
Dashboard/#/dashboard-page (Analyst y Supervisor). Reclamos por etapa, por cobertura (Invalidez/Muerte), por tomador y tiempos promedio de gestión.
Bandeja
Bandeja del analista/#/home-page (solo Analyst). Carrusel de 7 etapas con contadores, filtros por banco/tipo/estado, buscador, y acciones por fila (inline .btn-accion + menú .btn-acciones: Ver caso / Reasignar / Eliminar). La bandeja muestra los casos del analista logueado.
Gestion page
Análisis documental/#/home-page/gestion-page/{claimId}. Paneles por documento con campos data-driven (selector ideal: [data-slag='{DocumentType}-{FieldName}']), visor PDF del documento original a la derecha, "Guardar y continuar" y "Aprobar".
Caso page
Ver caso/#/caso-page/{id}/{back} (todos los roles). Cabecera con número de caso y número SISE (editable), riel de etapas, datos del asegurado, Analista responsable, comentarios, historial y documentación. El médico ve esta pantalla sin lápices de edición.

Otras pantallas documentadas en detalle en agentes/05-pantallas-front.md: pronunciamiento (lotes), aceptacion-page, tesorery-home-page (grupos, registro de pago), medical-home-page, admin-home-page (usuarios), reportes del supervisor, configuración (FreeCover, motivos), ingresar-denuncia (carga masiva con dropzone) y repositorio de casos.

7El ambiente QA hoy

URL: https://dhdesa.lbc.bo/LBC/Aplicaciones/DHLbc/#/ (requiere VPN de LBC). Base LBCDEV reconstruida el 2026-07-11: snapshot de producción del 30/12/2025 + pase consolidado del WI #1229.

Casos por etapa (1.157 casos reales)

Cerrado (Close)
1.014
Clasificación y análisis
80
En proceso
51
Pronunciamiento
10
Gestión médica
1
Tesorería
1
Aceptación
0
Fuente: snapshot ScriptDHLBC.sql (INSERT de Claim por ClaimStateId). Para probar Aceptación hay que empujar un caso hasta esa etapa.

Bancos y parámetros

BancoFreeCover (Bs)CasosAnalista asociadoParámetros del pase #1229
Banco Sol174.000mayoría (BranchPolicy: 53)analista.extra4InsuredCode, DestinationBankCode, DestinationAccountNumber, LegalName
Banco Fie188.000BranchPolicy: 21andres.daleneyídem
Banco Ecofuturo280.000BranchPolicy: 8ídem
Banco Estatal00 casos, 0 BranchPolicysin parámetros nuevos

Qué agregó el pase #1229

8Historia del producto

622 Work Items en 14 sprints, de julio 2024 a julio 2026. El sistema se construyó etapa por etapa, en el mismo orden del flujo.

Iteración 1-2 (jul-oct 2024)

Login LDAP, carga masiva de planillas, bandeja del analista, Pronunciamiento y Aceptación con lotes del mismo banco.

Iteración 3-4 (fin 2024)

Ver Caso con historial de 7 etapas; Tesorería completa: grupos 001/2024, estados Creado → En Supervisor → En Tesorería → Pagado/Rechazado.

Iteración 6-8 (2025)

Cierre + Dashboard; perfil Médico (informe, doc adicional, devolución); perfil Tesorero; Supervisor con administración de usuarios y FreeCover fast-track por banco.

Iteración 9-11 (fin 2025 - ene 2026)

OCR sobre SharePoint, analytics del Supervisor, integración SISE (número de reclamo, liquidación masiva, banco Ecofuturo). Se elimina la carga individual.

Sprint SISE 2026.2 (abr 2026)

Ubicación de ocurrencia (país/provincia/municipio hacia SISE, WIs #1174/#1175), sub-siniestros con carátula (#1177-#1179), acción dinámica "Enviar a SISE".

Sprint Cierre POC (jul 2026)

Plan de pagos data-driven por banco (PP-01..06), cartas multipágina y destinatario por banco (CR-02, #1242), repositorio local de archivos (#1240), cadena de tech-debt verificado con Playwright (#1236-#1252), y el pase a producción consolidado (DB-01, #1229).

Abiertos conocidosCR-01 (#1207): carta de rechazo con titular/codeudor hardcodeados · OCR-01 (#1206): excluir al Dr. Guzmán del OCR · CFG-01 (#1210): correos por banco · #1250 (Seguridad): clientSecret de SharePoint commiteado en appsettings.json · #1191-#1198: fase 2 de aliados (roles Intermediary/Management/GeneralManagement) en Active.

9Glosario esencial

Los términos mínimos para seguir una conversación del proyecto. El glosario completo (~80 términos) está en agentes/07-glosario.md.

Desgravamen
Seguro que paga el saldo de la deuda bancaria si el deudor muere o queda inválido. El beneficiario real es el banco.
Denuncia / Caso / Siniestro
La denuncia es el aviso del banco; el sistema la convierte en un caso (Claim); el siniestro es su representación oficial en SISE.
Tomador
El banco que contrató la póliza colectiva. "Aceptación del tomador" = el banco acepta el pronunciamiento.
Etapa vs. estado
Etapa = ClaimState (las 8 estaciones del riel). Estado = ClaimStatus (los 20 matices dentro de cada etapa, ej. Assignated, PendingPayment).
FreeCover
Umbral de monto por banco bajo el cual el caso es fast-track y salta la auditoría médica.
Pronunciamiento
La decisión formal del asegurador sobre el caso: aprobado o rechazado (con carta).
Lote / Agrupación
Conjunto de casos del mismo banco que avanzan juntos: lotes de pronunciamiento→aceptación, grupos de pago en tesorería, liquidaciones SISE.
Carátula
PDF resumen del sub-siniestro creado en SISE, persistido como documento del caso.
Slag
Clave {DocumentType}-{FieldName} que identifica un campo del análisis; se usa para etiquetas i18n por banco y como selector de pruebas (data-slag).
Acción dinámica
Acción por fila que decide el backend según el estado del caso (actions[]); el front solo la dibuja.
SISE
Core asegurador de Mapfre donde vive el siniestro oficial. DHLBC le crea siniestros, sub-siniestros y solicitudes de pago.
Pase
El paquete de cambios (SQL + binarios) que lleva un ambiente a la versión nueva. El pase consolidado actual es el WI #1229.

10Cómo se prueba (E2E)

La guía operativa completa — paso a paso por rol, con selectores y asserts — está en agentes/08-guia-e2e-playwright.md. Esto es el mapa.

Las reglas de oro

Los 9 escenarios planificados

#EscenarioRolCubre
E1Matriz de logintodos5 usuarios, logout, credencial inválida, landings por rol
E2Análisis documental completoAnalystgestion-page, combos encadenados, guardar parcial, aprobar → En proceso
E3Caso en procesoAnalystcaso-page, comentarios, historial, pronunciamiento, carta de rechazo (PDF)
E4Envío a SISEAnalystacción sendtosise, estados SiseCreationStatus, carátula sub-siniestro
E5Gestión médicaAnalyst Medicalenvío al médico, informe (PDF), doc adicional, devolución
E6Pronunciamiento → AceptaciónAnalystlotes mismo banco, aprobar/rechazar del tomador
E7Tesorería y cierreAnalyst Treasuryagrupar, enviar, pagar/rechazar con comprobante, cierre de grupo
E8SupervisorSupervisordashboard, usuarios, configuración FreeCover, reportes, reasignación
E9Transversalestodosrepositorio, i18n, errores de consola por página, HTTP ≥ 400, rutas legacy sin guard
EvidenciaCada corrida deja su carpeta versionada en evidencias/ (naming con los WIs/escenarios cubiertos) y se adjunta al Work Item correspondiente en Azure DevOps.