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

Material Design: Notificaciones (Snackbar)

Material Design introduce una nueva forma de mostrar notificaciones al usuario, estos son los snackbar, similares a los[...]

Subir imagen a un servidor web con REST/JSON

En este tutorial crearemos una sencilla aplicación para android que nos permitirá subir una imagen a un servidor web. La[...]

Comprime y sube imagenes con JavaScript

Es indispensable pensar a la hora de desarrollar aplicaciones web la optimización de recursos, en el caso de las imagene[...]

base de datos multiple – parte II

Continuación del tutorial «Utiliza 2 bases de datos diferentes en una aplicación» La Interfaz frmSelected.java: Haciendo[...]

Código de Control en PHP v7.0 Bolivia

NUEVA ESPECIFICACIÓN TÉCNICA DEL CÓDIGO DE CONTROL (Ver.7.0) En el marco del Nuevo Sistema de Facturación implementado p[...]

Introducción a Python en Java

Python es un lenguaje de programación interpretado,  de programación multiparadigma, ya que soporta orientación a objeto[...]