< Summary

Information
Class: FAU.DataAccess.ApplicationDbContext
Assembly: FAU.DataAccess
File(s): /home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.DataAccess/ApplicationDbContext.cs
Line coverage
100%
Covered lines: 234
Uncovered lines: 0
Coverable lines: 234
Total lines: 348
Line coverage: 100%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
get_Personas()100%11100%
get_Usuarios()100%11100%
get_Roles()100%11100%
get_Permisos()100%11100%
get_Acciones()100%11100%
get_Contextos()100%11100%
get_BitacorasAuditoria()100%11100%
get_Bancos()100%11100%
get_CuentasBancarias()100%11100%
get_TiposBeneficio()100%11100%
get_BeneficiosSociales()100%11100%
get_ParametrosPeriodo()100%11100%
get_RelacionesLaborales()100%11100%
get_MovimientosLaborales()100%11100%
get_Regimenes()100%11100%
get_Escalafones()100%11100%
get_Grados()100%11100%
get_Situaciones()100%11100%
get_Programas()100%11100%
get_Unidades()100%11100%
get_SubUnidades()100%11100%
get_TiposMovimiento()100%11100%
get_MotivosBaja()100%11100%
get_FranjasIrpf()100%11100%
get_Dependientes()100%11100%
get_Form3100()100%11100%
get_Form3100PersonasACargo()100%11100%
get_Documentos()100%11100%
get_DescuentosPersonalesPeriodo()100%11100%
get_TiposCompensacion()100%11100%
get_ConfigCompensaciones()100%11100%
get_LotesCompensacion()100%11100%
get_ItemsLoteCompensacion()100%11100%
get_CatalogoItems()100%11100%
get_RemuneracionesGrado()100%11100%
get_TablaPermanencias()100%11100%
get_TarifasPorCategoria()100%11100%
get_PeriodosLiquidacion()100%11100%
get_SnapshotsInsumos()100%11100%
get_NovedadesPeriodo()100%11100%
get_Retroactividades()100%11100%
get_RetroactividadItems()100%11100%
get_LiquidacionItems()100%11100%
get_LiquidacionEstadosPersonal()100%11100%
get_LiquidacionResumenes()100%11100%
OnModelCreating(...)100%11100%

File(s)

/home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.DataAccess/ApplicationDbContext.cs

