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

CUF: Código Único de Factura

Autor jc mouse viernes, febrero 8, 2019

Este 2019 se implementara en Bolivia un nuevo Sistema de Facturación Electrónica con nuevas características y medidas de seguridad, una de estas es el Código Único de Factura o CUF que reemplazara al Código de Control del sistema anterior. En este post aprenderemos como se genera este Código Único paso a paso con un ejemplo otorgado por Impuestos Bolivia, de la misma forma usando el lenguaje de programación java, implementaremos el código necesario para su generación. Finalmente realizaremos las pruebas necesarias para pasar con éxito la «Batería de pruebas de generación de CUF» suministrado por Impuestos Bolivia.

El CUF (Código Único de Factura) es un Dato alfanumérico generado por el Sistema de Facturación del
contribuyente para cada Documento Fiscal Electrónico, que permite individualizar el mismo y verificar su inalterabilidad. (Art. 25 Cap. II Titulo II, RND Nº 101800000026).

Para su generación se debe tener en cuenta los siguientes campos:

CUF CAMPOS

Ejemplo

Dados los siguientes datos:

  • NIT EMISOR = 123456789
  • FECHA y HORA = 2019-01-13 16:37:21.242 = 20190113163721242
  • SUCURSAL = 0
  • MODALIDAD = 2 (Computarizada)
  • TIPO EMISIÓN = 1 (online)
  • CÓDIGO DOCUMENTO FISCAL = 1 (Factura)
  • TIPO DOCUMENTO SECTOR = 10 (Factura de Juegos de Azar)
  • NUMERO DE FACTURA = 10
  • Punto de Venta (POS): 0

Paso 1. Completar cada campo con ceros (0)  a la izquierda según la longitud definida

  • NIT EMISOR = 0000123456789
  • FECHA y HORA = 20190113163721242
  • SUCURSAL = 0000
  • MODALIDAD = 2
  • TIPO EMISIÓN = 1
  • CÓDIGO DOCUMENTO FISCAL = 1
  • TIPO DOCUMENTO SECTOR = 10
  • NUMERO DE FACTURA = 00000010
  • Punto de Venta (POS): 0000

Paso 2. Concatenar campos

0000123456789 + 20190113163721242 + 0000 + 2 + 1 + 1 + 10 + 00000010 + 0000

Entonces tenemos la cadena: «000012345678920190113163721242000021110000000100000«

Paso 3. Con la cadena del paso 2, obtener el modulo 11 y adjuntar al final de la cadena, es decir

Valor Modulo 11 (000012345678920190113163721242000021110000000100000) = 0

Adjuntamos el resultado al final de la cadena: 0000123456789201901131637212420000211100000001000000

Paso 4. Aplicar a la cadena resultante Base 16

Base16 = 159FFE6FB1986A24BB32F330C0AF846D7AA50240

Código Único de Factura en Java

A continuación se implementan todos los pasos anteriores en lenguaje java para la generación del CUF.

import java.math.BigInteger;
/**
 * @see https://www.jc-mouse.net/
 * @author mouse
 */
public class Main {

