entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Como verificar cédula de identidad, dígito verificador?

validar numero de identificador persona en cakephp

Hola amigos, necesito validar un campo de mi formulario, este campo pertenece al numero de identificación personal de mi país, este numero tiene 10 digits

Ejemplo: cédula = 1710034065

2 1 2 1 2 1 2 1 2 (Coeficiente)
1 7 1 0 0 3 4 0 6 (Número de Cédula)
2 7 2 0 0 3 8 0 12 = 25 (Multiplicar cada dígito de la cédula por el
3 coeficiente, si es mayor a 10 sumo entre dígitos).

sumar las multiplicaciones

Del resultado de la suma

25/10= 2 Residuo 5 divisor 10 - residuo 5 = 5 (dígito verificador) que es igual al ultimo numero de la cédula


Ahora lo que yo necesito es implementar esta lógica, en el framework y no tengo idea de como hacerlo,
tengo este código realizado en java y quisiera implementarlo en el framework y tampoco se como hacerlo.

    function check_cedula( form )
{
  var cedula = form.cedula.value;
  array = cedula.split( "" );
  num = array.length;
  if ( num == 10 )
  {
    total = 0;
    digito = (array[9]*1);
    for( i=0; i < (num-1); i++ )
    {
      mult = 0;
      if ( ( i%2 ) != 0 ) {
        total = total + ( array[i] * 1 );
      }
      else
      {
        mult = array[i] * 2;
        if ( mult > 9 )
          total = total + ( mult - 9 );
        else
          total = total + mult;
      }
    }
    decena = total / 10;
    decena = Math.floor( decena );
    decena = ( decena + 1 ) * 10;
    final = ( decena - total );
    if ( ( final == 10 && digito == 0 ) || ( final == digito ) ) {
      alert( "La c\xe9dula ES v\xe1lida!!!" );
      return true;
    }
    else
    {
      alert( "La c\xe9dula NO es v\xe1lida!!!" );
      return false;
    }
  }
  else
  {
    alert("La c\xe9dula no puede tener menos de 10 d\xedgitos");
    return false;
  }
}

0voto

white comentado

El algoritmo luce para ser cedula de identidad de mi pais, Ecuador, es asi? para esta cedula ademas del algoritmo Algoritmo de Luhn se verifican los dos primeros digitos que son el codigo de provincia. el tercero es menor o igual a 6 si mal no recuerdo.

0voto

kokimoto comentado

si es para una cédula de ecuador, pero necesito hacer esa lógica en el framework cakephp que no tengo idea de como meterla

1 Respuesta

2votos

white Puntos75880

Prepare una funcion para el lado del cliente, esta comprueba los dos primeros digitos el tercero y el digito verificador, el codigo es el siguiente:

codigo javascript:

var EventMethod = (typeof attachEvent === 'undefined' ? 'addEventListener' : 'attachEvent');

Element.prototype.onEvent = function(event, callback, args)
{
    if(typeof callback === 'object')
        for(var x in callback)
            this.onEvent(event, callback[x], args[x]);
    else
        this[EventMethod]((EventMethod == 'attachEvent' ? 'on' : '') + event, function(){
            callback.apply(null, args);
        });
};

