< 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: 218
Uncovered lines: 0
Coverable lines: 218
Total lines: 319
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{
 2508    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
 9    {
 25010    }
 11
 12    // DbSets para las entidades principales
 32913    public DbSet<Persona> Personas { get; set; }
 30314    public DbSet<Usuario> Usuarios { get; set; }
 27615    public DbSet<Rol> Roles { get; set; }
 27416    public DbSet<Permiso> Permisos { get; set; }
 25317    public DbSet<Accion> Acciones { get; set; }
 25318    public DbSet<Contexto> Contextos { get; set; }
 26019    public DbSet<BitacoraAuditoria> BitacorasAuditoria { get; set; }
 29620    public DbSet<Banco> Bancos { get; set; }
 25021    public DbSet<CuentaBancaria> CuentasBancarias { get; set; }
 32422    public DbSet<TipoBeneficio> TiposBeneficio { get; set; }
 31623    public DbSet<BeneficioSocial> BeneficiosSociales { get; set; }
 27124    public DbSet<ParametroPeriodo> ParametrosPeriodo { get; set; }
 25
 26    // Personal y catálogos
 37327    public DbSet<RelacionLaboral> RelacionesLaborales { get; set; }
 26128    public DbSet<MovimientoLaboral> MovimientosLaborales { get; set; }
 30229    public DbSet<Regimen> Regimenes { get; set; }
 28430    public DbSet<Escalafon> Escalafones { get; set; }
 29531    public DbSet<Grado> Grados { get; set; }
 28432    public DbSet<Situacion> Situaciones { get; set; }
 28433    public DbSet<Programa> Programas { get; set; }
 28434    public DbSet<Unidad> Unidades { get; set; }
 25035    public DbSet<Compania> Companias { get; set; }
 26036    public DbSet<TipoMovimiento> TiposMovimiento { get; set; }
 37
 38    // IRPF
 32039    public DbSet<FranjaIrpf> FranjasIrpf { get; set; }
 40
 41    // Dependientes
 29042    public DbSet<Dependiente> Dependientes { get; set; }
 43
 44    // Compensaciones
 34745    public DbSet<TipoCompensacion> TiposCompensacion { get; set; }
 29346    public DbSet<ConfigCompensacion> ConfigCompensaciones { get; set; }
 30747    public DbSet<LoteCompensacion> LotesCompensacion { get; set; }
 28048    public DbSet<ItemLoteCompensacion> ItemsLoteCompensacion { get; set; }
 49
 50    // Instructivo / Tablas de referencia (no atadas a compensaciones)
 25851    public DbSet<CatalogoItem> CatalogoItems { get; set; }
 29752    public DbSet<RemuneracionGrado> RemuneracionesGrado { get; set; }
 25053    public DbSet<TarifaPorCategoria> TarifasPorCategoria { get; set; }
 54
 55    // Apertura de períodos
 27156    public DbSet<Periodo> PeriodosLiquidacion { get; set; }
 27057    public DbSet<SnapshotInsumos> SnapshotsInsumos { get; set; }
 58
 59    // Motor de cálculo
 26260    public DbSet<NovedadPeriodo> NovedadesPeriodo { get; set; }
 25061    public DbSet<Retroactividad> Retroactividades { get; set; }
 25062    public DbSet<RetroactividadItem> RetroactividadItems { get; set; }
 63
 64    // Liquidación de haberes
 25065    public DbSet<LiquidacionItem> LiquidacionItems { get; set; }
 25066    public DbSet<LiquidacionEstadoPersonal> LiquidacionEstadosPersonal { get; set; }
 25067    public DbSet<LiquidacionResumen> LiquidacionResumenes { get; set; }
 68
 69    protected override void OnModelCreating(ModelBuilder modelBuilder)
 70    {
 171        base.OnModelCreating(modelBuilder);
 72
 73        // Configuración de la relación muchos a muchos entre Usuario y Rol
 174        modelBuilder.Entity<Usuario>()
 175            .HasMany(u => u.Roles)
 176            .WithMany(r => r.Usuarios)
 177            .UsingEntity<Dictionary<string, object>>(
 178                "usuarios_roles",
 179                j => j.HasOne<Rol>().WithMany().HasForeignKey("rol_id"),
 180                j => j.HasOne<Usuario>().WithMany().HasForeignKey("usuario_id"),
 181                j =>
 182                {
 183                    j.HasKey("usuario_id", "rol_id");
 184                    j.ToTable("usuarios_roles");
 185                }
 186            );
 87
 88        // Configuración de la relación muchos a muchos entre Rol y Permiso
 189        modelBuilder.Entity<Rol>()
 190            .HasMany(r => r.Permisos)
 191            .WithMany(p => p.Roles)
 192            .UsingEntity<Dictionary<string, object>>(
 193                "roles_permisos",
 194                j => j.HasOne<Permiso>().WithMany().HasForeignKey("permiso_id"),
 195                j => j.HasOne<Rol>().WithMany().HasForeignKey("rol_id"),
 196                j =>
 197                {
 198                    j.HasKey("permiso_id", "rol_id");
 199                    j.ToTable("roles_permisos");
 1100                }
 1101            );
 102
 103        // Índices únicos
 1104        modelBuilder.Entity<Persona>()
 1105            .HasIndex(p => p.Cedula)
 1106            .IsUnique();
 107
 1108        modelBuilder.Entity<Usuario>()
 1109            .HasIndex(u => u.Username)
 1110            .IsUnique();
 111
 1112        modelBuilder.Entity<Rol>()
 1113            .HasIndex(r => r.Nombre)
 1114            .IsUnique();
 115
 1116        modelBuilder.Entity<Permiso>()
 1117            .HasIndex(p => p.Nombre)
 1118            .IsUnique();
 119
 1120        modelBuilder.Entity<Accion>()
 1121            .HasIndex(a => a.Nombre)
 1122            .IsUnique();
 123
 1124        modelBuilder.Entity<Contexto>()
 1125            .HasIndex(c => c.Nombre)
 1126            .IsUnique();
 127
 1128        modelBuilder.Entity<Banco>()
 1129            .HasIndex(b => b.Codigo)
 1130            .IsUnique();
 131
 1132        modelBuilder.Entity<TipoBeneficio>()
 1133            .HasIndex(tb => tb.Codigo)
 1134            .IsUnique();
 135
 136        // Índices para catálogos
 1137        modelBuilder.Entity<Regimen>()
 1138            .HasIndex(r => r.NumeroLey)
 1139            .IsUnique();
 140
 1141        modelBuilder.Entity<Escalafon>()
 1142            .HasIndex(e => e.Codigo)
 1143            .IsUnique();
 144
 1145        modelBuilder.Entity<Situacion>()
 1146            .HasIndex(s => s.Codigo)
 1147            .IsUnique();
 148
 1149        modelBuilder.Entity<Situacion>()
 1150            .Property(s => s.SistemaSalud)
 1151            .HasDefaultValue("ssffaa");
 152
 1153        modelBuilder.Entity<Programa>()
 1154            .HasIndex(p => p.Codigo)
 1155            .IsUnique();
 156
 1157        modelBuilder.Entity<Unidad>()
 1158            .HasIndex(u => u.Codigo)
 1159            .IsUnique();
 160
 1161        modelBuilder.Entity<Compania>()
 1162            .HasIndex(c => c.Codigo)
 1163            .IsUnique();
 164
 165        // Índices para relaciones laborales
 1166        modelBuilder.Entity<RelacionLaboral>()
 1167            .HasIndex(rl => new { rl.PersonaId, rl.Estado });
 168
 1169        modelBuilder.Entity<RelacionLaboral>()
 1170            .HasIndex(rl => rl.GradoId);
 171
 172        // Configuración explícita para resolver ambigüedad: Grado tiene dos FKs desde RelacionLaboral
 1173        modelBuilder.Entity<RelacionLaboral>()
 1174            .HasOne(rl => rl.Grado)
 1175            .WithMany(g => g.RelacionesLaborales)
 1176            .HasForeignKey(rl => rl.GradoId)
 1177            .OnDelete(DeleteBehavior.Restrict);
 178
 1179        modelBuilder.Entity<RelacionLaboral>()
 1180            .HasOne(rl => rl.GradoReincorporacion)
 1181            .WithMany()
 1182            .HasForeignKey(rl => rl.GradoReincorporacionId)
 1183            .OnDelete(DeleteBehavior.Restrict);
 184
 1185        modelBuilder.Entity<BeneficioSocial>()
 1186            .HasIndex(bs => new { bs.PersonaId, bs.Estado });
 187
 1188        modelBuilder.Entity<BeneficioSocial>()
 1189            .HasIndex(bs => new { bs.TipoBeneficioId, bs.Estado });
 190
 1191        modelBuilder.Entity<BeneficioSocial>()
 1192            .HasIndex(bs => new { bs.PersonaId, bs.TipoBeneficioId, bs.ClaveEvento });
 193
 1194        modelBuilder.Entity<BeneficioSocial>()
 1195            .HasIndex(bs => bs.RetroactividadPendiente);
 196
 1197        modelBuilder.Entity<ParametroPeriodo>()
 1198            .HasIndex(pp => new { pp.Anio, pp.Mes })
 1199            .IsUnique();
 200
 201        // Índice para búsqueda de auditoría por entidad
 1202        modelBuilder.Entity<BitacoraAuditoria>()
 1203            .HasIndex(b => new { b.Entidad, b.EntidadId });
 204
 205        // Configurar checks
 1206        modelBuilder.Entity<Usuario>()
 2207            .ToTable(t => t.HasCheckConstraint("CK_usuarios_estado",
 2208                "estado IN ('activo', 'bloqueado')"));
 209
 1210        modelBuilder.Entity<CuentaBancaria>()
 2211            .ToTable(t => t.HasCheckConstraint("CK_cuentas_bancarias_estado",
 2212                "estado IN ('activa', 'inactiva')"));
 213
 214        // Configure conversion for RelacionLaboral.Estado enum to store string values compatible with existing DB
 1215        modelBuilder.Entity<RelacionLaboral>()
 1216            .Property(rl => rl.Estado)
 1217            .HasConversion(
 1218                v => v == EstadoRelacion.Activo ? "activo" : "inactivo",
 1219                v => v == "activo" ? EstadoRelacion.Activo : EstadoRelacion.Inactivo
 1220            );
 221
 1222        modelBuilder.Entity<RelacionLaboral>()
 2223            .ToTable(t => t.HasCheckConstraint("CK_relaciones_laborales_estado",
 2224                "estado IN ('activo', 'inactivo')"));
 225
 226        // IRPF
 1227        modelBuilder.Entity<FranjaIrpf>()
 1228            .HasIndex(f => new { f.NumeroFranja, f.VigenteDesde })
 1229            .IsUnique();
 230
 231        // Dependientes
 1232        modelBuilder.Entity<Dependiente>()
 1233            .HasIndex(d => new { d.PersonaId, d.Activo });
 234
 1235        modelBuilder.Entity<Dependiente>()
 2236            .ToTable(t => t.HasCheckConstraint("CK_dependientes_tipo",
 2237                "tipo IN ('hijo', 'conyuge_sin_ingresos')"));
 238
 1239        modelBuilder.Entity<Dependiente>()
 2240            .ToTable(t => t.HasCheckConstraint("CK_dependientes_porcentaje",
 2241                "porcentaje_deduccion IS NULL OR porcentaje_deduccion IN (50, 100)"));
 242
 243        // Compensaciones
 1244        modelBuilder.Entity<TipoCompensacion>()
 1245            .HasIndex(t => t.Codigo)
 1246            .IsUnique();
 247
 1248        modelBuilder.Entity<ConfigCompensacion>()
 1249            .HasIndex(c => new { c.TipoCompensacionId, c.RegimenId, c.GradoId, c.EscalafonId, c.Funcion });
 250
 1251        modelBuilder.Entity<LoteCompensacion>()
 1252            .HasIndex(l => new { l.TipoCompensacionId, l.Periodo });
 253
 1254        modelBuilder.Entity<ItemLoteCompensacion>()
 1255            .HasIndex(i => new { i.LoteCompensacionId, i.PersonaId })
 1256            .IsUnique();
 257
 258        // Beneficios sociales
 1259        modelBuilder.Entity<TipoBeneficio>()
 2260            .ToTable(t => t.HasCheckConstraint("CK_tipos_beneficio_plazo_no_negativo",
 2261                "plazo_presentacion_dias IS NULL OR plazo_presentacion_dias >= 0"));
 262
 1263        modelBuilder.Entity<TipoBeneficio>()
 2264            .ToTable(t => t.HasCheckConstraint("CK_tipos_beneficio_monto_no_negativo",
 2265                "monto_referencia IS NULL OR monto_referencia >= 0"));
 266
 1267        modelBuilder.Entity<BeneficioSocial>()
 2268            .ToTable(t => t.HasCheckConstraint("CK_beneficios_sociales_estado",
 2269                "estado IN ('activo', 'inactivo', 'pendiente_doc')"));
 270
 271        // Catálogo e instructivo (tablas de referencia generales)
 1272        modelBuilder.Entity<CatalogoItem>()
 1273            .HasIndex(c => c.Codigo)
 1274            .IsUnique();
 275
 1276        modelBuilder.Entity<RemuneracionGrado>()
 1277            .HasIndex(r => new { r.GradoId, r.ItemId, r.VigenteDesde });
 278
 1279        modelBuilder.Entity<TarifaPorCategoria>()
 1280            .HasIndex(t => new { t.ItemId, t.Categoria, t.VigenteDesde });
 281
 282        // Apertura de períodos de liquidación
 1283        modelBuilder.Entity<Periodo>()
 1284            .HasOne(p => p.Snapshot)
 1285            .WithMany()
 1286            .HasForeignKey(p => p.SnapshotId)
 1287            .OnDelete(DeleteBehavior.Restrict);
 288
 1289        modelBuilder.Entity<Periodo>()
 1290            .HasIndex(p => new { p.Anio, p.Mes })
 1291            .IsUnique()
 1292            .HasFilter("activo = TRUE");
 293
 1294        modelBuilder.Entity<Periodo>()
 1295            .HasIndex(p => p.Estado);
 296
 1297        modelBuilder.Entity<Periodo>()
 2298            .ToTable(t => t.HasCheckConstraint("CK_periodos_liquidacion_estado",
 2299                "estado IN ('ABIERTA','LISTA_CALCULO','EN_CALCULO','CALCULADA','CERRADA')"));
 300
 1301        modelBuilder.Entity<LiquidacionItem>()
 1302            .HasIndex(li => new { li.PeriodoId, li.Cedula, li.Version });
 303
 1304        modelBuilder.Entity<LiquidacionItem>()
 1305            .HasIndex(li => new { li.PeriodoId, li.Version });
 306
 1307        modelBuilder.Entity<LiquidacionEstadoPersonal>()
 1308            .HasIndex(le => new { le.PeriodoId, le.Cedula, le.Version });
 309
 1310        modelBuilder.Entity<LiquidacionResumen>()
 1311            .HasIndex(lr => new { lr.PeriodoId, lr.Version, lr.ProgramaId, lr.RegimenId, lr.Rubro083 });
 312
 1313        modelBuilder.Entity<SnapshotInsumos>()
 1314            .Property(s => s.ContenidoJson)
 1315            .HasColumnType("jsonb");
 1316    }
 317}
 318
 319