Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Ley antifraude 2021 (VERIFACTU) - Programas informáticos (https://www.clubdelphi.com/foros/showthread.php?t=95235)

nuevo1234 09-01-2024 11:06:25

Cita:

Empezado por ermendalenda (Mensaje 553885)
Gracias por compartir.

Hola estoy un poco espeso, he leido esta respuesta y me he quedado con la misma duda que tenua, a raiz de esta respuesta de la aeat, sabeis si realmente los sistemas SÍ VERIFACTU (O sea que envian directamente) tienen que crear algún evento. el de instalación inicio de envio...? no entiendo muy bien el mensaje

Hola,

Lo que yo creo.

El registro de eventos es obligatorio únicamente en el caso de los sistemas no Veri*factu. Los sistemas Veri*factu pueden contar con él, pero es opcional.
Esto se recoge en la Orden Ministerial que está puesta a información pública y se ha publicado el 3 de enero de 2024.

En el pdf "Texto del proyecto" Artículo 3
"…. en tanto actúen como sistemas VERI*FACTU, no les serán de aplicación los artículos 6.b), 6.c), 6.d), 6.e), 6. f), 7.f), 7.h), 7.i), 7.j), 8 y 9 de esta orden."

El artículo 9 es el Registro de eventos.

ermendalenda 09-01-2024 11:28:19

Cita:

Empezado por antoine0 (Mensaje 553900)
¿Ha salido la Orden Ministerial? ¿Dónde está? :confused:

El proyecto de la OM último que puse, está en consulta:
http://www.hacienda.gob.es/Documenta...-1007-2023.pdf
http://www.hacienda.gob.es/Documenta...-1007-2023.pdf
http://www.hacienda.gob.es/Documenta...-1007-2023.pdf

newtron 09-01-2024 11:33:08

Cita:

Empezado por nincillo (Mensaje 553904)
Prueba a poner:
Código:

var
  alta :  AltaFactuSistemaFacturacion;
....

begin
  alta := AltaFactuSistemaFacturacion.Create;
....
end



Gracias pero no va, me marca error aquí:


Código Delphi [-]
var
  alta :   AltaFactuSistemaFacturacion;


Saludos.

ermendalenda 09-01-2024 11:41:46

Certificados electrónicos para el envio
 
Hay otra cosa, por si alguien quiere consultarlo ya al correo de verifactu, o esperar a la OM.
En el proyecto de la OM, dice que el envío se realizará con el certificado del emisor de la factura???? Y so
I lo quiero enviar a través de un tercero, tal y como lo haremos muchos, nos van a obligar a usar repositorios de certificados?

CarlosMz 09-01-2024 11:46:40

Cita:

Empezado por ermendalenda (Mensaje 553910)
Hay otra cosa, por si alguien quiere consultarlo ya al correo de verifactu, o esperar a la OM.
En el proyecto de la OM, dice que el envío se realizará con el certificado del emisor de la factura???? Y so
I lo quiero enviar a través de un tercero, tal y como lo haremos muchos, nos van a obligar a usar repositorios de certificados?

Interesante cuestión... Si obligan a usar el certificado de cada cliente y lo tenemos que almacenar con su clave tendremos que ser proveedores de confianza (reglamento eIDAS) ?

nincillo 09-01-2024 11:53:10

Cita:

Empezado por newtron (Mensaje 553909)
Gracias pero no va, me marca error aquí:


Código Delphi [-]
var
  alta :   AltaFactuSistemaFacturacion;


Saludos.

¿Qué error te pone?

¿Qué importación del wsdl estás utilizando?. ¿La que publicó @Neftali junto en el mismo post con el código de ejemplo o una importación que has hecho tu directamente?

newtron 09-01-2024 12:09:04

Cita:

Empezado por nincillo (Mensaje 553912)
¿Qué error te pone?

¿Qué importación del wsdl estás utilizando?. ¿La que publicó @Neftali junto en el mismo post con el código de ejemplo o una importación que has hecho tu directamente?


He actualizado el fichero SistemaFacturacion.pas y ahora si me lo coge. Sigo revisando.


Gracias y un saludo.

nincillo 09-01-2024 12:27:16

Cita:

Empezado por newtron (Mensaje 553913)
He actualizado el fichero SistemaFacturacion.pas y ahora si me lo coge. Sigo revisando.


Gracias y un saludo.

Perdona la insistencia, pero es por curiosidad de acuerdo al "misterio" que tengo yo al importar los wsdl, que dependiendo de la versión que escoja a la hora de importar, me lo importa diferente.

La "actualización" a la que te refieres, la hiciste descargando el wsdl mediante la url correspondiente o lo hiciste sustituyendo con el fichero que publicó @Neftali.

a) En el caso de hacerlo mediante la url, ¿puedes decirme en el dialogo de delphi que te sale durante la importación, cual de las 3 opciones escogiste?.
b) En el caso de utilizar el fichero publicado por @Neftali, la versión antigua, ¿también era del fichero publicado por @Neftali días atrás?.

Gracias y un saludo.

newtron 09-01-2024 12:40:15

[quote='Neftali [Germán.Estévez];553902']
En este caso genera un fichero como este:

