Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube
JC Mouse Bolivia
Index / PHP / Código Único de Factura en PHP

Código Único de Factura en PHP

Autor jc mouse martes, febrero 12, 2019

Código Único de Factura para el Nuevo Sistema de Facturación Electrónica en Bolivia desarrollado en el lenguaje PHP 7 (Hypertext Preprocessor) con el IDE Netbeans 8.2

El código fuente de este post puedes descarglo gratis desde este <<enlace económico>>. Si encuentras algún error avisas para que aprendamos todos.

SFE

<?php

declare(strict_types = 1);

/**
 * Codigo Unico de Factura
 *
 * @author mouse
 */
class CUF {

    /**
     * @param nit NIT emisor
     * @param fh Fecha y Hora en formato yyyyMMddHHmmssSSS
     * @param sucursal
     * @param mod Modalidad
     * @param temision Tipo de Emision
     * @param cdf Codigo Documento Fiscal
     * @param tds Tipo Documento Sector
     * @param nf Numero de Factura
     * @param pos Punto de Venta
     * @return CUF Codigo Unico de Factura
     */
    public function obtenerCUF(string $nit, string $fh, string $sucursal, string $mod, string $temision, string $cdf, string $tds, string $nf, string $pos) {
        $cadena = "";

        /**
         * PASO 1 y PASO2 Completa con ceros cada campo y concatena todo en una
         * sola cadena
         */
        $cadena .= str_pad($nit, 13, '0', STR_PAD_LEFT);
        $cadena .= $fh;
        $cadena .= str_pad($sucursal, 4, '0', STR_PAD_LEFT);
        $cadena .= $mod;
        $cadena .= $temision;
        $cadena .= $cdf;
        $cadena .= str_pad($tds, 2, '0', STR_PAD_LEFT);
        $cadena .= str_pad($nf, 8, '0', STR_PAD_LEFT);
        $cadena .= str_pad($pos, 4, '0', STR_PAD_LEFT);

        /**
         * Paso 3 Obtiene modulo 11 y adjunta resultado a la cadena
         */        
        $cadena .= $this->calculaDigitoMod11($cadena, 1, 9, false);
        
        /**
         * paso 4 Aplica base16
         */
        return $this->base16($cadena);
    }

    /**
     * @see https://impuestos.gob.bo/ ALGORITMO BASE 11 ? MÓDULO 11
     * Original codigo java
     */
    public function calculaDigitoMod11(string $dado, int $numDig, int $limMult, bool $x10): string {
        if (!$x10) {
            $numDig = 1;
        }
        for ($n = 1; $n <= $numDig; $n++) {
            $soma = 0;
            $mult = 2;
            for ($i = strlen($dado) - 1; $i >= 0; $i--) {
                $soma += ($mult * substr($dado, $i, 1));
                if (++$mult > $limMult) {
                    $mult = 2;
                }
            }
            if ($x10) {
                $dig = (($soma * 10) % 11) % 10;
            } else {
                $dig = $soma % 11;
            }

            if ($dig == 10) {
                $dado .= "1";
            }
            if ($dig == 11) {
                $dado .= "0";
            }
            if ($dig < 10) {
                $dado .= $dig;
            }
        }
        return substr($dado, strlen($dado) - $numDig, $numDig);
    }

    /**
     * @param string $number cadena 
     * @param bool $touppercase TRUE: resultado en mayusculas
     *                          FALSE: Resultado en minusculas
     * @return string Numero hexadecimal
     */
    public function base16(string $number, bool $touppercase = true): string {
        $hexvalues = array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f');
        $hexval = '';
        while ($number != '0') {
            $hexval = $hexvalues[bcmod($number, '16')] . $hexval;            
            $number = bcdiv($number, '16', 0);
        }
        return ($touppercase) ? strtoupper($hexval) : $hexval;
    }

}

Probando nuestro código tenemos:

<?php

