< 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: 205
Uncovered lines: 0
Coverable lines: 205
Total lines: 301
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{
 2178    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
 9    {
 21710    }
 11
 12    // DbSets para las entidades principales
 29613    public DbSet<Persona> Personas { get; set; }
 26414    public DbSet<Usuario> Usuarios { get; set; }
 24215    public DbSet<Rol> Roles { get; set; }
 24116    public DbSet<Permiso> Permisos { get; set; }
 22017    public DbSet<Accion> Acciones { get; set; }
 22018    public DbSet<Contexto> Contextos { get; set; }
 22719    public DbSet<BitacoraAuditoria> BitacorasAuditoria { get; set; }
 26320    public DbSet<Banco> Bancos { get; set; }
 21721    public DbSet<CuentaBancaria> CuentasBancarias { get; set; }
 27222    public DbSet<TipoBeneficio> TiposBeneficio { get; set; }
 25423    public DbSet<BeneficioSocial> BeneficiosSociales { get; set; }
 23224    public DbSet<ParametroPeriodo> ParametrosPeriodo { get; set; }
 25
 26    // Personal y catálogos
 29827    public DbSet<RelacionLaboral> RelacionesLaborales { get; set; }
 23128    public DbSet<MovimientoLaboral> MovimientosLaborales { get; set; }
 26929    public DbSet<Regimen> Regimenes { get; set; }
 25130    public DbSet<Escalafon> Escalafones { get; set; }
 26231    public DbSet<Grado> Grados { get; set; }
 25132    public DbSet<Situacion> Situaciones { get; set; }
 25133    public DbSet<Programa> Programas { get; set; }
 25134    public DbSet<Unidad> Unidades { get; set; }
 21735    public DbSet<Compania> Companias { get; set; }
 22736    public DbSet<TipoMovimiento> TiposMovimiento { get; set; }
 37
 38    // IRPF
 24939    public DbSet<FranjaIrpf> FranjasIrpf { get; set; }
 40
 41    // Dependientes
 25742    public DbSet<Dependiente> Dependientes { get; set; }
 43
 44    // Compensaciones
 28245    public DbSet<TipoCompensacion> TiposCompensacion { get; set; }
 26046    public DbSet<ConfigCompensacion> ConfigCompensaciones { get; set; }
 24947    public DbSet<LoteCompensacion> LotesCompensacion { get; set; }
 24748    public DbSet<ItemLoteCompensacion> ItemsLoteCompensacion { get; set; }
 49
 50    // Instructivo / Tablas de referencia (no atadas a compensaciones)
 22051    public DbSet<CatalogoItem> CatalogoItems { get; set; }
 22652    public DbSet<RemuneracionGrado> RemuneracionesGrado { get; set; }
 21753    public DbSet<TarifaPorCategoria> TarifasPorCategoria { get; set; }
 54
 55    // Apertura de períodos
 21856    public DbSet<Periodo> PeriodosLiquidacion { get; set; }
 21957    public DbSet<SnapshotInsumos> SnapshotsInsumos { get; set; }
 58
 59    // Liquidación de haberes
 21760    public DbSet<LiquidacionItem> LiquidacionItems { get; set; }
 21761    public DbSet<LiquidacionEstadoPersonal> LiquidacionEstadosPersonal { get; set; }
 21762    public DbSet<LiquidacionResumen> LiquidacionResumenes { get; set; }
 63
 64    protected override void OnModelCreating(ModelBuilder modelBuilder)
 65    {
 166        base.OnModelCreating(modelBuilder);
 67
 68        // Configuración de la relación muchos a muchos entre Usuario y Rol
 169        modelBuilder.Entity<Usuario>()
 170            .HasMany(u => u.Roles)
 171            .WithMany(r => r.Usuarios)
 172            .UsingEntity<Dictionary<string, object>>(
 173                "usuarios_roles",
 174                j => j.HasOne<Rol>().WithMany().HasForeignKey("rol_id"),
 175                j => j.HasOne<Usuario>().WithMany().HasForeignKey("usuario_id"),
 176                j =>
 177                {
 178                    j.HasKey("usuario_id", "rol_id");
 179                    j.ToTable("usuarios_roles");
 180                }
 181            );
 82
 83        // Configuración de la relación muchos a muchos entre Rol y Permiso
 184        modelBuilder.Entity<Rol>()
 185            .HasMany(r => r.Permisos)
 186            .WithMany(p => p.Roles)
 187            .UsingEntity<Dictionary<string, object>>(
 188                "roles_permisos",
 189                j => j.HasOne<Permiso>().WithMany().HasForeignKey("permiso_id"),
 190                j => j.HasOne<Rol>().WithMany().HasForeignKey("rol_id"),
 191                j =>
 192                {
 193                    j.HasKey("permiso_id", "rol_id");
 194                    j.ToTable("roles_permisos");
 195                }
 196            );
 97
 98        // Índices únicos
 199        modelBuilder.Entity<Persona>()
 1100            .HasIndex(p => p.Cedula)
 1101            .IsUnique();
 102
 1103        modelBuilder.Entity<Usuario>()
 1104            .HasIndex(u => u.Username)
 1105            .IsUnique();
 106
 1107        modelBuilder.Entity<Rol>()
 1108            .HasIndex(r => r.Nombre)
 1109            .IsUnique();
 110
 1111        modelBuilder.Entity<Permiso>()
 1112            .HasIndex(p => p.Nombre)
 1113            .IsUnique();
 114
 1115        modelBuilder.Entity<Accion>()
 1116            .HasIndex(a => a.Nombre)
 1117            .IsUnique();
 118
 1119        modelBuilder.Entity<Contexto>()
 1120            .HasIndex(c => c.Nombre)
 1121            .IsUnique();
 122
 1123        modelBuilder.Entity<Banco>()
 1124            .HasIndex(b => b.Codigo)
 1125            .IsUnique();
 126
 1127        modelBuilder.Entity<TipoBeneficio>()
 1128            .HasIndex(tb => tb.Codigo)
 1129            .IsUnique();
 130
 131        // Índices para catálogos
 1132        modelBuilder.Entity<Regimen>()
 1133            .HasIndex(r => r.NumeroLey)
 1134            .IsUnique();
 135
 1136        modelBuilder.Entity<Escalafon>()
 1137            .HasIndex(e => e.Codigo)
 1138            .IsUnique();
 139
 1140        modelBuilder.Entity<Situacion>()
 1141            .HasIndex(s => s.Codigo)
 1142            .IsUnique();
 143
 1144        modelBuilder.Entity<Situacion>()
 1145            .Property(s => s.SistemaSalud)
 1146            .HasDefaultValue("ssffaa");
 147
 1148        modelBuilder.Entity<Programa>()
 1149            .HasIndex(p => p.Codigo)
 1150            .IsUnique();
 151
 1152        modelBuilder.Entity<Unidad>()
 1153            .HasIndex(u => u.Codigo)
 1154            .IsUnique();
 155
 1156        modelBuilder.Entity<Compania>()
 1157            .HasIndex(c => c.Codigo)
 1158            .IsUnique();
 159
 160        // Índices para relaciones laborales
 1161        modelBuilder.Entity<RelacionLaboral>()
 1162            .HasIndex(rl => new { rl.PersonaId, rl.Estado });
 163
 1164        modelBuilder.Entity<RelacionLaboral>()
 1165            .HasIndex(rl => rl.GradoId);
 166
 1167        modelBuilder.Entity<BeneficioSocial>()
 1168            .HasIndex(bs => new { bs.PersonaId, bs.Estado });
 169
 1170        modelBuilder.Entity<BeneficioSocial>()
 1171            .HasIndex(bs => new { bs.TipoBeneficioId, bs.Estado });
 172
 1173        modelBuilder.Entity<BeneficioSocial>()
 1174            .HasIndex(bs => new { bs.PersonaId, bs.TipoBeneficioId, bs.ClaveEvento });
 175
 1176        modelBuilder.Entity<BeneficioSocial>()
 1177            .HasIndex(bs => bs.RetroactividadPendiente);
 178
 1179        modelBuilder.Entity<ParametroPeriodo>()
 1180            .HasIndex(pp => new { pp.Anio, pp.Mes })
 1181            .IsUnique();
 182
 183        // Índice para búsqueda de auditoría por entidad
 1184        modelBuilder.Entity<BitacoraAuditoria>()
 1185            .HasIndex(b => new { b.Entidad, b.EntidadId });
 186
 187        // Configurar checks
 1188        modelBuilder.Entity<Usuario>()
 2189            .ToTable(t => t.HasCheckConstraint("CK_usuarios_estado",
 2190                "estado IN ('activo', 'bloqueado')"));
 191
 1192        modelBuilder.Entity<CuentaBancaria>()
 2193            .ToTable(t => t.HasCheckConstraint("CK_cuentas_bancarias_estado",
 2194                "estado IN ('activa', 'inactiva')"));
 195
 196        // Configure conversion for RelacionLaboral.Estado enum to store string values compatible with existing DB
 1197        modelBuilder.Entity<RelacionLaboral>()
 1198            .Property(rl => rl.Estado)
 1199            .HasConversion(
 1200                v => v == EstadoRelacion.Activo ? "activo" : "inactivo",
 1201                v => v == "activo" ? EstadoRelacion.Activo : EstadoRelacion.Inactivo
 1202            );
 203
 1204        modelBuilder.Entity<RelacionLaboral>()
 2205            .ToTable(t => t.HasCheckConstraint("CK_relaciones_laborales_estado",
 2206                "estado IN ('activo', 'inactivo')"));
 207
 208        // IRPF
 1209        modelBuilder.Entity<FranjaIrpf>()
 1210            .HasIndex(f => new { f.NumeroFranja, f.VigenteDesde })
 1211            .IsUnique();
 212
 213        // Dependientes
 1214        modelBuilder.Entity<Dependiente>()
 1215            .HasIndex(d => new { d.PersonaId, d.Activo });
 216
 1217        modelBuilder.Entity<Dependiente>()
 2218            .ToTable(t => t.HasCheckConstraint("CK_dependientes_tipo",
 2219                "tipo IN ('hijo', 'conyuge_sin_ingresos')"));
 220
 1221        modelBuilder.Entity<Dependiente>()
 2222            .ToTable(t => t.HasCheckConstraint("CK_dependientes_porcentaje",
 2223                "porcentaje_deduccion IS NULL OR porcentaje_deduccion IN (50, 100)"));
 224
 225        // Compensaciones
 1226        modelBuilder.Entity<TipoCompensacion>()
 1227            .HasIndex(t => t.Codigo)
 1228            .IsUnique();
 229
 1230        modelBuilder.Entity<ConfigCompensacion>()
 1231            .HasIndex(c => new { c.TipoCompensacionId, c.RegimenId, c.GradoId, c.EscalafonId, c.Funcion });
 232
 1233        modelBuilder.Entity<LoteCompensacion>()
 1234            .HasIndex(l => new { l.TipoCompensacionId, l.Periodo });
 235
 1236        modelBuilder.Entity<ItemLoteCompensacion>()
 1237            .HasIndex(i => new { i.LoteCompensacionId, i.PersonaId })
 1238            .IsUnique();
 239
 240        // Beneficios sociales
 1241        modelBuilder.Entity<TipoBeneficio>()
 2242            .ToTable(t => t.HasCheckConstraint("CK_tipos_beneficio_plazo_no_negativo",
 2243                "plazo_presentacion_dias IS NULL OR plazo_presentacion_dias >= 0"));
 244
 1245        modelBuilder.Entity<TipoBeneficio>()
 2246            .ToTable(t => t.HasCheckConstraint("CK_tipos_beneficio_monto_no_negativo",
 2247                "monto_referencia IS NULL OR monto_referencia >= 0"));
 248
 1249        modelBuilder.Entity<BeneficioSocial>()
 2250            .ToTable(t => t.HasCheckConstraint("CK_beneficios_sociales_estado",
 2251                "estado IN ('activo', 'inactivo', 'pendiente_doc')"));
 252
 253        // Catálogo e instructivo (tablas de referencia generales)
 1254        modelBuilder.Entity<CatalogoItem>()
 1255            .HasIndex(c => c.Codigo)
 1256            .IsUnique();
 257
 1258        modelBuilder.Entity<RemuneracionGrado>()
 1259            .HasIndex(r => new { r.GradoId, r.ItemId, r.VigenteDesde });
 260
 1261        modelBuilder.Entity<TarifaPorCategoria>()
 1262            .HasIndex(t => new { t.ItemId, t.Categoria, t.VigenteDesde });
 263
 264        // Apertura de períodos de liquidación
 1265        modelBuilder.Entity<Periodo>()
 1266            .HasOne(p => p.Snapshot)
 1267            .WithMany()
 1268            .HasForeignKey(p => p.SnapshotId)
 1269            .OnDelete(DeleteBehavior.Restrict);
 270
 1271        modelBuilder.Entity<Periodo>()
 1272            .HasIndex(p => new { p.Anio, p.Mes })
 1273            .IsUnique()
 1274            .HasFilter("activo = TRUE");
 275
 1276        modelBuilder.Entity<Periodo>()
 1277            .HasIndex(p => p.Estado);
 278
 1279        modelBuilder.Entity<Periodo>()
 2280            .ToTable(t => t.HasCheckConstraint("CK_periodos_liquidacion_estado",
 2281                "estado IN ('ABIERTA', 'CERRADA')"));
 282
 1283        modelBuilder.Entity<LiquidacionItem>()
 1284            .HasIndex(li => new { li.PeriodoId, li.Cedula, li.Version });
 285
 1286        modelBuilder.Entity<LiquidacionItem>()
 1287            .HasIndex(li => new { li.PeriodoId, li.Version });
 288
 1289        modelBuilder.Entity<LiquidacionEstadoPersonal>()
 1290            .HasIndex(le => new { le.PeriodoId, le.Cedula, le.Version });
 291
 1292        modelBuilder.Entity<LiquidacionResumen>()
 1293            .HasIndex(lr => new { lr.PeriodoId, lr.Version, lr.ProgramaId, lr.RegimenId, lr.Rubro083 });
 294
 1295        modelBuilder.Entity<SnapshotInsumos>()
 1296            .Property(s => s.ContenidoJson)
 1297            .HasColumnType("jsonb");
 1298    }
 299}
 300
 301