Código:

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding">
    <SOAP-ENV:Body xmlns:NS1="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SistemaFacturacion.wsdl" xmlns:NS2="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd" xmlns:NS3="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd">
        <NS1:AltaFactuSistemaFacturacion SOAP-ENV:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
            <AltaFactuSistemaFacturacion SOAP-ENC:id="1" xsi:type="NS2:AltaFactuSistemaFacturacion">
                <Cabecera SOAP-ENC:id="2" xsi:type="NS3:Cabecera">
                    <IDVersion xsi:type="NS3:VersionType">1.0</IDVersion>
                    <ObligadoEmision SOAP-ENC:id="3" xsi:type="NS3:PersonaFisicaJuridicaESType">
                        <NombreRazon xsi:type="xsd:string">Empresa pruebas</NombreRazon>
                        <NIF xsi:type="xsd:string">11111111H</NIF>
                    </ObligadoEmision>
                    <TipoRegistroAEAT xsi:type="NS3:TipoRegistroAEATType">T0</TipoRegistroAEAT>
                    <FechaFinVeriFactu xsi:type="xsd:string">01/01/2026</FechaFinVeriFactu>
                </Cabecera>
                <item SOAP-ENC:id="4" xsi:type="NS2:FacturasEmitidasType">
                    <RegistroFacturacion SOAP-ENC:id="5" xsi:type="NS3:RegistroFacturacionType">
                        <IDFactura SOAP-ENC:id="6" xsi:type="NS3:IDFacturaExpedidaType">
                            <IDEmisorFactura SOAP-ENC:id="7" xsi:type="NS3:IDEmisorFactura">
                                <NIF xsi:type="xsd:string">3333333</NIF>
                            </IDEmisorFactura>
                            <NumSerieFacturaEmisor xsi:type="xsd:string">23/123456</NumSerieFacturaEmisor>
                            <FechaExpedicionFacturaEmisor xsi:type="xsd:string">31/12/23</FechaExpedicionFacturaEmisor>
                        </IDFactura>
                        <NombreRazonEmisor xsi:type="xsd:string"/>
                        <TipoRegistroSIF xsi:type="NS3:TipoRegistroSIFType">S0</TipoRegistroSIF>
                        <TipoFactura xsi:type="NS3:ClaveTipoFacturaType">F1</TipoFactura>
                        <DescripcionOperacion xsi:type="xsd:string">venta de mercaderías</DescripcionOperacion>
                        <Desglose xsi:type="SOAP-ENC:Array" SOAP-ENC:itemType="NS3:DetalleType" SOAP-ENC:arraySize="1">
                            <item SOAP-ENC:id="8" xsi:type="NS3:DetalleType">
                                <ClaveRegimen xsi:type="NS3:IdOperacionesTrascendenciaTributariaType">01</ClaveRegimen>
                                <TipoImpositivo xsi:type="xsd:string">21</TipoImpositivo>
                                <BaseImponibleOimporteNoSujeto xsi:type="xsd:string"/>
                                <CuotaRepercutida xsi:type="xsd:string">100</CuotaRepercutida>
                            </item>
                        </Desglose>
                        <ImporteTotal xsi:type="xsd:string"/>
                        <EncadenamientoRegistroAnterior xsi:nil="true"/>
                        <SistemaInformatico xsi:nil="true"/>
                        <FechaGenRegistro xsi:type="xsd:string"/>
                        <HoraGenRegistro xsi:type="xsd:string"/>
                        <HusoHorarioGenRegistro xsi:type="NS3:HusoHorarioGenRegistroType">01</HusoHorarioGenRegistro>
                    </RegistroFacturacion>
                    <DatosControl xsi:nil="true"/>
                </item>
            </AltaFactuSistemaFacturacion>
        </NS1:AltaFactuSistemaFacturacion>
    </SOAP-ENV:Body>
 </SOAP-ENV:Envelope>


Germán.



Cómo accedes a ese XML sin hacer el envío porque yo lo saco desde el evento "OnBeforeExecute" del componente HTTPRIO pero claro, si no se hace el envío porque no tenemos todavía las direcciones no llega a ese evento. Todo esto se me ocurre porque hará falta generar la huella de cada factura y no sé cómo aislar el nodo de cada factura para generar la huella.


Gracias y un saludo.

newtron 09-01-2024 12:50:19

Cita:

Empezado por nincillo (Mensaje 553914)
Perdona la insistencia, pero es por curiosidad de acuerdo al "misterio" que tengo yo al importar los wsdl, que dependiendo de la versión que escoja a la hora de importar, me lo importa diferente.

La "actualización" a la que te refieres, la hiciste descargando el wsdl mediante la url correspondiente o lo hiciste sustituyendo con el fichero que publicó @Neftali.

a) En el caso de hacerlo mediante la url, ¿puedes decirme en el dialogo de delphi que te sale durante la importación, cual de las 3 opciones escogiste?.
b) En el caso de utilizar el fichero publicado por @Neftali, la versión antigua, ¿también era del fichero publicado por @Neftali días atrás?.

Gracias y un saludo.


Lo que he hecho ha sido sustituir mi fichero "SistemaFacturacion.pas" por uno de los que ha subido Neftalí. El antiguo era uno que me había descargado desde la importación del fichero wsdl.


Saludos.

ermendalenda 09-01-2024 13:18:45

Duda Rectificativa
 
Hola, creo que esta duda me la podran aclarar alguno de los que hagan ticketbai:

Ejemplo:

Factura Numero 1 con 3 Líneas:

1 CocaCola 1,10 Euros
1 Fanta 1,10 Euros
1 Tonica 1,10 Euros
Total 3,3 Euros

Desglose
Base 3 Euros
Iva 10% 0,30


Hago rectificativa por diferencias y quito 1 Coca Cola
En la rectificativa :
pongo que la base de la rectificada es 3,00Euros y la cuota 0,30Euros


Me doy cuenta que aun tengo que devolver la Fanta
En la nueva rectificativa que pongo:
Opcion 1. base de la rectificada es 3,00 y la cuota 0,30
Opcion 2. base de la rectificada es 2,00 y la cuota 0,20

Gracias de antemano.

keys 09-01-2024 13:31:12

Cita:

Empezado por ermendalenda (Mensaje 553920)
Hola, creo que esta duda me la podran aclarar alguno de los que hagan ticketbai:

Ejemplo:

Factura Numero 1 con 3 Líneas:

1 CocaCola 1,10 Euros
1 Fanta 1,10 Euros
1 Tonica 1,10 Euros
Total 3,3 Euros

Desglose
Base 3 Euros
Iva 10% 0,30


Hago rectificativa por diferencias y quito 1 Coca Cola
En la rectificativa :
pongo que la base de la rectificada es 3,00Euros y la cuota 0,30Euros


Me doy cuenta que aun tengo que devolver la Fanta
En la nueva rectificativa que pongo:
Opcion 1. base de la rectificada es 3,00 y la cuota 0,30
Opcion 2. base de la rectificada es 2,00 y la cuota 0,20

Gracias de antemano.

Si la rectificativa es por diferencias en la primera factura rectificativa tienes que hacer un abono. Base -1 y cuota -0.10 (cocacola)

La segunda rectificativa si es por diferencias también sera un abono Base -1 y cuota -0.10. (fanta)
La factura original tendrá dos rectificativas.

Otra cosa es que sea por sustitución.

newtron 09-01-2024 13:34:45

Cita:

Empezado por ermendalenda (Mensaje 553920)
Hola, creo que esta duda me la podran aclarar alguno de los que hagan ticketbai:

Ejemplo:

Factura Numero 1 con 3 Líneas:

1 CocaCola 1,10 Euros
1 Fanta 1,10 Euros
1 Tonica 1,10 Euros
Total 3,3 Euros

Desglose
Base 3 Euros
Iva 10% 0,30


Hago rectificativa por diferencias y quito 1 Coca Cola
En la rectificativa :
pongo que la base de la rectificada es 3,00Euros y la cuota 0,30Euros


Me doy cuenta que aun tengo que devolver la Fanta
En la nueva rectificativa que pongo:
Opcion 1. base de la rectificada es 3,00 y la cuota 0,30
Opcion 2. base de la rectificada es 2,00 y la cuota 0,20

Gracias de antemano.


Yo no he hecho nada de TicketBAI pero entiendo que en la nueva factura, en los campos de "Base rectificada" y "Cuota rectificada" tendrás que poner los importes de la factura original y luego en el resto de datos los importes de la nueva factura.

