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

DHLBC gestiona los siniestros del seguro de desgravamen de LBC Seguros — La Boliviana Ciacruz: 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 · actualizado el 2026-07-29 con los cambios mergeados a develop desde entonces (WIs #1272-#1305). Fuentes: 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

Qué 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.

Arquitectura

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.

Roles 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. La decisión de aprobar o rechazar queda siempre en manos del 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.

El 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"). El campo información adicional del pedido está acotado a 100 caracteres, validados en el handler del backend además del corte del formulario (#1275). 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 adjuntando uno o varios comprobantes en la misma operación (#1273/#1278; el historial registra un solo evento por caso, no uno por archivo), y el cierre del grupo lleva cada caso a Cierre — propagando el flag real de beneficiario adicional del caso (#1294).

Integració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.

Pantallas

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 combo para cambiar de responsable lista solo analistas del banco del caso (#1302) — antes traía los de todos los bancos y elegir uno ajeno hacía fallar la asignación con HTTP 400. 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.

El 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 QA (Bs)Pólizas / casosAnalista asociadoMapper de cargaParámetros del pase #1229
Banco Sol174.00053 BranchPolicy · mayoría de los casosanalista.extra4 (528 casos)BancoSolExcelMapperInsuredCode, DestinationBankCode, DestinationAccountNumber, LegalName
Banco Fie188.00021 BranchPolicyandres.daleney (301 casos)BancoFieExcelMapperídem
Banco Ecofuturo280.0008 BranchPolicysin analista activo vinculado en QA (fue el hallazgo H15/#1255)BancoEcoFuturoExcelMapperídem
Banco Estatal00 BranchPolicy · 0 casosninguno — no está registrado en ExcelMapperFactory, así que hoy no puede cargar planillassin parámetros nuevos

Las 82 BranchPolicy (53 + 21 + 8) son la configuración por póliza: banco, ramo, moneda, cartera, sepelio, PAPIT y tipo de pago (Parcial / Final). Ese último dato es clave y se malinterpreta seguido: el tipo_pago que viaja a SISE no se calcula por montos ni es un input del endpoint — es un atributo de la BranchPolicy (clave: banco + número de póliza SISE) que se copia a ClaimAnalysisData.PolicyholderPayment al crear el caso.

Ojo con el origen de los valoresLos FreeCover de la tabla son los de la base LBCDEV (QA), en BankParameter.FreeCoverAmount. El TestDataSeeder de los tests usa valores distintos (Bs 50.000 para Banco Sol y 30.000 para Fie y Ecofuturo): son fixtures, no configuración real. No tomar los del seeder como los del ambiente.

Qué agregó el pase #1229

Historia 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).

Hardening post-POC (2ª quincena jul 2026)

Cosecha de los hallazgos de la corrida E2E y del QA visual, todos con test primero: cartas de rechazo y de documentación adicional con titular/codeudor reales y overflow multi-página sin dejar la firma sola (#1272, #1276, #1305) · tesorería con múltiples comprobantes por pago y notificación de error sin cerrar el diálogo (#1273/#1278, #1274) · combo de analistas filtrado por banco (#1302) · usuario SISE del responsable en txt_responsable (#1304) · beneficiario adicional real en el cierre (#1294) · límite de 100 caracteres en información adicional del médico (#1275) · plantillas de carga con "BENEFICIARIO ADICIONAL" marcado (#1300) y fixes de UI (#1288, #1292, #1293, #1295).

Abiertos conocidos

Estados verificados contra Azure DevOps el 2026-07-29. Los que no figuran acá se cerraron.

WIEstadoQué falta
#1206 · OCR-01NewExcluir al Dr. Mauricio Guzmán B (CI 1650355) como asegurado detectado por el OCR: hoy el pipeline lo toma como parte del caso cuando en realidad firma el informe.
#1207 · CR-01NewCarta de rechazo: titular y codeudor. El síntoma ya está corregido — #1272 (Closed) reemplazó los "Pedro"/"Juan" hardcodeados usando ClaimPartiesResolver sobre ClaimAnalysisData.IsPrimaryHolder + TechnicalSheet.InsuredName. Pero el WI sigue abierto y su título arranca con "PENDIENTE*": pedía propagar las columnas PrimaryHolder/CoDebtor desde FileRecord hasta TechnicalSheet, cosa que no se hizo. Además FileRecord.PrimaryHolder/CoDebtor existen en la base pero ningún mapper de banco los puebla — quedan en cadena vacía.
#1210 · CFG-01NewCorregir los correos de notificación de cargas por banco.
#1250 · SeguridadActiveclientSecret de SharePoint commiteado en appsettings.json. Rotar la credencial, no solo removerla del archivo — quedó en el historial de git.
#1191-#1198Active (8)Fase 2 de aliados: perfiles Intermediary/Management/GeneralManagement, portal del aliado, módulo de denuncias, visibilidad documental, mark-read de notificaciones con validación de pertenencia y quitar los datos demo (ELEMENT_DATA) de caso-page.
#1303NewEn las 7 pólizas DH+ (PLUS) de Banco Sol el beneficio del beneficiario adicional se calcula pero el sub-siniestro no llega a SISE: se saltea en silencio. Bloqueado por decisión de negocio.
Cerrados desde la última revisión#1176 — CoverageResponse tipada como wrapper en el front cuando el back emite array directo: Closed · #1272 — carta de rechazo con titular y codeudor reales: Closed · los 17 hallazgos de la corrida E2E (#1253-#1271): todos Resolved, pendientes de pasar a Closed tras validar en producción.

Glosario 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.

Có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.