< Summary

Information
Class: FAU.Logica.Validadores.MovimientoLaboralValidator
Assembly: FAU.Logica
File(s): /home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.Logica/Validadores/MovimientoLaboralValidator.cs
Line coverage
100%
Covered lines: 28
Uncovered lines: 0
Coverable lines: 28
Total lines: 79
Line coverage: 100%
Branch coverage
100%
Covered branches: 10
Total branches: 10
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
ValidarFechaBajaVsUltimoMovimiento()100%44100%
ValidarFechaMovimiento()100%66100%

File(s)

/home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.Logica/Validadores/MovimientoLaboralValidator.cs

#LineLine coverage
 1using FAU.DataAccess;
 2using Microsoft.EntityFrameworkCore;
 3
 4namespace FAU.Logica.Validadores;
 5
 6/// <summary>
 7/// Validador para movimientos laborales y fechas
 8/// </summary>
 9public class MovimientoLaboralValidator
 10{
 11    private readonly ApplicationDbContext _context;
 12
 813    public MovimientoLaboralValidator(ApplicationDbContext context)
 14    {
 815        _context = context;
 816    }
 17
 18    /// <summary>
 19    /// Valida que la fecha de baja sea posterior al último movimiento registrado
 20    /// </summary>
 21    /// <param name="relacionLaboralId">ID de la relación laboral</param>
 22    /// <param name="fechaBaja">Fecha de baja a validar</param>
 23    /// <returns>Mensaje de error o null si es válida</returns>
 24    public async Task<string?> ValidarFechaBajaVsUltimoMovimiento(long relacionLaboralId, DateTime fechaBaja)
 25    {
 26        // Obtener el último movimiento
 427        var ultimoMovimiento = await _context.MovimientosLaborales
 428            .Where(m => m.RelacionLaboralId == relacionLaboralId)
 429            .OrderByDescending(m => m.FechaMovimiento)
 430            .FirstOrDefaultAsync();
 31
 432        if (ultimoMovimiento == null)
 33        {
 34            // No hay movimientos anteriores, es válido
 235            return null;
 36        }
 37
 38        // Comparar las fechas sin hora
 239        var fechaBajaDate = fechaBaja.Date;
 240        var ultimoMovimientoDate = ultimoMovimiento.FechaMovimiento.Date;
 41
 242        if (fechaBajaDate <= ultimoMovimientoDate)
 43        {
 144            return $"La fecha de baja ({fechaBajaDate:dd/MM/yyyy}) debe ser posterior al último movimiento registrado ({
 45        }
 46
 147        return null;
 448    }
 49
 50    /// <summary>
 51    /// Valida que la fecha de movimiento sea válida (no futura y posterior al inicio de la relación)
 52    /// </summary>
 53    public async Task<string?> ValidarFechaMovimiento(long relacionLaboralId, DateTime fechaMovimiento)
 54    {
 555        var relacionLaboral = await _context.RelacionesLaborales
 556            .FirstOrDefaultAsync(r => r.Id == relacionLaboralId);
 57
 558        if (relacionLaboral == null)
 159            return "Relación laboral no encontrada";
 60
 461        var fechaMovimientoDate = fechaMovimiento.Date;
 462        var hoy = DateTime.Now.Date;
 63
 64        // Validar que no sea futura
 465        if (fechaMovimientoDate > hoy)
 66        {
 167            return $"La fecha del movimiento no puede ser futura. Fecha ingresada: {fechaMovimientoDate:dd/MM/yyyy}";
 68        }
 69
 70        // Validar que sea posterior a la fecha de inicio de la relación
 371        var fechaInicio = relacionLaboral.FechaInicio.Date;
 372        if (fechaMovimientoDate < fechaInicio)
 73        {
 174            return $"La fecha del movimiento ({fechaMovimientoDate:dd/MM/yyyy}) debe ser posterior o igual a la fecha de
 75        }
 76
 277        return null;
 578    }
 79}