EDITO: Nada nada.... no había entendido que había dos rectificativas. Al ver el mensaje de Keys me he dado cuenta.


Saludos.

keys 09-01-2024 13:42:18

Cita:

Empezado por newtron (Mensaje 553922)
Yo no he hecho nada de TicketBAI pero entiendo que en la nueva factura, en los campos de "Base rectificada" y "Cuota rectificada" tendrás que poner los importes de la factura original y luego en el resto de datos los importes de la nueva factura.

EDITO: Nada nada.... no había entendido que había dos rectificativas. Al ver el mensaje de Keys me he dado cuenta.


Saludos.

En ticketbai la base rectificada y la cuota rectificada solo son para las rectificativas por sustitucion. En las de diferencias no hay que poner nada.

Por eso digo que es distinto por sustitución que por diferencias. Por sustitución se sustituye toda la factura y es como si se hiciera una nueva y por diferencias sólo se pone lo que cambia de una a otra.

newtron 09-01-2024 13:44:15

Cita:

Empezado por keys (Mensaje 553923)
En ticketbai la base rectificada y la cuota rectificada solo son para las rectificativas por sustitucion. En las de diferencias no hay que poner nada.


Gracias Keys, es bueno saberlo porque imagino que en esto que nos ocupa ahora será similar.


Saludos.

nincillo 09-01-2024 13:58:07

[quote=newtron;553916]
Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 553902)
En este caso genera un fichero como este:

Código:

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding">
    <SOAP-ENV:Body xmlns:NS1="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SistemaFacturacion.wsdl" xmlns:NS2="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd" xmlns:NS3="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd">
        <NS1:AltaFactuSistemaFacturacion SOAP-ENV:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
            <AltaFactuSistemaFacturacion SOAP-ENC:id="1" xsi:type="NS2:AltaFactuSistemaFacturacion">
                <Cabecera SOAP-ENC:id="2" xsi:type="NS3:Cabecera">
                    <IDVersion xsi:type="NS3:VersionType">1.0</IDVersion>
                    <ObligadoEmision SOAP-ENC:id="3" xsi:type="NS3:PersonaFisicaJuridicaESType">
                        <NombreRazon xsi:type="xsd:string">Empresa pruebas</NombreRazon>
                        <NIF xsi:type="xsd:string">11111111H</NIF>
                    </ObligadoEmision>
                    <TipoRegistroAEAT xsi:type="NS3:TipoRegistroAEATType">T0</TipoRegistroAEAT>
                    <FechaFinVeriFactu xsi:type="xsd:string">01/01/2026</FechaFinVeriFactu>
                </Cabecera>
                <item SOAP-ENC:id="4" xsi:type="NS2:FacturasEmitidasType">
                    <RegistroFacturacion SOAP-ENC:id="5" xsi:type="NS3:RegistroFacturacionType">
                        <IDFactura SOAP-ENC:id="6" xsi:type="NS3:IDFacturaExpedidaType">
                            <IDEmisorFactura SOAP-ENC:id="7" xsi:type="NS3:IDEmisorFactura">
                                <NIF xsi:type="xsd:string">3333333</NIF>
                            </IDEmisorFactura>
                            <NumSerieFacturaEmisor xsi:type="xsd:string">23/123456</NumSerieFacturaEmisor>
                            <FechaExpedicionFacturaEmisor xsi:type="xsd:string">31/12/23</FechaExpedicionFacturaEmisor>
                        </IDFactura>
                        <NombreRazonEmisor xsi:type="xsd:string"/>
                        <TipoRegistroSIF xsi:type="NS3:TipoRegistroSIFType">S0</TipoRegistroSIF>
                        <TipoFactura xsi:type="NS3:ClaveTipoFacturaType">F1</TipoFactura>
                        <DescripcionOperacion xsi:type="xsd:string">venta de mercaderías</DescripcionOperacion>
                        <Desglose xsi:type="SOAP-ENC:Array" SOAP-ENC:itemType="NS3:DetalleType" SOAP-ENC:arraySize="1">
                            <item SOAP-ENC:id="8" xsi:type="NS3:DetalleType">
                                <ClaveRegimen xsi:type="NS3:IdOperacionesTrascendenciaTributariaType">01</ClaveRegimen>
                                <TipoImpositivo xsi:type="xsd:string">21</TipoImpositivo>
                                <BaseImponibleOimporteNoSujeto xsi:type="xsd:string"/>
                                <CuotaRepercutida xsi:type="xsd:string">100</CuotaRepercutida>
                            </item>
                        </Desglose>
                        <ImporteTotal xsi:type="xsd:string"/>
                        <EncadenamientoRegistroAnterior xsi:nil="true"/>
                        <SistemaInformatico xsi:nil="true"/>
                        <FechaGenRegistro xsi:type="xsd:string"/>
                        <HoraGenRegistro xsi:type="xsd:string"/>
                        <HusoHorarioGenRegistro xsi:type="NS3:HusoHorarioGenRegistroType">01</HusoHorarioGenRegistro>
                    </RegistroFacturacion>
                    <DatosControl xsi:nil="true"/>
                </item>
            </AltaFactuSistemaFacturacion>
        </NS1:AltaFactuSistemaFacturacion>
    </SOAP-ENV:Body>
 </SOAP-ENV:Envelope>


Germán.



Cómo accedes a ese XML sin hacer el envío porque yo lo saco desde el evento "OnBeforeExecute" del componente HTTPRIO pero claro, si no se hace el envío porque no tenemos todavía las direcciones no llega a ese evento. Todo esto se me ocurre porque hará falta generar la huella de cada factura y no sé cómo aislar el nodo de cada factura para generar la huella.


Gracias y un saludo.

Esa pregunta me la hago yo también.

Porque si no lo he entendido mal, deberíamos de generar un fichero individual por factura y luego cuando se vaya a hacer el envío leer esos ficheros y enviarlos todos juntos en una llamada al SOAP.

O sea, sería bueno saber, como generar primero esos ficheros individuales y luego como cargarlos para hacer la llamada SOAP. ¿No?.

ermendalenda 09-01-2024 14:16:18

Cita:

Empezado por keys (Mensaje 553923)
En ticketbai la base rectificada y la cuota rectificada solo son para las rectificativas por sustitucion. En las de diferencias no hay que poner nada.

Por eso digo que es distinto por sustitución que por diferencias. Por sustitución se sustituye toda la factura y es como si se hiciera una nueva y por diferencias sólo se pone lo que cambia de una a otra.


Vale Vale, he estado mirando y es igual, me habia confundido, este nodo no hay que ponerlo en la de diferencias.

Gracias por la aclaración keys.

Neftali [Germán.Estévez] 09-01-2024 16:31:44

Cita:

