< 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: 330
Uncovered lines: 0
Coverable lines: 330
Total lines: 483
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_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_Dependientes()100%11100%
get_Form3100()100%11100%
get_Form3100PersonasACargo()100%11100%
get_Documentos()100%11100%
get_DescuentosPersonalesPeriodo()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_CompensacionesDiferenciaAscenso()100%11100%
get_LiquidacionItems()100%11100%
get_LiquidacionEstadosPersonal()100%11100%
get_LiquidacionResumenes()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{
 3608    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
 9    {
 36010    }
 11
 12    // DbSets para las entidades principales
 47313    public DbSet<Persona> Personas { get; set; }
 41314    public DbSet<Usuario> Usuarios { get; set; }
 38615    public DbSet<Rol> Roles { get; set; }
 38416    public DbSet<Permiso> Permisos { get; set; }
 36317    public DbSet<Accion> Acciones { get; set; }
 36318    public DbSet<Contexto> Contextos { get; set; }
 37019    public DbSet<BitacoraAuditoria> BitacorasAuditoria { get; set; }
 40620    public DbSet<Banco> Bancos { get; set; }
 37021    public DbSet<Acreedor> Acreedores { get; set; }
 36022    public DbSet<CuentaBancaria> CuentasBancarias { get; set; }
 43623    public DbSet<TipoBeneficio> TiposBeneficio { get; set; }
 42824    public DbSet<BeneficioSocial> BeneficiosSociales { get; set; }
 38325    public DbSet<ParametroPeriodo> ParametrosPeriodo { get; set; }
 26
 27    // Personal y catálogos
 51628    public DbSet<RelacionLaboral> RelacionesLaborales { get; set; }
 37129    public DbSet<MovimientoLaboral> MovimientosLaborales { get; set; }
 43330    public DbSet<Regimen> Regimenes { get; set; }
 40931    public DbSet<Escalafon> Escalafones { get; set; }
 42132    public DbSet<Grado> Grados { get; set; }
 40933    public DbSet<Situacion> Situaciones { get; set; }
 41134    public DbSet<Programa> Programas { get; set; }
 41135    public DbSet<Unidad> Unidades { get; set; }
 36136    public DbSet<SubUnidad> SubUnidades { get; set; }
 38337    public DbSet<TipoMovimiento> TiposMovimiento { get; set; }
 36038    public DbSet<MotivoBaja> MotivosBaja { get; set; }
 39
 40    // IRPF
 43241    public DbSet<FranjaIrpf> FranjasIrpf { get; set; }
 36742    public DbSet<IrpfMensual> IrpfsMensual { get; set; }
 36743    public DbSet<IrpfDetalleFranjas> IrpfsDetalleFranjas { get; set; }
 44
 45    // Dependientes (mantenido por compatibilidad, deprecado)
 40046    public DbSet<Dependiente> Dependientes { get; set; }
 47
 48    // Form 3100
 36049    public DbSet<Form3100> Form3100 { get; set; }
 36050    public DbSet<Form3100PersonaACargo> Form3100PersonasACargo { get; set; }
 51
 52    // Documentos (almacenamiento genérico)
 36053    public DbSet<Documento> Documentos { get; set; }
 54
 55    // Descuentos personales por período
 36256    public DbSet<DescuentoPersonalPeriodo> DescuentosPersonalesPeriodo { get; set; }
 57
 58    // Compensaciones
 45759    public DbSet<TipoCompensacion> TiposCompensacion { get; set; }
 40360    public DbSet<ConfigCompensacion> ConfigCompensaciones { get; set; }
 41861    public DbSet<LoteCompensacion> LotesCompensacion { get; set; }
 39262    public DbSet<ItemLoteCompensacion> ItemsLoteCompensacion { get; set; }
 63
 64    // Instructivo / Tablas de referencia (no atadas a compensaciones)
 38265    public DbSet<CatalogoItem> CatalogoItems { get; set; }
 40966    public DbSet<RemuneracionGrado> RemuneracionesGrado { get; set; }
 39467    public DbSet<TablaPermanencia> TablaPermanencias { get; set; }
 36068    public DbSet<TarifaPorCategoria> TarifasPorCategoria { get; set; }
 69
 70    // Instructivos de beneficios sociales (DFC)
 36271    public DbSet<InstructivoAsigFamiliar> InstructivosAsigFamiliar { get; set; }
 36272    public DbSet<InstructivoPsf> InstructivosPsf { get; set; }
 36273    public DbSet<TablaHogarConstituido> TablasHogarConstituido { get; set; }
 74
 75    // Apertura de períodos
 42376    public DbSet<Periodo> PeriodosLiquidacion { get; set; }
 38077    public DbSet<SnapshotInsumos> SnapshotsInsumos { get; set; }
 78
 79    // Motor de cálculo
 37480    public DbSet<NovedadPeriodo> NovedadesPeriodo { get; set; }
 36081    public DbSet<Retroactividad> Retroactividades { get; set; }
 36082    public DbSet<RetroactividadItem> RetroactividadItems { get; set; }
 83
 84    // Beneficiarios de beneficios sociales (hijos para asig. familiar, etc.)
 36085    public DbSet<BeneficioSocialBeneficiario> BeneficioSocialBeneficiarios { get; set; }
 86
 87    // Aguinaldo (SAC) y compensaciones por diferencia de ascenso
 36088    public DbSet<Aguinaldo> Aguinaldos { get; set; }
 36089    public DbSet<CompensacionDiferenciaAscenso> CompensacionesDiferenciaAscenso { get; set; }
 90
 91    // Liquidación de haberes
 42592    public DbSet<LiquidacionItem> LiquidacionItems { get; set; }
 37693    public DbSet<LiquidacionEstadoPersonal> LiquidacionEstadosPersonal { get; set; }
 37694    public DbSet<LiquidacionResumen> LiquidacionResumenes { get; set; }
 36095    public DbSet<IncidenciaCalculo> IncidenciasCalculo { get; set; }
 96
 97    protected override void OnModelCreating(ModelBuilder modelBuilder)
 98    {
 199        base.OnModelCreating(modelBuilder);
 100
 101        // Configuración de la relación muchos a muchos entre Usuario y Rol
 1102        modelBuilder.Entity<Usuario>()
 1103            .HasMany(u => u.Roles)
 1104            .WithMany(r => r.Usuarios)
 1105            .UsingEntity<Dictionary<string, object>>(
 1106                "usuarios_roles",
 1107                j => j.HasOne<Rol>().WithMany().HasForeignKey("rol_id"),
 1108                j => j.HasOne<Usuario>().WithMany().HasForeignKey("usuario_id"),
 1109                j =>
 1110                {
 1111                    j.HasKey("usuario_id", "rol_id");
 1112                    j.ToTable("usuarios_roles");
 1113                }
 1114            );
 115
 116        // Configuración de la relación muchos a muchos entre Rol y Permiso
 1117        modelBuilder.Entity<Rol>()
 1118            .HasMany(r => r.Permisos)
 1119            .WithMany(p => p.Roles)
 1120            .UsingEntity<Dictionary<string, object>>(
 1121                "roles_permisos",
 1122                j => j.HasOne<Permiso>().WithMany().HasForeignKey("permiso_id"),
 1123                j => j.HasOne<Rol>().WithMany().HasForeignKey("rol_id"),
 1124                j =>
 1125                {
 1126                    j.HasKey("permiso_id", "rol_id");
 1127                    j.ToTable("roles_permisos");
 1128                }
 1129            );
 130
 131        // Índices únicos
 1132        modelBuilder.Entity<Persona>()
 1133            .HasIndex(p => p.Cedula)
 1134            .IsUnique();
 135
 1136        modelBuilder.Entity<Usuario>()
 1137            .HasIndex(u => u.Username)
 1138            .IsUnique();
 139
 1140        modelBuilder.Entity<Rol>()
 1141            .HasIndex(r => r.Nombre)
 1142            .IsUnique();
 143
 1144        modelBuilder.Entity<Permiso>()
 1145            .HasIndex(p => p.Nombre)
 1146            .IsUnique();
 147
 1148        modelBuilder.Entity<Accion>()
 1149            .HasIndex(a => a.Nombre)
 1150            .IsUnique();
 151
 1152        modelBuilder.Entity<Contexto>()
 1153            .HasIndex(c => c.Nombre)
 1154            .IsUnique();
 155
 1156        modelBuilder.Entity<Banco>()
 1157            .HasIndex(b => b.Codigo)
 1158            .IsUnique();
 159
 1160        modelBuilder.Entity<Acreedor>()
 1161            .HasIndex(a => a.Codigo)
 1162            .IsUnique();
 163
 1164        modelBuilder.Entity<Acreedor>()
 1165            .HasIndex(a => a.PrioridadDeficit)
 1166            .IsUnique();
 167
 1168        modelBuilder.Entity<TipoBeneficio>()
 1169            .HasIndex(tb => tb.Codigo)
 1170            .IsUnique();
 171
 172        // Índices para catálogos
 1173        modelBuilder.Entity<Regimen>()
 1174            .HasIndex(r => r.NumeroLey)
 1175            .IsUnique();
 176
 1177        modelBuilder.Entity<Escalafon>()
 1178            .HasIndex(e => e.Codigo)
 1179            .IsUnique();
 180
 181        // Grados: código único universal (independiente del escalafón)
 1182        modelBuilder.Entity<Grado>()
 1183            .HasIndex(g => g.Codigo)
 1184            .IsUnique();
 185
 1186        modelBuilder.Entity<Situacion>()
 1187            .HasIndex(s => s.Codigo)
 1188            .IsUnique();
 189
 1190        modelBuilder.Entity<Situacion>()
 1191            .Property(s => s.SistemaSalud)
 1192            .HasDefaultValue("ssffaa");
 193
 1194        modelBuilder.Entity<Programa>()
 1195            .HasIndex(p => p.Codigo)
 1196            .IsUnique();
 197
 1198        modelBuilder.Entity<Unidad>()
 1199            .HasIndex(u => u.Codigo)
 1200            .IsUnique();
 201
 202        // Form3100: unicidad por persona + mes/año de vigencia
 1203        modelBuilder.Entity<Form3100>()
 1204            .HasIndex(f => new { f.PersonaId, f.VigenteDesde_Anio, f.VigenteDesde_Mes })
 1205            .IsUnique();
 206
 207        // MotivoBaja: código único
 1208        modelBuilder.Entity<MotivoBaja>()
 1209            .HasIndex(m => m.Codigo)
 1210            .IsUnique();
 211
 212        // Índices para relaciones laborales
 1213        modelBuilder.Entity<RelacionLaboral>()
 1214            .HasIndex(rl => new { rl.PersonaId, rl.Estado });
 215
 1216        modelBuilder.Entity<RelacionLaboral>()
 1217            .HasIndex(rl => rl.GradoId);
 218
 219        // Configuración explícita para resolver ambigüedad: Grado tiene dos FKs desde RelacionLaboral
 1220        modelBuilder.Entity<RelacionLaboral>()
 1221            .HasOne(rl => rl.Grado)
 1222            .WithMany(g => g.RelacionesLaborales)
 1223            .HasForeignKey(rl => rl.GradoId)
 1224            .OnDelete(DeleteBehavior.Restrict);
 225
 1226        modelBuilder.Entity<RelacionLaboral>()
 1227            .HasOne(rl => rl.GradoReincorporacion)
 1228            .WithMany()
 1229            .HasForeignKey(rl => rl.GradoReincorporacionId)
 1230            .OnDelete(DeleteBehavior.Restrict);
 231
 1232        modelBuilder.Entity<BeneficioSocial>()
 1233            .HasIndex(bs => new { bs.PersonaId, bs.Estado });
 234
 1235        modelBuilder.Entity<BeneficioSocial>()
 1236            .HasIndex(bs => new { bs.TipoBeneficioId, bs.Estado });
 237
 1238        modelBuilder.Entity<BeneficioSocial>()
 1239            .HasIndex(bs => new { bs.PersonaId, bs.TipoBeneficioId, bs.ClaveEvento });
 240
 1241        modelBuilder.Entity<BeneficioSocial>()
 1242            .HasIndex(bs => bs.RetroactividadPendiente);
 243
 1244        modelBuilder.Entity<ParametroPeriodo>()
 1245            .HasIndex(pp => new { pp.Anio, pp.Mes })
 1246            .IsUnique();
 247
 248        // Índice para búsqueda de auditoría por entidad
 1249        modelBuilder.Entity<BitacoraAuditoria>()
 1250            .HasIndex(b => new { b.Entidad, b.EntidadId });
 251
 252        // Configurar checks
 1253        modelBuilder.Entity<Usuario>()
 2254            .ToTable(t => t.HasCheckConstraint("CK_usuarios_estado",
 2255                "estado IN ('activo', 'bloqueado')"));
 256
 1257        modelBuilder.Entity<CuentaBancaria>()
 2258            .ToTable(t => t.HasCheckConstraint("CK_cuentas_bancarias_estado",
 2259                "estado IN ('activa', 'inactiva')"));
 260
 261        // Configure conversion for RelacionLaboral.Estado enum to store string values compatible with existing DB
 1262        modelBuilder.Entity<RelacionLaboral>()
 1263            .Property(rl => rl.Estado)
 1264            .HasConversion(
 1265                v => v == EstadoRelacion.Activo ? "activo" : "inactivo",
 1266                v => v == "activo" ? EstadoRelacion.Activo : EstadoRelacion.Inactivo
 1267            );
 268
 1269        modelBuilder.Entity<RelacionLaboral>()
 2270            .ToTable(t => t.HasCheckConstraint("CK_relaciones_laborales_estado",
 2271                "estado IN ('activo', 'inactivo')"));
 272
 273        // IRPF - Franjas progresivas
 1274        modelBuilder.Entity<FranjaIrpf>()
 1275            .HasIndex(f => new { f.NumeroFranja, f.VigenteDesde })
 1276            .IsUnique();
 277
 278        // IRPF - Resultado mensual por persona
 1279        modelBuilder.Entity<IrpfMensual>()
 1280            .HasKey(i => i.Id);
 281
 1282        modelBuilder.Entity<IrpfMensual>()
 1283            .HasIndex(i => new { i.LiquidacionId, i.PersonaId })
 1284            .IsUnique();
 285
 1286        modelBuilder.Entity<IrpfMensual>()
 1287            .HasOne(i => i.Liquidacion)
 1288            .WithMany()
 1289            .HasForeignKey(i => i.LiquidacionId)
 1290            .OnDelete(DeleteBehavior.Cascade);
 291
 1292        modelBuilder.Entity<IrpfMensual>()
 1293            .HasOne(i => i.Persona)
 1294            .WithMany()
 1295            .HasForeignKey(i => i.PersonaId)
 1296            .OnDelete(DeleteBehavior.Restrict);
 297
 1298        modelBuilder.Entity<IrpfMensual>()
 1299            .HasMany(i => i.IrpfDetalleFranjas)
 1300            .WithOne(d => d.IrpfMensual)
 1301            .HasForeignKey(d => d.IrpfMensualId)
 1302            .OnDelete(DeleteBehavior.Cascade);
 303
 304        // IRPF - Detalle por franja
 1305        modelBuilder.Entity<IrpfDetalleFranjas>()
 1306            .HasKey(d => d.Id);
 307
 1308        modelBuilder.Entity<IrpfDetalleFranjas>()
 1309            .HasOne(d => d.FranjaIrpf)
 1310            .WithMany()
 1311            .HasForeignKey(d => d.FranjaIrpfId)
 1312            .OnDelete(DeleteBehavior.Restrict);
 313
 314        // Dependientes
 1315        modelBuilder.Entity<Dependiente>()
 1316            .HasIndex(d => new { d.PersonaId, d.Activo });
 317
 1318        modelBuilder.Entity<Dependiente>()
 2319            .ToTable(t => t.HasCheckConstraint("CK_dependientes_tipo",
 2320                "tipo IN ('hijo', 'conyuge_sin_ingresos')"));
 321
 1322        modelBuilder.Entity<Dependiente>()
 2323            .ToTable(t => t.HasCheckConstraint("CK_dependientes_porcentaje",
 2324                "porcentaje_deduccion IS NULL OR porcentaje_deduccion IN (50, 100)"));
 325
 326        // Compensaciones
 1327        modelBuilder.Entity<TipoCompensacion>()
 1328            .HasIndex(t => t.Codigo)
 1329            .IsUnique();
 330
 1331        modelBuilder.Entity<ConfigCompensacion>()
 1332            .HasIndex(c => new { c.TipoCompensacionId, c.RegimenId, c.GradoId, c.EscalafonId, c.Funcion });
 333
 1334        modelBuilder.Entity<LoteCompensacion>()
 1335            .HasIndex(l => new { l.TipoCompensacionId, l.Periodo });
 336
 1337        modelBuilder.Entity<ItemLoteCompensacion>()
 1338            .HasIndex(i => new { i.LoteCompensacionId, i.PersonaId })
 1339            .IsUnique();
 340
 341        // Beneficios sociales
 1342        modelBuilder.Entity<TipoBeneficio>()
 2343            .ToTable(t => t.HasCheckConstraint("CK_tipos_beneficio_plazo_no_negativo",
 2344                "plazo_presentacion_dias IS NULL OR plazo_presentacion_dias >= 0"));
 345
 1346        modelBuilder.Entity<TipoBeneficio>()
 2347            .ToTable(t => t.HasCheckConstraint("CK_tipos_beneficio_monto_no_negativo",
 2348                "monto_referencia IS NULL OR monto_referencia >= 0"));
 349
 1350        modelBuilder.Entity<BeneficioSocial>()
 2351            .ToTable(t => t.HasCheckConstraint("CK_beneficios_sociales_estado",
 2352                "estado IN ('activo', 'inactivo', 'pendiente_doc')"));
 353
 354        // Catálogo e instructivo (tablas de referencia generales)
 1355        modelBuilder.Entity<CatalogoItem>()
 1356            .HasIndex(c => c.Codigo)
 1357            .IsUnique();
 358
 1359        modelBuilder.Entity<RemuneracionGrado>()
 1360            .HasIndex(r => new { r.GradoId, r.ItemId, r.VigenteDesde });
 361
 1362        modelBuilder.Entity<TablaPermanencia>()
 1363            .HasIndex(t => new { t.EscalafonId, t.AniosDesde, t.AniosHasta, t.VigenteDesde });
 364
 1365        modelBuilder.Entity<TablaPermanencia>()
 2366            .ToTable(t => t.HasCheckConstraint("CK_tabla_permanencia_valor", "porcentaje IS NOT NULL OR monto_fijo IS NO
 367
 1368        modelBuilder.Entity<TarifaPorCategoria>()
 1369            .HasIndex(t => new { t.ItemId, t.Categoria, t.VigenteDesde });
 370
 371        // Apertura de períodos de liquidación
 1372        modelBuilder.Entity<Periodo>()
 1373            .HasOne(p => p.Snapshot)
 1374            .WithMany()
 1375            .HasForeignKey(p => p.SnapshotId)
 1376            .OnDelete(DeleteBehavior.Restrict);
 377
 1378        modelBuilder.Entity<Periodo>()
 1379            .HasIndex(p => new { p.Anio, p.Mes })
 1380            .IsUnique()
 1381            .HasFilter("activo = TRUE");
 382
 1383        modelBuilder.Entity<Periodo>()
 1384            .HasIndex(p => p.Estado);
 385
 1386        modelBuilder.Entity<Periodo>()
 2387            .ToTable(t => t.HasCheckConstraint("CK_periodos_liquidacion_estado",
 2388                "estado IN ('ABIERTA','LISTA_CALCULO','EN_CALCULO','CALCULADA','CERRADA')"));
 389
 1390        modelBuilder.Entity<LiquidacionItem>()
 1391            .HasIndex(li => new { li.PeriodoId, li.Cedula, li.Version });
 392
 1393        modelBuilder.Entity<LiquidacionItem>()
 1394            .HasIndex(li => new { li.PeriodoId, li.Version });
 395
 1396        modelBuilder.Entity<LiquidacionEstadoPersonal>()
 1397            .HasIndex(le => new { le.PeriodoId, le.Cedula, le.Version });
 398
 1399        modelBuilder.Entity<LiquidacionResumen>()
 1400            .HasIndex(lr => new { lr.PeriodoId, lr.Version, lr.ProgramaId, lr.RegimenId, lr.Rubro083 });
 401
 1402        modelBuilder.Entity<SnapshotInsumos>()
 1403            .Property(s => s.ContenidoJson)
 1404            .HasColumnType("jsonb");
 405
 1406        modelBuilder.Entity<IncidenciaCalculo>()
 1407            .HasIndex(i => new { i.PeriodoId, i.PersonaId });
 408
 1409        modelBuilder.Entity<IncidenciaCalculo>()
 2410            .ToTable(t => t.HasCheckConstraint("ck_incidencias_calculo_tipo",
 2411                $"tipo IN ('{string.Join("', '", TipoIncidenciaCalculo.Todos)}')"));
 412
 1413        modelBuilder.Entity<BeneficioSocialBeneficiario>()
 1414            .HasIndex(b => new { b.BeneficioId, b.Activo });
 415
 1416        modelBuilder.Entity<BeneficioSocialBeneficiario>()
 2417            .ToTable(t => t.HasCheckConstraint("ck_beneficio_beneficiario_vigencia",
 2418                "vigente_hasta IS NULL OR vigente_hasta >= vigente_desde"));
 419
 1420        modelBuilder.Entity<InstructivoAsigFamiliar>()
 1421            .HasIndex(i => new { i.VigenteDesde, i.TipoFranja });
 422
 1423        modelBuilder.Entity<InstructivoAsigFamiliar>()
 2424            .ToTable(t => t.HasCheckConstraint("ck_instructivo_asig_familiar_tipo",
 2425                "tipo_franja IN ('franja_8','franja_16','discapacidad')"));
 426
 1427        modelBuilder.Entity<InstructivoAsigFamiliar>()
 2428            .ToTable(t => t.HasCheckConstraint("ck_instructivo_asig_familiar_importe",
 2429                "importe > 0"));
 430
 1431        modelBuilder.Entity<InstructivoPsf>()
 1432            .HasIndex(i => new { i.VigenteDesde, i.NumeroCategoria });
 433
 1434        modelBuilder.Entity<InstructivoPsf>()
 2435            .ToTable(t => t.HasCheckConstraint("ck_instructivo_psf_categoria",
 2436                "numero_categoria BETWEEN 1 AND 5"));
 437
 1438        modelBuilder.Entity<InstructivoPsf>()
 2439            .ToTable(t => t.HasCheckConstraint("ck_instructivo_psf_importe",
 2440                "importe > 0"));
 441
 1442        modelBuilder.Entity<TablaHogarConstituido>()
 1443            .HasIndex(t => new { t.VigenteDesde, t.HastaHaberes });
 444
 1445        modelBuilder.Entity<TablaHogarConstituido>()
 2446            .ToTable(t => t.HasCheckConstraint("ck_tabla_hogar_importe",
 2447                "importe > 0"));
 448
 449        // Aguinaldos: unicidad por persona + año + semestre
 1450        modelBuilder.Entity<Aguinaldo>()
 1451            .HasIndex(a => new { a.PersonaId, a.Anio, a.Semestre })
 1452            .IsUnique();
 453
 454        // Compensaciones por diferencia de ascenso:
 455        // dos FKs hacia Grado, se configuran explícitamente para evitar
 456        // ambigüedad y ciclos de cascada.
 1457        modelBuilder.Entity<CompensacionDiferenciaAscenso>()
 1458            .HasOne(c => c.GradoViejo)
 1459            .WithMany()
 1460            .HasForeignKey(c => c.GradoViejoId)
 1461            .OnDelete(DeleteBehavior.Restrict);
 462
 1463        modelBuilder.Entity<CompensacionDiferenciaAscenso>()
 1464            .HasOne(c => c.GradoNuevo)
 1465            .WithMany()
 1466            .HasForeignKey(c => c.GradoNuevoId)
 1467            .OnDelete(DeleteBehavior.Restrict);
 468
 1469        modelBuilder.Entity<CompensacionDiferenciaAscenso>()
 1470            .HasOne(c => c.RelacionLaboralNueva)
 1471            .WithMany()
 1472            .HasForeignKey(c => c.RelacionLaboralNuevaId)
 1473            .OnDelete(DeleteBehavior.Restrict);
 474
 1475        modelBuilder.Entity<CompensacionDiferenciaAscenso>()
 1476            .HasIndex(c => c.PersonaId);
 477
 1478        modelBuilder.Entity<CompensacionDiferenciaAscenso>()
 1479            .HasIndex(c => c.Estado);
 1480    }
 481}
 482
 483