< 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: 263
Uncovered lines: 0
Coverable lines: 263
Total lines: 386
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_IrpfsMensual()100%11100%
get_IrpfsDetalleFranjas()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{
 3178    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
 9    {
 31710    }
 11
 12    // DbSets para las entidades principales
 39613    public DbSet<Persona> Personas { get; set; }
 37014    public DbSet<Usuario> Usuarios { get; set; }
 34315    public DbSet<Rol> Roles { get; set; }
 34116    public DbSet<Permiso> Permisos { get; set; }
 32017    public DbSet<Accion> Acciones { get; set; }
 32018    public DbSet<Contexto> Contextos { get; set; }
 32719    public DbSet<BitacoraAuditoria> BitacorasAuditoria { get; set; }
 36320    public DbSet<Banco> Bancos { get; set; }
 31721    public DbSet<CuentaBancaria> CuentasBancarias { get; set; }
 39222    public DbSet<TipoBeneficio> TiposBeneficio { get; set; }
 38523    public DbSet<BeneficioSocial> BeneficiosSociales { get; set; }
 34024    public DbSet<ParametroPeriodo> ParametrosPeriodo { get; set; }
 25
 26    // Personal y catálogos
 44027    public DbSet<RelacionLaboral> RelacionesLaborales { get; set; }
 32828    public DbSet<MovimientoLaboral> MovimientosLaborales { get; set; }
 37229    public DbSet<Regimen> Regimenes { get; set; }
 36630    public DbSet<Escalafon> Escalafones { get; set; }
 37831    public DbSet<Grado> Grados { get; set; }
 36632    public DbSet<Situacion> Situaciones { get; set; }
 36833    public DbSet<Programa> Programas { get; set; }
 36834    public DbSet<Unidad> Unidades { get; set; }
 31835    public DbSet<SubUnidad> SubUnidades { get; set; }
 34036    public DbSet<TipoMovimiento> TiposMovimiento { get; set; }
 31737    public DbSet<MotivoBaja> MotivosBaja { get; set; }
 38
 39    // IRPF
 38940    public DbSet<FranjaIrpf> FranjasIrpf { get; set; }
 32441    public DbSet<IrpfMensual> IrpfsMensual { get; set; }
 32442    public DbSet<IrpfDetalleFranjas> IrpfsDetalleFranjas { get; set; }
 43
 44    // Dependientes (mantenido por compatibilidad, deprecado)
 35745    public DbSet<Dependiente> Dependientes { get; set; }
 46
 47    // Form 3100
 31748    public DbSet<Form3100> Form3100 { get; set; }
 31749    public DbSet<Form3100PersonaACargo> Form3100PersonasACargo { get; set; }
 50
 51    // Documentos (almacenamiento genérico)
 31752    public DbSet<Documento> Documentos { get; set; }
 53
 54    // Descuentos personales por período
 31755    public DbSet<DescuentoPersonalPeriodo> DescuentosPersonalesPeriodo { get; set; }
 56
 57    // Compensaciones
 41458    public DbSet<TipoCompensacion> TiposCompensacion { get; set; }
 36059    public DbSet<ConfigCompensacion> ConfigCompensaciones { get; set; }
 37560    public DbSet<LoteCompensacion> LotesCompensacion { get; set; }
 34961    public DbSet<ItemLoteCompensacion> ItemsLoteCompensacion { get; set; }
 62
 63    // Instructivo / Tablas de referencia (no atadas a compensaciones)
 33664    public DbSet<CatalogoItem> CatalogoItems { get; set; }
 36665    public DbSet<RemuneracionGrado> RemuneracionesGrado { get; set; }
 31866    public DbSet<TablaPermanencia> TablaPermanencias { get; set; }
 31767    public DbSet<TarifaPorCategoria> TarifasPorCategoria { get; set; }
 68
 69    // Apertura de períodos
 34070    public DbSet<Periodo> PeriodosLiquidacion { get; set; }
 33771    public DbSet<SnapshotInsumos> SnapshotsInsumos { get; set; }
 72
 73    // Motor de cálculo
 33174    public DbSet<NovedadPeriodo> NovedadesPeriodo { get; set; }
 31775    public DbSet<Retroactividad> Retroactividades { get; set; }
 31776    public DbSet<RetroactividadItem> RetroactividadItems { get; set; }
 77
 78    // Liquidación de haberes
 31779    public DbSet<LiquidacionItem> LiquidacionItems { get; set; }
 31780    public DbSet<LiquidacionEstadoPersonal> LiquidacionEstadosPersonal { get; set; }
 31781    public DbSet<LiquidacionResumen> LiquidacionResumenes { get; set; }
 82
 83    protected override void OnModelCreating(ModelBuilder modelBuilder)
 84    {
 185        base.OnModelCreating(modelBuilder);
 86
 87        // Configuración de la relación muchos a muchos entre Usuario y Rol
 188        modelBuilder.Entity<Usuario>()
 189            .HasMany(u => u.Roles)
 190            .WithMany(r => r.Usuarios)
 191            .UsingEntity<Dictionary<string, object>>(
 192                "usuarios_roles",
 193                j => j.HasOne<Rol>().WithMany().HasForeignKey("rol_id"),
 194                j => j.HasOne<Usuario>().WithMany().HasForeignKey("usuario_id"),
 195                j =>
 196                {
 197                    j.HasKey("usuario_id", "rol_id");
 198                    j.ToTable("usuarios_roles");
 199                }
 1100            );
 101
 102        // Configuración de la relación muchos a muchos entre Rol y Permiso
 1103        modelBuilder.Entity<Rol>()
 1104            .HasMany(r => r.Permisos)
 1105            .WithMany(p => p.Roles)
 1106            .UsingEntity<Dictionary<string, object>>(
 1107                "roles_permisos",
 1108                j => j.HasOne<Permiso>().WithMany().HasForeignKey("permiso_id"),
 1109                j => j.HasOne<Rol>().WithMany().HasForeignKey("rol_id"),
 1110                j =>
 1111                {
 1112                    j.HasKey("permiso_id", "rol_id");
 1113                    j.ToTable("roles_permisos");
 1114                }
 1115            );
 116
 117        // Índices únicos
 1118        modelBuilder.Entity<Persona>()
 1119            .HasIndex(p => p.Cedula)
 1120            .IsUnique();
 121
 1122        modelBuilder.Entity<Usuario>()
 1123            .HasIndex(u => u.Username)
 1124            .IsUnique();
 125
 1126        modelBuilder.Entity<Rol>()
 1127            .HasIndex(r => r.Nombre)
 1128            .IsUnique();
 129
 1130        modelBuilder.Entity<Permiso>()
 1131            .HasIndex(p => p.Nombre)
 1132            .IsUnique();
 133
 1134        modelBuilder.Entity<Accion>()
 1135            .HasIndex(a => a.Nombre)
 1136            .IsUnique();
 137
 1138        modelBuilder.Entity<Contexto>()
 1139            .HasIndex(c => c.Nombre)
 1140            .IsUnique();
 141
 1142        modelBuilder.Entity<Banco>()
 1143            .HasIndex(b => b.Codigo)
 1144            .IsUnique();
 145
 1146        modelBuilder.Entity<TipoBeneficio>()
 1147            .HasIndex(tb => tb.Codigo)
 1148            .IsUnique();
 149
 150        // Índices para catálogos
 1151        modelBuilder.Entity<Regimen>()
 1152            .HasIndex(r => r.NumeroLey)
 1153            .IsUnique();
 154
 1155        modelBuilder.Entity<Escalafon>()
 1156            .HasIndex(e => e.Codigo)
 1157            .IsUnique();
 158
 159        // Grados: código único universal (independiente del escalafón)
 1160        modelBuilder.Entity<Grado>()
 1161            .HasIndex(g => g.Codigo)
 1162            .IsUnique();
 163
 1164        modelBuilder.Entity<Situacion>()
 1165            .HasIndex(s => s.Codigo)
 1166            .IsUnique();
 167
 1168        modelBuilder.Entity<Situacion>()
 1169            .Property(s => s.SistemaSalud)
 1170            .HasDefaultValue("ssffaa");
 171
 1172        modelBuilder.Entity<Programa>()
 1173            .HasIndex(p => p.Codigo)
 1174            .IsUnique();
 175
 1176        modelBuilder.Entity<Unidad>()
 1177            .HasIndex(u => u.Codigo)
 1178            .IsUnique();
 179
 180        // Form3100: unicidad por persona + mes/año de vigencia
 1181        modelBuilder.Entity<Form3100>()
 1182            .HasIndex(f => new { f.PersonaId, f.VigenteDesde_Anio, f.VigenteDesde_Mes })
 1183            .IsUnique();
 184
 185        // MotivoBaja: código único
 1186        modelBuilder.Entity<MotivoBaja>()
 1187            .HasIndex(m => m.Codigo)
 1188            .IsUnique();
 189
 190        // Índices para relaciones laborales
 1191        modelBuilder.Entity<RelacionLaboral>()
 1192            .HasIndex(rl => new { rl.PersonaId, rl.Estado });
 193
 1194        modelBuilder.Entity<RelacionLaboral>()
 1195            .HasIndex(rl => rl.GradoId);
 196
 197        // Configuración explícita para resolver ambigüedad: Grado tiene dos FKs desde RelacionLaboral
 1198        modelBuilder.Entity<RelacionLaboral>()
 1199            .HasOne(rl => rl.Grado)
 1200            .WithMany(g => g.RelacionesLaborales)
 1201            .HasForeignKey(rl => rl.GradoId)
 1202            .OnDelete(DeleteBehavior.Restrict);
 203
 1204        modelBuilder.Entity<RelacionLaboral>()
 1205            .HasOne(rl => rl.GradoReincorporacion)
 1206            .WithMany()
 1207            .HasForeignKey(rl => rl.GradoReincorporacionId)
 1208            .OnDelete(DeleteBehavior.Restrict);
 209
 1210        modelBuilder.Entity<BeneficioSocial>()
 1211            .HasIndex(bs => new { bs.PersonaId, bs.Estado });
 212
 1213        modelBuilder.Entity<BeneficioSocial>()
 1214            .HasIndex(bs => new { bs.TipoBeneficioId, bs.Estado });
 215
 1216        modelBuilder.Entity<BeneficioSocial>()
 1217            .HasIndex(bs => new { bs.PersonaId, bs.TipoBeneficioId, bs.ClaveEvento });
 218
 1219        modelBuilder.Entity<BeneficioSocial>()
 1220            .HasIndex(bs => bs.RetroactividadPendiente);
 221
 1222        modelBuilder.Entity<ParametroPeriodo>()
 1223            .HasIndex(pp => new { pp.Anio, pp.Mes })
 1224            .IsUnique();
 225
 226        // Índice para búsqueda de auditoría por entidad
 1227        modelBuilder.Entity<BitacoraAuditoria>()
 1228            .HasIndex(b => new { b.Entidad, b.EntidadId });
 229
 230        // Configurar checks
 1231        modelBuilder.Entity<Usuario>()
 2232            .ToTable(t => t.HasCheckConstraint("CK_usuarios_estado",
 2233                "estado IN ('activo', 'bloqueado')"));
 234
 1235        modelBuilder.Entity<CuentaBancaria>()
 2236            .ToTable(t => t.HasCheckConstraint("CK_cuentas_bancarias_estado",
 2237                "estado IN ('activa', 'inactiva')"));
 238
 239        // Configure conversion for RelacionLaboral.Estado enum to store string values compatible with existing DB
 1240        modelBuilder.Entity<RelacionLaboral>()
 1241            .Property(rl => rl.Estado)
 1242            .HasConversion(
 1243                v => v == EstadoRelacion.Activo ? "activo" : "inactivo",
 1244                v => v == "activo" ? EstadoRelacion.Activo : EstadoRelacion.Inactivo
 1245            );
 246
 1247        modelBuilder.Entity<RelacionLaboral>()
 2248            .ToTable(t => t.HasCheckConstraint("CK_relaciones_laborales_estado",
 2249                "estado IN ('activo', 'inactivo')"));
 250
 251        // IRPF - Franjas progresivas
 1252        modelBuilder.Entity<FranjaIrpf>()
 1253            .HasIndex(f => new { f.NumeroFranja, f.VigenteDesde })
 1254            .IsUnique();
 255
 256        // IRPF - Resultado mensual por persona
 1257        modelBuilder.Entity<IrpfMensual>()
 1258            .HasKey(i => i.Id);
 259
 1260        modelBuilder.Entity<IrpfMensual>()
 1261            .HasIndex(i => new { i.LiquidacionId, i.PersonaId })
 1262            .IsUnique();
 263
 1264        modelBuilder.Entity<IrpfMensual>()
 1265            .HasOne(i => i.Liquidacion)
 1266            .WithMany()
 1267            .HasForeignKey(i => i.LiquidacionId)
 1268            .OnDelete(DeleteBehavior.Cascade);
 269
 1270        modelBuilder.Entity<IrpfMensual>()
 1271            .HasOne(i => i.Persona)
 1272            .WithMany()
 1273            .HasForeignKey(i => i.PersonaId)
 1274            .OnDelete(DeleteBehavior.Restrict);
 275
 1276        modelBuilder.Entity<IrpfMensual>()
 1277            .HasMany(i => i.IrpfDetalleFranjas)
 1278            .WithOne(d => d.IrpfMensual)
 1279            .HasForeignKey(d => d.IrpfMensualId)
 1280            .OnDelete(DeleteBehavior.Cascade);
 281
 282        // IRPF - Detalle por franja
 1283        modelBuilder.Entity<IrpfDetalleFranjas>()
 1284            .HasKey(d => d.Id);
 285
 1286        modelBuilder.Entity<IrpfDetalleFranjas>()
 1287            .HasOne(d => d.FranjaIrpf)
 1288            .WithMany()
 1289            .HasForeignKey(d => d.FranjaIrpfId)
 1290            .OnDelete(DeleteBehavior.Restrict);
 291
 292        // Dependientes
 1293        modelBuilder.Entity<Dependiente>()
 1294            .HasIndex(d => new { d.PersonaId, d.Activo });
 295
 1296        modelBuilder.Entity<Dependiente>()
 2297            .ToTable(t => t.HasCheckConstraint("CK_dependientes_tipo",
 2298                "tipo IN ('hijo', 'conyuge_sin_ingresos')"));
 299
 1300        modelBuilder.Entity<Dependiente>()
 2301            .ToTable(t => t.HasCheckConstraint("CK_dependientes_porcentaje",
 2302                "porcentaje_deduccion IS NULL OR porcentaje_deduccion IN (50, 100)"));
 303
 304        // Compensaciones
 1305        modelBuilder.Entity<TipoCompensacion>()
 1306            .HasIndex(t => t.Codigo)
 1307            .IsUnique();
 308
 1309        modelBuilder.Entity<ConfigCompensacion>()
 1310            .HasIndex(c => new { c.TipoCompensacionId, c.RegimenId, c.GradoId, c.EscalafonId, c.Funcion });
 311
 1312        modelBuilder.Entity<LoteCompensacion>()
 1313            .HasIndex(l => new { l.TipoCompensacionId, l.Periodo });
 314
 1315        modelBuilder.Entity<ItemLoteCompensacion>()
 1316            .HasIndex(i => new { i.LoteCompensacionId, i.PersonaId })
 1317            .IsUnique();
 318
 319        // Beneficios sociales
 1320        modelBuilder.Entity<TipoBeneficio>()
 2321            .ToTable(t => t.HasCheckConstraint("CK_tipos_beneficio_plazo_no_negativo",
 2322                "plazo_presentacion_dias IS NULL OR plazo_presentacion_dias >= 0"));
 323
 1324        modelBuilder.Entity<TipoBeneficio>()
 2325            .ToTable(t => t.HasCheckConstraint("CK_tipos_beneficio_monto_no_negativo",
 2326                "monto_referencia IS NULL OR monto_referencia >= 0"));
 327
 1328        modelBuilder.Entity<BeneficioSocial>()
 2329            .ToTable(t => t.HasCheckConstraint("CK_beneficios_sociales_estado",
 2330                "estado IN ('activo', 'inactivo', 'pendiente_doc')"));
 331
 332        // Catálogo e instructivo (tablas de referencia generales)
 1333        modelBuilder.Entity<CatalogoItem>()
 1334            .HasIndex(c => c.Codigo)
 1335            .IsUnique();
 336
 1337        modelBuilder.Entity<RemuneracionGrado>()
 1338            .HasIndex(r => new { r.GradoId, r.ItemId, r.VigenteDesde });
 339
 1340        modelBuilder.Entity<TablaPermanencia>()
 1341            .HasIndex(t => new { t.EscalafonId, t.AniosDesde, t.AniosHasta, t.VigenteDesde });
 342
 1343        modelBuilder.Entity<TablaPermanencia>()
 2344            .ToTable(t => t.HasCheckConstraint("CK_tabla_permanencia_valor", "porcentaje IS NOT NULL OR monto_fijo IS NO
 345
 1346        modelBuilder.Entity<TarifaPorCategoria>()
 1347            .HasIndex(t => new { t.ItemId, t.Categoria, t.VigenteDesde });
 348
 349        // Apertura de períodos de liquidación
 1350        modelBuilder.Entity<Periodo>()
 1351            .HasOne(p => p.Snapshot)
 1352            .WithMany()
 1353            .HasForeignKey(p => p.SnapshotId)
 1354            .OnDelete(DeleteBehavior.Restrict);
 355
 1356        modelBuilder.Entity<Periodo>()
 1357            .HasIndex(p => new { p.Anio, p.Mes })
 1358            .IsUnique()
 1359            .HasFilter("activo = TRUE");
 360
 1361        modelBuilder.Entity<Periodo>()
 1362            .HasIndex(p => p.Estado);
 363
 1364        modelBuilder.Entity<Periodo>()
 2365            .ToTable(t => t.HasCheckConstraint("CK_periodos_liquidacion_estado",
 2366                "estado IN ('ABIERTA','LISTA_CALCULO','EN_CALCULO','CALCULADA','CERRADA')"));
 367
 1368        modelBuilder.Entity<LiquidacionItem>()
 1369            .HasIndex(li => new { li.PeriodoId, li.Cedula, li.Version });
 370
 1371        modelBuilder.Entity<LiquidacionItem>()
 1372            .HasIndex(li => new { li.PeriodoId, li.Version });
 373
 1374        modelBuilder.Entity<LiquidacionEstadoPersonal>()
 1375            .HasIndex(le => new { le.PeriodoId, le.Cedula, le.Version });
 376
 1377        modelBuilder.Entity<LiquidacionResumen>()
 1378            .HasIndex(lr => new { lr.PeriodoId, lr.Version, lr.ProgramaId, lr.RegimenId, lr.Rubro083 });
 379
 1380        modelBuilder.Entity<SnapshotInsumos>()
 1381            .Property(s => s.ContenidoJson)
 1382            .HasColumnType("jsonb");
 1383    }
 384}
 385
 386