Empezado por newtron (Mensaje 553903)
Gracias Germán por el ejemplo. El problema es que ese código a mi no me compila en mi Delphi Berlín, se ve que este tipo de instrucciones no le gustan:


Código Delphi [-]
  var alta:AltaFactuSistemaFacturacion := AltaFactuSistemaFacturacion.Create;


¿Hay alguna forma de modificar eso para que compile en Delphi Berlín?
Gracias de nuevo y un saludo.


Si. Perdón por no pensar en las versiones antiguas.
Simplemente hay que desdoblar en 2 líneas la definición y el uso.

Código Delphi [-]
  
var 
  alta:AltaFactuSistemaFacturacion;
  ...
begin
  ...
  AltaFactuSistemaFacturacion:= AltaFactuSistemaFacturacion.Create;

Neftali [Germán.Estévez] 09-01-2024 16:40:20

Cita:

Empezado por newtron (Mensaje 553916)
Germán.
Cómo accedes a ese XML sin hacer el envío porque yo lo saco desde el evento "OnBeforeExecute" del componente HTTPRIO pero claro, si no se hace el envío porque no tenemos todavía las direcciones no llega a ese evento. Todo esto se me ocurre porque hará falta generar la huella de cada factura y no sé cómo aislar el nodo de cada factura para generar la huella.

Si llega al evento si en la URL colocas lo que sea que sea diferente a vacío.
Luego falla por URL, pero al evento llega.

Código modificado a partir de lo que puso un compañero (perdón que no recuerdo quien) mensajes atrás:

Código Delphi [-]
procedure TForm3.HTTPRIO1BeforeExecute(const MethodName: string; SOAPRequest: TStream);
var
  sTmp: TStringList;
  nFile: string;
begin
  sTmp := TStringList.Create;
  try
    SOAPRequest.Position := 0;
    sTmp.LoadFromStream(SOAPRequest);
    nFile := ExtractFilePath(Application.ExeName) + 'VeriFactu_PeticionEnviada.xml';
    sTmp.SaveToFile(nFile);
    Memo1.Lines.LoadFromFile(nFile);
  finally
    FreeAndNil(sTmp);
  end;
end;

Y en el fichero generado por SOAP, modifica esta variable y le asignas cualquier valor( que actualmente está a cadena vacía)...
Código Delphi [-]
  defURL  = 'me_la_he_inventado_';

edari 09-01-2024 17:21:49

Buenas tardes,


Voy a empezar a generar el xml y tengo un par de dudas iniciales


El fichero xml se entiende que es mejor ya generarlo entero sin retornos de carro por el tema del hash que viene después...?


Calculo el hash con los lo que hay entre las etiquetas "RegistroAltaFacturas" sin retornos de carro con todas las etiquetas seguidas


Ese hash tiene ser al 100% como el que genere Hacienda en su comprobación y mi duda es


Cómo se puede comprobar que el hash que he calculado es el correcto, el que espera hacienda?


Graciass ^\||/

Neftali [Germán.Estévez] 09-01-2024 17:27:18

Cita:

Empezado por edari (Mensaje 553936)
El fichero xml se entiende que es mejor ya generarlo entero sin retornos de carro por el tema del hash que viene después...?

Si generas el XML utilizando la unit que te genera el el IDE al importar el WSDL, ya se genera sin saltos de carro.
Si lo generas manualmente puedes hacerlo como quieras

Cita:

Empezado por edari (Mensaje 553936)
Cómo se puede comprobar que el hash que he calculado es el correcto, el que espera hacienda?

Si el código de cálculo es correcto y no has modificado la parte del XML después del cálculo (por ejemplo en el envío, como a veces pasa) el hash se calculará correctamente. Puedes comprobar el cálculo que tú hagas utilizando alguna de las herramientas online que hay.

newtron 09-01-2024 18:32:59

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 553934)
Y en el fichero generado por SOAP, modifica esta variable y le asignas cualquier valor( que actualmente está a cadena vacía)...
Código Delphi [-] defURL = 'me_la_he_inventado_';


Gracias Germán. Apuntar que para que me llegara al evento le he tenido que añadir a la url el prefijo http://


Código Delphi [-]
  defURL  = 'http://me_la_he_inventado_';


Lo que sigo con la duda es de cómo capturar el texto del nodo de cada factura para poder calcular el hash.

Saludos.


edari 09-01-2024 19:07:22

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 553937)
Si generas el XML utilizando la unit que te genera el el IDE al importar el WSDL, ya se genera sin saltos de carro.
Si lo generas manualmente puedes hacerlo como quieras



Si el código de cálculo es correcto y no has modificado la parte del XML después del cálculo (por ejemplo en el envío, como a veces pasa) el hash se calculará correctamente. Puedes comprobar el cálculo que tú hagas utilizando alguna de las herramientas online que hay.


Gracias Neftali


Voy con ello, a ver donde llego.

ramherfer 11-01-2024 13:44:47

Hola buenos días. Por favor, alquien a conseguido importar lo wsdl con Delphi 7. Lo he intentado con el WSDL Importer, pero me genera un fichero de pocas lineas y creo que no es correcto. ¡Gracias!
Código:

unit SistemaFacturacion;

interface

uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;

type

  // ************************************************************************ //
  // The following types, referred to in the WSDL document are not being represented
  // in this file. They are either aliases[@] of other types represented or were referred
  // to but never[!] declared in the document. The types from the latter category
  // typically map to predefined/known XML or Borland types; however, they could also
  // indicate incorrect WSDL documents that failed to declare or import a schema type.
  // ************************************************************************ //
  // !:AltaFactuSistemaFacturacion - "https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd"
  // !:RespuestaAltaFactuSistemaFacturacion - "https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/RespuestaSuministro.xsd"
  // !:BajaFactuSistemaFacturacion - "https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd"
  // !:RespuestaBajaFactuSistemaFacturacion - "https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/RespuestaSuministro.xsd"


  // ************************************************************************ //
  // Namespace : https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SistemaFacturacion.wsdl
  // transport : http://schemas.xmlsoap.org/soap/http
  // style    : document
  // binding  : sfBinding
  // service  : sfService
  // port      : SistemaFacturacion
  // URL      : xxxxxxxxxx
  // ************************************************************************ //
  sfSOAP = interface(IInvokable)
  ['{20282F52-013C-FB3F-C901-1B37EB939FA1}']
    function  AltaFactuSistemaFacturacion(const AltaFactuSistemaFacturacion: AltaFactuSistemaFacturacion): RespuestaAltaFactuSistemaFacturacion; stdcall;
    function  BajaFactuSistemaFacturacion(const BajaFactuSistemaFacturacion: BajaFactuSistemaFacturacion): RespuestaBajaFactuSistemaFacturacion; stdcall;
  end;

function GetsfSOAP(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): sfSOAP;


implementation

