< 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: 223
Uncovered lines: 0
Coverable lines: 223
Total lines: 326
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

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{
 2528    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
 9    {
 25210    }
 11
 12    // DbSets para las entidades principales
 33113    public DbSet<Persona> Personas { get; set; }
 30514    public DbSet<Usuario> Usuarios { get; set; }
 27815    public DbSet<Rol> Roles { get; set; }
 27616    public DbSet<Permiso> Permisos { get; set; }
 25517    public DbSet<Accion> Acciones { get; set; }
 25518    public DbSet<Contexto> Contextos { get; set; }
 26219    public DbSet<BitacoraAuditoria> BitacorasAuditoria { get; set; }
 29820    public DbSet<Banco> Bancos { get; set; }
 25221    public DbSet<CuentaBancaria> CuentasBancarias { get; set; }
 32622    public DbSet<TipoBeneficio> TiposBeneficio { get; set; }
 32023    public DbSet<BeneficioSocial> BeneficiosSociales { get; set; }
 27524    public DbSet<ParametroPeriodo> ParametrosPeriodo { get; set; }
 25
 26    // Personal y catálogos
 37527    public DbSet<RelacionLaboral> RelacionesLaborales { get; set; }
 26328    public DbSet<MovimientoLaboral> MovimientosLaborales { get; set; }
 30429    public DbSet<Regimen> Regimenes { get; set; }
 28630    public DbSet<Escalafon> Escalafones { get; set; }
 29731    public DbSet<Grado> Grados { get; set; }
 28632    public DbSet<Situacion> Situaciones { get; set; }
 28633    public DbSet<Programa> Programas { get; set; }
 28634    public DbSet<Unidad> Unidades { get; set; }
 25235    public DbSet<Compania> Companias { get; set; }
 26236    public DbSet<TipoMovimiento> TiposMovimiento { get; set; }
 37
 38    // IRPF
 32439    public DbSet<FranjaIrpf> FranjasIrpf { get; set; }
 40
 41    // Dependientes
 29242    public DbSet<Dependiente> Dependientes { get; set; }
 43
 44    // Compensaciones
 34945    public DbSet<TipoCompensacion> TiposCompensacion { get; set; }
 29546    public DbSet<ConfigCompensacion> ConfigCompensaciones { get; set; }
 31047    public DbSet<LoteCompensacion> LotesCompensacion { get; set; }
 28448    public DbSet<ItemLoteCompensacion> ItemsLoteCompensacion { get; set; }
 49
 50    // Instructivo / Tablas de referencia (no atadas a compensaciones)
 26251    public DbSet<CatalogoItem> CatalogoItems { get; set; }
 30152    public DbSet<RemuneracionGrado> RemuneracionesGrado { get; set; }
 25353    public DbSet<TablaPermanencia> TablaPermanencias { get; set; }
 25254    public DbSet<TarifaPorCategoria> TarifasPorCategoria { get; set; }
 55
 56    // Apertura de períodos
 27557    public DbSet<Periodo> PeriodosLiquidacion { get; set; }
 27258    public DbSet<SnapshotInsumos> SnapshotsInsumos { get; set; }
 59
 60    // Motor de cálculo
 26661    public DbSet<NovedadPeriodo> NovedadesPeriodo { get; set; }
 25262    public DbSet<Retroactividad> Retroactividades { get; set; }
 25263    public DbSet<RetroactividadItem> RetroactividadItems { get; set; }
 64
 65    // Liquidación de haberes
 25266    public DbSet<LiquidacionItem> LiquidacionItems { get; set; }
 25267    public DbSet<LiquidacionEstadoPersonal> LiquidacionEstadosPersonal { get; set; }
 25268    public DbSet<LiquidacionResumen> LiquidacionResumenes { get; set; }
 69
 70    protected override void OnModelCreating(ModelBuilder modelBuilder)
 71    {
 172        base.OnModelCreating(modelBuilder);
 73
 74        // Configuración de la relación muchos a muchos entre Usuario y Rol
 175        modelBuilder.Entity<Usuario>()
 176            .HasMany(u => u.Roles)
 177            .WithMany(r => r.Usuarios)
 178            .UsingEntity<Dictionary<string, object>>(
 179                "usuarios_roles",
 180                j => j.HasOne<Rol>().WithMany().HasForeignKey("rol_id"),
 181                j => j.HasOne<Usuario>().WithMany().HasForeignKey("usuario_id"),
 182                j =>
 183                {
 184                    j.HasKey("usuario_id", "rol_id");
 185                    j.ToTable("usuarios_roles");
 186                }
 187            );
 88
 89        // Configuración de la relación muchos a muchos entre Rol y Permiso
 190        modelBuilder.Entity<Rol>()
 191            .HasMany(r => r.Permisos)
 192            .WithMany(p => p.Roles)
 193            .UsingEntity<Dictionary<string, object>>(
 194                "roles_permisos",
 195                j => j.HasOne<Permiso>().WithMany().HasForeignKey("permiso_id"),
 196                j => j.HasOne<Rol>().WithMany().HasForeignKey("rol_id"),
 197                j =>
 198                {
 199                    j.HasKey("permiso_id", "rol_id");
 1100                    j.ToTable("roles_permisos");
 1101                }
 1102            );
 103
 104        // Índices únicos
 1105        modelBuilder.Entity<Persona>()
 1106            .HasIndex(p => p.Cedula)
 1107            .IsUnique();
 108
 1109        modelBuilder.Entity<Usuario>()
 1110            .HasIndex(u => u.Username)
 1111            .IsUnique();
 112
 1113        modelBuilder.Entity<Rol>()
 1114            .HasIndex(r => r.Nombre)
 1115            .IsUnique();
 116
 1117        modelBuilder.Entity<Permiso>()
 1118            .HasIndex(p => p.Nombre)
 1119            .IsUnique();
 120
 1121        modelBuilder.Entity<Accion>()
 1122            .HasIndex(a => a.Nombre)
 1123            .IsUnique();
 124
 1125        modelBuilder.Entity<Contexto>()
 1126            .HasIndex(c => c.Nombre)
 1127            .IsUnique();
 128
 1129        modelBuilder.Entity<Banco>()
 1130            .HasIndex(b => b.Codigo)
 1131            .IsUnique();
 132
 1133        modelBuilder.Entity<TipoBeneficio>()
 1134            .HasIndex(tb => tb.Codigo)
 1135            .IsUnique();
 136
 137        // Índices para catálogos
 1138        modelBuilder.Entity<Regimen>()
 1139            .HasIndex(r => r.NumeroLey)
 1140            .IsUnique();
 141
 1142        modelBuilder.Entity<Escalafon>()
 1143            .HasIndex(e => e.Codigo)
 1144            .IsUnique();
 145
 1146        modelBuilder.Entity<Situacion>()
 1147            .HasIndex(s => s.Codigo)
 1148            .IsUnique();
 149
 1150        modelBuilder.Entity<Situacion>()
 1151            .Property(s => s.SistemaSalud)
 1152            .HasDefaultValue("ssffaa");
 153
 1154        modelBuilder.Entity<Programa>()
 1155            .HasIndex(p => p.Codigo)
 1156            .IsUnique();
 157
 1158        modelBuilder.Entity<Unidad>()
 1159            .HasIndex(u => u.Codigo)
 1160            .IsUnique();
 161
 1162        modelBuilder.Entity<Compania>()
 1163            .HasIndex(c => c.Codigo)
 1164            .IsUnique();
 165
 166        // Índices para relaciones laborales
 1167        modelBuilder.Entity<RelacionLaboral>()
 1168            .HasIndex(rl => new { rl.PersonaId, rl.Estado });
 169
 1170        modelBuilder.Entity<RelacionLaboral>()
 1171            .HasIndex(rl => rl.GradoId);
 172
 173        // Configuración explícita para resolver ambigüedad: Grado tiene dos FKs desde RelacionLaboral
 1174        modelBuilder.Entity<RelacionLaboral>()
 1175            .HasOne(rl => rl.Grado)
 1176            .WithMany(g => g.RelacionesLaborales)
 1177            .HasForeignKey(rl => rl.GradoId)
 1178            .OnDelete(DeleteBehavior.Restrict);
 179
 1180        modelBuilder.Entity<RelacionLaboral>()
 1181            .HasOne(rl => rl.GradoReincorporacion)
 1182            .WithMany()
 1183            .HasForeignKey(rl => rl.GradoReincorporacionId)
 1184            .OnDelete(DeleteBehavior.Restrict);
 185
 1186        modelBuilder.Entity<BeneficioSocial>()
 1187            .HasIndex(bs => new { bs.PersonaId, bs.Estado });
 188
 1189        modelBuilder.Entity<BeneficioSocial>()
 1190            .HasIndex(bs => new { bs.TipoBeneficioId, bs.Estado });
 191
 1192        modelBuilder.Entity<BeneficioSocial>()
 1193            .HasIndex(bs => new { bs.PersonaId, bs.TipoBeneficioId, bs.ClaveEvento });
 194
 1195        modelBuilder.Entity<BeneficioSocial>()
 1196            .HasIndex(bs => bs.RetroactividadPendiente);
 197
 1198        modelBuilder.Entity<ParametroPeriodo>()
 1199            .HasIndex(pp => new { pp.Anio, pp.Mes })
 1200            .IsUnique();
 201
 202        // Índice para búsqueda de auditoría por entidad
 1203        modelBuilder.Entity<BitacoraAuditoria>()
 1204            .HasIndex(b => new { b.Entidad, b.EntidadId });
 205
 206        // Configurar checks
 1207        modelBuilder.Entity<Usuario>()
 2208            .ToTable(t => t.HasCheckConstraint("CK_usuarios_estado",
 2209                "estado IN ('activo', 'bloqueado')"));
 210
 1211        modelBuilder.Entity<CuentaBancaria>()
 2212            .ToTable(t => t.HasCheckConstraint("CK_cuentas_bancarias_estado",
 2213                "estado IN ('activa', 'inactiva')"));
 214
 215        // Configure conversion for RelacionLaboral.Estado enum to store string values compatible with existing DB
 1216        modelBuilder.Entity<RelacionLaboral>()
 1217            .Property(rl => rl.Estado)
 1218            .HasConversion(
 1219                v => v == EstadoRelacion.Activo ? "activo" : "inactivo",
 1220                v => v == "activo" ? EstadoRelacion.Activo : EstadoRelacion.Inactivo
 1221            );
 222
 1223        modelBuilder.Entity<RelacionLaboral>()
 2224            .ToTable(t => t.HasCheckConstraint("CK_relaciones_laborales_estado",
 2225                "estado IN ('activo', 'inactivo')"));
 226
 227        // IRPF
 1228        modelBuilder.Entity<FranjaIrpf>()
 1229            .HasIndex(f => new { f.NumeroFranja, f.VigenteDesde })
 1230            .IsUnique();
 231
 232        // Dependientes
 1233        modelBuilder.Entity<Dependiente>()
 1234            .HasIndex(d => new { d.PersonaId, d.Activo });
 235
 1236        modelBuilder.Entity<Dependiente>()
 2237            .ToTable(t => t.HasCheckConstraint("CK_dependientes_tipo",
 2238                "tipo IN ('hijo', 'conyuge_sin_ingresos')"));
 239
 1240        modelBuilder.Entity<Dependiente>()
 2241            .ToTable(t => t.HasCheckConstraint("CK_dependientes_porcentaje",
 2242                "porcentaje_deduccion IS NULL OR porcentaje_deduccion IN (50, 100)"));
 243
 244        // Compensaciones
 1245        modelBuilder.Entity<TipoCompensacion>()
 1246            .HasIndex(t => t.Codigo)
 1247            .IsUnique();
 248
 1249        modelBuilder.Entity<ConfigCompensacion>()
 1250            .HasIndex(c => new { c.TipoCompensacionId, c.RegimenId, c.GradoId, c.EscalafonId, c.Funcion });
 251
 1252        modelBuilder.Entity<LoteCompensacion>()
 1253            .HasIndex(l => new { l.TipoCompensacionId, l.Periodo });
 254
 1255        modelBuilder.Entity<ItemLoteCompensacion>()
 1256            .HasIndex(i => new { i.LoteCompensacionId, i.PersonaId })
 1257            .IsUnique();
 258
 259        // Beneficios sociales
 1260        modelBuilder.Entity<TipoBeneficio>()
 2261            .ToTable(t => t.HasCheckConstraint("CK_tipos_beneficio_plazo_no_negativo",
 2262                "plazo_presentacion_dias IS NULL OR plazo_presentacion_dias >= 0"));
 263
 1264        modelBuilder.Entity<TipoBeneficio>()
 2265            .ToTable(t => t.HasCheckConstraint("CK_tipos_beneficio_monto_no_negativo",
 2266                "monto_referencia IS NULL OR monto_referencia >= 0"));
 267
 1268        modelBuilder.Entity<BeneficioSocial>()
 2269            .ToTable(t => t.HasCheckConstraint("CK_beneficios_sociales_estado",
 2270                "estado IN ('activo', 'inactivo', 'pendiente_doc')"));
 271
 272        // Catálogo e instructivo (tablas de referencia generales)
 1273        modelBuilder.Entity<CatalogoItem>()
 1274            .HasIndex(c => c.Codigo)
 1275            .IsUnique();
 276
 1277        modelBuilder.Entity<RemuneracionGrado>()
 1278            .HasIndex(r => new { r.GradoId, r.ItemId, r.VigenteDesde });
 279
 1280        modelBuilder.Entity<TablaPermanencia>()
 1281            .HasIndex(t => new { t.EscalafonId, t.AniosDesde, t.AniosHasta, t.VigenteDesde });
 282
 1283        modelBuilder.Entity<TablaPermanencia>()
 2284            .ToTable(t => t.HasCheckConstraint("CK_tabla_permanencia_valor", "porcentaje IS NOT NULL OR monto_fijo IS NO
 285
 1286        modelBuilder.Entity<TarifaPorCategoria>()
 1287            .HasIndex(t => new { t.ItemId, t.Categoria, t.VigenteDesde });
 288
 289        // Apertura de períodos de liquidación
 1290        modelBuilder.Entity<Periodo>()
 1291            .HasOne(p => p.Snapshot)
 1292            .WithMany()
 1293            .HasForeignKey(p => p.SnapshotId)
 1294            .OnDelete(DeleteBehavior.Restrict);
 295
 1296        modelBuilder.Entity<Periodo>()
 1297            .HasIndex(p => new { p.Anio, p.Mes })
 1298            .IsUnique()
 1299            .HasFilter("activo = TRUE");
 300
 1301        modelBuilder.Entity<Periodo>()
 1302            .HasIndex(p => p.Estado);
 303
 1304        modelBuilder.Entity<Periodo>()
 2305            .ToTable(t => t.HasCheckConstraint("CK_periodos_liquidacion_estado",
 2306                "estado IN ('ABIERTA','LISTA_CALCULO','EN_CALCULO','CALCULADA','CERRADA')"));
 307
 1308        modelBuilder.Entity<LiquidacionItem>()
 1309            .HasIndex(li => new { li.PeriodoId, li.Cedula, li.Version });
 310
 1311        modelBuilder.Entity<LiquidacionItem>()
 1312            .HasIndex(li => new { li.PeriodoId, li.Version });
 313
 1314        modelBuilder.Entity<LiquidacionEstadoPersonal>()
 1315            .HasIndex(le => new { le.PeriodoId, le.Cedula, le.Version });
 316
 1317        modelBuilder.Entity<LiquidacionResumen>()
 1318            .HasIndex(lr => new { lr.PeriodoId, lr.Version, lr.ProgramaId, lr.RegimenId, lr.Rubro083 });
 319
 1320        modelBuilder.Entity<SnapshotInsumos>()
 1321            .Property(s => s.ContenidoJson)
 1322            .HasColumnType("jsonb");
 1323    }
 324}
 325
 326