#LineLine coverage
 1using FAU.Entidades;
 2using Microsoft.EntityFrameworkCore;
 3
 4namespace FAU.DataAccess;
 5
 6public class ApplicationDbContext : DbContext
 7{
 2658    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
 9    {
 26510    }
 11
 12    // DbSets para las entidades principales
 34413    public DbSet<Persona> Personas { get; set; }
 31814    public DbSet<Usuario> Usuarios { get; set; }
 29115    public DbSet<Rol> Roles { get; set; }
 28916    public DbSet<Permiso> Permisos { get; set; }
 26817    public DbSet<Accion> Acciones { get; set; }
 26818    public DbSet<Contexto> Contextos { get; set; }
 27519    public DbSet<BitacoraAuditoria> BitacorasAuditoria { get; set; }
 31120    public DbSet<Banco> Bancos { get; set; }
 26521    public DbSet<CuentaBancaria> CuentasBancarias { get; set; }
 33922    public DbSet<TipoBeneficio> TiposBeneficio { get; set; }
 33323    public DbSet<BeneficioSocial> BeneficiosSociales { get; set; }
 28824    public DbSet<ParametroPeriodo> ParametrosPeriodo { get; set; }
 25
 26    // Personal y catálogos
 38827    public DbSet<RelacionLaboral> RelacionesLaborales { get; set; }
 27628    public DbSet<MovimientoLaboral> MovimientosLaborales { get; set; }
 31729    public DbSet<Regimen> Regimenes { get; set; }
 29930    public DbSet<Escalafon> Escalafones { get; set; }
 31031    public DbSet<Grado> Grados { get; set; }
 29932    public DbSet<Situacion> Situaciones { get; set; }
 29933    public DbSet<Programa> Programas { get; set; }
 29934    public DbSet<Unidad> Unidades { get; set; }
 26535    public DbSet<SubUnidad> SubUnidades { get; set; }
 27536    public DbSet<TipoMovimiento> TiposMovimiento { get; set; }
 26537    public DbSet<MotivoBaja> MotivosBaja { get; set; }
 38
 39    // IRPF
 33740    public DbSet<FranjaIrpf> FranjasIrpf { get; set; }
 41
 42    // Dependientes (mantenido por compatibilidad, deprecado)
 30543    public DbSet<Dependiente> Dependientes { get; set; }
 44
 45    // Form 3100
 26546    public DbSet<Form3100> Form3100 { get; set; }
 26547    public DbSet<Form3100PersonaACargo> Form3100PersonasACargo { get; set; }
 48
 49    // Documentos (almacenamiento genérico)
 26550    public DbSet<Documento> Documentos { get; set; }
 51
 52    // Descuentos personales por período
 26553    public DbSet<DescuentoPersonalPeriodo> DescuentosPersonalesPeriodo { get; set; }
 54
 55    // Compensaciones
 36256    public DbSet<TipoCompensacion> TiposCompensacion { get; set; }
 30857    public DbSet<ConfigCompensacion> ConfigCompensaciones { get; set; }
 32358    public DbSet<LoteCompensacion> LotesCompensacion { get; set; }
 29759    public DbSet<ItemLoteCompensacion> ItemsLoteCompensacion { get; set; }
 60
 61    // Instructivo / Tablas de referencia (no atadas a compensaciones)
 28462    public DbSet<CatalogoItem> CatalogoItems { get; set; }
 31463    public DbSet<RemuneracionGrado> RemuneracionesGrado { get; set; }
 26664    public DbSet<TablaPermanencia> TablaPermanencias { get; set; }
 26565    public DbSet<TarifaPorCategoria> TarifasPorCategoria { get; set; }
 66
 67    // Apertura de períodos
 28868    public DbSet<Periodo> PeriodosLiquidacion { get; set; }
 28569    public DbSet<SnapshotInsumos> SnapshotsInsumos { get; set; }
 70
 71    // Motor de cálculo
 27972    public DbSet<NovedadPeriodo> NovedadesPeriodo { get; set; }
 26573    public DbSet<Retroactividad> Retroactividades { get; set; }
 26574    public DbSet<RetroactividadItem> RetroactividadItems { get; set; }
 75
 76    // Liquidación de haberes
 26577    public DbSet<LiquidacionItem> LiquidacionItems { get; set; }
 26578    public DbSet<LiquidacionEstadoPersonal> LiquidacionEstadosPersonal { get; set; }
 26579    public DbSet<LiquidacionResumen> LiquidacionResumenes { get; set; }
 80
 81    protected override void OnModelCreating(ModelBuilder modelBuilder)
 82    {
 183        base.OnModelCreating(modelBuilder);
 84
 85        // Configuración de la relación muchos a muchos entre Usuario y Rol
 186        modelBuilder.Entity<Usuario>()
 187            .HasMany(u => u.Roles)
 188            .WithMany(r => r.Usuarios)
 189            .UsingEntity<Dictionary<string, object>>(
 190                "usuarios_roles",
 191                j => j.HasOne<Rol>().WithMany().HasForeignKey("rol_id"),
 192                j => j.HasOne<Usuario>().WithMany().HasForeignKey("usuario_id"),
 193                j =>
 194                {
 195                    j.HasKey("usuario_id", "rol_id");
 196                    j.ToTable("usuarios_roles");
 197                }
 198            );
 99
 100        // Configuración de la relación muchos a muchos entre Rol y Permiso
 1101        modelBuilder.Entity<Rol>()
 1102            .HasMany(r => r.Permisos)
 1103            .WithMany(p => p.Roles)
 1104            .UsingEntity<Dictionary<string, object>>(
 1105                "roles_permisos",
 1106                j => j.HasOne<Permiso>().WithMany().HasForeignKey("permiso_id"),
 1107                j => j.HasOne<Rol>().WithMany().HasForeignKey("rol_id"),
 1108                j =>
 1109                {
 1110                    j.HasKey("permiso_id", "rol_id");
 1111                    j.ToTable("roles_permisos");
 1112                }
 1113            );
 114
 115        // Índices únicos
 1116        modelBuilder.Entity<Persona>()
 1117            .HasIndex(p => p.Cedula)
 1118            .IsUnique();
 119
 1120        modelBuilder.Entity<Usuario>()
 1121            .HasIndex(u => u.Username)
 1122            .IsUnique();
 123
 1124        modelBuilder.Entity<Rol>()
 1125            .HasIndex(r => r.Nombre)
 1126            .IsUnique();
 127
 1128        modelBuilder.Entity<Permiso>()
 1129            .HasIndex(p => p.Nombre)
 1130            .IsUnique();
 131
 1132        modelBuilder.Entity<Accion>()
 1133            .HasIndex(a => a.Nombre)
 1134            .IsUnique();
 135
 1136        modelBuilder.Entity<Contexto>()
 1137            .HasIndex(c => c.Nombre)
 1138            .IsUnique();
 139
 1140        modelBuilder.Entity<Banco>()
 1141            .HasIndex(b => b.Codigo)
 1142            .IsUnique();
 143
 1144        modelBuilder.Entity<TipoBeneficio>()
 1145            .HasIndex(tb => tb.Codigo)
 1146            .IsUnique();
 147
 148        // Índices para catálogos
 1149        modelBuilder.Entity<Regimen>()
 1150            .HasIndex(r => r.NumeroLey)
 1151            .IsUnique();
 152
 1153        modelBuilder.Entity<Escalafon>()
 1154            .HasIndex(e => e.Codigo)
 1155            .IsUnique();
 156
 157        // Grados: código único universal (independiente del escalafón)
 1158        modelBuilder.Entity<Grado>()
 1159            .HasIndex(g => g.Codigo)
 1160            .IsUnique();
 161
 1162        modelBuilder.Entity<Situacion>()
 1163            .HasIndex(s => s.Codigo)
 1164            .IsUnique();
 165
 1166        modelBuilder.Entity<Situacion>()
 1167            .Property(s => s.SistemaSalud)
 1168            .HasDefaultValue("ssffaa");
 169
 1170        modelBuilder.Entity<Programa>()
 1171            .HasIndex(p => p.Codigo)
 1172            .IsUnique();
 173
 1174        modelBuilder.Entity<Unidad>()
 1175            .HasIndex(u => u.Codigo)
 1176            .IsUnique();
 177
 178        // Form3100: unicidad por persona + mes/año de vigencia
 1179        modelBuilder.Entity<Form3100>()
 1180            .HasIndex(f => new { f.PersonaId, f.VigenteDesde_Anio, f.VigenteDesde_Mes })
 1181            .IsUnique();
 182
 183        // MotivoBaja: código único
 1184        modelBuilder.Entity<MotivoBaja>()
 1185            .HasIndex(m => m.Codigo)
 1186            .IsUnique();
 187
 188        // Índices para relaciones laborales
 1189        modelBuilder.Entity<RelacionLaboral>()
 1190            .HasIndex(rl => new { rl.PersonaId, rl.Estado });
 191
 1192        modelBuilder.Entity<RelacionLaboral>()
 1193            .HasIndex(rl => rl.GradoId);
 194
 195        // Configuración explícita para resolver ambigüedad: Grado tiene dos FKs desde RelacionLaboral
 1196        modelBuilder.Entity<RelacionLaboral>()
 1197            .HasOne(rl => rl.Grado)
 1198            .WithMany(g => g.RelacionesLaborales)
 1199            .HasForeignKey(rl => rl.GradoId)
 1200            .OnDelete(DeleteBehavior.Restrict);
 201
 1202        modelBuilder.Entity<RelacionLaboral>()
 1203            .HasOne(rl => rl.GradoReincorporacion)
 1204            .WithMany()
 1205            .HasForeignKey(rl => rl.GradoReincorporacionId)
 1206            .OnDelete(DeleteBehavior.Restrict);
 207
 1208        modelBuilder.Entity<BeneficioSocial>()
 1209            .HasIndex(bs => new { bs.PersonaId, bs.Estado });
 210
 1211        modelBuilder.Entity<BeneficioSocial>()
 1212            .HasIndex(bs => new { bs.TipoBeneficioId, bs.Estado });
 213
 1214        modelBuilder.Entity<BeneficioSocial>()
 1215            .HasIndex(bs => new { bs.PersonaId, bs.TipoBeneficioId, bs.ClaveEvento });
 216
 1217        modelBuilder.Entity<BeneficioSocial>()
 1218            .HasIndex(bs => bs.RetroactividadPendiente);
 219
 1220        modelBuilder.Entity<ParametroPeriodo>()
 1221            .HasIndex(pp => new { pp.Anio, pp.Mes })
 1222            .IsUnique();
 223
 224        // Índice para búsqueda de auditoría por entidad
 1225        modelBuilder.Entity<BitacoraAuditoria>()
 1226            .HasIndex(b => new { b.Entidad, b.EntidadId });
 227
 228        // Configurar checks
 1229        modelBuilder.Entity<Usuario>()
 2230            .ToTable(t => t.HasCheckConstraint("CK_usuarios_estado",
 2231                "estado IN ('activo', 'bloqueado')"));
 232
 1233        modelBuilder.Entity<CuentaBancaria>()
 2234            .ToTable(t => t.HasCheckConstraint("CK_cuentas_bancarias_estado",
 2235                "estado IN ('activa', 'inactiva')"));
 236
 237        // Configure conversion for RelacionLaboral.Estado enum to store string values compatible with existing DB
 1238        modelBuilder.Entity<RelacionLaboral>()
 1239            .Property(rl => rl.Estado)
 1240            .HasConversion(
 1241                v => v == EstadoRelacion.Activo ? "activo" : "inactivo",
 1242                v => v == "activo" ? EstadoRelacion.Activo : EstadoRelacion.Inactivo
 1243            );
 244
 1245        modelBuilder.Entity<RelacionLaboral>()
 2246            .ToTable(t => t.HasCheckConstraint("CK_relaciones_laborales_estado",
 2247                "estado IN ('activo', 'inactivo')"));
 248
 249        // IRPF
 1250        modelBuilder.Entity<FranjaIrpf>()
 1251            .HasIndex(f => new { f.NumeroFranja, f.VigenteDesde })
 1252            .IsUnique();
 253
 254        // Dependientes
 1255        modelBuilder.Entity<Dependiente>()
 1256            .HasIndex(d => new { d.PersonaId, d.Activo });
 257
 1258        modelBuilder.Entity<Dependiente>()
 2259            .ToTable(t => t.HasCheckConstraint("CK_dependientes_tipo",
 2260                "tipo IN ('hijo', 'conyuge_sin_ingresos')"));
 261
 1262        modelBuilder.Entity<Dependiente>()
 2263            .ToTable(t => t.HasCheckConstraint("CK_dependientes_porcentaje",
 2264                "porcentaje_deduccion IS NULL OR porcentaje_deduccion IN (50, 100)"));
 265
 266        // Compensaciones
 1267        modelBuilder.Entity<TipoCompensacion>()
 1268            .HasIndex(t => t.Codigo)
 1269            .IsUnique();
 270
 1271        modelBuilder.Entity<ConfigCompensacion>()
 1272            .HasIndex(c => new { c.TipoCompensacionId, c.RegimenId, c.GradoId, c.EscalafonId, c.Funcion });
 273
 1274        modelBuilder.Entity<LoteCompensacion>()
 1275            .HasIndex(l => new { l.TipoCompensacionId, l.Periodo });
 276
 1277        modelBuilder.Entity<ItemLoteCompensacion>()
 1278            .HasIndex(i => new { i.LoteCompensacionId, i.PersonaId })
 1279            .IsUnique();
 280
 281        // Beneficios sociales
 1282        modelBuilder.Entity<TipoBeneficio>()
 2283            .ToTable(t => t.HasCheckConstraint("CK_tipos_beneficio_plazo_no_negativo",
 2284                "plazo_presentacion_dias IS NULL OR plazo_presentacion_dias >= 0"));
 285
 1286        modelBuilder.Entity<TipoBeneficio>()
 2287            .ToTable(t => t.HasCheckConstraint("CK_tipos_beneficio_monto_no_negativo",
 2288                "monto_referencia IS NULL OR monto_referencia >= 0"));
 289
 1290        modelBuilder.Entity<BeneficioSocial>()
 2291            .ToTable(t => t.HasCheckConstraint("CK_beneficios_sociales_estado",
 2292                "estado IN ('activo', 'inactivo', 'pendiente_doc')"));
 293
 294        // Catálogo e instructivo (tablas de referencia generales)
 1295        modelBuilder.Entity<CatalogoItem>()
 1296            .HasIndex(c => c.Codigo)
 1297            .IsUnique();
 298
 1299        modelBuilder.Entity<RemuneracionGrado>()
 1300            .HasIndex(r => new { r.GradoId, r.ItemId, r.VigenteDesde });
 301
 1302        modelBuilder.Entity<TablaPermanencia>()
 1303            .HasIndex(t => new { t.EscalafonId, t.AniosDesde, t.AniosHasta, t.VigenteDesde });
 304
 1305        modelBuilder.Entity<TablaPermanencia>()
 2306            .ToTable(t => t.HasCheckConstraint("CK_tabla_permanencia_valor", "porcentaje IS NOT NULL OR monto_fijo IS NO
 307
 1308        modelBuilder.Entity<TarifaPorCategoria>()
 1309            .HasIndex(t => new { t.ItemId, t.Categoria, t.VigenteDesde });
 310
 311        // Apertura de períodos de liquidación
 1312        modelBuilder.Entity<Periodo>()
 1313            .HasOne(p => p.Snapshot)
 1314            .WithMany()
 1315            .HasForeignKey(p => p.SnapshotId)
 1316            .OnDelete(DeleteBehavior.Restrict);
 317
 1318        modelBuilder.Entity<Periodo>()
 1319            .HasIndex(p => new { p.Anio, p.Mes })
 1320            .IsUnique()
 1321            .HasFilter("activo = TRUE");
 322
 1323        modelBuilder.Entity<Periodo>()
 1324            .HasIndex(p => p.Estado);
 325
 1326        modelBuilder.Entity<Periodo>()
 2327            .ToTable(t => t.HasCheckConstraint("CK_periodos_liquidacion_estado",
 2328                "estado IN ('ABIERTA','LISTA_CALCULO','EN_CALCULO','CALCULADA','CERRADA')"));
 329
 1330        modelBuilder.Entity<LiquidacionItem>()
 1331            .HasIndex(li => new { li.PeriodoId, li.Cedula, li.Version });
 332
 1333        modelBuilder.Entity<LiquidacionItem>()
 1334            .HasIndex(li => new { li.PeriodoId, li.Version });
 335
 1336        modelBuilder.Entity<LiquidacionEstadoPersonal>()
 1337            .HasIndex(le => new { le.PeriodoId, le.Cedula, le.Version });
 338
 1339        modelBuilder.Entity<LiquidacionResumen>()
 1340            .HasIndex(lr => new { lr.PeriodoId, lr.Version, lr.ProgramaId, lr.RegimenId, lr.Rubro083 });
 341
 1342        modelBuilder.Entity<SnapshotInsumos>()
 1343            .Property(s => s.ContenidoJson)
 1344            .HasColumnType("jsonb");
 1345    }
 346}
 347
 348