    public static void main(String[] args) {
        String cuf = obtenerCUF("123456789", "20190113163721242", 0, 2, 1, 1, 10, 10, 0);
        System.out.println(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 static String obtenerCUF(String nit, String fh, int sucursal, int mod, int temision, int cdf, int tds, int nf, int pos) {
        String cadena = "";

        /**
         * PASO 1 y PASO2 Completa con ceros cada campo y concatena todo en una
         * sola cadena
         */
        cadena += String.format("%013d", new BigInteger(nit));
        cadena += fh;
        cadena += String.format("%04d", sucursal);
        cadena += mod;
        cadena += temision;
        cadena += cdf;
        cadena += String.format("%02d", tds);
        cadena += String.format("%08d", nf);
        cadena += String.format("%04d", pos);

        /**
         * Paso 3 Obtiene modulo 11 y adjunta resultado a la cadena
         */
        String mod11 = calculaDigitoMod11(cadena, 1, 9, false);
        cadena += mod11;

        /**
         * paso 4 Aplica base16
         */
        BigInteger cuf = new BigInteger(cadena);
        return cuf.toString(16).toUpperCase();
    }

    /**
     * @see https://impuestos.gob.bo/
     * ALGORITMO BASE 11 ? MÓDULO 11
     */
    public static String calculaDigitoMod11(String dado, int numDig, int limMult, boolean x10) {
        int mult, soma, i, n, dig;
        if (!x10) {
            numDig = 1;
        }
        for (n = 1; n <= numDig; n++) {
            soma = 0;
            mult = 2;
            for (i = dado.length() - 1; i >= 0; i--) {
                soma += (mult * Integer.parseInt(dado.
                        substring(i, 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 += String.valueOf(dig);
            }
        }
        return dado.substring(dado.length() - numDig, dado.length());
    }

}

Ejecutando el código anterior obtenemos el CUF:

generacion de cuf

Para terminar el post, Impuestos Bolivia también deja a disposición de los desarrolladores una «Batería de Pruebas de Generación de CUF» en formato PDF (no se porque en ese formato) para realizar las pruebas respectivas de generación de CUF.

bateria de pruebas

Pasaremos estos registros a un formato CSV para poder trabajar mejor con ellos y modificaremos nuestro código de la siguiente manera:

import java.io.IOException;
import java.net.URISyntaxException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;
import java.math.BigInteger;

/**
 * @see https://www.jc-mouse.net/
 * @author mouse
 */
public class Main {

    public static void main(String[] args) {
//        String cuf = obtenerCUF("123456789", "20190113163721242", 0, 2, 1, 1, 10, 10, 0);
//        System.out.println(cuf);

        try (Stream<String> stream = Files
                .lines(Paths
                        .get(ClassLoader.getSystemResource("example/PruebasCUF.csv").toURI()))) {
            stream.forEach((String line) -> {
                String[] arr = line.split(",");
                String cuf = obtenerCUF(arr[1],
                        arr[2],
                        Integer.valueOf(arr[3]),
                        Integer.valueOf(arr[4]),
                        Integer.valueOf(arr[5]),
                        Integer.valueOf(arr[6]),
                        Integer.valueOf(arr[7]),
                        Integer.valueOf(arr[8]),
                        Integer.valueOf(arr[9]));
                System.out.println(
                        arr[0] + ".- " + cuf + " = " + arr[22] + " -> " + (cuf.equals(arr[22])));
            });
        } catch (IOException | URISyntaxException e) {
            System.err.println(e.getMessage());
        }
    }
...
..
.
.

Son en total 50 registros de prueba, ejecutando el programa generamos 50 CUF los cuales comparamos con el resultado del archivo y todos son correctos.

Pruebas Codigo Unico

El código fuente así como el archivo CSV con los registros de prueba utilizados en este post, puedes descargarlos del siguiente enlace.

IDE: Netbeans

Peso: 18KB

Java: 8

<<ENLACE POBRE>>

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

HSQLDB: Gestor de bases de datos libre en java

HSQLDB: Gestor de bases de datos libre en java

HyperSQL DataBase (HSQLDB) es un moderno administrador de bases de datos relacionales, es portátil e implementado en jav...

Introducción a VueJS framework para el desarrollo FrontEnd

Introducción a VueJS framework para el desarrollo FrontEnd

Vue.js es un framework progresivo para la creación de interfaces de usuario de una sola página creado por Evan You. Pero...

Ejemplo RESTFul Webservice en Java

Ejemplo RESTFul Webservice en Java

En este post construiremos un Servicio Web en Java bajo el estandar REST (Representational State Transfer), el cual hace...

Ecuación de segundo grado

Ecuación de segundo grado

Problema: Implemente el código necesario en Kotlin para resolver una ecuación de segundo grado de números reales: Soluci...

Programa en la nube sin instalar nada con repl.it

Programa en la nube sin instalar nada con repl.it

Repl.it es un proyecto de tres jóvenes emprendedores (Amjad, Haya, Maso), es un compilador en linea el cual te permite p...

Ejemplo de uso de ProgressDialog

Ejemplo de uso de ProgressDialog

Un ProgressDialog muestra una ventana con un texto y una barra de progreso que indica el tiempo que tarda una tarea en r...

Comparte lo que sabes

Categorias

Últimas entradas

En este post veremos un ejemplo sencillo de como descargar desde Internet archivos de cualquier tipo (*.jpg, *.png, *.gi...

FFmpeg es una colección de software libre capaz de decodificar, codificar, transcodificar, mux, demux, transmitir, filtr...

The Age of AI o «La era de la Inteligencia Artificial»,  es una serie de 8 documentales de Youtube Original, presentados...

La comunidad 3D Buzz  era una de los lugares donde la gente curiosa de aprender a realizar videojuegos buscaba recursos...

Herramientas

Generador de Enlaces a Whatsapp