function GetsfSOAP(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): sfSOAP;
const
  defWSDL = 'Y:\Ramiro\Escritorio\VERIFACTU\FORMATOS-0.4\SistemaFacturacion.wsdl';
  defURL  = 'xxxxxxxxxx';
  defSvc  = 'sfService';
  defPrt  = 'SistemaFacturacion';
var
  RIO: THTTPRIO;
begin
  Result := nil;
  if (Addr = '') then
  begin
    if UseWSDL then
      Addr := defWSDL
    else
      Addr := defURL;
  end;
  if HTTPRIO = nil then
    RIO := THTTPRIO.Create(nil)
  else
    RIO := HTTPRIO;
  try
    Result := (RIO as sfSOAP);
    if UseWSDL then
    begin
      RIO.WSDLLocation := Addr;
      RIO.Service := defSvc;
      RIO.Port := defPrt;
    end else
      RIO.URL := Addr;
  finally
    if (Result = nil) and (HTTPRIO = nil) then
      RIO.Free;
  end;
end;


initialization
  InvRegistry.RegisterInterface(TypeInfo(sfSOAP), 'https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SistemaFacturacion.wsdl', 'UTF-8');
  InvRegistry.RegisterDefaultSOAPAction(TypeInfo(sfSOAP), '');
  InvRegistry.RegisterInvokeOptions(TypeInfo(sfSOAP), ioDocument);
  InvRegistry.RegisterInvokeOptions(TypeInfo(sfSOAP), ioLiteral);

end.


Neftali [Germán.Estévez] 11-01-2024 16:04:47

Cita:

Empezado por ramherfer (Mensaje 553955)
Hola buenos días. Por favor, alquien a conseguido importar lo wsdl con Delphi 7. Lo he intentado con el WSDL Importer, pero me genera un fichero de pocas lineas y creo que no es correcto. ¡Gracias!


He probado a importarlo con una versión antigua de Delphi (la 7 precisamente) que tenía en una máquina virtual y me genera lo mismo que a ti.
Aunque Delphi no deja de sorprenderme.
Los ficheros generados con las nuevas versiones se pueden "retorcar" para que compilen con Delphi 7 sinmuchos problemas. Incluso el código anterior que genera el XML también se puede ejecutar sin mayores problemas.


Parece mentira que con una versión de hace 20 años se pueda hacer esto.

Eso si, al ejecutar el código falla con el siguiente error:





El cual veo más complicado, porque me parece que las estructuras generadas son demasiado complejas para esa versión.
Como te he comentado en privado, tal vez tendrás que optar con generar una DLL/BPL con una versión más nueva de Delphi (que no tenga 20 años :rolleyes:) y llamarla desde tu aplicación de delphi 7.

ramherfer 11-01-2024 16:41:19

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 553902)
A mi los tres ficheros generados con esas opciones me resultan similares.
Completando el código que has puesto, la llamada podría ser similar a esta:

Código Delphi [-]
procedure TForm3.Button1Click(Sender: TObject);
var
  arrayDetalles : array of DetalleType;
  RegistroAltaFacturas: Array_Of_FacturasEmitidasType;
begin
  var alta:AltaFactuSistemaFacturacion := AltaFactuSistemaFacturacion.Create;

  // Cabecera
  var cab := Cabecera.Create;
  cab.IDVersion := VersionType._1_0;

  cab.ObligadoEmision := PersonaFisicaJuridicaESType.Create;
  cab.ObligadoEmision.NombreRazon := 'Empresa pruebas';
  cab.ObligadoEmision.NIF := '11111111H';
  cab.TipoRegistroAEAT := TipoRegistroAEATType.T0;
  cab.FechaFinVeriFactu := '01/01/2026';
  alta.Cabecera := cab;

  // Factura
  var fact:FacturasEmitidasType;
  fact := FacturasEmitidasType.Create;
  fact.RegistroFacturacion := RegistroFacturacionType.Create;
  fact.RegistroFacturacion.IDFactura := IDFacturaExpedidaType.Create;
  fact.RegistroFacturacion.IDFactura.NumSerieFacturaEmisor := '23/123456';
  fact.RegistroFacturacion.IDFactura.FechaExpedicionFacturaEmisor := '31/12/23';
  fact.RegistroFacturacion.IDFactura.IDEmisorFactura := IDEmisorFactura.Create;
  fact.RegistroFacturacion.IDFactura.IDEmisorFactura.NIF := '3333333';
  fact.RegistroFacturacion.DescripcionOperacion := 'venta de mercaderías';

  // Detalle
  var detalle := DetalleType.Create;
  detalle.CuotaRepercutida := '100';
  detalle.TipoImpositivo := '21';
  SetLength(arrayDetalles, 1);
  arrayDetalles[0] := detalle;

  // desglose
  var desglose: DesgloseType := DesgloseType.Create();
  SetLength(Desglose, 1);
  Desglose[0] := detalle;
  fact.RegistroFacturacion.Desglose := Desglose;

  // Lista de facturas del envío
  SetLength(RegistroAltaFacturas, 1);
  RegistroAltaFacturas[0] := fact;

  // Factura 1
  alta.RegistroAltaFacturas := RegistroAltaFacturas;

  // envío
  try
    var res:RespuestaAltaFactuSistemaFacturacion := RespuestaAltaFactuSistemaFacturacion.Create;
    res := GetsfSOAP(False, '', HTTPRIO1).AltaFactuSistemaFacturacion(alta);

    ShowMessage('Se ha realizado el envío; ' + sLineBreak +
                '   CSV: ' + res.CSV  + sLineBreak +
                '   TimeStamp: ' + res.DatosPresentacion.TimestampPresentacion
                );
  except
    on E:Exception do begin
      ShowMessage(Format('Error al realizar el envío; (%s)-%s',[E.ClassName, E.Message]));
    end;
  end;
end;

En este caso genera un fichero como este:

