Algoritmo Base 10 para Dígito Verificador oxxo PHP

Hola qué tal, hoy compartiré un pequeño pedazo de código que tal vez pueda ayudar a alguien por ahí.

En el trabajo solicitaron crear un código de barras para cobros por oxxo, para obtener dicho código de barras es necesario crear una cadena de números (29 digitos en este caso).

Supongamos que el número es el siguiente:

191210475750261871150649310

el algoritmo nos dice lo siguiente:
  1. Empezando de atrás para adelante se multiplica el primer número del código por 2, el siguiente por 1, el siguiente por 2, el siguiente por 1 y así sucesivamente. 
  2. Se suman los resultados (los números de 2 cifras se separan y se suman)
  3. Se divide el resultado de la suma entre 10 y se obtiene el residuo.
  4. Si el resido es igual a cero el dígito es cero. Si el residuo es diferente de cero el dígito es el resultado de restarle a 10 el residuo.
Ok, apartir de este algoritmo el código es el siguiente:

        $splitCodigo = str_split('191210475750261871150649310');
        $bandera = true;
        $suma  = 0;
        $splitCodigo = array_reverse($splitCodigo);
        foreach ($splitCodigo as $value) {
            $x=0;
            switch ($bandera) {
                case true:
                    $z = 0;
                    $x = $value * 2;
                    $x = str_split($x);
                    foreach ($x as $y) {
                        $z = $z + $y;
                    }
                    $bandera = false;
                    break;
                case false:
                    $z = 0;
                    $x = $value * 1;
                    $x=str_split($x);
                    foreach ($x as $y) {
                        $z = $z + $y;
                    }
                    $bandera = true;
                    break;
            }
            $suma = $suma + $z;
        }     
        $res = ($suma % 10); 
        if($res == 0){
            $codigoFinal = 0;
            $cadenaFinal = ''.$codigo.$codigoFinal.'';
           
        }
        if($res != 0){
            $codigoFinal = 10 - $res;
            $cadenaFinal = ''.$codigo.$codigoFinal.'';
        }

        echo $cadenaFinal;
    }

quizá haya mil formas más eficientes de generar el código y la cadena, si tienes una mejor idea hazmela saber.

Saludos!! y feliz año nuevo 2018

happy coding!

Entradas populares de este blog

"php" no se reconoce como un comando interno o externo, programa o archivo por lotes ejecutable.

Dompdf image not found or type unknown

Laravel y MercadoPago SDK