Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Colaboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-10-2021
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 2.764
Poder: 7
ermendalenda Va por buen camino
Cita:
Empezado por Ramon88 Ver Mensaje
He estado probándolo y si cambio los caracteres o lo convierto a uri no me funciona, sin embargo si lo dejo tal cual, si. No entiendo nada...


FUNCIONA:

https://tbai.prep.gipuzkoa.eus/qr/?i...&i=0.00&cr=046


NO FUNCIONA:
https://tbai.prep.gipuzkoa.eus/qr/?i...&i=0.00&cr=046
El último crc del último caso está mal.
No puedes poner el mismo. Tienes que calcularlo según lo que has cambiado. Es lioso pero es así
Responder Con Cita
  #2  
Antiguo 04-10-2021
espinete espinete is offline
Miembro
 
Registrado: mar 2009
Posts: 667
Poder: 18
espinete Va camino a la fama
el mensaje ha sido modificado en tránsito o la firma no está bien realizada

Buenas...

Estoy haciendo pruebas con Gipuzkoa y, aunque la factura se envía, me devuelve el error "...el mensaje ha sido modificado en tránsito o la firma no está bien realizada...".

He leído en el foro y en las Preguntas Frecuentes de Gipuzkoa, que puede deberse a problemas en la codificación del archivo antes y después de firmar/enviar, pero he revisado todo y no encuentro dónde puede estar el problema.
Me he asegurado de que todo se guarda como UTF-8 (sin BOM) y el envío se realiza también en UTF-8 (sin BOM).
El nombre de la empresa no contiene ningún carácter especial, ni tildes, etc.

Estos son los pasos que sigo:

1. Creo el XML de la factura a partir del xml data binding:

Código Delphi [-]
        f:=ticketBaiV12.NewTicketBai;
        f.Cabecera.IDVersionTBAI := '1.2';
        .......

2. Cargo el contenido de "f" en un XMLDocument:

Código Delphi [-]
        XMLDocument1.XML.Text:=f.XML;
        xmldocument1.Active:=True;
        xmldocument1.SaveToFile('factura.xml');

3. Realizo las modificaciones de hay que hacer en el XML generado por Delphi, siguiendo los pasos encontrados en el foro:

Código Delphi [-]
        FicheroCorregir := TStringList.Create;
        FicheroCorregir.LoadFromFile('factura.xml');
        FicheroCorregir.Text := AnsiReplaceStr(FicheroCorregir.Text, '','');
        FicheroCorregir.Text := AnsiReplaceStr(FicheroCorregir.Text,'', '');

        FicheroCorregir.WriteBOM := false;
        FicheroCorregir.SaveToFile('factura.xml', TEncoding.UTF8);

4. Firmo la factura

Código Delphi [-]
    firmante.r_SigPolicyID := 'https://www.gipuzkoa.eus/ticketbai/sinadura';                        
    firmante.r_SigPolicyHash := 'e8daca026eb4a3bbbad85510c3365ec36e2b6b6bdef4f4506300b6d4033a227d';     //6NrKAm60o7u62FUQwzZew24ra2ve9PRQYwC21AM6In0= convertido a HEX 
    firmante.r_SigPolicyURI := 'https://www.gipuzkoa.eus/ticketbai/sinadura';

    FirmarXML('factura.xml',firmante);

5. Vuelvo a cargar el XML ya firmado en un XMLDocument:

Código Delphi [-]
    xmldocument1.Active:=false;
    xmldocument1.LoadFromFile('firmado.xml');
    xmldocument1.Active:=true;

6. Uso el código SaveAsUTF8 encontrado en el foro para guardar el archivo en UTF-8 SIN BOM

Código Delphi [-]
    SaveAsUTF8('firmado.xml', xmldocument1.XML);

7. Ya tenemos el archivo firmado. Ahora hago el envío:

Código Delphi [-]
    RequestBody := TFileStream.Create('firmado.xml', fmOpenRead);

    NetHTTPClient1.SecureProtocols := [THTTPSecureProtocol.TLS12];
    NetHTTPClient1.CustomHeaders['Content-Type'] := 'application/xml';
    NetHTTPClient1.CustomHeaders['Charset'] := 'UTF-8';

    AResponse := NetHTTPClient1.Post('https://tbai-prep.egoitza.gipuzkoa.eus/WAS/HACI/HTBRecepcionFacturasWEB/rest/recepcionFacturas/alta',RequestBody);

¿Dónde puede estar el problema? Las facturas se envían (en el entorno de pruebas). De hecho si intento reenviarla, me dice que ya ha sido enviada.

