< 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
0%
Covered lines: 0
Uncovered lines: 29
Coverable lines: 29
Total lines: 113
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 20
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
Validar(...)0%7280%
CalcularDigitoVerificador(...)0%4260%
Limpiar(...)100%210%
Formatear(...)0%4260%

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    {
 017        if (string.IsNullOrWhiteSpace(cedula))
 018            return false;
 19
 20        // Limpiar la cédula (remover caracteres no numéricos)
 021        string cedulaLimpia = Limpiar(cedula);
 22
 23        // Debe tener entre 6 y 8 dígitos
 024        if (cedulaLimpia.Length < 6 || cedulaLimpia.Length > 8)
 025            return false;
 26
 27        // Validar que sean solo números
 028        if (!Regex.IsMatch(cedulaLimpia, @"^\d+$"))
 029            return false;
 30
 31        // Obtener el dígito verificador (último dígito)
 032        char digitoIngresado = cedulaLimpia[cedulaLimpia.Length - 1];
 33
 34        // Obtener la cédula sin el dígito verificador
 035        string cedulaSinDigito = cedulaLimpia.Substring(0, cedulaLimpia.Length - 1);
 36
 37        // Calcular el dígito verificador esperado
 038        int digitoCalculado = CalcularDigitoVerificador(cedulaSinDigito);
 39
 40        // Comparar
 041        return digitoIngresado == digitoCalculado.ToString()[0];
 42    }
 43
 44    /// <summary>
 45    /// Calcula el dígito verificador de una cédula
 46    /// </summary>
 47    /// <param name="cedula">Cédula sin el dígito verificador</param>
 48    /// <returns>Dígito verificador calculado</returns>
 49    private static int CalcularDigitoVerificador(string cedula)
 50    {
 51        // Completar con ceros a la izquierda hasta tener 7 dígitos
 052        while (cedula.Length < 7)
 53        {
 054            cedula = "0" + cedula;
 55        }
 56
 57        // Algoritmo de validación
 058        string multiplicadores = "2987634";
 059        int suma = 0;
 60
 061        for (int i = 0; i < 7; i++)
 62        {
 063            int digito = int.Parse(cedula[i].ToString());
 064            int multiplicador = int.Parse(multiplicadores[i].ToString());
 065            suma += (digito * multiplicador) % 10;
 66        }
 67
 068        if (suma % 10 == 0)
 69        {
 070            return 0;
 71        }
 72        else
 73        {
 074            return 10 - (suma % 10);
 75        }
 76    }
 77
 78    /// <summary>
 79    /// Limpia una cédula removiendo caracteres no numéricos
 80    /// </summary>
 81    /// <param name="cedula">Cédula con posibles puntos, guiones, etc.</param>
 82    /// <returns>Cédula solo con números</returns>
 83    public static string Limpiar(string cedula)
 84    {
 085        return Regex.Replace(cedula, @"\D", "");
 86    }
 87
 88    /// <summary>
 89    /// Formatea una cédula en el formato estándar (X.XXX.XXX-X)
 90    /// </summary>
 91    /// <param name="cedula">Cédula a formatear</param>
 92    /// <returns>Cédula formateada</returns>
 93    public static string Formatear(string cedula)
 94    {
 095        string cedulaLimpia = Limpiar(cedula);
 96
 097        if (cedulaLimpia.Length < 7 || cedulaLimpia.Length > 8)
 098            return cedula;
 99
 100        // Formatear según longitud
 0101        if (cedulaLimpia.Length == 7)
 102        {
 103            // X.XXX.XXX
 0104            return $"{cedulaLimpia[0]}.{cedulaLimpia.Substring(1, 3)}.{cedulaLimpia.Substring(4, 3)}";
 105        }
 106        else // 8 dígitos
 107        {
 108            // X.XXX.XXX-X
 0109            return $"{cedulaLimpia[0]}.{cedulaLimpia.Substring(1, 3)}.{cedulaLimpia.Substring(4, 3)}-{cedulaLimpia[7]}";
 110        }
 111    }
 112}
 113