function validate_ci(input, callback)
{
    var value = input.value,
        digits = [],
        digits_count = 0,
        verify_digit = null,
        last_digit = null,
        result = function()
        {
            callback.apply(input, arguments);
            return false;
        };

    if(value.match(/([0-9]{9})\-([0-9])/) !== null)
        value = value.replace('-', '');

    // verificamos la longitud
    if(value.length < 10)
        return result(null, 'ingresa 10 digitos');

    // revizamos el codigo de la provincia
    if(parseInt(value.substr(0, 2)) > 24)
        return result(false, 'cedula incorrecta.');

    // revizamos el 3er digito
    if(parseInt(value.substr(2, 1)) > 6)
        return result(false, 'cedula incorrecta.');

    // definimos como un arreglo los digitos
    digits = value.split('');

    // obtenemos el ultimo digito
    last_digit = digits[digits.length-1];

    digits.pop(); // extraemos el ultimo digito ( digito verificador ) de los digitos

    // recorremos los digitos
    for(var x in digits)
    {
        var digit = digits[x],  // definimos el digito
            total = digit * ((parseInt(x) + 1) % 2 == 0 ? 1 : 2); // usamos el algoritmo de Lhun

        // si la multiplicacion es mayor a 9 sumamos entre digitos
        if( total > 9 )
        {
            var two_digits = total.toLocaleString().split('');
            total = parseInt(two_digits[0]) + parseInt(two_digits[1]);
        }

        digits_count += total;
    }

    // usamos el modulo 10
    verify_digit = 10 - (digits_count % 10);

    // digito verificador erroneo
    if(verify_digit !== parseInt(last_digit))
        return result(false, 'cedula incorrecta.');

    return result(true, null, last_digit);
}

(function(){
    console.log('ea?');
    var ci_input = document.getElementById('ci');

    ci_input.onEvent('keyup', validate_ci, [ci_input, function(is_valid, msg, last_digit){

        var input_class = (is_valid === null ? '' : (is_valid ? 'correct' : 'error')),
            input_classes = this.className.split(' '),
            info_classes = [
                input_classes.indexOf('correct'),
                input_classes.indexOf('error')
            ];

        for(var x in info_classes)
        {
            if(info_classes[x] > 0)
                input_classes.splice(info_classes[x], 1);
        }

        input_classes.push(input_class);

        this.className = input_classes.join(' ');

    }]);
})();

El html:

<form method="POST" action="">
    <div class="field">
        <label for="ci">Cedula de identidad:</label>
        <input class="input-text" id="ci" name="ci" placeholder="000000000-0">
    </div>
</form>

esto comprueba tanto para el formato xxxxxxxxx-x que para xxxxxxxxxx

la funcion funciona asi:

validate_ci(input, callback)

input: toma el elemento con el campo de la cedula,
callback: regresa una funcion con argumentos (is_valid, msg, last_digit);

donde solo tendrias que hacer esto:

var validar = validate_ci(input, function(is_valid, msg, last_digit){

    // is valid => regresa true o false dependiendo si valido o no
    // msg es el error que presenta la validacion
    // last_digit es el ultimo digito verificador

});

if( !validar )
{
    // si no valido hacemos alguna accion.
}

DEMO:

http://jsfiddle.net/9vq2eaq5/1/embedded/result/
http://jsfiddle.net/9vq2eaq5/1/

Si lo que buscas es validarlo del lado del servidor, no conozco muy bien cakephp pero viendo la documentacion, seria de agregar un validador personalizado, basandome en eso te dejo el siguiente código, no esta probado pero debería funcionar:

http://book.cakephp.org/2.0/en/models/data-validation.html

class Post extends AppModel {

    public $validate = array(
        'cedula' => array(
            'rule' => 'check_ci',
            'message' => 'La cedula es incorrecta.'
        )
    );

    public function check_ci($check) {

        $value = array_values($check);
        $value = $value[0];

        if(preg_match('~[0-9]{9}\-[0-9]~', $value))
            $value = str_replace('-', '', $value);

        if(intval(substr($value, 0, 2)) > 24)
            return false;

        if(intval(substr($value, 2, 1)) > 6)
            return false;

        $count_digits = 0;
        $digits = str_split($value);
        $last_digit = $digits[count($digits)-1];
        array_pop($digits);

        foreach($digits as $pos => $digit)
        {
            $total = $digit * (($pos + 1) % 2 == 0 ? 1 : 2);

            if($total > 9)
            {
                $pair_digits = str_split(strval($total));
                $total = intval($pair_digits[0]) + intval($pair_digits[1]);
            }

            $count_digits += $total;
        }

        $verify_digit = 10 - ($count_digits % 10);

        if($verify_digit !== intval($last_digit))
            return false;

        return true;
    }
}

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta