Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   TICKET BAI (TicketBAI); Nuevo sistema de la Agencia Tributaria del Pais Vasco (https://www.clubdelphi.com/foros/showthread.php?t=94264)

unomasmas 26-10-2021 21:59:53

Cita:

Empezado por ermendalenda (Mensaje 543762)
Ahora si que la hemos liado.
A ver que se considera distinta aplicación o no, si tengo un proceso en segundo plano que espera los pagos que ha lanzado la aplicación principal y la aplicación principal puede seguir haciendo facturas pero la serie es la misma.... Madre mía..

No sé si tu caso se podría considerar como dos aplicaciones distintas. Yo se lo plantearía directamente a ellos...

Sistel 26-10-2021 22:45:44

Cita:

Empezado por elcharlie (Mensaje 543743)
Buenas, ¿sabéis si se puede comprobar que un fichero xml de factura TBai, cumple con el esquema xsd? porque me estoy partiendo los cuernos para intentar comprobarlo, y no encuentro ninguna solución. No sé si alguien puede echarme una mano...

Hola elcharlie,

Yo lo hago con PHP

Código PHP:

function VALIDAR_XML($xml$xsd) {
    
// Valida un string xml frente a un string de esquema xsd
    // Devuelve array de errores si los hay, o nada si no hay errores
    
libxml_use_internal_errors(true);
    
$domDocument= new DOMDocument();
    
$domDocument->loadXML($xml);
    if (!
$domDocument->schemaValidate($xsd)) {
        
$errores libxml_get_errors();
        
libxml_clear_errors();
        return 
$errores;
    } else {
        return;
    }


Saludos

Sistel 26-10-2021 23:01:13

Cita:

Empezado por espinete (Mensaje 543742)
...
Por cierto, una duda que me surge ahora... ¿cómo hacéis con "ClaveRegimenIvaOpTrascendencia"? ¿Es un dato que depende del negocio (emisor) o de cada factura?

Permite estos valores:
01=Regimen General
02=Exportación
03=Bienes usados, arte, antiguedades
04.....

Se supone que es un dato genérico por empresa? O cada factura puede tener un valor distinto según lo que se venda? Porque si es esto último, no veo yo a los clientes rellenando un dato más (obligatorio) antes de guardar cada venta.

Hola espinete,

No es un dato de la empresa sino de la factura.
Aunque en general, para la mayor parte de emisores será la que le corresponda por su régimen de IVA ante Hacienda:
- 01 Operación de régimen general y cualquier otro supuesto que no esté recogido en los siguientes valores
- 51 Operaciones en recargo de equivalencia
- 52 Operaciones en régimen simplificado

Pero se puede dar el caso de que por el tipo de operación sea, por ejemplo:
- 02 Exportación
- 11 Operaciones de arrendamiento de local de negocio sujetas a retención.
- 12 Operaciones de arrendamiento de local de negocio no sujetas a retención.
- 13 Operaciones de arrendamiento de local de negocio sujetas y no sujetas a retención.

Pero si te fijas, verás que se permiten hasta 3 claves para una misma factura.
Con ello creo que se pueden cubrir la mayoría de casos.

Saludos

ermendalenda 27-10-2021 06:47:28

Cita:

Empezado por Sistel (Mensaje 543767)
Hola elcharlie,

Yo lo hago con PHP

Código PHP:

function VALIDAR_XML($xml$xsd) {
    
// Valida un string xml frente a un string de esquema xsd
    // Devuelve array de errores si los hay, o nada si no hay errores
    
libxml_use_internal_errors(true);
    
$domDocument= new DOMDocument();
    
$domDocument->loadXML($xml);
    if (!
$domDocument->schemaValidate($xsd)) {
        
$errores libxml_get_errors();
        
libxml_clear_errors();
        return 
$errores;
    } else {
        return;
    }


Saludos

Gracias esto va a venir genial

ermendalenda 27-10-2021 07:36:27

Cita:

Empezado por unomasmas (Mensaje 543766)
No sé si tu caso se podría considerar como dos aplicaciones distintas. Yo se lo plantearía directamente a ellos...

Lo lógico es una sola, es un instalador que instala todas las funciones y que haya un proceso en segundo que genera los tiquets de idéntica forma que si fueran manuales) y que dependa toralmente del proceso principal.
Es una forma de programar que igualmente puede ser con procesos asíncronos desde el mismo ejecutable.

elcharlie 27-10-2021 08:32:38

Cita:

Empezado por unomasmas (Mensaje 543765)
Acabo de publicar cómo lo hago yo. Está en C#. No sé si te sirve. Puedes verlo en https://www.clubdelphi.com/foros/sho...postcount=2039

Gracias, lo intentare adaptar a delphi, a ver si soy capaz, si encuentro solución lo posteo para que lo reutiliceis.

Neftali [Germán.Estévez] 27-10-2021 09:23:59

Cita:

Empezado por APO (Mensaje 543745)
Buenas!! ¿Sabéis como se configura Postman para probar de enviar algún TicketBAI.xml y saber si es correcto? Es la primera vez que lo utilizo y no hay manera. Tampoco sé donde especificarle el xml que quiero enviarle. A ver si me podéis echar una mano, gracias!!!
Adjunto pantallazo de lo que estoy poniendo en Postman:
https://files.fm/thumb_show.php?i=agn9cpwwv


En este hilo explicamos cómo hacerlo con insomnia:
http://clubdelphi.com/foros/showpost...postcount=1029

Es un programa similar.
Te lo comento, porque me resultó más sencillo que hacerlo con PostMan. A mi hubo una temporada que me funcionaba (postman), pero luego dejaron de hacerlo.

keys 27-10-2021 11:05:48

Hola a todos.

No se si alguien esta usando el servicio de consulta de facturas de la hacienda de Bizkaia. Me ocurre lo siguiente.

Tenemos una factura con dos tipos de IVA, uno normal al 21% (S1) y otro una inversión de sujeto pasivo (S2). A la hora de enviar el fichero lo enviamos el desglose de la siguiente manera y se envía correctamente.

Código PHP:

<TipoDesglose>
      <
DesgloseFactura>
          <
Sujeta>
             <
NoExenta>
                <
DetalleNoExenta>
                     <
TipoNoExenta>S1</TipoNoExenta>
                    <
DesgloseIVA>
                           <
DetalleIVA>
                                 <
BaseImponible>1189.50</BaseImponible>
                                 <
TipoImpositivo>21.00</TipoImpositivo>
                                 <
CuotaImpuesto>249.80</CuotaImpuesto>
                                 <
OperacionEnRecargoDeEquivalenciaORegimenSimplificado>N</OperacionEnRecargoDeEquivalenciaORegimenSimplificado>
                        </
DetalleIVA>
                      </
DesgloseIVA>
                  </
DetalleNoExenta>
                 <
DetalleNoExenta>
                     <
TipoNoExenta>S2</TipoNoExenta>
                        <
DesgloseIVA>
                            <
DetalleIVA>
                                <
BaseImponible>450.00</BaseImponible>
                                <
TipoImpositivo>0.00</TipoImpositivo>
                                <
CuotaImpuesto>0.00</CuotaImpuesto>
                                <
OperacionEnRecargoDeEquivalenciaORegimenSimplificado>N</OperacionEnRecargoDeEquivalenciaORegimenSimplificado>
                            </
DetalleIVA>
                      </
DesgloseIVA>
                 </
DetalleNoExenta>
             </
NoExenta>
        </
Sujeta>
   </
DesgloseFactura>
</
TipoDesglose

Es decir hay que añadir dos tipos de la etiqueta <DetalleNoexenta> dentro de la etiqueta <NoExenta> uno de tipo S1 y otro de tipo S2.

Pero cuando se hace la consulta al servicio de consulta el fichero devuelto tiene la siguiente estructura.
Código PHP:

<TipoDesglose>
      <
DesgloseFactura>
         <
Sujeta>
            <
NoExenta>
               <
DetalleNoExenta>
                       <
TipoNoExenta>S1</TipoNoExenta>
                        <
DesgloseIVA>
                             <
DetalleIVA>
                                  <
BaseImponible>1189.50</BaseImponible>
                                  <
TipoImpositivo>21.00</TipoImpositivo>
                                  <
CuotaImpuesto>249.80</CuotaImpuesto>
                                  <
OperacionEnRecargoDeEquivalenciaORegimenSimplificado>N</OperacionEnRecargoDeEquivalenciaORegimenSimplificado>
                           </
DetalleIVA>
                       </
DesgloseIVA>
                </
DetalleNoExenta>
            </
NoExenta>
          <
NoExenta>
            <
DetalleNoExenta>
                  <
TipoNoExenta>S2</TipoNoExenta>
                  <
DesgloseIVA>
                        <
DetalleIVA>
                              <
BaseImponible>450.00</BaseImponible>
                              <
TipoImpositivo>0.00</TipoImpositivo>
                              <
CuotaImpuesto>0.00</CuotaImpuesto>
                             <
OperacionEnRecargoDeEquivalenciaORegimenSimplificado>N</OperacionEnRecargoDeEquivalenciaORegimenSimplificado>
                       </
DetalleIVA>
                  </
DesgloseIVA>
              </
DetalleNoExenta>
           </
NoExenta>
         </
Sujeta>
   </
DesgloseFactura>
</
TipoDesglose

Es decir lo que esta duplicado es la etiqueta <Noexenta> en vez de <DetalleNoExenta> dentro de ella por lo que al cargar el fichero sólo retorna un elemento en vez de dos, ya que esta duplicada <Noexenta>.

al hacer
Código Delphi [-]
ShowMessage(Resultado240.FacturasEmitidas[i].TicketBai.Factura.TipoDesglose.DesgloseFactura.Sujeta.NoExenta.Count.ToString);

Esto retorna 1 en vez de 2.

¿Alguien lo puede probar?. Por que cualquiera le explica esto a hacienda.

espinete 27-10-2021 12:54:41

Hola a todos...

Como Álava es la única que devuelve los posibles "errores de validación de negocio" al enviar las facturas, me estoy encontrando con varios problemas a la hora de enviar facturas con descuentos por línea, con recargo de equivalencia, retenciones, etc... y no encuentro ninguna factura de prueba que usar como ejemplo para ver las diferencias.

He conseguido enviar sin problema facturas con varios tipos de IVA e incluso con un descuento "global" (por pronto pago, por ejemplo). Entiendo que el problema está en que estoy poniendo mal los importes en algún sitio según las condiciones de cada caso.
¿Alguien podría decirme si en el detalle de la factura (líneas), "ImporteUnitario" e "ImporteTotal" deben reflejar el importe REAL/FINAL de esa línea, con el recargo, descuento, etc. aplicados?

Por ejemplo. Para una Factura EXENTA DE IVA...

Lo que yo hago:

* * * * * * <DetallesFactura>
* * * * * * * * <IDDetalleFactura>
* * * * * * * * * * <DescripcionDetalle>TARJETA SMALL</DescripcionDetalle>
* * * * * * * * * * <Cantidad>1</Cantidad>
* * * * * * * * * * <ImporteUnitario>100.00</ImporteUnitario>
* * * * * * * * * * <Descuento>0.00</Descuento>
* * * * * * * * * * <ImporteTotal>121.00</ImporteTotal>
* * * * * * * * </IDDetalleFactura>
* * * * * * </DetallesFactura>

Pero creo que ImporteTotal debería ser 100.00 en vez de 121.00 si la factura está exenta?


Otro caso: Factura con RETENCIÓN

* * * * * * <DetallesFactura>
* * * * * * * * <IDDetalleFactura>
* * * * * * * * * * <DescripcionDetalle>WEBCAM NGS XPRESSCAM</DescripcionDetalle>
* * * * * * * * * * <Cantidad>1</Cantidad>
* * * * * * * * * * <ImporteUnitario>100.00</ImporteUnitario>
* * * * * * * * * * <Descuento>0.00</Descuento>
* * * * * * * * * * <ImporteTotal>121.00</ImporteTotal>
* * * * * * * * </IDDetalleFactura>
* * * * * * </DetallesFactura>

* * * * * * <ImporteTotalFactura>102.00</ImporteTotalFactura>
* * * * * * <RetencionSoportada>19.00</RetencionSoportada>

¿Debería ImporteTotal (121.00) reflejar la retención también? ¿O tal vez ImporteTotalFactura no deba incluir la retención?

Lo mismo me ocurre con facturas con Recargo de Equivalencia o con Descuento por línea.

¿Debería ImporteTotal reflejar SIEMPRE el importe final de la línea según las condiciones de la factura? ¿o solo el precio "real" del artículo, independientemente de las condiciones de la factura?

Sé que puede resultar obvio, pero no sé cómo hace Araba las validaciones de los totales. La facturación electrónica de otros países se encarga de sumar/restar lo que sea necesario en función de los datos/condiciones de la factura, pero en este caso es "al revés" y debemos indicar nosotros los importes exactos que se van a sumar/restar. Es decir, hay que dárselo todo masticado.

ermendalenda 27-10-2021 14:40:27

Cita:

Empezado por Sistel (Mensaje 543767)
Hola elcharlie,

Yo lo hago con PHP

Código PHP:

function VALIDAR_XML($xml$xsd) {
    
// Valida un string xml frente a un string de esquema xsd
    // Devuelve array de errores si los hay, o nada si no hay errores
    
libxml_use_internal_errors(true);
    
$domDocument= new DOMDocument();
    
$domDocument->loadXML($xml);
    if (!
$domDocument->schemaValidate($xsd)) {
        
$errores libxml_get_errors();
        
libxml_clear_errors();
        return 
$errores;
    } else {
        return;
    }


Saludos

Vaya, se queda bloqueado el servicio php en cuanto llega a esta línea:
if (!$domDocument->schemaValidate($xsd)) {

hago_preguntas 27-10-2021 16:59:39

Cita:

Empezado por elcharlie (Mensaje 543743)
Buenas, ¿sabéis si se puede comprobar que un fichero xml de factura TBai, cumple con el esquema xsd? porque me estoy partiendo los cuernos para intentar comprobarlo, y no encuentro ninguna solución. No sé si alguien puede echarme una mano...

Puedes probar también online en esta dirección (falta el protocolo delante y tiene un espacio, ya que no tengo permisos para poner urls), pegando el xml y el xsd:

[quote]
www .utilities-online.info/xsdvalidation
[quote]

Nosotros los comprobamos usando el API de java:

Cita:

public static void validateXMLSchema(File xsdFile, File xmlFile) throws IOException, SAXException {
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = factory.newSchema(xsdFile);
Validator validator = schema.newValidator();

validator.validate(new StreamSource(xmlFile));
}

ermendalenda 27-10-2021 17:34:45

Cita:

Empezado por ermendalenda (Mensaje 543775)
Vaya, se queda bloqueado el servicio php en cuanto llega a esta línea:
if (!$domDocument->schemaValidate($xsd)) {

Ahora me da otro error
<br />
<b>Warning</b>: DOMDocument::schemaValidate(): Invalid Schema in <b>/..../firmador.php</b> on line <b>72</b><br />
Buahh por qué cada cosa se complica tantooo

hago_preguntas 27-10-2021 19:23:21

Cita:

Empezado por rci (Mensaje 543698)
Hola, he estado haciendo pruebas al generar la ruta para el QR y al final creo que Araba funciona de una forma y Bizkaia y Gipuzkoa de otra.


Estaba haciendo pruebas de QR para Araba y en un caso me contestó lo de "parámetros incorrectos". El identificador TBAI de esa factura tiene una barra /
En mi proceso para generar el QR hacia URL encoding de los valores para construir la URL y después generaba el CRC.

Para Bizkaia y Gipuzkoa esto es correcto y funciona. Pero para Araba no, pregunté y me contestaron que el CRC lo tengo que calcular antes del URL encoding.
Si lo hago de esta forma ya funciona pero claro... preferiria hacerlo siempre igual :o


Probando probando también vi que si no hago URL encoding en ningún momento, y no sustituyo la barra por %2F también funciona y funciona haciendo lo mismo para las tres diputaciones, lo cual me gusta, pero claro, en la documentación dice que tenemos que hacer el encoding y supongo que habrá algún otro carácter que no sea aceptado en una URL y falle si no lo recodifico.


Volví a preguntar a Araba y me contestaron:


Vosotros estais filtrando los valores que pasamos como parámetros en la URL del QR o no? Antes y después de generar el QR dependiendo de la diputación?:p



Muchas gracias y disculpad por tantas preguntas


Saludos

Ya debería de funcionar como el resto de administraciones, escribimos a Álava para preguntar por la inconsistencia con respecto a las especificaciones, y nos respondieron esto:

Cita:

Hemos implantado una nueva versión en la cual no deberíais tener problemas para realizar dicha consulta.



¿Lo podéis probar?



Un saludo y disculpen las molestias.
Lo probamos con varias que no funcionaban, y ya funcionan como indica la especificación.

adolphsys 27-10-2021 20:17:15

Cita:

Empezado por keys (Mensaje 543773)
Hola a todos.

No se si alguien esta usando el servicio de consulta de facturas de la hacienda de Bizkaia. Me ocurre lo siguiente.

...

Hola keys, suprime el <TipoImpositivo> y <CuotaImpuesto> de la línea ISP. En ventas con Inversión de Sujeto Pasivo, el IVA no hay que consignarlo:

Código PHP:

<DetalleIVA>
           <
BaseImponible>450.00</BaseImponible>
           <
OperacionEnRecargoDeEquivalenciaORegimenSimplificado>N</OperacionEnRecargoDeEquivalenciaORegimenSimplificado>
</
DetalleIVA

Y después inténtalo de nuevo.

adolphsys 27-10-2021 20:34:48

Cita:

Empezado por espinete (Mensaje 543774)
Hola a todos...

...

¿Alguien podría decirme si en el detalle de la factura (líneas), "ImporteUnitario" e "ImporteTotal" deben reflejar el importe REAL/FINAL de esa línea, con el recargo, descuento, etc. aplicados?

Hola espinete, el montante de los recargos y descuentos globales (recargo financiero, descuento por pronto pago...), o sea, cargos pie factura, no se incluyen en el <ImporteTotal> de las líneas de detalle.
El <ImporteUnitario> es el precio de venta de la línea de detalle.
Si el artículo de la línea de detalle tiene descuento de venta, su importe (no su porcentaje) hay que consignarlo en <Descuento>
El <ImporteTotal> tiene que ser el propio de la línea de detalle con su IVA (y Recargo de equivalencia en su caso) correspondiente.
Si la factura incluye conceptos adicionales como entregas a cuenta, suplidos... aplicables tras el total de factura, no hay que incluirlos en el fichero TicketBAI.

Espero haberte ayudado.

keys 28-10-2021 09:15:25

Cita:

Empezado por adolphsys (Mensaje 543782)
Hola keys, suprime el <TipoImpositivo> y <CuotaImpuesto> de la línea ISP. En ventas con Inversión de Sujeto Pasivo, el IVA no hay que consignarlo:

Código PHP:

<DetalleIVA>
           <
BaseImponible>450.00</BaseImponible>
           <
OperacionEnRecargoDeEquivalenciaORegimenSimplificado>N</OperacionEnRecargoDeEquivalenciaORegimenSimplificado>
</
DetalleIVA

Y después inténtalo de nuevo.

El problema no esta en el envío, las facturas las envia correctamente, el problema esta en lo que devuelve hacienda en la consulta que no sigue la estructura de los xsd.

Un Saludo

rci 28-10-2021 09:34:28

QR Araba ya funciona igual que las otras
 
Cita:

Empezado por hago_preguntas (Mensaje 543780)
Ya debería de funcionar como el resto de administraciones, escribimos a Álava para preguntar por la inconsistencia con respecto a las especificaciones, y nos respondieron esto:



Lo probamos con varias que no funcionaban, y ya funcionan como indica la especificación.




Hola hago_preguntas, acabo de probar el ejemplo que tenia controlado y es cierto, funciona de las dos forma, igual que las otras diputaciones forales y también con su propio sistema.

Muchas gracias

Sistel 28-10-2021 09:37:09

Cita:

Empezado por ermendalenda (Mensaje 543775)
Vaya, se queda bloqueado el servicio php en cuanto llega a esta línea:
if (!$domDocument->schemaValidate($xsd)) {

Hola ermendalenda,

Comprueba que tienes instalada la extensión libxml de PHP.
Puedes comprobarlo ejecutando
Código PHP:

<?php phpinfo(); ?>

Debe aparecerte una sección de libxml
Si no la tienes instalada, ya sabes ... en mi caso
Código:

apt-get install php7.4-xml
Saludos

Sistel 28-10-2021 09:48:36

Cita:

Empezado por adolphsys (Mensaje 543783)
...
El <ImporteTotal> tiene que ser el propio de la línea de detalle con su IVA (y Recargo de equivalencia en su caso) correspondiente.
...

Hola adolphsys,

¿Seguro que el RE (en el caso de que el destinatario esté obligado) debe estar incluído en el <ImporteTotal> de cada línea de detalle?
Según la descripción: "Importe total CON IVA de la línea de factura."
No dice que deba estar incluído el RE.
Donde sí debe estar el RE detallado es en la sección DetalleIVA -> CuotaRecargoEquivalencia

Saludos

Sistel 28-10-2021 09:52:13

Cita:

Empezado por keys (Mensaje 543785)
El problema no esta en el envío, las facturas las envia correctamente, el problema esta en lo que devuelve hacienda en la consulta que no sigue la estructura de los xsd.

Un Saludo

Hola keys,

Si verificas el XML devuelto por Hacienda contra el esquema XSD ¿te da correcto?
En caso de que no dé correcto, habría que informar a Hacienda Foral.

Saludos


La franja horaria es GMT +2. Ahora son las 01:42:07.

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