PD: aunque conste como enviada, si voy a la URL del TicketBAI obtenido...

Por ejemplo: https://tbai.prep.gipuzkoa.eus/qr/?i...=100.00&cr=112

...me devuelve "No se ha podido determinar el estado de la factura"
Responder Con Cita
  #3  
Antiguo 04-10-2021
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 2.764
Poder: 7
ermendalenda Va por buen camino
Cita:
Empezado por espinete Ver Mensaje
Buenas...

Estoy haciendo pruebas con Gipuzkoa y, aunque la factura se envía, me devuelve el error "...el mensaje ha sido modificado en tránsito o la firma no está bien realizada...".

He leído en el foro y en las Preguntas Frecuentes de Gipuzkoa, que puede deberse a problemas en la codificación del archivo antes y después de firmar/enviar, pero he revisado todo y no encuentro dónde puede estar el problema.
Me he asegurado de que todo se guarda como UTF-8 (sin BOM) y el envío se realiza también en UTF-8 (sin BOM).
El nombre de la empresa no contiene ningún carácter especial, ni tildes, etc.

Estos son los pasos que sigo:

1. Creo el XML de la factura a partir del xml data binding:

Código Delphi [-] f:=ticketBaiV12.NewTicketBai; f.Cabecera.IDVersionTBAI := '1.2'; .......


2. Cargo el contenido de "f" en un XMLDocument:

Código Delphi [-] XMLDocument1.XML.Text:=f.XML; xmldocument1.Active:=True; xmldocument1.SaveToFile('factura.xml');


3. Realizo las modificaciones de hay que hacer en el XML generado por Delphi, siguiendo los pasos encontrados en el foro:

Código Delphi [-] FicheroCorregir := TStringList.Create; FicheroCorregir.LoadFromFile('factura.xml'); FicheroCorregir.Text := AnsiReplaceStr(FicheroCorregir.Text, '',''); FicheroCorregir.Text := AnsiReplaceStr(FicheroCorregir.Text,'', ''); FicheroCorregir.WriteBOM := false; FicheroCorregir.SaveToFile('factura.xml', TEncoding.UTF8);


4. Firmo la factura

Código Delphi [-] firmante.r_SigPolicyID := 'https://www.gipuzkoa.eus/ticketbai/sinadura'; firmante.r_SigPolicyHash := 'e8daca026eb4a3bbbad85510c3365ec36e2b6b6bdef4f4506300b6d4033a227d'; //6NrKAm60o7u62FUQwzZew24ra2ve9PRQYwC21AM6In0= convertido a HEX firmante.r_SigPolicyURI := 'https://www.gipuzkoa.eus/ticketbai/sinadura'; FirmarXML('factura.xml',firmante);


5. Vuelvo a cargar el XML ya firmado en un XMLDocument:

Código Delphi [-] xmldocument1.Active:=false; xmldocument1.LoadFromFile('firmado.xml'); xmldocument1.Active:=true;


6. Uso el código SaveAsUTF8 encontrado en el foro para guardar el archivo en UTF-8 SIN BOM

Código Delphi [-] SaveAsUTF8('firmado.xml', xmldocument1.XML);


7. Ya tenemos el archivo firmado. Ahora hago el envío:

Código Delphi [-] RequestBody := TFileStream.Create('firmado.xml', fmOpenRead); NetHTTPClient1.SecureProtocols := [THTTPSecureProtocol.TLS12]; NetHTTPClient1.CustomHeaders['Content-Type'] := 'application/xml'; NetHTTPClient1.CustomHeaders['Charset'] := 'UTF-8'; AResponse := NetHTTPClient1.Post('https://tbai-prep.egoitza.gipuzkoa.eus/WAS/HACI/HTBRecepcionFacturasWEB/rest/recepcionFacturas/alta',RequestBody);


¿Dónde puede estar el problema? Las facturas se envían (en el entorno de pruebas). De hecho si intento reenviarla, me dice que ya ha sido enviada.

PD: aunque conste como enviada, si voy a la URL del TicketBAI obtenido...

Por ejemplo: https://tbai.prep.gipuzkoa.eus/qr/?i...=100.00&cr=112

...me devuelve "No se ha podido determinar el estado de la factura"
Hola, no sé si te va a funcionar pero yo hago un par de cosas diferentes:

1. Una vez firmado no lo paso a UTF-8, solo antes.
2. Prueba a cambiar esto en la Cabecera:
xsi:schemaLocation="http://www.w3.org/TR/xmldsig-core/xmldsig-core-schema.xsd"