require 'CUF.php';
$cuf = new CUF();
$codigo = $cuf->obtenerCUF(123456789, "20190113163721242", 0, 2, 1, 1, 10, 10, 0);
echo $codigo;

HEX php

Ya pata terminar realizamos la prueba en la Batería de Pruebas otorgada en la documentación de Impuestos Bolivia

<?php

require 'CUF.php';
$cuf = new CUF();

$handle = fopen("PruebasCUF.csv", "r");
while ($data = fgetcsv($handle, 1000, ";")) {
    $data = array_map("utf8_encode", $data); //added
    $num = count($data);
    for ($c = 0; $c < $num; $c++) {        
        $arr = explode(",", $data[$c]);
        $codigo = $cuf->obtenerCUF($arr[1], $arr[2], $arr[3], $arr[4], $arr[5], $arr[6], $arr[7], $arr[8], $arr[9]);
        echo $arr[0] . ".- " . $codigo . " -> " . ((strcmp($codigo , $arr[22] )==0) ?'OK':'>|ERROR|<') . '<br>';
    }
}

Y tenemos:

php hex code

enjoy!!!

Tags

Si te ha gustado podrías compartirlo o dejar un comentario. ¡Muchas gracias!
Autor: JC Mouse

Yo soy yo :) JC Mouse, Soy orgullosamente boliviano soy fundador y CEO de la web jc-Mouse.net uno de las pocas web en emprendimiento y tecnología en Bolivia.

Toda la información que encuentres en este sitio es y sera completamente gratis siempre, puedes copiar, descargar y re-publicar si así lo deseas en otros blogs o sitios web, solo te pido a cambio que dejes una referencia a esta web. Esto nos ayuda a crecer y seguir aportando. Bye

Enjoy! :)

También Te Podría Interesar

Modificar las pestañas de JTabbedPane

Modificar las pestañas de JTabbedPane

En este tutorial veremos lo fácil que es personalizar las pestañas de un JTabbedPane con unas cuantas lineas de código y...

Programación Shell: Estructuras de control

Programación Shell: Estructuras de control

Las estructuras de control de Shell son muy parecidos a otras lenguajes de programación. Las estructuras disponibles en...

Generar clases desde Esquemas XSD

Generar clases desde Esquemas XSD

XJC es una herramienta de linea de comandos del compilador de esquemas de JAXB que se puede utilizar para convertir un e...

Crea tu JLabel con hipervinculo

Crea tu JLabel con hipervinculo

Si queremos añadir un enlace web a una aplicación en java, podemos hacer uso de botones o etiquetas, incluso se puede añ...

Exportar registros MySQL a Excel

Exportar registros MySQL a Excel

Java Excel API es un API para java que permite a los desarrolladores leer y escribir en hojas de cálculo Excel. jexcelap...

Animaciones básicas con Pygame

Animaciones básicas con Pygame

En tutoriales pasados creábamos demasiadas líneas de código en el mismo lugar para dibujar en la pantalla, cosa que nos...

2 comentarios en “Código Único de Factura en PHP”

  1. Daniel Julio Valdivia Choque dice:

    eres un genio muchas gracias por el aporte sera que puedes compartir el código en otro versión de php

    1. Mouse dice:

      pues quitale los tipos a los métodos y elimina el declare(strict_types = 1);

Los comentarios estan cerrados

Comparte lo que sabes

Categorias

Últimas entradas

Pyodide es un proyecto experimental de Mozilla  que proporciona un intérprete de Python que se ejecuta completamente en...

PicarOS Diego es una distribución GNU/Linux basada en Debian enfocada principalmente en la educación dentro del aula rec...

Windows XP fue lanzado oficialmente el 25 de octubre de 2001, han pasado ya 17 años y 7 meses convirtiendo así a XP uno...

Java proporciona Collection Framework, que define varias clases e interfaces para representar un grupo de objetos como u...

Android Bolivia

MAUS