Código:

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding">
    <SOAP-ENV:Body xmlns:NS1="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SistemaFacturacion.wsdl" xmlns:NS2="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd" xmlns:NS3="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd">
        <NS1:AltaFactuSistemaFacturacion SOAP-ENV:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
            <AltaFactuSistemaFacturacion SOAP-ENC:id="1" xsi:type="NS2:AltaFactuSistemaFacturacion">
                <Cabecera SOAP-ENC:id="2" xsi:type="NS3:Cabecera">
                    <IDVersion xsi:type="NS3:VersionType">1.0</IDVersion>
                    <ObligadoEmision SOAP-ENC:id="3" xsi:type="NS3:PersonaFisicaJuridicaESType">
                        <NombreRazon xsi:type="xsd:string">Empresa pruebas</NombreRazon>
                        <NIF xsi:type="xsd:string">11111111H</NIF>
                    </ObligadoEmision>
                    <TipoRegistroAEAT xsi:type="NS3:TipoRegistroAEATType">T0</TipoRegistroAEAT>
                    <FechaFinVeriFactu xsi:type="xsd:string">01/01/2026</FechaFinVeriFactu>
                </Cabecera>
                <item SOAP-ENC:id="4" xsi:type="NS2:FacturasEmitidasType">
                    <RegistroFacturacion SOAP-ENC:id="5" xsi:type="NS3:RegistroFacturacionType">
                        <IDFactura SOAP-ENC:id="6" xsi:type="NS3:IDFacturaExpedidaType">
                            <IDEmisorFactura SOAP-ENC:id="7" xsi:type="NS3:IDEmisorFactura">
                                <NIF xsi:type="xsd:string">3333333</NIF>
                            </IDEmisorFactura>
                            <NumSerieFacturaEmisor xsi:type="xsd:string">23/123456</NumSerieFacturaEmisor>
                            <FechaExpedicionFacturaEmisor xsi:type="xsd:string">31/12/23</FechaExpedicionFacturaEmisor>
                        </IDFactura>
                        <NombreRazonEmisor xsi:type="xsd:string"/>
                        <TipoRegistroSIF xsi:type="NS3:TipoRegistroSIFType">S0</TipoRegistroSIF>
                        <TipoFactura xsi:type="NS3:ClaveTipoFacturaType">F1</TipoFactura>
                        <DescripcionOperacion xsi:type="xsd:string">venta de mercaderías</DescripcionOperacion>
                        <Desglose xsi:type="SOAP-ENC:Array" SOAP-ENC:itemType="NS3:DetalleType" SOAP-ENC:arraySize="1">
                            <item SOAP-ENC:id="8" xsi:type="NS3:DetalleType">
                                <ClaveRegimen xsi:type="NS3:IdOperacionesTrascendenciaTributariaType">01</ClaveRegimen>
                                <TipoImpositivo xsi:type="xsd:string">21</TipoImpositivo>
                                <BaseImponibleOimporteNoSujeto xsi:type="xsd:string"/>
                                <CuotaRepercutida xsi:type="xsd:string">100</CuotaRepercutida>
                            </item>
                        </Desglose>
                        <ImporteTotal xsi:type="xsd:string"/>
                        <EncadenamientoRegistroAnterior xsi:nil="true"/>
                        <SistemaInformatico xsi:nil="true"/>
                        <FechaGenRegistro xsi:type="xsd:string"/>
                        <HoraGenRegistro xsi:type="xsd:string"/>
                        <HusoHorarioGenRegistro xsi:type="NS3:HusoHorarioGenRegistroType">01</HusoHorarioGenRegistro>
                    </RegistroFacturacion>
                    <DatosControl xsi:nil="true"/>
                </item>
            </AltaFactuSistemaFacturacion>
        </NS1:AltaFactuSistemaFacturacion>
    </SOAP-ENV:Body>
 </SOAP-ENV:Envelope>


Adjunto los 3 ficheros generados al importar el WSDL y el propio fichero WSDL.

Van unas preguntas a ver si me podeis echar una mano

¿Con este código se genera el xml de la(s) factura(s) y se enviaría (si la url es correcta)?.

Lo comento ya que trato de añadir por ejemplo DatosControl y me genera un error de excepción añadiendo estas tres lineas:

Código:

fact.RegistroFacturacion.Desglose := Desglose;

  //---------------------------------------Genera un error de excepción
  fact.DatosControl.Huella := 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXYYYY';
  fact.datosControl.TipoHash := TipoHashType._01;
  fact.datosControl.Incidencia := IncidenciaType.N;
  //---------------------------------------------------

  // Factura 1
  alta.RegistroAltaFacturas := RegistroAltaFacturas;

Tambien aunque lo he intentado añadir código necesario en distintas partes, ya que la factura me llega con dos tipos de maldito iva, no lo he conseguido, ¿Cómo le afectaría al código si una factura lleva dos o más tipos de iva el 21 y el 10?

¿La huella de la factura, se tiene que generar desde este xml y de cada uno de los nodos <RegistroFacturacion> que contenga?

Con el código original funciona perfectamente, genera el xml y realiza el envío, dando error ya que la url no existe. Lo he probado con Delphi 11 Community Edition.

Voy a seguir los consejos de Germán @Neftali y voy a tratar de confeccionar una librería llamada desde delphi 7 y que reciba datos y los procese enviandolos y capturando las respuestas.
Jamás he realizado proyecto que se asemeje a esto, por lo que pido ayuda y comprensión si molesto algo, con alguna pregunta cuyo concepto muchos dareis por sentado.
Si lo consigo, como agradecimiento, colocare en este foro el código completo para que lo utilice cualquiera que lo necesite. Si no lo consigo... para que hablar más.

Neftali [Germán.Estévez] 11-01-2024 18:41:51

Cita:

Empezado por ramherfer (Mensaje 553958)
Van unas preguntas a ver si me podeis echar una mano
¿Con este código se genera el xml de la(s) factura(s) y se enviaría (si la url es correcta)?.

Con esta línea acabas haciendo el envío y obteniendo la respuesta. Con las anteriores "montas" la factura.

Código Delphi [-]
res := GetsfSOAP(False, '', HTTPRIO1).AltaFactuSistemaFacturacion(alta);
Cita:

Empezado por ramherfer (Mensaje 553958)
Tambien aunque lo he intentado añadir código necesario en distintas partes, ya que la factura me llega con dos tipos de maldito iva, no lo he conseguido, ¿Cómo le afectaría al código si una factura lleva dos o más tipos de iva el 21 y el 10?

¿Has creado el objeto?

Código Delphi [-]
  // Datos de control
  fact.DatosControl := DatosControlType.Create;
  fact.DatosControl.Huella := 'xxxxxxxxxxxxxxxxxxxxxxxxx';
  fact.DatosControl.TipoHash := TipoHashType._01;
  fact.DatosControl.Incidencia := IncidenciaType.N;

Cita:

Empezado por ramherfer (Mensaje 553958)
¿La huella de la factura, se tiene que generar desde este xml y de cada uno de los nodos <RegistroFacturacion> que contenga?

Cada factura que se envía (se pueden enviar N facturas) equivale al tipo RegistroFacturacionType. Y cada uno de estos leva su huella (dentro de DatosControl):
Código Delphi [-]
  FacturasEmitidasType = class(TRemotable)
  private
    FRegistroFacturacion: RegistroFacturacionType;
    FDatosControl: DatosControlType;
  public
    destructor Destroy; override;
  published
    property RegistroFacturacion: RegistroFacturacionType  read FRegistroFacturacion write FRegistroFacturacion;
    property DatosControl:        DatosControlType         read FDatosControl write FDatosControl;
  end;

Por lo tanto, para cada factura habrá que calcular su huella y añadirla al bloque DatosControl que va junto a la factura.
Si se van a enviar N facturas, todas ellas se añaden a un array (Array_Of_FacturasEmitidasType) que finalmente es lo que enviamos en la llamada a SOAP (única propiedad de AltaFactuSistemaFacturacion).

