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!!!
Hace un par de años atras google para el aniversario del juego de Pacman saco un doodle en su homenaje, ese doodle que s[...]
El Algoritmo de Aldous-Broder llamado así por dos matemáticos, David Aldous and A. Broder (quienes trabajaban en la inve[...]
Apache POI es la API de Java para el trabajo con archivos de Microsoft como son Word, Excel y Power Point. Apache POI se[...]
Inspeccionando los cientos de marcadores que tenia en mi firefox, me encontre un enlace web con una interesante clase pa[...]
SQLite. SQLite es un sistema de gestión de bases de datos relacional compatible con ACID, contenida en una relativamente[...]
En este post veremos como imprimir secciones de un formulario en java implementando la Interface Printable. La clase que[...]