< 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
71%
Covered lines: 20
Uncovered lines: 8
Coverable lines: 28
Total lines: 79
Line coverage: 71.4%
Branch coverage
40%
Covered branches: 4
Total branches: 10
Branch coverage: 40%
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()25%5458.33%
ValidarFechaMovimiento()50%6676.92%

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
 113    public MovimientoLaboralValidator(ApplicationDbContext context)
 14    {
 115        _context = context;
 116    }
 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
 127        var ultimoMovimiento = await _context.MovimientosLaborales
 128            .Where(m => m.RelacionLaboralId == relacionLaboralId)
 129            .OrderByDescending(m => m.FechaMovimiento)
 130            .FirstOrDefaultAsync();
 31
 132        if (ultimoMovimiento == null)
 33        {
 34            // No hay movimientos anteriores, es válido
 135            return null;
 36        }
 37
 38        // Comparar las fechas sin hora
 039        var fechaBajaDate = fechaBaja.Date;
 040        var ultimoMovimientoDate = ultimoMovimiento.FechaMovimiento.Date;
 41
 042        if (fechaBajaDate <= ultimoMovimientoDate)
 43        {
 044            return $"La fecha de baja ({fechaBajaDate:dd/MM/yyyy}) debe ser posterior al último movimiento registrado ({
 45        }
 46
 047        return null;
 148    }
 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    {
 155        var relacionLaboral = await _context.RelacionesLaborales
 156            .FirstOrDefaultAsync(r => r.Id == relacionLaboralId);
 57
 158        if (relacionLaboral == null)
 059            return "Relación laboral no encontrada";
 60
 161        var fechaMovimientoDate = fechaMovimiento.Date;
 162        var hoy = DateTime.UtcNow.Date;
 63
 64        // Validar que no sea futura
 165        if (fechaMovimientoDate > hoy)
 66        {
 067            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
 171        var fechaInicio = relacionLaboral.FechaInicio.Date;
 172        if (fechaMovimientoDate < fechaInicio)
 73        {
 074            return $"La fecha del movimiento ({fechaMovimientoDate:dd/MM/yyyy}) debe ser posterior o igual a la fecha de
 75        }
 76
 177        return null;
 178    }
 79}