Neftali [Germán.Estévez] 11-01-2024 18:50:43

Cita:

Empezado por ramherfer (Mensaje 553958)
Tambien aunque lo he intentado añadir código necesario en distintas partes, ya que la factura me llega con dos tipos de maldito iva, no lo he conseguido, ¿Cómo le afectaría al código si una factura lleva dos o más tipos de iva el 21 y el 10?


Para eso debes añadir Tantos DetalleDesglose como necesites.
Según el la documentación entre 1 y 10.



Código Delphi [-]
  DesgloseType = array of DetalleType;


En el código anterior parte hemos creado 1 (1 detalle) y se ha añadido al Array, pero puedes crear varios y añadirlos.


Código Delphi [-]
  // Detalle de IVA 21%
  var detalle1 := DetalleType.Create;
  detalle1.CuotaRepercutida := '100';
  detalle1.TipoImpositivo := '21';
  // detalle IVA al 10%
  var detalle2 := DetalleType.Create;
  detalle2.CuotaRepercutida := '200';
  detalle2.TipoImpositivo := '10';
  // desglose
  var desglose: DesgloseType := DesgloseType.Create();
  SetLength(Desglose, 2);
  Desglose[0] := detalle1;
  Desglose[1] := detalle2;
  fact.RegistroFacturacion.Desglose := Desglose;


Eso te añadirá varios al XML:



sglorka 11-01-2024 19:47:53

Nodo RegistroFacturacion
 
A alguien le ha ocurrido que al serializar el registro individual (no montado dentro de <AltaFactuSistemaFacturacion>) el nodo <RegistroFacturacion> aparece con su namespace

<?xml version="1.0" encoding="utf-8"?>
<FacturasEmitidasType xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RegistroFacturacion xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd">
<IDFactura xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd">
<IDEmisorFactura>
<NIF>xxxxxxxxx</NIF>
</IDEmisorFactura> ........

pero al incorporarlo al nodo <AltaFactuSistemaFacturacion> para ser enviado la serialización elimina el namespace de dicho nodo

<AltaFactuSistemaFacturacion xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Cabecera xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd">
<IDVersion>1.0</IDVersion>
<ObligadoEmision>
<NombreRazon>xxxxx</NombreRazon>
<NIF>xxxxx</NIF>
</ObligadoEmision>
<TipoRegistroAEAT>T0</TipoRegistroAEAT>
</Cabecera>
<RegistroAltaFacturas xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd">
<RegistroFacturacion>
<IDFactura xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd">
<IDEmisorFactura> ....

Esto tiene la implicación de que el hash que calcularán en la aeat del nodo RegistroFacturacion no incluirá los carácteres relativos al namespace y por tanto, no coincidirá

¿ Alguien está en este caso ?

ramherfer 11-01-2024 21:54:01

Buenas noches.
A ver por favor estamos trabajando con 3 ficheros que subio German (Neftali):

SistemaFacturacionSOAPv11.pas
SistemaFacturacionSOAPv12.pas
SistemaFacturacionSOAPvRec.pas

Alguien podría indicar el proceso, los pasos para obtenerlos.
Gracias.

Neftali [Germán.Estévez] 12-01-2024 08:50:11

Cita:

Empezado por ramherfer (Mensaje 553963)
Alguien podría indicar el proceso, los pasos para obtenerlos.

Desde el IDE de Delphi:
  1. Crear un proyecto nuevo
  2. File/New/Other/Web/WSDL Importer
  3. Location: https://prewww2.aeat.es/static_files...cturacion.wsdl
  4. Siguente, Siguiente, Finish,...
Desde una ventana de MS-DOS:
Código:

c:\Program Files (x86)\Borland\Delphi7\Bin>WSDLImp.exe -p -Dc:\temp -soap12 https://prewww2.aeat.es/static_files/common/internet/dep/aplicaciones/es/aeat/tikeV1.0/cont/ws/SistemaFacturacion.wsdl

newtron 12-01-2024 09:53:06

Cita:

Empezado por ramherfer (Mensaje 553958)
Voy a seguir los consejos de Germán @Neftali y voy a tratar de confeccionar una librería llamada desde delphi 7 y que reciba datos y los procese enviandolos y capturando las respuestas.
Jamás he realizado proyecto que se asemeje a esto, por lo que pido ayuda y comprensión si molesto algo, con alguna pregunta cuyo concepto muchos dareis por sentado.
Si lo consigo, como agradecimiento, colocare en este foro el código completo para que lo utilice cualquiera que lo necesite. Si no lo consigo... para que hablar más.


De una forma o de otra yo creo que habrá que plantear crear un programa aparte que se encargue de recopilar las facturas según se vayan produciendo e ir enviándolas porque en ambientes de red ese trabajo tendrá que hacerlo un único terminal que tenga el certificado digital correspondiente instalado, o si a alguien se le ocurre otra forma mejor puede comentarlo.



Saludos.

Neftali [Germán.Estévez] 12-01-2024 10:11:56

Cita:

Empezado por newtron (Mensaje 553968)
De una forma o de otra yo creo que habrá que plantear crear un programa aparte que se encargue de recopilar las facturas según se vayan produciendo e ir enviándolas porque en ambientes de red ese trabajo tendrá que hacerlo un único terminal que tenga el certificado digital correspondiente instalado, o si a alguien se le ocurre otra forma mejor puede comentarlo.


Bueno es una opción bastante lógica para algunos entornos, estoy pensando en empresas grandes con un ERP. En esos casos es bastante lógico pensar en un servicio que implemente una cola de envío.


Pero en otros casos, por ejemplo en una tienda con 3 puestos de venta, tal vez es más sencillo que cada TPV/puesto genere sus facturas y las envíe. En el caso de TicketBAI, por ejemplo, ya está pensado y admiten certificados de dispositivo. Cada máquina tiene un certificado de dispositivo y simplifica todo el proceso (instalación, envío,...).

newtron 12-01-2024 10:20:25

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 553969)
Bueno es una opción bastante lógica para algunos entornos, estoy pensando en empresas grandes con un ERP. En esos casos es bastante lógico pensar en un servicio que implemente una cola de envío.


Pero en otros casos, por ejemplo en una tienda con 3 puestos de venta, tal vez es más sencillo que cada TPV/puesto genere sus facturas y las envíe. En el caso de TicketBAI, por ejemplo, ya está pensado y admiten certificados de dispositivo. Cada máquina tiene un certificado de dispositivo y simplifica todo el proceso (instalación, envío,...).


Pues si te digo la verdad no tengo ni idea de lo que es un certificado de dispositivo pero en mi caso me resulta más fácil de mantener un único programa instalado en el servidor que andar peleando con los terminales que se averían y los reinstalan, cambian o quien sabe qué y todo eso hay que ir luego detrás configurando así que seguramente iré por esa vía.



