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.
<?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;
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:
enjoy!!!
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! :)
Sourcetrail el explorador de código fuente de los lenguaje C, C ++, Java y Python se pasa al Software Libre y desde ahor...
GraphADT es una proyecto alojado en github escrito en java que te permite trabajar con grafos, a la fecha de escribir es...
Según Santa Wikipedia: «Un archivo binario es un archivo informático que contiene información de cualquier tipo codifica...
¿Quieres iniciarte en la programación? ¿Eres un programador impaciente que odia instalar cualquier software en su comput...
BorderPane es un layout que distribuye los nodos hijos en 5 posiciones TOP, LEFT, BOTTOM, RIGHT y CENTER Los nodos hijos...
En este tutorial conoceremos lo que es el uso de BitmapFont en LibGDX y algún uso que le podemos dar como crear un menú,...
Los comentarios estan cerrados
Si trabajas con redes sociales (RRSS) a continuación te muestro tres herramintas gratuitas que te ayudaran a la hora de...
Por lo general se usan transacciones a nivel base de datos y posteriormente se llaman estos a través de procedimientos a...
En este post, aprenderemos como conectar Visual Basic 6 con SQL Server, abrir una tabla, leer su contenido y mostrar est...
Lo que veremos en este post es la configuración del driver para PHP de SQL Server que ha creado Microsoft el cual permit...
eres un genio muchas gracias por el aporte sera que puedes compartir el código en otro versión de php
pues quitale los tipos a los métodos y elimina el declare(strict_types = 1);