< 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: 171
Uncovered lines: 0
Coverable lines: 171
Total lines: 252
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_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_Companias()100%11100%
get_TiposMovimiento()100%11100%
get_FranjasIrpf()100%11100%
get_DeduccionesIrpf()100%11100%
get_Dependientes()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_TarifasPorCategoria()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{
 2208    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
 9    {
 22010    }
 11
 12    // DbSets para las entidades principales
 30613    public DbSet<Persona> Personas { get; set; }
 26214    public DbSet<Usuario> Usuarios { get; set; }
 24515    public DbSet<Rol> Roles { get; set; }
 24416    public DbSet<Permiso> Permisos { get; set; }
 22117    public DbSet<Accion> Acciones { get; set; }
 22118    public DbSet<Contexto> Contextos { get; set; }
 22219    public DbSet<BitacoraAuditoria> BitacorasAuditoria { get; set; }
 26620    public DbSet<Banco> Bancos { get; set; }
 22021    public DbSet<CuentaBancaria> CuentasBancarias { get; set; }
 27222    public DbSet<TipoBeneficio> TiposBeneficio { get; set; }
 24823    public DbSet<BeneficioSocial> BeneficiosSociales { get; set; }
 24
 25    // Personal y catálogos
 30126    public DbSet<RelacionLaboral> RelacionesLaborales { get; set; }
 23127    public DbSet<MovimientoLaboral> MovimientosLaborales { get; set; }
 27228    public DbSet<Regimen> Regimenes { get; set; }
 25429    public DbSet<Escalafon> Escalafones { get; set; }
 26130    public DbSet<Grado> Grados { get; set; }
 25431    public DbSet<Situacion> Situaciones { get; set; }
 25432    public DbSet<Programa> Programas { get; set; }
 25433    public DbSet<Unidad> Unidades { get; set; }
 22034    public DbSet<Compania> Companias { get; set; }
 23035    public DbSet<TipoMovimiento> TiposMovimiento { get; set; }
 36
 37    // IRPF
 24338    public DbSet<FranjaIrpf> FranjasIrpf { get; set; }
 25039    public DbSet<DeduccionIrpf> DeduccionesIrpf { get; set; }
 40
 41    // Dependientes
 26042    public DbSet<Dependiente> Dependientes { get; set; }
 43
 44    // Compensaciones
 28245    public DbSet<TipoCompensacion> TiposCompensacion { get; set; }
 26346    public DbSet<ConfigCompensacion> ConfigCompensaciones { get; set; }
 24347    public DbSet<LoteCompensacion> LotesCompensacion { get; set; }
 25048    public DbSet<ItemLoteCompensacion> ItemsLoteCompensacion { get; set; }
 49
 50    // Instructivo / Tablas de referencia (no atadas a compensaciones)
 22051    public DbSet<CatalogoItem> CatalogoItems { get; set; }
 22052    public DbSet<RemuneracionGrado> RemuneracionesGrado { get; set; }
 22053    public DbSet<TarifaPorCategoria> TarifasPorCategoria { get; set; }
 54
 55    protected override void OnModelCreating(ModelBuilder modelBuilder)
 56    {
 157        base.OnModelCreating(modelBuilder);
 58
 59        // Configuración de la relación muchos a muchos entre Usuario y Rol
 160        modelBuilder.Entity<Usuario>()
 161            .HasMany(u => u.Roles)
 162            .WithMany(r => r.Usuarios)
 163            .UsingEntity<Dictionary<string, object>>(
 164                "usuarios_roles",
 165                j => j.HasOne<Rol>().WithMany().HasForeignKey("rol_id"),
 166                j => j.HasOne<Usuario>().WithMany().HasForeignKey("usuario_id"),
 167                j =>
 168                {
 169                    j.HasKey("usuario_id", "rol_id");
 170                    j.ToTable("usuarios_roles");
 171                }
 172            );
 73
 74        // Configuración de la relación muchos a muchos entre Rol y Permiso
 175        modelBuilder.Entity<Rol>()
 176            .HasMany(r => r.Permisos)
 177            .WithMany(p => p.Roles)
 178            .UsingEntity<Dictionary<string, object>>(
 179                "roles_permisos",
 180                j => j.HasOne<Permiso>().WithMany().HasForeignKey("permiso_id"),
 181                j => j.HasOne<Rol>().WithMany().HasForeignKey("rol_id"),
 182                j =>
 183                {
 184                    j.HasKey("permiso_id", "rol_id");
 185                    j.ToTable("roles_permisos");
 186                }
 187            );
 88
 89        // Índices únicos
 190        modelBuilder.Entity<Persona>()
 191            .HasIndex(p => p.Cedula)
 192            .IsUnique();
 93
 194        modelBuilder.Entity<Usuario>()
 195            .HasIndex(u => u.Username)
 196            .IsUnique();
 97
 198        modelBuilder.Entity<Rol>()
 199            .HasIndex(r => r.Nombre)
 1100            .IsUnique();
 101
 1102        modelBuilder.Entity<Permiso>()
 1103            .HasIndex(p => p.Nombre)
 1104            .IsUnique();
 105
 1106        modelBuilder.Entity<Accion>()
 1107            .HasIndex(a => a.Nombre)
 1108            .IsUnique();
 109
 1110        modelBuilder.Entity<Contexto>()
 1111            .HasIndex(c => c.Nombre)
 1112            .IsUnique();
 113
 1114        modelBuilder.Entity<Banco>()
 1115            .HasIndex(b => b.Codigo)
 1116            .IsUnique();
 117
 1118        modelBuilder.Entity<TipoBeneficio>()
 1119            .HasIndex(tb => tb.Codigo)
 1120            .IsUnique();
 121
 122        // Índices para catálogos
 1123        modelBuilder.Entity<Regimen>()
 1124            .HasIndex(r => r.NumeroLey)
 1125            .IsUnique();
 126
 1127        modelBuilder.Entity<Escalafon>()
 1128            .HasIndex(e => e.Codigo)
 1129            .IsUnique();
 130
 1131        modelBuilder.Entity<Situacion>()
 1132            .HasIndex(s => s.Codigo)
 1133            .IsUnique();
 134
 1135        modelBuilder.Entity<Programa>()
 1136            .HasIndex(p => p.Codigo)
 1137            .IsUnique();
 138
 1139        modelBuilder.Entity<Unidad>()
 1140            .HasIndex(u => u.Codigo)
 1141            .IsUnique();
 142
 1143        modelBuilder.Entity<Compania>()
 1144            .HasIndex(c => c.Codigo)
 1145            .IsUnique();
 146
 147        // Índices para relaciones laborales
 1148        modelBuilder.Entity<RelacionLaboral>()
 1149            .HasIndex(rl => new { rl.PersonaId, rl.Estado });
 150
 1151        modelBuilder.Entity<RelacionLaboral>()
 1152            .HasIndex(rl => rl.GradoId);
 153
 1154        modelBuilder.Entity<BeneficioSocial>()
 1155            .HasIndex(bs => new { bs.PersonaId, bs.Estado });
 156
 1157        modelBuilder.Entity<BeneficioSocial>()
 1158            .HasIndex(bs => new { bs.TipoBeneficioId, bs.Estado });
 159
 1160        modelBuilder.Entity<BeneficioSocial>()
 1161            .HasIndex(bs => new { bs.PersonaId, bs.TipoBeneficioId, bs.ClaveEvento });
 162
 1163        modelBuilder.Entity<BeneficioSocial>()
 1164            .HasIndex(bs => bs.RetroactividadPendiente);
 165
 166        // Índice para búsqueda de auditoría por entidad
 1167        modelBuilder.Entity<BitacoraAuditoria>()
 1168            .HasIndex(b => new { b.Entidad, b.EntidadId });
 169
 170        // Configurar checks
 1171        modelBuilder.Entity<Usuario>()
 2172            .ToTable(t => t.HasCheckConstraint("CK_usuarios_estado",
 2173                "estado IN ('activo', 'bloqueado')"));
 174
 1175        modelBuilder.Entity<CuentaBancaria>()
 2176            .ToTable(t => t.HasCheckConstraint("CK_cuentas_bancarias_estado",
 2177                "estado IN ('activa', 'inactiva')"));
 178
 179        // Configure conversion for RelacionLaboral.Estado enum to store string values compatible with existing DB
 1180        modelBuilder.Entity<RelacionLaboral>()
 1181            .Property(rl => rl.Estado)
 1182            .HasConversion(
 1183                v => v == EstadoRelacion.Activo ? "activo" : "inactivo",
 1184                v => v == "activo" ? EstadoRelacion.Activo : EstadoRelacion.Inactivo
 1185            );
 186
 1187        modelBuilder.Entity<RelacionLaboral>()
 2188            .ToTable(t => t.HasCheckConstraint("CK_relaciones_laborales_estado",
 2189                "estado IN ('activo', 'inactivo')"));
 190
 191        // IRPF
 1192        modelBuilder.Entity<FranjaIrpf>()
 1193            .HasIndex(f => new { f.NumeroFranja, f.VigenteDesde })
 1194            .IsUnique();
 195
 1196        modelBuilder.Entity<DeduccionIrpf>()
 1197            .HasIndex(d => new { d.PersonaId, d.Activo });
 198
 199        // Dependientes
 1200        modelBuilder.Entity<Dependiente>()
 1201            .HasIndex(d => new { d.PersonaId, d.Activo });
 202
 1203        modelBuilder.Entity<Dependiente>()
 2204            .ToTable(t => t.HasCheckConstraint("CK_dependientes_tipo",
 2205                "tipo IN ('hijo', 'conyuge_sin_ingresos')"));
 206
 1207        modelBuilder.Entity<Dependiente>()
 2208            .ToTable(t => t.HasCheckConstraint("CK_dependientes_porcentaje",
 2209                "porcentaje_deduccion IS NULL OR porcentaje_deduccion IN (50, 100)"));
 210
 211        // Compensaciones
 1212        modelBuilder.Entity<TipoCompensacion>()
 1213            .HasIndex(t => t.Codigo)
 1214            .IsUnique();
 215
 1216        modelBuilder.Entity<ConfigCompensacion>()
 1217            .HasIndex(c => new { c.TipoCompensacionId, c.RegimenId, c.GradoId, c.EscalafonId, c.Funcion });
 218
 1219        modelBuilder.Entity<LoteCompensacion>()
 1220            .HasIndex(l => new { l.TipoCompensacionId, l.Periodo });
 221
 1222        modelBuilder.Entity<ItemLoteCompensacion>()
 1223            .HasIndex(i => new { i.LoteCompensacionId, i.PersonaId })
 1224            .IsUnique();
 225
 226        // Beneficios sociales
 1227        modelBuilder.Entity<TipoBeneficio>()
 2228            .ToTable(t => t.HasCheckConstraint("CK_tipos_beneficio_plazo_no_negativo",
 2229                "plazo_presentacion_dias IS NULL OR plazo_presentacion_dias >= 0"));
 230
 1231        modelBuilder.Entity<TipoBeneficio>()
 2232            .ToTable(t => t.HasCheckConstraint("CK_tipos_beneficio_monto_no_negativo",
 2233                "monto_referencia IS NULL OR monto_referencia >= 0"));
 234
 1235        modelBuilder.Entity<BeneficioSocial>()
 2236            .ToTable(t => t.HasCheckConstraint("CK_beneficios_sociales_estado",
 2237                "estado IN ('activo', 'inactivo', 'pendiente_doc')"));
 238
 239        // Catálogo e instructivo (tablas de referencia generales)
 1240        modelBuilder.Entity<CatalogoItem>()
 1241            .HasIndex(c => c.Codigo)
 1242            .IsUnique();
 243
 1244        modelBuilder.Entity<RemuneracionGrado>()
 1245            .HasIndex(r => new { r.GradoId, r.ItemId, r.VigenteDesde });
 246
 1247        modelBuilder.Entity<TarifaPorCategoria>()
 1248            .HasIndex(t => new { t.ItemId, t.Categoria, t.VigenteDesde });
 1249    }
 250}
 251
 252