Saludos.

Neftali [Germán.Estévez] 12-01-2024 10:36:41

Cita:

Empezado por newtron (Mensaje 553970)
Pues si te digo la verdad no tengo ni idea de lo que es un certificado de dispositivo pero en mi caso me resulta más fácil de mantener un único programa instalado en el servidor que andar peleando con los terminales que se averían y los reinstalan, cambian o quien sabe qué y todo eso hay que ir luego detrás configurando así que seguramente iré por esa vía.


Bueno yo creo que las 2 pueden ser buenas. Cada uno deberá decidir para su programa cual es mejor.
Creo que ambas tienen ventajas/inconvenientes.

ermendalenda 12-01-2024 11:29:11

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 553969)
Bueno es una opción bastante lógica para algunos entornos, estoy pensando en empresas grandes con un ERP. En esos casos es bastante lógico pensar en un servicio que implemente una cola de envío.


Pero en otros casos, por ejemplo en una tienda con 3 puestos de venta, tal vez es más sencillo que cada TPV/puesto genere sus facturas y las envíe. En el caso de TicketBAI, por ejemplo, ya está pensado y admiten certificados de dispositivo. Cada máquina tiene un certificado de dispositivo y simplifica todo el proceso (instalación, envío,...).

Estoy de acuerdo, en una empresa con muchos terminales es un poco locura que cada terminal envie los datos, es mejor establecer servicios de envio para que se centralice y si hay una incidencia sea un poco más facil de gestionar, sobre todo en los sistemas cuya base son softwares de escritorio. Por otro lado tenemos los distribuidores de software, en ese caso veo 2 posibllidades, ya que pueden hacer ellos el envio (también centralizado), o contratar el servicio de envio. Ya hay empresas para ello en tickebai y van a desarrollar para Verifactu, por si os quereis ahorraros el trabajo y entra dentro de vuestras posiublidades de gestión y economicas...
Las empresas que se dedican a hacer el envio tienen una cosa buena, es que con que le envies el tique/factura en un formato por ejemplo json, te devuelven el Qr y se encargan de todo lo demás. Algunas te dan el servico en tu misma red local y otras a través de servicios Rest.

Os lo cuento para los que veais la cosa muy complicada sepais que opciones hay.

nincillo 12-01-2024 12:38:34

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 553972)
Bueno yo creo que las 2 pueden ser buenas. Cada uno deberá decidir para su programa cual es mejor.
Creo que ambas tienen ventajas/inconvenientes.

Hasta donde yo entiendo (y quizás lo entienda mal). Por un lado está la generación del xml correspondiente a la factura, con su hash y demás, y por otro lado está el envío de dichos xml a hacienda.

Si estoy en lo correcto, quizás la generación del xml sería por parte del equipo que genera la factura y que la dejaría en una carpeta "común" y por otro lado está el programa dedicado al envío de dichos ficheros xml a Hacienda, que no tiene por que hacerlo en tiempo real, ya que según he leído por ahí, la propia hacienda puede marcar el ritmo de envío y el número de facturas a enviar en cada envío.

Per la verdad es que cuando te pones a pensar que puede haber varios equipos a la vez facturando con la misma serie, buff, la posibilidad de combinaciones es grande. Si se da el caso de que estén facturando simultáneamente, quizás el primer equipo aún no generó del todo el xml, y el segundo equipo está intentando leer información del xml que aún no se generó o no del todo... En fin...

La otra opción que he pensado es con algún sistema de flags, que cada vez que algún equipo equipo genere una factura, un programa en el servidor genere todos los xml de las facturas que se hayan generado desde la última vez o algo así...

Y la facturación en bloque de fin de mes, que se pueden generar cientos de facturas en un momento... En fin... Poco a poco...

Neftali [Germán.Estévez] 12-01-2024 12:53:20

Cita:

Empezado por nincillo (Mensaje 553975)
Per la verdad es que cuando te pones a pensar que puede haber varios equipos a la vez facturando con la misma serie, buff, la posibilidad de combinaciones es grande. Si se da el caso de que estén facturando simultáneamente,
...
Y la facturación en bloque de fin de mes, que se pueden generar cientos de facturas en un momento... En fin...


Bueno, pero de eso no le podemos "echar la culpa" a VERI*FACTU, esos problemas ya los tenemos ahora... :D:D:D:D

antoine0 12-01-2024 13:29:41

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 553969)
Bueno es una opción bastante lógica para algunos entornos, estoy pensando en empresas grandes con un ERP.

Mmmm.... Empresa grande y ERP, pero no en el S.I.I.... ¿Habrá muchas?

antoine0 12-01-2024 13:50:01

Cita:

Empezado por sglorka (Mensaje 553961)
A alguien le ha ocurrido que al serializar el registro individual (no montado dentro de <AltaFactuSistemaFacturacion>) el nodo <RegistroFacturacion> aparece con su namespace

<?xml version="1.0" encoding="utf-8"?>
<FacturasEmitidasType xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RegistroFacturacion xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd">
<IDFactura xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd">
<IDEmisorFactura>
<NIF>xxxxxxxxx</NIF>
</IDEmisorFactura> ........

pero al incorporarlo al nodo <AltaFactuSistemaFacturacion> para ser enviado la serialización elimina el namespace de dicho nodo

<AltaFactuSistemaFacturacion xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Cabecera xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd">
<IDVersion>1.0</IDVersion>
<ObligadoEmision>
<NombreRazon>xxxxx</NombreRazon>
<NIF>xxxxx</NIF>
</ObligadoEmision>
<TipoRegistroAEAT>T0</TipoRegistroAEAT>
</Cabecera>
<RegistroAltaFacturas xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd">
<RegistroFacturacion>
<IDFactura xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd">
<IDEmisorFactura> ....

Yo lo haría de una forma un poco distinta:
<AltaFactuSistemaFacturacion xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Cabecera xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd"> ... </Cabecera>
<Alta:RegistroAltaFacturas xmlns:Alta="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd">
<LR:RegistroFacturacion xmlns:LR="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd">
<IDFactura xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd">
<IDEmisorFactura> ....
La idea es que los espacios de nombres Alta y LR aparecen distintos dentro del documento pero en realidad son el mismo esquema. Habrá que probar con la herramienta de Hacienda pero creo que en XML es válido.
Lo he hecho con dos espacios de nombres explícitos para que se entiende mejor, pero supongo que el segundo puede ser el espacio por defecto. Evidentemente hay que ponerlo para que al final lo que aparece en lo que se está enviando a Hacienda siga exactamente lo mismo que lo que se ha usado para calcular la huella y eventualmente firmar.


La franja horaria es GMT +2. Ahora son las 02:09:41.

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