< 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: 347
Uncovered lines: 0
Coverable lines: 347
Total lines: 510
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_Acciones()100%11100%
get_Contextos()100%11100%
get_BitacorasAuditoria()100%11100%
get_Bancos()100%11100%
get_Acreedores()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_TramosSanidadMilitar()100%11100%
get_Dependientes()100%11100%
get_Form3100()100%11100%
get_Form3100PersonasACargo()100%11100%
get_Documentos()100%11100%
get_DescuentosPersonalesPeriodo()100%11100%
get_FictosPersona()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_InstructivosAsigFamiliar()100%11100%
get_InstructivosPsf()100%11100%
get_TablasHogarConstituido()100%11100%
get_PeriodosLiquidacion()100%11100%
get_SnapshotsInsumos()100%11100%
get_NovedadesPeriodo()100%11100%
get_Retroactividades()100%11100%
get_RetroactividadItems()100%11100%
get_BeneficioSocialBeneficiarios()100%11100%
get_Aguinaldos()100%11100%
get_HistoricoLiquidaciones()100%11100%
get_CompensacionesDiferenciaAscenso()100%11100%
get_LiquidacionItems()100%11100%
get_LiquidacionEstadosPersonal()100%11100%
get_LiquidacionResumenes()100%11100%
get_AguinaldosBaja()100%11100%
get_ItemsAguinaldoBaja()100%11100%
get_IncidenciasCalculo()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{
 4998    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
 9    {
 49910    }
 11
 12    // DbSets para las entidades principales
 72413    public DbSet<Persona> Personas { get; set; }
 55214    public DbSet<Usuario> Usuarios { get; set; }
 52215    public DbSet<Rol> Roles { get; set; }
 50216    public DbSet<Accion> Acciones { get; set; }
 50217    public DbSet<Contexto> Contextos { get; set; }
 50918    public DbSet<BitacoraAuditoria> BitacorasAuditoria { get; set; }
 55419    public DbSet<Banco> Bancos { get; set; }
 56520    public DbSet<Acreedor> Acreedores { get; set; }
 51721    public DbSet<CuentaBancaria> CuentasBancarias { get; set; }
 58922    public DbSet<TipoBeneficio> TiposBeneficio { get; set; }
 58223    public DbSet<BeneficioSocial> BeneficiosSociales { get; set; }
 55324    public DbSet<ParametroPeriodo> ParametrosPeriodo { get; set; }
 25
 26    // Personal y catálogos
 77827    public DbSet<RelacionLaboral> RelacionesLaborales { get; set; }
 51328    public DbSet<MovimientoLaboral> MovimientosLaborales { get; set; }
 68729    public DbSet<Regimen> Regimenes { get; set; }
 61030    public DbSet<Escalafon> Escalafones { get; set; }
 63331    public DbSet<Grado> Grados { get; set; }
 63732    public DbSet<Situacion> Situaciones { get; set; }
 57833    public DbSet<Programa> Programas { get; set; }
 57834    public DbSet<Unidad> Unidades { get; set; }
 51135    public DbSet<SubUnidad> SubUnidades { get; set; }
 52236    public DbSet<TipoMovimiento> TiposMovimiento { get; set; }
 51337    public DbSet<MotivoBaja> MotivosBaja { get; set; }
 38
 39    // IRPF
 59640    public DbSet<FranjaIrpf> FranjasIrpf { get; set; }
 50641    public DbSet<IrpfMensual> IrpfsMensual { get; set; }
 50642    public DbSet<IrpfDetalleFranjas> IrpfsDetalleFranjas { get; set; }
 43
 44    // Descuentos legales
 51545    public DbSet<TramoSanidadMilitar> TramosSanidadMilitar { get; set; }
 46
 47    // Dependientes (mantenido por compatibilidad, deprecado)
 53948    public DbSet<Dependiente> Dependientes { get; set; }
 49
 50    // Form 3100
 49951    public DbSet<Form3100> Form3100 { get; set; }
 49952    public DbSet<Form3100PersonaACargo> Form3100PersonasACargo { get; set; }
 53
 54    // Documentos (almacenamiento genérico)
 51455    public DbSet<Documento> Documentos { get; set; }
 56
 57    // Descuentos personales por período
 54358    public DbSet<DescuentoPersonalPeriodo> DescuentosPersonalesPeriodo { get; set; }
 56259    public DbSet<FictoPersona> FictosPersona { get; set; }
 60
 61    // Compensaciones
 59962    public DbSet<TipoCompensacion> TiposCompensacion { get; set; }
 54463    public DbSet<ConfigCompensacion> ConfigCompensaciones { get; set; }
 55964    public DbSet<LoteCompensacion> LotesCompensacion { get; set; }
 54865    public DbSet<ItemLoteCompensacion> ItemsLoteCompensacion { get; set; }
 66
 67    // Instructivo / Tablas de referencia (no atadas a compensaciones)
 62468    public DbSet<CatalogoItem> CatalogoItems { get; set; }
 59969    public DbSet<RemuneracionGrado> RemuneracionesGrado { get; set; }
 53170    public DbSet<TablaPermanencia> TablaPermanencias { get; set; }
 49971    public DbSet<TarifaPorCategoria> TarifasPorCategoria { get; set; }
 72
 73    // Instructivos de beneficios sociales (DFC)
 51674    public DbSet<InstructivoAsigFamiliar> InstructivosAsigFamiliar { get; set; }
 51675    public DbSet<InstructivoPsf> InstructivosPsf { get; set; }
 51676    public DbSet<TablaHogarConstituido> TablasHogarConstituido { get; set; }
 77
 78    // Apertura de períodos
 64679    public DbSet<Periodo> PeriodosLiquidacion { get; set; }
 51980    public DbSet<SnapshotInsumos> SnapshotsInsumos { get; set; }
 81
 82    // Motor de cálculo
 56083    public DbSet<NovedadPeriodo> NovedadesPeriodo { get; set; }
 49984    public DbSet<Retroactividad> Retroactividades { get; set; }
 49985    public DbSet<RetroactividadItem> RetroactividadItems { get; set; }
 86
 87    // Beneficiarios de beneficios sociales (hijos para asig. familiar, etc.)
 51788    public DbSet<BeneficioSocialBeneficiario> BeneficioSocialBeneficiarios { get; set; }
 89
 90    // Aguinaldo (SAC) y compensaciones por diferencia de ascenso
 49991    public DbSet<Aguinaldo> Aguinaldos { get; set; }
 50392    public DbSet<HistoricoLiquidacion> HistoricoLiquidaciones { get; set; }
 51693    public DbSet<CompensacionDiferenciaAscenso> CompensacionesDiferenciaAscenso { get; set; }
 94
 95    // Liquidación de haberes
 67896    public DbSet<LiquidacionItem> LiquidacionItems { get; set; }
 55797    public DbSet<LiquidacionEstadoPersonal> LiquidacionEstadosPersonal { get; set; }
 54198    public DbSet<LiquidacionResumen> LiquidacionResumenes { get; set; }
 49999    public DbSet<AguinaldoBaja> AguinaldosBaja { get; set; }
 499100    public DbSet<AguinaldoBajaItem> ItemsAguinaldoBaja { get; set; }
 542101    public DbSet<IncidenciaCalculo> IncidenciasCalculo { get; set; }
 102
 103    protected override void OnModelCreating(ModelBuilder modelBuilder)
 104    {
 1105        base.OnModelCreating(modelBuilder);
 106
 107        // Configuración de la relación muchos a muchos entre Usuario y Rol
 1108        modelBuilder.Entity<Usuario>()
 1109            .HasMany(u => u.Roles)
 1110            .WithMany(r => r.Usuarios)
 1111            .UsingEntity<Dictionary<string, object>>(
 1112                "usuarios_roles",
 1113                j => j.HasOne<Rol>().WithMany().HasForeignKey("rol_id"),
 1114                j => j.HasOne<Usuario>().WithMany().HasForeignKey("usuario_id"),
 1115                j =>
 1116                {
 1117                    j.HasKey("usuario_id", "rol_id");
 1118                    j.ToTable("usuarios_roles");
 1119                }
 1120            );
 121
 122        // Índices únicos
 1123        modelBuilder.Entity<Persona>()
 1124            .HasIndex(p => p.Cedula)
 1125            .IsUnique();
 126
 1127        modelBuilder.Entity<Usuario>()
 1128            .HasIndex(u => u.Username)
 1129            .IsUnique();
 130
 1131        modelBuilder.Entity<Rol>()
 1132            .HasIndex(r => r.Nombre)
 1133            .IsUnique();
 134
 1135        modelBuilder.Entity<Accion>()
 1136            .HasIndex(a => a.Nombre)
 1137            .IsUnique();
 138
 1139        modelBuilder.Entity<Contexto>()
 1140            .HasIndex(c => c.Nombre)
 1141            .IsUnique();
 142
 1143        modelBuilder.Entity<Banco>()
 1144            .HasIndex(b => b.Codigo)
 1145            .IsUnique();
 146
 1147        modelBuilder.Entity<Acreedor>()
 1148            .HasIndex(a => a.Codigo)
 1149            .IsUnique();
 150
 1151        modelBuilder.Entity<Acreedor>()
 1152            .HasIndex(a => a.OrdenLegalDeficit);
 153
 1154        modelBuilder.Entity<FictoPersona>()
 1155            .HasIndex(f => new { f.PersonaId, f.CatalogoItemId })
 1156            .IsUnique();
 157
 1158        modelBuilder.Entity<FictoPersona>()
 1159            .HasIndex(f => new { f.Activo, f.PersonaId });
 160
 1161        modelBuilder.Entity<FictoPersona>()
 2162            .ToTable(t => t.HasCheckConstraint(
 2163                "ck_fictos_persona_importe_positivo",
 2164                "importe > 0"));
 165
 1166        modelBuilder.Entity<TipoBeneficio>()
 1167            .HasIndex(tb => tb.Codigo)
 1168            .IsUnique();
 169
 170        // Índices para catálogos
 1171        modelBuilder.Entity<Regimen>()
 1172            .HasIndex(r => r.NumeroLey)
 1173            .IsUnique();
 174
 1175        modelBuilder.Entity<Escalafon>()
 1176            .HasIndex(e => e.Codigo)
 1177            .IsUnique();
 178
 179        // Grados: código único universal (independiente del escalafón)
 1180        modelBuilder.Entity<Grado>()
 1181            .HasIndex(g => g.Codigo)
 1182            .IsUnique();
 183
 1184        modelBuilder.Entity<Situacion>()
 1185            .HasIndex(s => s.Codigo)
 1186            .IsUnique();
 187
 1188        modelBuilder.Entity<Situacion>()
 1189            .Property(s => s.SistemaSalud)
 1190            .HasDefaultValue("ssffaa");
 191
 1192        modelBuilder.Entity<Programa>()
 1193            .HasIndex(p => p.Codigo)
 1194            .IsUnique();
 195
 1196        modelBuilder.Entity<Unidad>()
 1197            .HasIndex(u => u.Codigo)
 1198            .IsUnique();
 199
 200        // Form3100: unicidad por persona + mes/año de vigencia
 1201        modelBuilder.Entity<Form3100>()
 1202            .HasIndex(f => new { f.PersonaId, f.VigenteDesde_Anio, f.VigenteDesde_Mes })
 1203            .IsUnique();
 204
 205        // MotivoBaja: código único
 1206        modelBuilder.Entity<MotivoBaja>()
 1207            .HasIndex(m => m.Codigo)
 1208            .IsUnique();
 209
 210        // Índices para relaciones laborales
 1211        modelBuilder.Entity<RelacionLaboral>()
 1212            .HasIndex(rl => new { rl.PersonaId, rl.Estado });
 213
 1214        modelBuilder.Entity<RelacionLaboral>()
 1215            .HasIndex(rl => rl.GradoId);
 216
 217        // Configuración explícita para resolver ambigüedad: Grado tiene dos FKs desde RelacionLaboral
 1218        modelBuilder.Entity<RelacionLaboral>()
 1219            .HasOne(rl => rl.Grado)
 1220            .WithMany(g => g.RelacionesLaborales)
 1221            .HasForeignKey(rl => rl.GradoId)
 1222            .OnDelete(DeleteBehavior.Restrict);
 223
 1224        modelBuilder.Entity<RelacionLaboral>()
 1225            .HasOne(rl => rl.GradoReincorporacion)
 1226            .WithMany()
 1227            .HasForeignKey(rl => rl.GradoReincorporacionId)
 1228            .OnDelete(DeleteBehavior.Restrict);
 229
 1230        modelBuilder.Entity<BeneficioSocial>()
 1231            .HasIndex(bs => new { bs.PersonaId, bs.Estado });
 232
 1233        modelBuilder.Entity<BeneficioSocial>()
 1234            .HasIndex(bs => new { bs.TipoBeneficioId, bs.Estado });
 235
 1236        modelBuilder.Entity<BeneficioSocial>()
 1237            .HasIndex(bs => new { bs.PersonaId, bs.TipoBeneficioId, bs.ClaveEvento });
 238
 1239        modelBuilder.Entity<BeneficioSocial>()
 1240            .HasIndex(bs => bs.RetroactividadPendiente);
 241
 1242        modelBuilder.Entity<ParametroPeriodo>()
 1243            .HasIndex(pp => new { pp.Anio, pp.Mes })
 1244            .IsUnique();
 245
 246        // Índice para búsqueda de auditoría por entidad
 1247        modelBuilder.Entity<BitacoraAuditoria>()
 1248            .HasIndex(b => new { b.Entidad, b.EntidadId });
 249
 250        // Configurar checks
 1251        modelBuilder.Entity<Usuario>()
 2252            .ToTable(t => t.HasCheckConstraint("CK_usuarios_estado",
 2253                "estado IN ('activo', 'bloqueado')"));
 254
 1255        modelBuilder.Entity<CuentaBancaria>()
 2256            .ToTable(t => t.HasCheckConstraint("CK_cuentas_bancarias_estado",
 2257                "estado IN ('activa', 'inactiva')"));
 258
 259        // Configure conversion for RelacionLaboral.Estado enum to store string values compatible with existing DB
 1260        modelBuilder.Entity<RelacionLaboral>()
 1261            .Property(rl => rl.Estado)
 1262            .HasConversion(
 1263                v => v == EstadoRelacion.Activo ? "activo" : "inactivo",
 1264                v => v == "activo" ? EstadoRelacion.Activo : EstadoRelacion.Inactivo
 1265            );
 266
 1267        modelBuilder.Entity<RelacionLaboral>()
 2268            .ToTable(t => t.HasCheckConstraint("CK_relaciones_laborales_estado",
 2269                "estado IN ('activo', 'inactivo')"));
 270
 271        // IRPF - Franjas progresivas
 1272        modelBuilder.Entity<FranjaIrpf>()
 1273            .HasIndex(f => new { f.NumeroFranja, f.VigenteDesde })
 1274            .IsUnique();
 275
 276        // IRPF - Resultado mensual por persona
 1277        modelBuilder.Entity<IrpfMensual>()
 1278            .HasKey(i => i.Id);
 279
 1280        modelBuilder.Entity<IrpfMensual>()
 1281            .HasIndex(i => new { i.LiquidacionId, i.PersonaId })
 1282            .IsUnique();
 283
 1284        modelBuilder.Entity<IrpfMensual>()
 1285            .HasOne(i => i.Liquidacion)
 1286            .WithMany()
 1287            .HasForeignKey(i => i.LiquidacionId)
 1288            .OnDelete(DeleteBehavior.Cascade);
 289
 1290        modelBuilder.Entity<IrpfMensual>()
 1291            .HasOne(i => i.Persona)
 1292            .WithMany()
 1293            .HasForeignKey(i => i.PersonaId)
 1294            .OnDelete(DeleteBehavior.Restrict);
 295
 1296        modelBuilder.Entity<IrpfMensual>()
 1297            .HasMany(i => i.IrpfDetalleFranjas)
 1298            .WithOne(d => d.IrpfMensual)
 1299            .HasForeignKey(d => d.IrpfMensualId)
 1300            .OnDelete(DeleteBehavior.Cascade);
 301
 302        // IRPF - Detalle por franja
 1303        modelBuilder.Entity<IrpfDetalleFranjas>()
 1304            .HasKey(d => d.Id);
 305
 1306        modelBuilder.Entity<IrpfDetalleFranjas>()
 1307            .HasOne(d => d.FranjaIrpf)
 1308            .WithMany()
 1309            .HasForeignKey(d => d.FranjaIrpfId)
 1310            .OnDelete(DeleteBehavior.Restrict);
 311
 312        // Dependientes
 1313        modelBuilder.Entity<Dependiente>()
 1314            .HasIndex(d => new { d.PersonaId, d.Activo });
 315
 1316        modelBuilder.Entity<Dependiente>()
 2317            .ToTable(t => t.HasCheckConstraint("CK_dependientes_tipo",
 2318                "tipo IN ('hijo', 'conyuge_sin_ingresos')"));
 319
 1320        modelBuilder.Entity<Dependiente>()
 2321            .ToTable(t => t.HasCheckConstraint("CK_dependientes_porcentaje",
 2322                "porcentaje_deduccion IS NULL OR porcentaje_deduccion IN (50, 100)"));
 323
 324        // Compensaciones
 1325        modelBuilder.Entity<TipoCompensacion>()
 1326            .HasIndex(t => t.Codigo)
 1327            .IsUnique();
 328
 1329        modelBuilder.Entity<ConfigCompensacion>()
 1330            .HasIndex(c => new { c.TipoCompensacionId, c.RegimenId, c.GradoId, c.EscalafonId, c.Funcion });
 331
 1332        modelBuilder.Entity<LoteCompensacion>()
 1333            .HasIndex(l => new { l.TipoCompensacionId, l.PeriodoId });
 334
 1335        modelBuilder.Entity<LoteCompensacion>()
 1336            .HasOne(l => l.Periodo)
 1337            .WithMany()
 1338            .HasForeignKey(l => l.PeriodoId)
 1339            .OnDelete(DeleteBehavior.Restrict);
 340
 1341        modelBuilder.Entity<ItemLoteCompensacion>()
 1342            .HasIndex(i => new { i.LoteCompensacionId, i.PersonaId })
 1343            .IsUnique();
 344
 345        // Beneficios sociales
 1346        modelBuilder.Entity<TipoBeneficio>()
 2347            .ToTable(t => t.HasCheckConstraint("CK_tipos_beneficio_plazo_no_negativo",
 2348                "plazo_presentacion_dias IS NULL OR plazo_presentacion_dias >= 0"));
 349
 1350        modelBuilder.Entity<TipoBeneficio>()
 2351            .ToTable(t => t.HasCheckConstraint("CK_tipos_beneficio_monto_no_negativo",
 2352                "monto_referencia IS NULL OR monto_referencia >= 0"));
 353
 1354        modelBuilder.Entity<BeneficioSocial>()
 2355            .ToTable(t => t.HasCheckConstraint("CK_beneficios_sociales_estado",
 2356                "estado IN ('activo', 'inactivo', 'pendiente_doc')"));
 357
 358        // Catálogo e instructivo (tablas de referencia generales)
 1359        modelBuilder.Entity<CatalogoItem>()
 1360            .HasIndex(c => c.Codigo)
 1361            .IsUnique();
 362
 1363        modelBuilder.Entity<RemuneracionGrado>()
 1364            .HasIndex(r => new { r.GradoId, r.ItemId, r.VigenteDesde });
 365
 1366        modelBuilder.Entity<TablaPermanencia>()
 1367            .HasIndex(t => new { t.EscalafonId, t.GradoId, t.MesesDesde, t.MesesHasta, t.AplicaRiesgoVuelo, t.VigenteDes
 368
 1369        modelBuilder.Entity<TablaPermanencia>()
 1370            .HasIndex(t => new { t.GradoId, t.VigenteDesde });
 371
 1372        modelBuilder.Entity<TablaPermanencia>()
 2373            .ToTable(t => t.HasCheckConstraint("CK_tabla_permanencia_valor", "porcentaje IS NOT NULL OR monto_fijo IS NO
 374
 1375        modelBuilder.Entity<TablaPermanencia>()
 2376            .ToTable(t => t.HasCheckConstraint("CK_tabla_permanencia_meses", "meses_hasta >= meses_desde"));
 377
 1378        modelBuilder.Entity<TarifaPorCategoria>()
 1379            .HasIndex(t => new { t.ItemId, t.Categoria, t.VigenteDesde });
 380
 381        // Apertura de períodos de liquidación
 1382        modelBuilder.Entity<Periodo>()
 1383            .HasOne(p => p.Snapshot)
 1384            .WithMany()
 1385            .HasForeignKey(p => p.SnapshotId)
 1386            .OnDelete(DeleteBehavior.Restrict);
 387
 1388        modelBuilder.Entity<Periodo>()
 1389            .HasIndex(p => new { p.Anio, p.Mes })
 1390            .IsUnique()
 1391            .HasFilter("activo = TRUE");
 392
 1393        modelBuilder.Entity<Periodo>()
 1394            .HasIndex(p => p.Estado);
 395
 1396        modelBuilder.Entity<Periodo>()
 2397            .ToTable(t => t.HasCheckConstraint("CK_periodos_liquidacion_estado",
 2398                "estado IN ('ABIERTA','LISTA_CALCULO','EN_CALCULO','CALCULADA','CERRADA')"));
 399
 1400        modelBuilder.Entity<LiquidacionItem>()
 1401            .HasIndex(li => new { li.PeriodoId, li.Cedula, li.Version });
 402
 1403        modelBuilder.Entity<LiquidacionItem>()
 1404            .HasIndex(li => new { li.PeriodoId, li.Version });
 405
 1406        modelBuilder.Entity<LiquidacionEstadoPersonal>()
 1407            .HasIndex(le => new { le.PeriodoId, le.Cedula, le.Version });
 408
 1409        modelBuilder.Entity<LiquidacionResumen>()
 1410            .HasIndex(lr => new { lr.PeriodoId, lr.Version, lr.ProgramaId, lr.RegimenId, lr.Rubro083 });
 411
 1412        modelBuilder.Entity<AguinaldoBaja>()
 1413            .HasMany(a => a.Items)
 1414            .WithOne(i => i.AguinaldoBaja)
 1415            .HasForeignKey(i => i.AguinaldoBajaId)
 1416            .OnDelete(DeleteBehavior.Cascade);
 417
 1418        modelBuilder.Entity<AguinaldoBaja>()
 1419            .HasIndex(a => new { a.PersonaId, a.Anio, a.Mes })
 1420            .IsUnique();
 421
 1422        modelBuilder.Entity<AguinaldoBaja>()
 1423            .HasIndex(a => new { a.Anio, a.Mes });
 424
 1425        modelBuilder.Entity<AguinaldoBajaItem>()
 1426            .HasIndex(i => new { i.AguinaldoBajaId, i.Tipo });
 427
 1428        modelBuilder.Entity<SnapshotInsumos>()
 1429            .Property(s => s.ContenidoJson)
 1430            .HasColumnType("jsonb");
 431
 1432        modelBuilder.Entity<IncidenciaCalculo>()
 1433            .HasIndex(i => new { i.PeriodoId, i.PersonaId });
 434
 1435        modelBuilder.Entity<IncidenciaCalculo>()
 2436            .ToTable(t => t.HasCheckConstraint("ck_incidencias_calculo_tipo",
 2437                $"tipo IN ('{string.Join("', '", TipoIncidenciaCalculo.Todos)}')"));
 438
 1439        modelBuilder.Entity<BeneficioSocialBeneficiario>()
 1440            .HasIndex(b => new { b.BeneficioId, b.Activo });
 441
 1442        modelBuilder.Entity<BeneficioSocialBeneficiario>()
 2443            .ToTable(t => t.HasCheckConstraint("ck_beneficio_beneficiario_vigencia",
 2444                "vigente_hasta IS NULL OR vigente_hasta >= vigente_desde"));
 445
 1446        modelBuilder.Entity<InstructivoAsigFamiliar>()
 1447            .HasIndex(i => new { i.VigenteDesde, i.TipoFranja });
 448
 1449        modelBuilder.Entity<InstructivoAsigFamiliar>()
 2450            .ToTable(t => t.HasCheckConstraint("ck_instructivo_asig_familiar_tipo",
 2451                "tipo_franja IN ('franja_8','franja_16','discapacidad')"));
 452
 1453        modelBuilder.Entity<InstructivoAsigFamiliar>()
 2454            .ToTable(t => t.HasCheckConstraint("ck_instructivo_asig_familiar_importe",
 2455                "importe > 0"));
 456
 1457        modelBuilder.Entity<InstructivoPsf>()
 1458            .HasIndex(i => new { i.VigenteDesde, i.NumeroCategoria });
 459
 1460        modelBuilder.Entity<InstructivoPsf>()
 2461            .ToTable(t => t.HasCheckConstraint("ck_instructivo_psf_categoria",
 2462                "numero_categoria BETWEEN 1 AND 5"));
 463
 1464        modelBuilder.Entity<InstructivoPsf>()
 2465            .ToTable(t => t.HasCheckConstraint("ck_instructivo_psf_importe",
 2466                "importe > 0"));
 467
 1468        modelBuilder.Entity<TablaHogarConstituido>()
 1469            .HasIndex(t => new { t.VigenteDesde, t.HastaHaberes });
 470
 1471        modelBuilder.Entity<TablaHogarConstituido>()
 2472            .ToTable(t => t.HasCheckConstraint("ck_tabla_hogar_importe",
 2473                "importe > 0"));
 474
 475        // Aguinaldos: unicidad por persona + año + semestre
 1476        modelBuilder.Entity<Aguinaldo>()
 1477            .HasIndex(a => new { a.PersonaId, a.Anio, a.Semestre })
 1478            .IsUnique();
 479
 480        // Compensaciones por diferencia de ascenso:
 481        // dos FKs hacia Grado, se configuran explícitamente para evitar
 482        // ambigüedad y ciclos de cascada.
 1483        modelBuilder.Entity<CompensacionDiferenciaAscenso>()
 1484            .HasOne(c => c.GradoViejo)
 1485            .WithMany()
 1486            .HasForeignKey(c => c.GradoViejoId)
 1487            .OnDelete(DeleteBehavior.Restrict);
 488
 1489        modelBuilder.Entity<CompensacionDiferenciaAscenso>()
 1490            .HasOne(c => c.GradoNuevo)
 1491            .WithMany()
 1492            .HasForeignKey(c => c.GradoNuevoId)
 1493            .OnDelete(DeleteBehavior.Restrict);
 494
 1495        modelBuilder.Entity<CompensacionDiferenciaAscenso>()
 1496            .HasOne(c => c.RelacionLaboralNueva)
 1497            .WithMany()
 1498            .HasForeignKey(c => c.RelacionLaboralNuevaId)
 1499            .OnDelete(DeleteBehavior.Restrict);
 500
 1501        modelBuilder.Entity<CompensacionDiferenciaAscenso>()
 1502            .HasIndex(c => c.PersonaId);
 503
 1504        modelBuilder.Entity<CompensacionDiferenciaAscenso>()
 1505            .HasIndex(c => c.Estado);
 506
 1507    }
 508}
 509
 510