El verificador

El siguiente evento organizado por la DGB son las 4as Jornadas Bibliotecarias.

Para este evento, he desarrollado un Servicio Web para el registro de asistencias mediante un código de barras insertado en los gafetes de identificación.

En realidad el concepto es muy sencillo, a los asistentes del evento se les entrega un gafete con su nombre y un código de barras; al inicio de cada actividad, pasan su identificación frente a un lector de códigos de barras y con eso verifican su asistencia.

Lo repito: El concepto fue muy sencillo pero la realización no lo fue tanto, comenzando por la asignación de códigos de barras [CB] a cada asistente; según el estándar EAN12 y EAN13 dice lo siguiente

  1. Los primeros dígitos corresponden al código del país, (para México es: 750)
  2. Los 4 siguientes dígitos corresponden al código de manufactura (interno de la organización)
  3. Los 5 siguientes, corresponden al código del producto
  4. El último dígito es el verificador que se obtiene de la siguiente manera:
    1. El número menos significante del código se considera Impar, el antecesor Par, y se continúa alternadamente. Ejemplo para el código 750951324799 => 7:P 5:I 0:P 9:I 5:P 1:I 3:P 2:I 4:P 7:I 9:P 9:I
    2. Se suman los números marcados como impares => 5+9+1+2+7+9 = 33
    3. Se multiplica el resultado por × 3 => 33 × 3 = 99
    4. Se suman los números marcados como pares => 7+0+5+3+4+9 = 28
    5. Se hace la suma total => 99 + 28 = 127
    6. Se calcula la diferencia a la decena inmediatamente superior => 130 – 127 = 3
    7. El dígito verificador sería => 3
  5. Finalmente, una cadena numérica para generar el un código EAN13 válido sería: 7509513247993

Todo lo anterior, aplica para un código de barras en términos formales, lo que yo he realizado es la construcción de una cadena númerica de longitud 13, siguiendo parte del estándar EAN13 mediante php:

 <?php 
// Prefijo para el codigo de barras (México: 750 : EAN12) 
$prefixBarCode = "750";
// Longitud del hash para el código de barras 
$hashLenght = 9; 
// Array con los elementos que se emplean para crear un HASH ALEATORIO 
$tokensArray = array("0","1","2","3","4","5","6","7","8","9"); 
// Función para generar una cadena pseudo-aleatoria con semilla de tiempo 
function createhash($tokens,$length){ 
 $hashcode = ""; 
 for($c = 0; $c < $length; $c++){
 srand((double)microtime() * 100000000000);
 $pass = $tokens[rand(0,count($tokens) - 1)];
 $hashcode = $hashcode.$pass;
 }
 return $hashcode;
}
function getVerifyNumber($code){
 // Separa los 12 dígitos en elementos de un arreglo
 $arrayBarCode = str_split($code);
 // Invertir el arreglo (El ultimo elemento ahora es el primero)
 $arrayBarCodeReverse = array_reverse($arrayBarCode);
 // Consecutivamente, el primer elemento del arreglo es del conjunto A, el segundo del conjunto B
 for ($i=0; $i<(count($arrayBarCodeReverse) / 2); $i++){
 // Sumar los elementos del conjunto A 
 // [0*2],[1*2],[2*2]…[i*2] => [0],[2],[4]…[i*2]
 $addOdd += $arrayBarCodeReverse[$i*2];
 // Sumar los elementos del conjunto B
 // [(0*2)+1],[(1*2)+1],[(2*2)+1]…[(i*2)+1] => [1],[3],[5]…[]
 $addEven += $arrayBarCodeReverse[($i*2)+1];
 }
 // Suma total
 $addTotal = ($addOdd * 3) + $addEven;
 // Regresa el dígito que complementa la decena mas cercana en la suma total
 return(substr(10 - substr($addTotal,-1,1),-1,1));
}
// Crear los 12 dígitos aleatorios para el código de barras
$barCode = $prefixBarCode . createhash($tokensArray,$hashLenght);
// Crear el dígito verificador del código de barras
$verifyNumber = getVerifyNumber($barCode);
// El codigo EAN13
$ean13barCode = $barCode . $verifyNumber;
echo $ean13barCode;
?> 

Y al final, todo eso simplemente para obtener 13 dígitos; jajajaja que rollo.

Lo siguiente a realizar fue, tomando como argumento una cadena de 13 dígitos, crear el código de barras; en el siguiente sitio web se muestran las especificaciones del estándar EAN13 para crear las barras y espacios correlacionados a la serie numérica.

Al final de todo el proyecto, he podido notar como de un concepto tan sencillo (sencillo no es lo mismo que simple) se desencadenan una serie de conceptos más profundos. Por este tipo de cosas… ¡me gusta mi trabajo!

Por último: el próximo 3 y 4 de Julio se utilizará mi servicio Web dentro del marco de las 4as Jornadas Bibliotecarias con poco más de 230 usuarios… esto me emociona.

Finalmente, aquí está el artículo con el código completo para Crear códigos de barras con PHP

4 pensamientos en “El verificador

  1. Muy interesante tu articulo, tengo una duda, cuando explicas la forma de calcular el digito verificador, el ultimo digito, dices “El número menos significante del código se considera Impar”, me queda la duda, si en caso de que el numero menor de los digitos se repitiera? se toma el primero? el ultimo? como impar?

  2. Gracias Arlin.

    Respondiendo tu pregunta… cuando me refiero al “dígito menos significante” me refiero al número que está en la extrema derecha de la secuencia de números y no al valor absoluto de los dígitos, por ejemplo, el digito menos significante de 123456789123 es el “3” que está en la extrema derecha, ese dígito lo consideras como “impar” aunque su valor sea par o impar.. solo es para alternar los valores para la suma y producto posterior.
    Ve con atención el ejemplo, quizás sea más claro que esta descripción.

    Saludos!

  3. Excelente, ya entendi, muchas gracias por la aclaracion y muchas gracias por tu articulo! buen aporte

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s