3: Las politicas de firma no cuadran con las mias, falta el digest:
"name" => "Politica de firma TicketBAI 1.0",
"url" => "https://www.gipuzkoa.eus/ticketbai/sinadura",
"digest" => "dTtPpv4fWTcejeVx7+91ILruFX3HysbngBlllJm4i/E="
Responder Con Cita
  #4  
Antiguo 04-10-2021
espinete espinete is offline
Miembro
 
Registrado: mar 2009
Posts: 667
Poder: 18
espinete Va camino a la fama
Cita:
Empezado por ermendalenda Ver Mensaje
Hola, no sé si te va a funcionar pero yo hago un par de cosas diferentes:

1. Una vez firmado no lo paso a UTF-8, solo antes.
2. Prueba a cambiar esto en la Cabecera:
xsi:schemaLocation="http://www.w3.org/TR/xmldsig-core/xmldsig-core-schema.xsd"

3: Las politicas de firma no cuadran con las mias, falta el digest:
"name" => "Politica de firma TicketBAI 1.0",
"url" => "https://www.gipuzkoa.eus/ticketbai/sinadura",
"digest" => "dTtPpv4fWTcejeVx7+91ILruFX3HysbngBlllJm4i/E="
Si elimino el SaveAsUTF8 tras hacer la firma, no me admite el envío. Me devuelve un error que dice algo así como "no se admite contenido en el prolog".

Cambiando el xsi:schemaLocation del XML por "http://www.w3.org/TR/xmldsig-core/xmldsig-core-schema.xsd" en vez de "urn:ticketbai:emision ticketBaiV12.xsd" no afecta al resultado. Obtengo el mismo error 008 de mi anterior post.

Por cierto, en mi anterior post al convertir el texto a código Delphi se comió parte del código.
Esto es lo que hago para cambiar la cabecera del XML, una vez generado:

....
FicheroCorregir.Text := AnsiReplaceStr(FicheroCorregir.Text, '<TicketBai xmlns="urn:ticketbai:emision">','<T:TicketBai xmlns:T="urn:ticketbai:emision" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:ticketbai:emision ticketBaiV12.xsd">');
FicheroCorregir.Text := AnsiReplaceStr(FicheroCorregir.Text,'</TicketBai>', '</T:TicketBai>');
....

No he entendido lo de las políticas de firma y que falta el digest... Antes solo puse parte del código, para resumir. Pongo ahora el resto, si es que te refieres a esta parte:

firmante.r_Nombre_firma := nom_emp_emisora;
firmante.r_ID := '';
firmante.r_Metodo_Canonicalization := '';
firmante.r_Hash_algorithm := 'SHA256';
firmante.r_SigPolicyHashAlgorithm := 'SHA256';
//Gipuzkoa
firmante.r_SigPolicyID := 'https://www.gipuzkoa.eus/ticketbai/sinadura';
firmante.r_SigPolicyHash := 'e8daca026eb4a3bbbad85510c3365ec36e2b6b6bdef4f4506300b6d4033a227d'; //6NrKAm60o7u62FUQwzZew24ra2ve9PRQYwC21AM6In0= convertido a HEX es e8daca026eb4a3bbbad85510c3365ec36e2b6b6bdef4f4506300b6d4033a227d
firmante.r_SigPolicyURI := 'https://www.gipuzkoa.eus/ticketbai/sinadura';

Utilizo los componentes de SecureBlackBox 2020 para la firma.

Alguna pista?
Responder Con Cita
  #5  
Antiguo 04-10-2021
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 2.764
Poder: 7
ermendalenda Va por buen camino
Ese error la mayoría de las veces es por que hay caracteres extraños o el uri ml definido(que no parece el caso?) Edita el fichero antes de firmarlo con mswordpad. No pases utf8 firmalo y envíalo.
Si quieres mandar el xml par que lo repasemos cambiándole los datos...
Responder Con Cita
  #6  
Antiguo 04-10-2021
espinete espinete is offline
Miembro
 
Registrado: mar 2009
Posts: 667
Poder: 18
espinete Va camino a la fama
Hola

Estoy probando a hacer varios envíos seguidos de facturas a distintos clientes, para comprobar si hay algún caracter especial en el nombre del cliente, etc.

En algunos envíos me devuelve el error Codigo 008: Error en verificación de firma.
En otros me devuelve el error Codigo 008: El mensaje ha sido modificado en tránsito o la firma no está bien realizada -- Reference URI="" failed to verify. Reference URI="#SignedProperties-1610103204" failed to verify. [src/xml2signatureobj.cpp(315)] - (10606)

