Quiero saber si hay alguien que pudiera pasar un pequeño codigo de java a velneo 6
Yo soy programador de Java, C/C++ dime qué necesitas y si te puedo ayudar en algo.
Hola:
(si te resulta mas comodo mi correo es euskarri@lan-1000, puedo enviartelo todo por mail)
El tema tiene que ver con la implantación del sistema TicketBai por parte de la Haciendas Forales.
El proceso de TicketBai consta de los siguientes procesos:
Generar la factura en formato XML, según las especificaciones que publicaron las Haciendas Forales.
Firmar digitalmente ese XML, según las especificaciones que publicaron las Haciendas Forales.
Obtener un dato del fichero firmado, que aparece en una etiqueta del XML.
Con ese dato se obtiene un indicativo, aquí hay un ejemplo:
“TBAI-A99800179-140622-ikRKYPQaO6y9b-”
A este indicativo hay que generar un CRC de comprobación que se agrega al indicativo, en el ejemplo seria el 078
TBAI-A99800179-140622-ikRKYPQaO6y9b-078
A este ultimo se le vuelve a realizar la comprobación CRC y con del dato obtenido (156), se genera una URL que se convierte en un código QR
El código QR se debe incrustar en la factura.
Para conseguir hacer todo esto en Velneo 6x, hemos hecho lo siguiente:
XML se genera desde velneo 6x sin problemas.
La firma digital la realizamos llamando a la aplicación autofirmacommandline, de Autofirma de la Agencia Tributaria.
Obtener el dato del fichero tampoco plantea problemas, leyendo el fichero desde Velneo 6x
Con eso generamos el indicativo en Velneo 6x.
Los CRC de comprobación se realizan con un algoritmo de un Script de Java, que lo puedes ver al final de este documento. Ese Script lo convertimos en un archivo EXE al que llamamos desde Velneo 6x y nos devuelve el resultado.
Finalmente el QR lo generamos con una aplicación de libre distribución llamada Zint.
El sistema nos funciona, aunque en ocasiones no sabemos porque el CRC falla, supongo que porque hace una llamada a Java y ocurre algún error.
Nos preguntábamos si es posible trasladar el Script de Java a Velneo 6x para que la generación del CRC se realice en modo nativo Velneo 6x. Entiendo que lo de la firma digital y generar el QR será más complicado hacerlo en Velneo 6x.
ALGORITMO CRC DE COMPROBACIÓN
package net.ticketbai;
import java.io.UnsupportedEncodingException;
public class CRC8{
private static final String UTF_8 = “UTF-8”;
// CRC-8,
// Poly = x^8 + x^2 + x^1 + x^0
// Init = 0
// RefIn = false
// RefOut = false
// XorOut = 0
private static final byte crc8_table =
new byte {
(byte ) 0x00, (byte ) 0x07, (byte ) 0x0E, (byte ) 0x09, (byte ) 0x1C, (byte ) 0x1B, (byte ) 0x12, (byte ) 0x15,
(byte ) 0x38, (byte ) 0x3F, (byte ) 0x36, (byte ) 0x31, (byte ) 0x24, (byte ) 0x23, (byte ) 0x2A, (byte ) 0x2D,
(byte ) 0x70, (byte ) 0x77, (byte ) 0x7E, (byte ) 0x79, (byte ) 0x6C, (byte ) 0x6B, (byte ) 0x62, (byte ) 0x65,
(byte ) 0x48, (byte ) 0x4F, (byte ) 0x46, (byte ) 0x41, (byte ) 0x54, (byte ) 0x53, (byte ) 0x5A, (byte ) 0x5D,
(byte ) 0xE0, (byte ) 0xE7, (byte ) 0xEE, (byte ) 0xE9, (byte ) 0xFC, (byte ) 0xFB, (byte ) 0xF2, (byte ) 0xF5,
(byte ) 0xD8, (byte ) 0xDF, (byte ) 0xD6, (byte ) 0xD1, (byte ) 0xC4, (byte ) 0xC3, (byte ) 0xCA, (byte ) 0xCD,
(byte ) 0x90, (byte ) 0x97, (byte ) 0x9E, (byte ) 0x99, (byte ) 0x8C, (byte ) 0x8B, (byte ) 0x82, (byte ) 0x85,
(byte ) 0xA8, (byte ) 0xAF, (byte ) 0xA6, (byte ) 0xA1, (byte ) 0xB4, (byte ) 0xB3, (byte ) 0xBA, (byte ) 0xBD,
(byte ) 0xC7, (byte ) 0xC0, (byte ) 0xC9, (byte ) 0xCE, (byte ) 0xDB, (byte ) 0xDC, (byte ) 0xD5, (byte ) 0xD2,
(byte ) 0xFF, (byte ) 0xF8, (byte ) 0xF1, (byte ) 0xF6, (byte ) 0xE3, (byte ) 0xE4, (byte ) 0xED, (byte ) 0xEA,
(byte ) 0xB7, (byte ) 0xB0, (byte ) 0xB9, (byte ) 0xBE, (byte ) 0xAB, (byte ) 0xAC, (byte ) 0xA5, (byte ) 0xA2,
(byte ) 0x8F, (byte ) 0x88, (byte ) 0x81, (byte ) 0x86, (byte ) 0x93, (byte ) 0x94, (byte ) 0x9D, (byte ) 0x9A,
(byte ) 0x27, (byte ) 0x20, (byte ) 0x29, (byte ) 0x2E, (byte ) 0x3B, (byte ) 0x3C, (byte ) 0x35, (byte ) 0x32,
(byte ) 0x1F, (byte ) 0x18, (byte ) 0x11, (byte ) 0x16, (byte ) 0x03, (byte ) 0x04, (byte ) 0x0D, (byte ) 0x0A,
(byte ) 0x57, (byte ) 0x50, (byte ) 0x59, (byte ) 0x5E, (byte ) 0x4B, (byte ) 0x4C, (byte ) 0x45, (byte ) 0x42,
(byte ) 0x6F, (byte ) 0x68, (byte ) 0x61, (byte ) 0x66, (byte ) 0x73, (byte ) 0x74, (byte ) 0x7D, (byte ) 0x7A,
(byte ) 0x89, (byte ) 0x8E, (byte ) 0x87, (byte ) 0x80, (byte ) 0x95, (byte ) 0x92, (byte ) 0x9B, (byte ) 0x9C,
(byte ) 0xB1, (byte ) 0xB6, (byte ) 0xBF, (byte ) 0xB8, (byte ) 0xAD, (byte ) 0xAA, (byte ) 0xA3, (byte ) 0xA4,
(byte ) 0xF9, (byte ) 0xFE, (byte ) 0xF7, (byte ) 0xF0, (byte ) 0xE5, (byte ) 0xE2, (byte ) 0xEB, (byte ) 0xEC,
(byte ) 0xC1, (byte ) 0xC6, (byte ) 0xCF, (byte ) 0xC8, (byte ) 0xDD, (byte ) 0xDA, (byte ) 0xD3, (byte ) 0xD4,
(byte ) 0x69, (byte ) 0x6E, (byte ) 0x67, (byte ) 0x60, (byte ) 0x75, (byte ) 0x72, (byte ) 0x7B, (byte ) 0x7C,
(byte ) 0x51, (byte ) 0x56, (byte ) 0x5F, (byte ) 0x58, (byte ) 0x4D, (byte ) 0x4A, (byte ) 0x43, (byte ) 0x44,
(byte ) 0x19, (byte ) 0x1E, (byte ) 0x17, (byte ) 0x10, (byte ) 0x05, (byte ) 0x02, (byte ) 0x0B, (byte ) 0x0C,
(byte ) 0x21, (byte ) 0x26, (byte ) 0x2F, (byte ) 0x28, (byte ) 0x3D, (byte ) 0x3A, (byte ) 0x33, (byte ) 0x34,
(byte ) 0x4E, (byte ) 0x49, (byte ) 0x40, (byte ) 0x47, (byte ) 0x52, (byte ) 0x55, (byte ) 0x5C, (byte ) 0x5B,
(byte ) 0x76, (byte ) 0x71, (byte ) 0x78, (byte ) 0x7F, (byte ) 0x6A, (byte ) 0x6D, (byte ) 0x64, (byte ) 0x63,
(byte ) 0x3E, (byte ) 0x39, (byte ) 0x30, (byte ) 0x37, (byte ) 0x22, (byte ) 0x25, (byte ) 0x2C, (byte ) 0x2B,
(byte ) 0x06, (byte ) 0x01, (byte ) 0x08, (byte ) 0x0F, (byte ) 0x1A, (byte ) 0x1D, (byte ) 0x14, (byte ) 0x13,
(byte ) 0xAE, (byte ) 0xA9, (byte ) 0xA0, (byte ) 0xA7, (byte ) 0xB2, (byte ) 0xB5, (byte ) 0xBC, (byte ) 0xBB,
(byte ) 0x96, (byte ) 0x91, (byte ) 0x98, (byte ) 0x9F, (byte ) 0x8A, (byte ) 0x8D, (byte ) 0x84, (byte ) 0x83,
(byte ) 0xDE, (byte ) 0xD9, (byte ) 0xD0, (byte ) 0xD7, (byte ) 0xC2, (byte ) 0xC5, (byte ) 0xCC, (byte ) 0xCB,
(byte ) 0xE6, (byte ) 0xE1, (byte ) 0xE8, (byte ) 0xEF, (byte ) 0xFA, (byte ) 0xFD, (byte ) 0xF4, (byte ) 0xF3 };
/**
-
Calculate the CRC value with data from input string.
-
@param input input string
-
@return The calculated CRC value. Left padding with zeros.
-
@throws UnsupportedEncodingException
*/
public static String calculate(String input) throws UnsupportedEncodingException {
byte data = input.getBytes(UTF_8 );
int len = data.length;
byte crc = 0;
for (int i = 0; i < len; i++)
crc = crc8_table [(crc ^ data[i]) & 0xff];
return String.format(“%03d”, crc & 0xFFL);
Hola. No habría ningún problema en realizar una dll en C++ compatible con v6 y v7 que realice todas esas tareas. De esta forma no tendrías que llamar a programas externos por línea de comando.
Si no entiendo mal la dll ó dlls deberían contener las siguientes funcionalidades Ñ
- Generar/Leer fichero XML
- Firmar digitalmente el XML con un certificado que contenga una clave privada.
- Generar CRC
- Generar QR
Es esa la idea ?
Sí, esa es la idea, aunque la parte de generar el XML ya la tenemos solucionada desde Velneo 6x.
Hay que tener en cuenta que la firma digital debe de cumplir las especificaciones de las Haciendas Forales, que indican especificamente lo siguiente "Formato XAdES: se admitirán exclusivamente las firmas XAdESenveloped. No se admitirá XAdESenveloping, ni XAdESdettached·. Tenemos un documento con el detalle de la Politica de firma.
Nos gustaria saber el costo que tendria esa dll para integrarla en nuestras aplicaciones.
Gracias
Ok, no habría ningún problema con la firma digital en formato XAdES, tengo que estudiar la parte de incorporar el CRC y el código QR.
Déjame que lo estudie. Dime tu correo y te digo la respuesta.
Hola Roberto, somos una empresa de Granada que trabaja con V6, estamos interesados en contactar contigo por la dll para el tema de ticket bai, nuestro telefono es 958572109, pregunta por Sergio o Gabriel
Gracias
Claro, sin problemas.
El lunes os llamo y me contáis cuáles son vuestras necesidades.
Un saludo. Roberto