Aprende Java Aprende Php Aprende C++ Aprende HTML 5 Aprende JavaScript Aprende JSON Aprende MySQL Aprende SQLServer Aprende Visual Basic 6 Aprende PostgreSQL Aprende SQLite Aprende Redis Aprende Kotlin Aprende XML Aprende Linux VSC Aprende Wordpress Aprende Laravel Aprende VueJS Aprende JQuery Aprende Bootstrap Aprende Netbeans Aprende Android
Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube Sigueme en TikTok Sigueme en Whatsapp
Home / PHP / Código Único de Factura en PHP

Código Único de Factura en PHP

Por 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

Artículos similares

Quill Editor: Cómo Integrar el WYSIWYG Modular en Vistas Blade

En el desarrollo web la elección de un buen editor de texto enriquecido (WYSIWYG) es una decisión crucial que afecta dir[...]

Personalizar JTable: Tabla con footer (Pie de página)

En muchas ocasiones es necesaria la personalización de componentes java para que estos se adecuen a nuestros requerimien[...]

Botones circulares de Google Plus en java

Continuación del tutorial «Google Circles en java» o.O 🙂 La Interfaz El proyecto consta de una sola interfaz la cual es[...]

DOM4J: Creación de archivos XML

DOM4J es una de las librerías para java más populares para el trabajo con XML ya que nos permite crea, editar y leer doc[...]

Parámetros por valor y por referencia en php

En php cuando se pasan parámetros a una función, estos por defecto se los hacen por valor, es decir php crea una copia d[...]

GSON: Generar objetos java desde JSON

En un post anterior vimos como utilizar GSON para serializar un objeto java en JSON, en esta oportunidad se vera el proc[...]