En cualquier caso, el envío se realiza y la factura consta como enviada (no puedo subirla de nuevo porque ya existe).

En el entorno de pruebas que estoy desarrollando, guardo el archivo xml ANTES y DESPUÉS de firmarlo. Abriéndolos con el Notepad++ veo que ambos tienen codificación UTF-8 SIN BOM.

¿Hay alguna utilidad online donde poder verificar los XML de ticketbai?
Responder Con Cita
  #7  
Antiguo 04-10-2021
Band Band is offline
Miembro
 
Registrado: may 2021
Posts: 35
Poder: 0
Band Va por buen camino
Cita:
Empezado por espinete Ver Mensaje
Hola

Estoy probando a hacer varios envíos seguidos de facturas a distintos clientes, para comprobar si hay algún caracter especial en el nombre del cliente, etc.

En algunos envíos me devuelve el error Codigo 008: Error en verificación de firma.
En otros me devuelve el error Codigo 008: El mensaje ha sido modificado en tránsito o la firma no está bien realizada -- Reference URI="" failed to verify. Reference URI="#SignedProperties-1610103204" failed to verify. [src/xml2signatureobj.cpp(315)] - (10606)

En cualquier caso, el envío se realiza y la factura consta como enviada (no puedo subirla de nuevo porque ya existe).

En el entorno de pruebas que estoy desarrollando, guardo el archivo xml ANTES y DESPUÉS de firmarlo. Abriéndolos con el Notepad++ veo que ambos tienen codificación UTF-8 SIN BOM.

¿Hay alguna utilidad online donde poder verificar los XML de ticketbai?

Una vez firmado el xml no puedes volver a guardarlo. Es decir, cuando lo firmas tienes que dejarlo tal cual y no puedes realizar ninguna acción sobre el (obviamente si puedes enviar el fichero, copiarlo, moverlo... pero nada más, ni volver a guardarlo ni añadir un caracter en blanco al final ni nada).

Yo para probar el tema de caracteres raros, uso como propuso alguien del foro (igual voy equivocado, pero creo que era Neftali) esta cadena: áéíóúÁÉÍÓÚÜçÇñÑ€~#@ <--- Puede ser más compleja y rara, pero con esto a mi me vale
Responder Con Cita
  #8  
Antiguo 04-10-2021
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 2.764
Poder: 7
ermendalenda Va por buen camino
Cita:
Empezado por espinete Ver Mensaje
Hola

Estoy probando a hacer varios envíos seguidos de facturas a distintos clientes, para comprobar si hay algún caracter especial en el nombre del cliente, etc.

En algunos envíos me devuelve el error Codigo 008: Error en verificación de firma.
En otros me devuelve el error Codigo 008: El mensaje ha sido modificado en tránsito o la firma no está bien realizada -- Reference URI="" failed to verify. Reference URI="#SignedProperties-1610103204" failed to verify. [src/xml2signatureobj.cpp(315)] - (10606)

En cualquier caso, el envío se realiza y la factura consta como enviada (no puedo subirla de nuevo porque ya existe).

En el entorno de pruebas que estoy desarrollando, guardo el archivo xml ANTES y DESPUÉS de firmarlo. Abriéndolos con el Notepad++ veo que ambos tienen codificación UTF-8 SIN BOM.

¿Hay alguna utilidad online donde poder verificar los XML de ticketbai?

Tiene que quedar así:
Código:
<?xml version="1.0" encoding="UTF-8"?>
<T:TicketBai xmlns:T="urn:ticketbai:emision" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/TR/xmldsig-core/xmldsig-core-schema.xsd">
<Cabecera>
<IDVersionTBAI>1.2</IDVersionTBAI>
</Cabecera>

.
.
.
.
<HuellaTBAI>
.
.
.
</HuellaTBAI>
<ds:Signature 
.
.
..
</ds:Signature>
</T:TicketBai>
Aquí te dejo un par de verificadores de xmls firmados, que están en el foro(No de ticketbai, son genéricos):
http://tools.chilkat.io/xmlDsigVerif...#generatedCode
https://web.uanataca.com/pe/servicio...ma-electronica
Responder Con Cita
  #9  
Antiguo 04-10-2021
Ramon88 Ramon88 is offline
Miembro
 
Registrado: ago 2021
Posts: 157
Poder: 5
Ramon88 Va por buen camino
Cita:
Empezado por espinete Ver Mensaje
Hola

Estoy probando a hacer varios envíos seguidos de facturas a distintos clientes, para comprobar si hay algún caracter especial en el nombre del cliente, etc.

