< Summary

Information
Class: FAU.Logica.Validadores.CedulaValidator
Assembly: FAU.Logica
File(s): /home/runner/work/Sistema.Liquidacion.BE/Sistema.Liquidacion.BE/FAU.Logica/Validadores/CedulaValidator.cs
Line coverage
96%
Covered lines: 29
Uncovered lines: 1
Coverable lines: 30
Total lines: 119
Line coverage: 96.6%
Branch coverage
95%
Covered branches: 19
Total branches: 20
Branch coverage: 95%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
Validar(...)87.5%8890.9%
CompletarCedula(...)100%11100%
CalcularDigitoVerificador(...)100%66100%
Limpiar(...)100%11100%
Formatear(...)100%66100%

File(s)

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

#LineLine coverage
 1using System.Text.RegularExpressions;
 2
 3namespace FAU.Logica.Validadores;
 4
 5/// <summary>
 6/// Validador de cédulas de identidad con dígito verificador
 7/// </summary>
 8public static class CedulaValidator
 9{
 10    /// <summary>
 11    /// Valida una cédula verificando el dígito de control
 12    /// </summary>
 13    /// <param name="cedula">Cédula a validar (puede contener puntos y guiones)</param>
 14    /// <returns>True si la cédula es válida</returns>
 15    public static bool Validar(string cedula)
 16    {
 1717        if (string.IsNullOrWhiteSpace(cedula))
 218            return false;
 19
 20        // Limpiar la cédula (remover caracteres no numéricos)
 1521        string cedulaLimpia = Limpiar(cedula);
 22
 23        // Debe tener entre 6 y 8 dígitos
 1524        if (cedulaLimpia.Length < 6 || cedulaLimpia.Length > 8)
 425            return false;
 26
 27        // Validar que sean solo números
 1128        if (!Regex.IsMatch(cedulaLimpia, @"^\d+$"))
 029            return false;
 30
 31        // Obtener el dígito verificador (último dígito)
 1132        char digitoIngresado = cedulaLimpia[cedulaLimpia.Length - 1];
 33
 34        // Obtener la cédula sin el dígito verificador
 1135        string cedulaSinDigito = cedulaLimpia.Substring(0, cedulaLimpia.Length - 1);
 36
 37        // Calcular el dígito verificador esperado
 1138        int digitoCalculado = CalcularDigitoVerificador(cedulaSinDigito);
 39
 40        // Comparar
 1141        return digitoIngresado == digitoCalculado.ToString()[0];
 42    }
 43
 44    /// <summary>
 45    /// Agrega el dígito verificador a una cédula que no lo incluye.
 46    /// </summary>
 47    public static string CompletarCedula(string cedulaSinDigito) =>
 848        cedulaSinDigito + CalcularDigitoVerificador(cedulaSinDigito);
 49
 50    /// <summary>
 51    /// Calcula el dígito verificador de una cédula
 52    /// </summary>
 53    /// <param name="cedula">Cédula sin el dígito verificador</param>
 54    /// <returns>Dígito verificador calculado</returns>
 55    public static int CalcularDigitoVerificador(string cedula)
 56    {
 57        // Completar con ceros a la izquierda hasta tener 7 dígitos
 2058        while (cedula.Length < 7)
 59        {
 160            cedula = "0" + cedula;
 61        }
 62
 63        // Algoritmo de validación
 1964        string multiplicadores = "2987634";
 1965        int suma = 0;
 66
 30467        for (int i = 0; i < 7; i++)
 68        {
 13369            int digito = int.Parse(cedula[i].ToString());
 13370            int multiplicador = int.Parse(multiplicadores[i].ToString());
 13371            suma += (digito * multiplicador) % 10;
 72        }
 73
 1974        if (suma % 10 == 0)
 75        {
 476            return 0;
 77        }
 78        else
 79        {
 1580            return 10 - (suma % 10);
 81        }
 82    }
 83
 84    /// <summary>
 85    /// Limpia una cédula removiendo caracteres no numéricos
 86    /// </summary>
 87    /// <param name="cedula">Cédula con posibles puntos, guiones, etc.</param>
 88    /// <returns>Cédula solo con números</returns>
 89    public static string Limpiar(string cedula)
 90    {
 4691        return Regex.Replace(cedula, @"\D", "");
 92    }
 93
 94    /// <summary>
 95    /// Formatea una cédula en el formato estándar (X.XXX.XXX-X)
 96    /// </summary>
 97    /// <param name="cedula">Cédula a formatear</param>
 98    /// <returns>Cédula formateada</returns>
 99    public static string Formatear(string cedula)
 100    {
 3101        string cedulaLimpia = Limpiar(cedula);
 102
 3103        if (cedulaLimpia.Length < 7 || cedulaLimpia.Length > 8)
 1104            return cedula;
 105
 106        // Formatear según longitud
 2107        if (cedulaLimpia.Length == 7)
 108        {
 109            // X.XXX.XXX
 1110            return $"{cedulaLimpia[0]}.{cedulaLimpia.Substring(1, 3)}.{cedulaLimpia.Substring(4, 3)}";
 111        }
 112        else // 8 dígitos
 113        {
 114            // X.XXX.XXX-X
 1115            return $"{cedulaLimpia[0]}.{cedulaLimpia.Substring(1, 3)}.{cedulaLimpia.Substring(4, 3)}-{cedulaLimpia[7]}";
 116        }
 117    }
 118}
 119