📁 MetCotizadores/
├── 📄 MetCotizadores.sln (Solución Visual Studio)
├── 📄 MetCotizadores.csproj (Archivo de proyecto)
├── 📄 app.config (Configuración de ensamblado)
├── 📄 README.md (Documentación)
├── 📄 site-description.md (Guía de documentación)
│
├── 📁 Properties/
│ └── 📄 AssemblyInfo.cs (Metadatos del ensamblado)
│
├── 📁 Módulo MetaLife/ (Productos MetaLife)
│ ├── 📄 MetaLifeCotiza.cs (1,324 líneas - Cotización principal)
│ ├── 📄 MetaLifeDatos.cs (448 líneas - Patrón Singleton)
│ ├── 📄 MetaLifeCalculos.cs (2,403 líneas - Cálculos actuariales)
│ ├── 📄 MetaLifeTablas.cs (2,327 líneas - Gestión de tablas)
│ └── 📄 MetaLifeGenSubs.cs (439 líneas - Generador subsidios)
│
├── 📁 Módulo Met99/ (Productos Met99/Vida360)
│ ├── 📄 Met99Cotiza.cs (370 líneas - Cotización principal)
│ ├── 📄 Met99Datos.cs (896 líneas - Patrón Singleton)
│ └── 📄 Met99Calcula.cs (2,887 líneas - ARCHIVO MAYOR)
│
├── 📁 Módulo Vida Inversión/
│ ├── 📄 MetCalculosVI.cs (1,641 líneas - Cálculos VI)
│ └── 📄 MetDatosVI.cs (898 líneas - Datos VI)
│
├── 📁 Módulo EducaLife/
│ └── 📄 EducaLifeCotiza.cs (791 líneas - Cotización EducaLife)
│
├── 📁 Módulo PerfectLife/
│ └── 📄 PerfectLifeCotiza.cs (980 líneas - Cotización PerfectLife)
│
├── 📁 Utilidades/
│ ├── 📄 Tablas.cs (1,168 líneas - Acceso a BD SQL)
│ ├── 📄 GenSubs.cs (561 líneas - Generador subsidios)
│ ├── 📄 MetGenSubs.cs (440 líneas - Generador subsidios)
│ └── 📄 Helpers.cs (54 líneas - Métodos de extensión)
│
├── 📁 bin/
│ ├── 📁 Debug/
│ │ ├── MetCotizadores.dll
│ │ └── MetCotizadores.pdb
│ └── 📁 Release/
│
├── 📁 obj/
│ └── 📁 Debug/
│
└── 📁 packages/ (NuGet packages - 20 paquetes)
Namespace raíz: MetCotizadores
Todos los archivos comparten el mismo namespace raíz. La organización lógica se realiza mediante:
MetCotizadores (Proyecto principal)
NF.ClassLibrary (Dependencia externa)
..\..\Comun_UAT\Nf.ClassLibrary\NF.ClassLibrary\| Librería | Versión | Propósito |
|---|---|---|
| System | 4.8 | Tipos fundamentales |
| System.Configuration | 4.8 | Gestión de configuración |
| System.Core | 4.8 | LINQ, expresiones lambda |
| System.Data | 4.8 | ADO.NET para acceso a datos |
| System.Net.Http | 4.8 | Cliente HTTP |
| System.Xml | 4.8 | Procesamiento XML |
| System.Xml.Linq | 4.8 | LINQ to XML |
| Microsoft.CSharp | 4.8 | Runtime dynamic |
| Librería | Versión Actual | Propósito | Categoría |
|---|---|---|---|
| BouncyCastle | 1.8.9 | Criptografía, certificados SSL/TLS, firmas digitales | Seguridad |
| Newtonsoft.Json | 12.0.3 | Serialización/deserialización JSON | Serialización |
| EPPlus | 5.5.1 | Generación y manipulación de archivos Excel (.xlsx) | Reporting |
| iTextSharp | 5.5.13.2 | Generación y manipulación de archivos PDF | Reporting |
| itextsharp.xmlworker | 5.5.13.2 | Conversión HTML a PDF | Reporting |
| DotNetZip | 1.15.0 | Compresión y descompresión de archivos ZIP | Utilidad |
| Microsoft.AspNet.Mvc | 5.2.7 | Framework MVC (referencia consumidor) | Web Framework |
| Microsoft.AspNet.Razor | 3.2.7 | Motor de vistas Razor | Web Framework |
| Microsoft.AspNet.WebPages | 3.2.7 | Páginas Web ASP.NET | Web Framework |
| Microsoft.AspNet.WebApi.Client | 5.2.7 | Cliente WebAPI | Web Framework |
| Microsoft.IO.RecyclableMemoryStream | 1.4.0 | Optimización de memoria para streams | Rendimiento |
| Microsoft.Net.Http | 2.2.29 | Cliente HTTP (legacy) | Red |
| Microsoft.Bcl | 1.1.10 | Base Class Library (portabilidad) | Framework |
| Microsoft.Bcl.Build | 1.0.21 | Herramientas de build | Build Tools |
| Microsoft.Web.Infrastructure | 1.0.0.0 | Infraestructura web ASP.NET | Framework |
| System.Collections | 4.3.0 | Colecciones genéricas | Framework |
| System.Collections.NonGeneric | 4.3.0 | Colecciones no genéricas | Framework |
| System.ComponentModel.Annotations | 5.0.0 | Atributos de validación | Validación |
| System.Net.Http | 4.3.4 | Cliente HTTP moderno | Red |
| System.Runtime.Serialization.Json | 4.3.0 | Serialización JSON (System) | Serialización |
| NuGet.VisualStudio | 5.8.1 | Herramientas NuGet | Desarrollo |
| Librería | Ubicación | Propósito |
|---|---|---|
| NF.ClassLibrary | ..\..\Comun_UAT\Nf.ClassLibrary\NF.ClassLibrary\bin\Debug\ | Librería compartida de funcionalidades comunes (UAT) |
Patrón Principal: N-Layer Architecture (Arquitectura en Capas) con Business Logic Layer
El proyecto implementa una arquitectura en capas especializada para lógica de negocio:
Patrones Secundarios:
graph TB
A[Aplicación Consumidora<br/>ASP.NET MVC/WebAPI] --> B{MetCotizadores.dll}
B --> C[Capa de Cotización]
C --> C1[MetaLifeCotiza]
C --> C2[Met99Cotiza]
C --> C3[EducaLifeCotiza]
C --> C4[PerfectLifeCotiza]
C1 --> D[Capa de Cálculos]
C2 --> D
D --> D1[MetaLifeCalculos]
D --> D2[Met99Calcula]
D --> D3[MetCalculosVI]
C1 --> E[Capa de Datos/DTO]
C2 --> E
E --> E1[MetaLifeDatos<br/>Singleton]
E --> E2[Met99Datos<br/>Singleton]
E --> E3[MetDatosVI<br/>Singleton]
D --> F[Capa de Tablas]
F --> F1[MetaLifeTablas]
F --> F2[Tablas]
F2 --> G[(SQL Server<br/>Base de Datos)]
C --> H[Utilidades]
H --> H1[GenSubs<br/>Singleton]
H --> H2[Helpers<br/>Extensiones]
B --> I[NF.ClassLibrary<br/>Librería Externa]
style B fill:#4A90E2,color:#fff
style C fill:#50C878,color:#fff
style D fill:#FFB347,color:#fff
style E fill:#E574BC,color:#fff
style F fill:#9B59B6,color:#fff
style G fill:#E74C3C,color:#fff
Dictionary<string, object>sequenceDiagram
participant App as Aplicación Web<br/>(MVC/API)
participant Cot as *Cotiza<br/>(Orquestador)
participant Dat as *Datos<br/>(Singleton DTO)
participant Tab as Tablas<br/>(Data Access)
participant Calc as *Calculos<br/>(Actuarial)
participant DB as SQL Server
participant Rep as Generador<br/>Reportes
App->>Cot: Cotizar(Dictionary params)
activate Cot
Cot->>Dat: getInstance()
Dat-->>Cot: instancia singleton
Cot->>Tab: CargaOcupaciones()
Tab->>DB: SELECT * FROM met99_tblOcupaciones
DB-->>Tab: DataTable
Tab->>Dat: Poblar listas
Tab-->>Cot: void
Cot->>Tab: CargaReglas()
Tab->>DB: SELECT * FROM met99_tblReglas
DB-->>Tab: DataTable
Tab->>Dat: Poblar reglas
Tab-->>Cot: void
Cot->>Calc: CalcularPrimas()
Calc->>Dat: Leer datos entrada
Calc->>Calc: Aplicar fórmulas actuariales
Calc->>Dat: Guardar resultados
Calc-->>Cot: void
Cot->>Calc: GenerarProyecciones()
Calc->>Dat: Leer configuración
Calc->>Calc: Calcular proyecciones
Calc->>Dat: Guardar proyecciones
Calc-->>Cot: void
Cot->>Rep: GenerarExcel(datos)
Rep-->>Cot: archivo Excel (EPPlus)
Cot->>Rep: GenerarPDF(datos)
Rep-->>Cot: archivo PDF (iTextSharp)
Cot-->>App: string (resultado JSON o ruta archivo)
deactivate Cot
Cotización de Seguros de Vida MetaLife
Cotización de Seguros Met99/Vida360
Cotización de Seguros EducaLife
Cotización de Seguros PerfectLife
Cotización de Vida Inversión (VI)
Generación de Subsidios
Generación de Reportes
Gestión de Tablas Maestras
Cálculos Actuariales Complejos
Simulación de Escenarios
// Configuradas en NF.ClassLibrary o en app.config del consumidor
// Acceso vía System.Configuration.ConfigurationManager
Ubicación esperada: La aplicación consumidora debe proporcionar:
met99_tblOcupacionesmet99_tblLogosmet99_tblReglas<!-- app.config -->
<configuration>
<runtime>
<assemblyBinding>
<!-- Redirección BouncyCastle para criptografía -->
<dependentAssembly>
<assemblyIdentity name="BouncyCastle.Crypto" />
<bindingRedirect oldVersion="0.0.0.0-1.8.9.0" newVersion="1.8.9.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
// MetaLifeDatos.cs
public class MetaLifeDatos
{
private static MetaLifeDatos ipDatos = new MetaLifeDatos();
public static MetaLifeDatos getInstance() { return ipDatos; }
}
// Clases *Datos.cs contienen propiedades públicas
public String nombre;
public int edad;
public Double sumaAsegurada;
// Helpers.cs
public static class Helpers
{
public static void AddRange<T>(this List<T> list, ...)
}
Inyección SQL
this.txtQuery = "SELECT * FROM met99_tblOcupaciones;";
Validación de Datos
Convert.ToInt32(), Convert.ToDouble()Criptografía
Notas:
| Librería | Versión Actual | Última Estable | Estado |
|---|---|---|---|
| BouncyCastle | 1.8.9 | 2.5.0 | ⚠️ Desactualizada |
| Newtonsoft.Json | 12.0.3 | 13.0.3 | ⚠️ Desactualizada |
| EPPlus | 5.5.1 | 7.5.4 | ⚠️ Desactualizada |
| iTextSharp | 5.5.13.2 | 5.5.13.3 | ✅ Actualizada |
| DotNetZip | 1.15.0 | 1.16.0 | ✅ Actualizada |
| Librería | Versión Actual | Versión Recomendada | Motivo | Esfuerzo |
|---|---|---|---|---|
| BouncyCastle.Crypto | 1.8.9 | 2.5.0 | Vulnerabilidades de seguridad conocidas en versiones antiguas | Medio |
| Newtonsoft.Json | 12.0.3 | 13.0.3 | Correcciones de seguridad, mejor rendimiento | Bajo |
| Código SQL | N/A | Parametrizado | CRÍTICO: Prevenir inyección SQL | Alto |
| Librería | Versión Actual | Versión Recomendada | Beneficio | Esfuerzo |
|---|---|---|---|---|
| EPPlus | 5.5.1 | 7.5.4 | Nuevas características Excel, mejor rendimiento | Medio |
| iTextSharp | 5.5.13.2 | 7.x (iText7) o Alternativa | iText7 tiene arquitectura mejorada, licencia comercial | Alto |
| Manejo de Excepciones | Básico | Try-Catch robusto + Logging | Mejor diagnóstico de errores | Medio |
| Async/Await | No implementado | Implementar en I/O | Mejor escalabilidad | Alto |
| Acción | Versión Actual | Recomendación | Beneficio | Esfuerzo |
|---|---|---|---|---|
| Migración a .NET | .NET Framework 4.8 | .NET 8+ | Cross-platform, mejor rendimiento, LTS | Muy Alto |
| XML Comments | Escaso | Documentar APIs públicas | IntelliSense, documentación generada | Medio |
| Unit Tests | No evidenciados | Implementar suite de tests | Mayor confiabilidad | Alto |
| Inyección de Dependencias | new manual | DI Container | Mejor testabilidad | Alto |
gantt
title Roadmap de Actualización Recomendado
dateFormat YYYY-MM
section Seguridad Crítica
Parametrizar queries SQL :crit, 2025-12, 60d
Actualizar BouncyCastle :crit, 2025-12, 15d
section Librerías
Actualizar Newtonsoft.Json :2026-01, 7d
Actualizar EPPlus :2026-02, 21d
section Calidad de Código
Implementar logging robusto :2026-02, 30d
Agregar XML documentation :2026-03, 45d
section Testing
Crear suite de unit tests :2026-04, 90d
section Modernización (Opcional)
Evaluar migración a .NET 8 :2026-06, 30d
Implementar async/await :2026-07, 60d
pie title "Distribución por Tipo de Archivo"
"C# (.cs)" : 95
"Config (.config, .csproj)" : 3
"Markdown (.md)" : 2
pie title "Líneas de Código por Módulo"
"Met99" : 4153
"MetaLife" : 6941
"Vida Inversión" : 2539
"EducaLife" : 791
"PerfectLife" : 980
"Utilidades" : 2223
pie title "Estado de NuGet Packages"
"Actualizadas (<=1 versión)" : 2
"Desactualizadas (2-5 versiones)" : 3
"Muy desactualizadas (>5 versiones)" : 3
"Framework (estables)" : 12
| Archivo | Líneas | Complejidad | Mantenibilidad |
|---|---|---|---|
| Met99Calcula.cs | 2,887 | ⚠️ Muy Alta | 🔴 Baja |
| MetaLifeCalculos.cs | 2,403 | ⚠️ Muy Alta | 🔴 Baja |
| MetaLifeTablas.cs | 2,327 | ⚠️ Alta | 🟡 Media |
| MetCalculosVI.cs | 1,641 | ⚠️ Alta | 🟡 Media |
| MetaLifeCotiza.cs | 1,324 | 🟢 Media | 🟢 Buena |
| Otros | <1,000 | 🟢 Baja-Media | 🟢 Buena |
Observaciones:
SQL Injection: Migrar de consultas concatenadas a consultas parametrizadas con SqlParameter
Falta de manejo de excepciones: Muchos catch blocks vacíos o con solo asignación a string
Ausencia de logging: No se evidencia uso de framework de logging (NLog, Serilog, log4net)
Librerías desactualizadas con vulnerabilidades conocidas
Archivos monolíticos: Met99Calcula.cs (2,887 líneas) debe refactorizarse
Ausencia de pruebas unitarias
Acoplamiento fuerte: Uso excesivo de Singleton
Código síncrono: Todo el I/O es síncrono (DB, archivos)
Falta documentación XML: Métodos públicos sin documentación
Implementar Repository Pattern para acceso a datos
Migrar a ORM (Entity Framework, Dapper)
Agregar validación de entrada con FluentValidation o Data Annotations
Implementar caché para tablas maestras (MemoryCache, Redis)
Configuración externa: Mover valores hardcodeados a archivos de configuración
Code analysis: Integrar analizadores de Roslyn (StyleCop, FxCop)
| Término | Descripción |
|---|---|
| EP | Extra Prima - Recargo adicional por riesgo aumentado |
| PASI | Pago Adicional por Suma Asegurada por Invalidez |
| MA | Muerte Accidental |
| DI | Doble Indemnización |
| TI | Triple Indemnización |
| GE | Gastos de Entierro / Gastos Funerarios |
| VI | Vida Inversión - Seguro con componente de inversión |
| PPR | Plan Personal de Retiro |
| CPEA | Cuenta Personal de Ahorro (suposición) |
| Suma Asegurada | Capital que paga la aseguradora en caso de siniestro |
| Prima | Pago periódico del asegurado |
| Subsidio | Descuento o bonificación aplicada a la prima |
| Plazo de Pago | Duración del período de pagos de primas |
| Escenario | Proyección financiera (optimista/pesimista/real) |
| Término | Descripción |
|---|---|
| Singleton | Patrón que garantiza una única instancia de una clase |
| DTO | Data Transfer Object - Objeto para transferir datos entre capas |
| ADO.NET | Tecnología de acceso a datos de .NET |
| Tabla Maestras | Tablas de configuración y catálogos en BD |
| Memoria de Cálculo | Reporte detallado de cálculos realizados |
| Proyección | Simulación de valores futuros |
graph LR
App[Aplicación<br/>Consumidora] --> Met[MetCotizadores.dll]
Met --> ML[Módulo MetaLife]
Met --> M99[Módulo Met99]
Met --> EL[Módulo EducaLife]
Met --> PL[Módulo PerfectLife]
Met --> VI[Módulo VI]
ML --> MLCot[MetaLifeCotiza]
ML --> MLDat[MetaLifeDatos]
ML --> MLCalc[MetaLifeCalculos]
ML --> MLTab[MetaLifeTablas]
M99 --> M99Cot[Met99Cotiza]
M99 --> M99Dat[Met99Datos]
M99 --> M99Calc[Met99Calcula]
MLCot --> Util[Utilidades]
M99Cot --> Util
Util --> Tab[Tablas]
Util --> GS[GenSubs]
Util --> Help[Helpers]
Tab --> DB[(SQL Server)]
Met --> NF[NF.ClassLibrary]
Met --> EPP[EPPlus<br/>5.5.1]
Met --> iText[iTextSharp<br/>5.5.13.2]
Met --> JSON[Newtonsoft.Json<br/>12.0.3]
Met --> BC[BouncyCastle<br/>1.8.9]
style Met fill:#4A90E2,color:#fff
style DB fill:#E74C3C,color:#fff
style NF fill:#95a5a6,color:#fff
Métodos principales para consumidores:
// MetaLifeCotiza
public string Cotizar(Dictionary<string, object> cotizaParams)
// Met99Cotiza
public string Cotiza(Dictionary<string, object> cotizaParams)
// EducaLifeCotiza
public string Cotizar(Dictionary<string, object> cotizaParams)
// PerfectLifeCotiza
public string Cotizar(Dictionary<string, object> cotizaParams)
Parámetros esperados (ejemplo para MetaLife):
Retorno: string (probablemente JSON o ruta a archivo generado)
Tablas SQL Server necesarias:
met99_tblOcupaciones: Catálogo de ocupaciones y clasificación de riesgosmet99_tblLogos: Logotipos de promotoríasmet99_tblReglas: Reglas de negocio por coberturaConexión: La aplicación consumidora debe proporcionar connection string
Salida típica:
Código Legacy pero Funcional: El proyecto utiliza tecnologías maduras (.NET Framework 4.8) adecuadas para Windows Server
Alta Especialización: El código es altamente especializado en cálculos actuariales, requiere conocimiento del dominio para mantenimiento
Falta de Separación de Responsabilidades: Algunas clases tienen múltiples responsabilidades (violación de SRP)
Rendimiento: Uso extensivo de listas List<T> y operaciones en memoria - adecuado para volúmenes moderados
Mantenibilidad: Archivos con >2,000 líneas dificultan el mantenimiento
Testing: No se evidencian pruebas unitarias - crítico para lógica actuarial
Corto Plazo (1-3 meses):
Mediano Plazo (3-6 meses):
Largo Plazo (6-12 meses):
Para preguntas sobre esta documentación, contactar al equipo de desarrollo.
Documentación generada: 2025-12-13
Analizado por: Claude AI (Sonnet 4.5)
Versión del documento: 1.0
Última actualización del proyecto: 2025-09-05
Commit: ef0fa19 - fix cotizador quialitas