En algunos envíos me devuelve el error Codigo 008: Error en verificación de firma.
En otros me devuelve el error Codigo 008: El mensaje ha sido modificado en tránsito o la firma no está bien realizada -- Reference URI="" failed to verify. Reference URI="#SignedProperties-1610103204" failed to verify. [src/xml2signatureobj.cpp(315)] - (10606)

En cualquier caso, el envío se realiza y la factura consta como enviada (no puedo subirla de nuevo porque ya existe).

En el entorno de pruebas que estoy desarrollando, guardo el archivo xml ANTES y DESPUÉS de firmarlo. Abriéndolos con el Notepad++ veo que ambos tienen codificación UTF-8 SIN BOM.

¿Hay alguna utilidad online donde poder verificar los XML de ticketbai?

A mi me pasaba algo aprecido y era por que al pasarlo a una variable luego lo ponía todo en 1 linea.


Código:
Dim xmlDoc As New XmlDocument
xmlDoc.PreserveWhitespace = True
xmlDoc.Load(pathXML)
Responder Con Cita
  #10  
Antiguo 07-10-2021
unomasmas unomasmas is offline
Miembro
 
Registrado: dic 2019
Posts: 194
Poder: 7
unomasmas Va por buen camino
Cita:
Empezado por ermendalenda Ver Mensaje
El último crc del último caso está mal.
No puedes poner el mismo. Tienes que calcularlo según lo que has cambiado. Es lioso pero es así
No sé si ya lo has solucionado. Si no, como creo que también lo estás programando en C#, por si te sirve (si no a ti, tal vez a otro) dejo la función que tengo por ahora y un par de ellas auxiliares para obtener el dato.
Código:
/// <summary>
/// Obtiene la cadena para el código QR
/// </summary>
/// <param name="xmlFile">Fichero XML del que obtener info: Fichero Ticket-BAI</param>
/// <param name="serverConsulta">la parte fija de conexión al servidor, según la Diputación</param>
/// <param name="encoded">Codificamos o no?</param>
/// <param name="tBaiId">Opcional. Podemos pasar el identificador TBAI. Si no, lo obtiene del XML Ticket-BAI</param>
/// <returns></returns>
public static string GetQRCodeString(string xmlFile, string serverConsulta, bool encoded, string tBaiId="")
{
    try
    {
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(xmlFile);

        if (tBaiId == string.Empty)
        {
            tBaiId = GetTBaiId(xmlFile);
        }
        if (encoded)
        {
            tBaiId = GetURLEncodedString(tBaiId);
        }

        string result = serverConsulta;
        result += @"?id=" + tBaiId;
        result += @"&s=" + xmlDoc.DocumentElement.GetValue("//Factura/CabeceraFactura/SerieFactura");
        result += @"&nf=" + xmlDoc.DocumentElement.GetValue("//Factura/CabeceraFactura/NumFactura");
        result += @"&i=" + xmlDoc.DocumentElement.GetValue("//Factura/DatosFactura/ImporteTotalFactura");
        result += @"&cr=" + GetCrc8(result);

        return result;
    }
    catch (Exception ex)
    {
        System.Windows.Forms.MessageBox.Show(ex.Message, System.Reflection.MethodBase.GetCurrentMethod().Name, System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
        return null;
    }
}

/// <summary>
/// Obtiene identificador TBAI
/// </summary>
/// <param name="xmlFile">Fichero Ticket-BAI de donde sacar la info para obtener el identificar</param>
/// <returns>Cadena con el identificador</returns>
public static string GetTBaiId(string xmlFile)
{
    try
    {
        string result;
        string separador = "-";
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(xmlFile);

        string nif = xmlDoc.DocumentElement.GetValue("//Sujetos/Emisor/NIF").PadLeft(9, '0');  //9 NIF Emisor

        string fechaExpedicion = xmlDoc.DocumentElement.GetValue("//Factura/CabeceraFactura/FechaExpedicionFactura");  //Fecha Formato dd-mm-yyyy
        DateTime parsedDate;
        DateTime.TryParseExact(fechaExpedicion, "dd-MM-yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out parsedDate);
        fechaExpedicion = parsedDate.ToString("ddMMyy");

        string signatureValue = GetSignatureValue(xmlDoc, 13);

        result = "TBAI" + separador;
        result += nif + separador;
        result += fechaExpedicion + separador;
        result += signatureValue + separador;
        result += GetCrc8(result);

        return result;
    }
    catch (Exception ex)
    {
        System.Windows.Forms.MessageBox.Show(ex.Message, System.Reflection.MethodBase.GetCurrentMethod().Name, System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
        return null;
    }
}

/// <summary>
/// Codifica una cadena para dar formato URI
/// </summary>
/// <param name="inputString">La cadena a codificar</param>
/// <returns>La cadena codificada</returns>
private static string GetURLEncodedString(string inputString)
{
    string result = Uri.EscapeDataString(inputString);
    return result;
}
Responder Con Cita
  #11  
Antiguo 24-11-2023
MrRipley MrRipley is offline
Registrado
 
Registrado: nov 2023
Posts: 2
Poder: 0
MrRipley Va por buen camino
Consulta función GetCrc8

Hola, unomasmas
Igual te sorprende una respuesta a tu post 4 años después de publicarlo, pero estoy con un programa de TicketBai que no consigo rematar.
Tu código me puede ser útil, pero me falta el punto más importante para mí código:

¿Cuál es la implementación para tu función "GetCrc8"?

Estoy creando links de QR con Batuz, Bizkaia, y me falla siempre el código CRC. He probado varias funciones. El algoritmo de la documentación está en java. He hecho "mi versión" del mismo, pero los códigos CRC siguen siendo incorrectos.
Un saludo


Cita:
Empezado por unomasmas Ver Mensaje
No sé si ya lo has solucionado. Si no, como creo que también lo estás programando en C#, por si te sirve (si no a ti, tal vez a otro) dejo la función que tengo por ahora y un par de ellas auxiliares para obtener el dato.
Código:
/// <summary>
/// Obtiene la cadena para el código QR
/// </summary>
/// <param name="xmlFile">Fichero XML del que obtener info: Fichero Ticket-BAI</param>
/// <param name="serverConsulta">la parte fija de conexión al servidor, según la Diputación</param>
/// <param name="encoded">Codificamos o no?</param>
/// <param name="tBaiId">Opcional. Podemos pasar el identificador TBAI. Si no, lo obtiene del XML Ticket-BAI</param>
/// <returns></returns>
public static string GetQRCodeString(string xmlFile, string serverConsulta, bool encoded, string tBaiId="")
{
    try
    {
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(xmlFile);

        if (tBaiId == string.Empty)
        {
            tBaiId = GetTBaiId(xmlFile);
        }
        if (encoded)
        {
            tBaiId = GetURLEncodedString(tBaiId);
        }

        string result = serverConsulta;
        result += @"?id=" + tBaiId;
        result += @"&s=" + xmlDoc.DocumentElement.GetValue("//Factura/CabeceraFactura/SerieFactura");
        result += @"&nf=" + xmlDoc.DocumentElement.GetValue("//Factura/CabeceraFactura/NumFactura");
        result += @"&i=" + xmlDoc.DocumentElement.GetValue("//Factura/DatosFactura/ImporteTotalFactura");
        result += @"&cr=" + GetCrc8(result);

        return result;
    }
    catch (Exception ex)
    {
        System.Windows.Forms.MessageBox.Show(ex.Message, System.Reflection.MethodBase.GetCurrentMethod().Name, System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
        return null;
    }
}

/// <summary>
/// Obtiene identificador TBAI
/// </summary>
/// <param name="xmlFile">Fichero Ticket-BAI de donde sacar la info para obtener el identificar</param>
/// <returns>Cadena con el identificador</returns>
public static string GetTBaiId(string xmlFile)
{
    try
    {
        string result;
        string separador = "-";
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(xmlFile);

        string nif = xmlDoc.DocumentElement.GetValue("//Sujetos/Emisor/NIF").PadLeft(9, '0');  //9 NIF Emisor

        string fechaExpedicion = xmlDoc.DocumentElement.GetValue("//Factura/CabeceraFactura/FechaExpedicionFactura");  //Fecha Formato dd-mm-yyyy
        DateTime parsedDate;
        DateTime.TryParseExact(fechaExpedicion, "dd-MM-yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out parsedDate);
        fechaExpedicion = parsedDate.ToString("ddMMyy");

        string signatureValue = GetSignatureValue(xmlDoc, 13);

        result = "TBAI" + separador;
        result += nif + separador;
        result += fechaExpedicion + separador;
        result += signatureValue + separador;
        result += GetCrc8(result);

        return result;
    }
    catch (Exception ex)
    {
        System.Windows.Forms.MessageBox.Show(ex.Message, System.Reflection.MethodBase.GetCurrentMethod().Name, System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
        return null;
    }
}

/// <summary>
/// Codifica una cadena para dar formato URI
/// </summary>
/// <param name="inputString">La cadena a codificar</param>
/// <returns>La cadena codificada</returns>
private static string GetURLEncodedString(string inputString)
{
    string result = Uri.EscapeDataString(inputString);
    return result;
}
Responder Con Cita
  #12  
Antiguo 24-11-2023
MaeseKvothe MaeseKvothe is offline
Miembro
 
Registrado: abr 2023
Posts: 44
Poder: 0
MaeseKvothe Va por buen camino
Cita:
Empezado por MrRipley Ver Mensaje
Hola, unomasmas
Igual te sorprende una respuesta a tu post 4 años después de publicarlo, pero estoy con un programa de TicketBai que no consigo rematar.
Tu código me puede ser útil, pero me falta el punto más importante para mí código:

¿Cuál es la implementación para tu función "GetCrc8"?

Estoy creando links de QR con Batuz, Bizkaia, y me falla siempre el código CRC. He probado varias funciones. El algoritmo de la documentación está en java. He hecho "mi versión" del mismo, pero los códigos CRC siguen siendo incorrectos.
Un saludo

No viene directamente a mí la pregunta pero yo también lo tengo hecho en C#, así que tal vez te pueda echar una mano aunque a mi función no la he llamado "GetCrc8".
Te paso la clase completa:
Código Delphi [-]
    public class CRC8Calc
    {
        private const string UTF_8 = "UTF-8";
        private static 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 };
        public static String Calculate(string input)
        {
            byte[] data = Encoding.ASCII.GetBytes(input);
            int len = data.Length;
            int crc = 0;
            for (int i = 0; i < len; i++)
            {
                crc = CRC8Calc.crc8_table[(crc ^ data[i]) & 0xff];
            }
            return String.Format("{0:000}", crc & 0xFFL);
        }
    }

Última edición por Casimiro Noteví fecha: 24-11-2023 a las 20:20:28.
Responder Con Cita
  #13  
Antiguo 24-11-2023
MrRipley MrRipley is offline
Registrado
 
Registrado: nov 2023
Posts: 2
Poder: 0
MrRipley Va por buen camino
Gracias!

Pruebo con tu código.
¡Muchas gracias!
Responder Con Cita
  #14  
Antiguo 27-11-2023
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is online now
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 19.441
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por MrRipley Ver Mensaje
¿Cuál es la implementación para tu función "GetCrc8"?

Al inicio de este hilo, en el mensaje 2, hay links a implementaciones de código de diferentes temas, entre ellos varias implementaciones del CRC8.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #15  
Antiguo 27-11-2023
VictorCasajuana VictorCasajuana is offline
Registrado
 
Registrado: oct 2022
Posts: 4
Poder: 0
VictorCasajuana Va por buen camino
validar xml con xsd

Hola!
He estado revisando en el hilo si alguien validaba los xml generados contra los xsd y no veo que nadie lo haga. No es buena práctica? me estoy planteando validarlos antes de enviarlos para minimizar los errores.
Gracias!
Responder Con Cita
  #16  
Antiguo 27-11-2023
Sistel Sistel is offline
Miembro
 
Registrado: nov 2019
Ubicación: Bilbao
Posts: 484
Poder: 7
Sistel Va por buen camino
Cita:
Empezado por VictorCasajuana Ver Mensaje
Hola!
He estado revisando en el hilo si alguien validaba los xml generados contra los xsd y no veo que nadie lo haga. No es buena práctica? me estoy planteando validarlos antes de enviarlos para minimizar los errores.
Gracias!
Hola,

Yo utilizo PHP y valido en XML creado contra el XSD
Código PHP:
function VALIDAR_XML($xml$fichero_xsd) {
    
// Valida un string xml frente a un fichero de esquema xsd
    // No devuelve nada si ha ido bien y los errores si ha ido mal
    
libxml_use_internal_errors(true);
    
$domDocument = new DOMDocument();
    
$domDocument->loadXML($xml);
    if (!
$domDocument->schemaValidate($fichero_xsd)) {
        
$errores libxml_get_errors();
        
libxml_clear_errors();        
        return 
$errores// Devuelve array de errores si los hay o nada si no hay errores
    
}

Eso sí, la función DOMDocument::schemaValidate de PHP no permite que la URL del schemaLocation sea externa.
Así que tuve que cambiar la línea de import del XSD a:
Código:
<import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="xmldsig-core-schema.xsd"/>
y guardar el fichero xmldsig-core-schema.xsd en el mismo directorio.

Pero funciona perfecto y valida frente al XSD.

Saludos
Responder Con Cita
  #17  
Antiguo 28-11-2023
unomasmas unomasmas is offline
Miembro
 
Registrado: dic 2019
Posts: 194
Poder: 7
unomasmas Va por buen camino
Cita:
Empezado por MrRipley Ver Mensaje
Hola, unomasmas
Igual te sorprende una respuesta a tu post 4 años después de publicarlo, pero estoy con un programa de TicketBai que no consigo rematar.
Tu código me puede ser útil, pero me falta el punto más importante para mí código:

¿Cuál es la implementación para tu función "GetCrc8"?

Estoy creando links de QR con Batuz, Bizkaia, y me falla siempre el código CRC. He probado varias funciones. El algoritmo de la documentación está en java. He hecho "mi versión" del mismo, pero los códigos CRC siguen siendo incorrectos.
Un saludo
Así es como lo tengo yo:
Código:
        private static readonly byte[] _crc8Table = 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 };

        /// <summary>
        /// Calculate the CRC value with data from input string.
        /// </summary>
        /// <param name="input">input string</param>
        /// <returns>The calculated CRC value. Left padding with zeros</returns>
        private string GetCrc8(string input)
        {
            try
            {
                byte[] data = System.Text.Encoding.UTF8.GetBytes(input);
                int len = data.Length;
                byte crc = 0;
                for (int i = 0; i < len; i++)
                    crc = _crc8Table[(crc ^ data[i]) & 0xff];
                long a = (crc & 0xFFL);
                return a.ToString("D3");
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.Message,  System.Reflection.MethodBase.GetCurrentMethod().Name,  MessageBoxButtons.OK, MessageBoxIcon.Error,  MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly);
                return null;
            }
        }
Responder Con Cita
  #18  
Antiguo 05-12-2023
Sistel Sistel is offline
Miembro
 
Registrado: nov 2019
Ubicación: Bilbao
Posts: 484
Poder: 7
Sistel Va por buen camino
Hola,

Hemos recibido email, de TicketBAI de Gipuzkoa, de aviso de cambios de la estructura de los XML a partir del 1 de enero de 2024.
Se acompaña de los nuevos XSD.

No puedo subir el documento porque el foro no me permite ese tamaño de fichero.
Si el administrador puede subirlo, se agradece.

Saludos
Responder Con Cita
  #19  
Antiguo 05-12-2023
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is online now
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 19.441
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Sistel Ver Mensaje
Hemos recibido email, de TicketBAI de Gipuzkoa, de aviso de cambios de la estructura de los XML a partir del 1 de enero de 2024.
Se acompaña de los nuevos XSD.
Yo e recibido el mail.
Creo que las modificaciones de las que habla, son la que ya han comentado las otras administraciones.
De todas formas, pone que en "breve se publicarán" los esquemas. Yo los descargué ayer y siguen estando en la web los de la v.1.2.1 .

Si disponéis de los nuevos de la versión 1.2.2, dímelo y me los envías por privado y los subo a la web.

Me corrijo yo mismo. En la web de Guipuzcoa y de Álava está la v.1.2.1, pero en la de Vizcaya ya está la v.1.2.2 (alta / anulación)

Los subo al FTP y modifico el mensaje #1 del hilo.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.

Última edición por Neftali [Germán.Estévez] fecha: 05-12-2023 a las 11:56:23.
Responder Con Cita
  #20  
Antiguo 05-12-2023
Sistel Sistel is offline
Miembro
 
Registrado: nov 2019
Ubicación: Bilbao
Posts: 484
Poder: 7
Sistel Va por buen camino
Hola,

Os paso los nuevos XSD de la versión 1.2.2 enviados por Gipuzkoa.

Saludos
Archivos Adjuntos
Tipo de Archivo: zip TicketBAI Alta Anulacion Zuzendu Osatu1_2_2.zip (11,6 KB, 7 visitas)
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
SII -Nuevo sistema de la Agencia Tributaria española de envío de datos vía Webservice newtron Internet 3716 19-01-2026 20:01:34
Como utilizar la ayuda del nuevo Sistema Operativo gluglu Humor 3 24-09-2007 09:39:05
Aplicacion Agencia De Viajes ArdiIIa Varios 9 20-01-2007 16:49:53
El Vasco Aguirre Al González La Taberna 5 26-05-2006 09:22:28
Microsoft ha lanzado su nuevo sistema operativo DarkByte Humor 0 25-01-2004 09:21:14


La franja horaria es GMT +2. Ahora son las 11:13:52.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi