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)

newtron 20-06-2023 09:40:18

^\||/^\||/ Gracias compañero.

nuevo1234 29-06-2023 21:44:28

Reglamento SIF-verifactu
 
Hola,

No hay noticias de la publicación del reglamento q se está esperando?

Me voy de vacaciones y supongo q ya no lo esperamos has después de verano.

Alguien tiene información? Creo q de factura electronica ya hay un borrador

Gracias

Neftali [Germán.Estévez] 30-06-2023 09:23:47

Va para largo.
Vete de vacaciones, volverás,... y estaremos igual. :D:D

seccion_31 05-07-2023 09:34:56

Buenos dias !

He leido el hilo atentamente, pero no soy capaz de importar los wsdl

desde las siguientes direcciones:

Entrada:
https://prewww2.aeat.es/static_files...nformacion.xsd

Salida:
https://prewww2.aeat.es/static_files...Suministro.xsd

Al importar, me da un error:

"
WSDL Import Error

An error was encontered importing....

....

Please verify that yo've entered the correct URL....
"

¿Podeis darme una mano por favor?

Con lo que aprendi en este foro de los SII, creo que luego podre seguir mas o menos solo, pero aqui ya no puedo continuar.

Saludos a tod@s

gracias

Neftali [Germán.Estévez] 05-07-2023 14:57:35

2 Archivos Adjunto(s)
Cita:

Empezado por seccion_31 (Mensaje 551946)
He leido el hilo atentamente, pero no soy capaz de importar los wsdl

Al importar, me da un error:


https://prewww2.aeat.es/static_files...nformacion.xsd
https://prewww2.aeat.es/static_files...Suministro.xsd

Yo he probado a generarlos importante desde el IDE y me ha creado esto (os adjunto los fuentes); No os he revisado mucho pero no parece que tengan nada raro.

seccion_31 05-07-2023 15:41:36

muchas gracias por los archivos !

sin tener demasiado idea de esto, porque voy muy perdido (lo siento)

en estos archivos que he descargado tenemos:

interface(IXMLNode)


mientras a los que estoy acostumbrado con el SII, son:

class(TRemotable)


Entiendo que los archivos descargados con los interfaces IXMLNode, son para construir el archivo XML, que mas adelante sera firmado y enviado. (todavia no se muy bien como).
Podria crear el archivo XML de forma manual, pero veo mas conveniente intentarlo asi.

Voy a ver.

Saludos !

Neftali [Germán.Estévez] 06-07-2023 08:46:38

2 Archivos Adjunto(s)
Cita:

Empezado por seccion_31 (Mensaje 551951)
muchas gracias por los archivos !
sin tener demasiado idea de esto, porque voy muy perdido (lo siento)
en estos archivos que he descargado tenemos:
...
Entiendo que los archivos descargados con los interfaces IXMLNode, son para construir el archivo XML, que mas adelante sera firmado y enviado. (todavia no se muy bien como).
Podria crear el archivo XML de forma manual, pero veo mas conveniente intentarlo asi.

Voy a ver.


Perdón.
Ahora que lo comentas, los he mirado con más detenimiento y les faltan las funciones que usamos para crear los XML.
Revisando la generación, he visto que la primera vez que lo he generado, no he seleccionado la opción siguiente:




Si los volvemos a generar y asignamos un nombre coherente, ahora sí aparecen las funciones que usamos para generar/cargar los XML.
En el caso de la petición estas:
Código Delphi [-]
function GetPeticionFacturacionAlta(Doc: IXMLDocument): IXMLSistemaFacturacionAltaFact;
function LoadPeticionFacturacionAlta(const FileName: string): IXMLSistemaFacturacionAltaFact;
function NewPeticionFacturacionAlta: IXMLSistemaFacturacionAltaFact;

Y en el caso de la respuesta estas:

Código Delphi [-]
function GetRespuestaFacturacionAlta(Doc: IXMLDocument): IXMLRespuestaComunAltaType;
function LoadRespuestaFacturacionAlta(const FileName: string): IXMLRespuestaComunAltaType;
function NewRespuestaFacturacionAlta: IXMLRespuestaComunAltaType;

A partir de ahí para generar un XML nuevo, deberíamos empezar por NewPeticionFacturacionAlta y para cargar la respuesta obtenida deberíamos usar LoadRespuestaFacturacionAlta o GetRespuestaFacturacionAlta.

Adjunto los nuevos ficheros.

seccion_31 06-07-2023 08:46:49

Buenos dias !

Os presento mi duda mas importante a la hora de generar el XML, usando el databinding, segun el esquema XSD que amablemente me envio Neftali.

Código Delphi [-]
procedure TForm2.Button5Click(Sender: TObject);
var
    alta: IXMLSistemaFacturacionAltaFact;
begin
      alta:=NewSistemaFacturacionAltaFact;
      alta.Cabecera.IDVersion:='1';
      alta.Cabecera.ObligadoEmision.NombreRazon:='Nombre de prueba';

      memo1.Lines.Text:=alta.XML;
end;

Hasta ahi sencillo, tengo el objeto XML de alta de factura, y me deja indicar la cabecera y todo lo que de ella pende.

Perfecto.

¿pero y el resto de nodos que tengo que añadir? ¿como lo hago? (tengo las definiciones en el .pas con los interfaces pero no se como usarlos mas alla de este pequeño codigo).

he tratado de mil maneras y no consigo añadirlos.

x favor, ¿alguien puede sacarme de esta duda?

Saludos cordiales.

Neftali [Germán.Estévez] 06-07-2023 08:57:37

Cita:

Empezado por seccion_31 (Mensaje 551966)
¿pero y el resto de nodos que tengo que añadir? ¿como lo hago? (tengo las definiciones en el .pas con los interfaces pero no se como usarlos mas alla de este pequeño codigo).

Con los últimos ficheros que te he subido, un código como este, genera y guarda un XML con datos:

Código Delphi [-]
...
uses
  SuministroInformacion;

procedure TForm3.Button1Click(Sender: TObject);
var
  IFact:IXMLSistemaFacturacionAltaFact;
begin
  IFact := NewPeticionFacturacionAlta;

  IFact.Cabecera.IDVersion := '1.0';

  IFAct.Cabecera.ObligadoEmision.NombreRazon := 'Pepe Lotas';
  IFAct.Cabecera.ObligadoEmision.NIF := '12345678N';
  IFAct.Cabecera.ObligadoEmision.NombreRazonRepresentante := 'Representante';


  ...



  IFact.OwnerDocument.SaveToFile('r:\fact1.xml')

end;

seccion_31 06-07-2023 09:23:13

gracias x la respuesta tan rapida.

las funciones las tenia, como se ve en el pequeño ejemplo de codigo que publique. hasta ahi perfecto.

Y como digo, puedo como bien indicas acceder al objeto cabecera, y todos sus descendientes:

Código Delphi [-]
  IFAct.Cabecera.ObligadoEmision.NombreRazon := 'Pepe Lotas';
  IFAct.Cabecera.ObligadoEmision.NIF := '12345678N';
  IFAct.Cabecera.ObligadoEmision.NombreRazonRepresentante := 'Representante';

Pero sigo sin entender, como creo un objeto nuevo, con digamos:

PeriodoLiquidacion

ó

RegistroFacturacion

Para seguir con la generacion del XML


Es decir algo asi:

Código Delphi [-]
IFAct.PeriodoLiquidacion.ejercicio:='2023';

Eso es lo que no se hacer.

Saludos cordiales

seccion_31 06-07-2023 12:39:12

He creado este codigo que genera un archivo XML, calcado al del ejemplo de ermendalenda:

Es un codigo muy basico, pero quizas a alguien le ayude, ahora voy a mirar como calcular la huella, que creo ha sido tratado en este foro.

(no lo formateo porque lo altera para mal)

Código Delphi [-]type TSistemaInformatico=record nombreRazon:string; NIF:string; IdsistemaInformatico:string; version:string; numeroInstalacion:string; TipoUsoSistema:string; end; TEncadenamiento=record IdEmisorFacturaAnterior:string; NumSerieFacturaAnterior:string; FechaExpedicionFacturaAnterior:Tdatetime; HuellaFacturaAnterior:string; end; TPeriodoliquidacion=record ejercicio:string; periodo:string; end; TIDFactura=record IdEmisor_nif:string; NumSerieFacturaEmisor:string; FechaExpedicionFacturaEmisor:Tdatetime; end; TDesglose=record claveRegimen:string; CalificacionOperacion:string; TipoImpositivo:real; BaseImponibleOImporteNoSujeto:real; CuotaRepercutida:real; end; TRegistroFactura=record PeriodoLiquidacion:TPeriodoliquidacion; IDFactura:TIDFactura; tipoFactura:string; FechaOperacion:Tdatetime; DescripcionOperacion:String; Desglose:array of TDesglose; ImporteTotal:real; EncadenamientoFacturaAnterior:TEncadenamiento; SistemaInformatico:TSistemaInformatico; end;



procedimientos:


Código:

function moneda(n:real):string;
begin
      FormatSettings.DecimalSeparator := '.';
      result:=trim(Format('%8.2f',[n]));
end;

function nodo(clave, valor:string):string;
begin
      result:='<'+clave+'>'+valor+'</'+clave+'>';
end;

procedure cabecera(xmlLista:TStringList; idVersion:string; NombreRazon, Nif:string);
begin
      if idVersion='' then idVersion:='0.1';

      xmlLista.add('<?xml version="1.0" encoding="UTF-8"?>');
      xmlLista.add('<SistemaFacturacionAltaFact xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/TR/xmldsig-core/xmldsig-core-schema.xsd">');
      xmlLista.add('<Cabecera>');
      xmlLista.add(nodo('IDVersion',idVersion));
      xmlLista.add('<ObligadoEmision>');
      xmlLista.add(nodo('NombreRazon',NombreRazon));
      xmlLista.add(nodo('NIF',Nif));
      xmlLista.add('</ObligadoEmision>');
      xmlLista.add('</Cabecera>');
end;

procedure iniciaRegistroAltaFacturas(xmlLista:TStringList);
begin
      xmlLista.add('<RegistroAltaFacturas>');
end;

function moneda(n:real):string;
begin
      FormatSettings.DecimalSeparator := '.';
      result:=trim(Format('%8.2f',[n]));
end;


procedure registroFacturacion(xmlLista:TStringList; registroFactura:TRegistroFactura);
var
  I:integer;
begin
      xmlLista.add('<RegistroFacturacion>');

      xmlLista.add('<PeriodoLiquidacion>');
      xmlLista.add(nodo('Ejercicio',registroFactura.PeriodoLiquidacion.ejercicio) );
      xmlLista.add(nodo('Periodo',registroFactura.PeriodoLiquidacion.periodo));
      xmlLista.add('</PeriodoLiquidacion>');

      xmlLista.add('<IdFactura>');
      xmlLista.add('<IdEmisorFactura>');
      xmlLista.add(nodo('NIF',registroFactura.IDFactura.IdEmisor_nif));
      xmlLista.add('</IdEmisorFactura>');

      xmlLista.add(nodo('NumSerieFacturaEmisor',registroFactura.IDFactura.NumSerieFacturaEmisor ));
      xmlLista.add(nodo('FechaExpedicionFacturaEmisor',datetostr(registroFactura.IDFactura.FechaExpedicionFacturaEmisor) ));
      xmlLista.add('</IdFactura>');

      xmlLista.add(nodo('TipoFactura',registroFactura.tipoFactura));
      xmlLista.add(nodo('FechaOperacion',datetostr(registroFactura.FechaOperacion)));
      xmlLista.add(nodo('DescripcionOperacion',registroFactura.DescripcionOperacion));

      // array de desgloses
      xmlLista.add('<Desglose>');
      for I := Low(registroFactura.Desglose) to High(registroFactura.Desglose) do
      begin
                xmlLista.add('<DetalleDesglose>');

                xmlLista.add(nodo('ClaveRegimen',registroFactura.Desglose[i].claveRegimen ));
                xmlLista.add(nodo('CalificacionOperacion',registroFactura.Desglose[i].CalificacionOperacion ));
                xmlLista.add(nodo('TipoImpositivo',moneda(registroFactura.Desglose[i].TipoImpositivo)));
                xmlLista.add(nodo('BaseImponibleOimporteNoSujeto',moneda(registroFactura.Desglose[i].BaseImponibleOImporteNoSujeto)));
                xmlLista.add(nodo('CuotaRepercutida',moneda(registroFactura.Desglose[i].CuotaRepercutida)));

                xmlLista.add('</DetalleDesglose>');
      end;
      xmlLista.add('</Desglose>');

      xmlLista.add(nodo('ImporteTotal',moneda(registroFactura.ImporteTotal)));

      xmlLista.add('<EncadenamientoFacturaAnterior>');
      xmlLista.add(nodo('IDEmisorFacturaAnterior',registroFactura.EncadenamientoFacturaAnterior.IdEmisorFacturaAnterior));
      xmlLista.add(nodo('NumSerieFacturaAnterior',registroFactura.EncadenamientoFacturaAnterior.NumSerieFacturaAnterior));
      xmlLista.add(nodo('FechaExpedicionFacturaAnterior',datetostr(registroFactura.EncadenamientoFacturaAnterior.FechaExpedicionFacturaAnterior)));
      xmlLista.add(nodo('HuellaFacturaAnterior',registroFactura.EncadenamientoFacturaAnterior.HuellaFacturaAnterior));
      xmlLista.add('</EncadenamientoFacturaAnterior>');


      xmlLista.add('<SistemaInformatico>');
      xmlLista.add(nodo('NombreRazon',registroFactura.SistemaInformatico.nombreRazon ));
      xmlLista.add(nodo('NIF', registroFactura.SistemaInformatico.NIF ) );
      xmlLista.add(nodo('IdSistemaInformatico', registroFactura.SistemaInformatico.IdsistemaInformatico ) );
      xmlLista.add(nodo('Version',registroFactura.SistemaInformatico.version));
      xmlLista.add(nodo('NumeroInstalacion',registroFactura.SistemaInformatico.numeroInstalacion));
      xmlLista.add(nodo('TipoUsoSistema',registroFactura.SistemaInformatico.TipoUsoSistema));
      xmlLista.add('</SistemaInformatico>');
      xmlLista.add('</RegistroFacturacion>');
end;


function finalizaRegistroAltaFacturas(xmlLista:TStringList):string;
var
  _huella:string;
begin
      // calculo de la huella: (por hacer)
      _huella:='005948F5A441A56ABF584804036409719AB89892608FD708BAB8AE5088C896AD';
      result:=_huella;
      //


      xmlLista.add('<DatosControl>');
      xmlLista.add(nodo('Huella',_huella) );
      xmlLista.add(nodo('TipoHash','01') );
      xmlLista.add(nodo('FechaGenRegistro',dateTostr(date)) );
      xmlLista.add(nodo('HoraGenRegistro',timeTostr(time)) );
      xmlLista.add(nodo('HUsoHorarioGenRegistro','02') );
      xmlLista.add('</DatosControl>');

      xmlLista.add('</RegistroAltaFacturas>');
      xmlLista.add('</SistemaFacturacionAltaFact>');
end;


// datos de la factura "desde la base de datos:"

procedure anadeDatosFactura(var factura:TRegistroFactura);
begin
      factura.PeriodoLiquidacion.ejercicio:='2022';
      factura.PeriodoLiquidacion.periodo:='3T';
      factura.IDFactura.IdEmisor_nif:='00000006Y';
      factura.IDFactura.NumSerieFacturaEmisor:='84.2.1.2566';
      factura.IDFactura.FechaExpedicionFacturaEmisor:=strtodate('31/07/2022');
      factura.tipoFactura:='F2';
      factura.FechaOperacion:=factura.IDFactura.FechaExpedicionFacturaEmisor;
      factura.DescripcionOperacion:='VENTA MINORISTA';

      setLength(factura.Desglose,1);

      factura.Desglose[0].claveRegimen:='01';
      factura.Desglose[0].CalificacionOperacion:='S1';
      factura.Desglose[0].TipoImpositivo:=4;
      factura.Desglose[0].BaseImponibleOImporteNoSujeto:=1;
      factura.Desglose[0].CuotaRepercutida:=0.04;

      factura.ImporteTotal:=1.04;

      // encadenamiento factura anterior
      factura.EncadenamientoFacturaAnterior.IdEmisorFacturaAnterior:='00000006Y';
      factura.EncadenamientoFacturaAnterior.NumSerieFacturaAnterior:='84.2.1.2565';
      factura.EncadenamientoFacturaAnterior.FechaExpedicionFacturaAnterior:=strTodate('31/07/2022');
      factura.EncadenamientoFacturaAnterior.HuellaFacturaAnterior:='9yYI6U89U3IUIQE345EUGWEBsd7EKFCBP9trtYUJSD0JFFKJKrtthAuysfadfWPE';

      // sistema informatico
      factura.SistemaInformatico.nombreRazon:='SISTEMAS INFORMATICOS TPV';
      factura.SistemaInformatico.NIF:='00000006Y';
      factura.SistemaInformatico.IdsistemaInformatico:='IDENTIFICADOR AEAT XXXX';
      factura.SistemaInformatico.version:='46.243.1';
      factura.SistemaInformatico.numeroInstalacion:='45';
      factura.SistemaInformatico.TipoUsoSistema:='01';
end;

// Click que genera el archivo XML

Código:

procedure TForm2.Button6Click(Sender: TObject);
var
  xml:TStringList;
  factura:TRegistroFactura;
begin
    xml:=TStringList.Create;

    cabecera(xml, '0.1', 'EMPRESA DE PRUEBA, S.A.','00000006Y');   

    iniciaRegistroAltaFacturas(xml);    <-- inicia la carga de facturas

    // por cada factura:
   
    anadeDatosFactura(factura);  // <-- carga de datos de la factura desde la "BD"
    registroFacturacion(xml, factura);    <-- carga la factura en el XML


    // final   
    finalizaRegistroAltaFacturas(xml);

    xml.SaveToFile('c:\final.xml');
    xml.Free;
end;


Neftali [Germán.Estévez] 06-07-2023 13:13:46

Utiliza etiquetas de código cuando añadas trozos de código a los mensajes.
Para los códigos que llevan caracteres especiales se puede usar la etiqueta [ CODE ] en lugar de la de [ delphi ]

seccion_31 06-07-2023 13:20:06

hola de nuevo

(a riesgo de parecer ya un poco absurdo, ya me disculpareis)

Segun lo que he visto tenemos:

1 RegistroAltafacturas
1 Cabecera
xx registro(s) de facturacion (sobre los que hay que calcular la huella)
1 control

Si estoy equivocado corregidme por favor. ¿Tengo dudas si el nodo de Control, esta dentro o fuera del registro de facturacion?

si el nodo de control esta fuera, entonces La huella se calcula sobre todos los registros de facturacion.

si el nodo de control esta dentro del registro de facturacion, se calcula la huella sobre cada uno de los registros de facturacion.


Para obtener el calculo de la huella, ¿es con los valores del registro de facturacion, ¿ó debe incluir los literales de identificacion de cada nodo XML?


Saludos cordiales

seccion_31 06-07-2023 13:47:25

He modificado el ejemplo de codigo anterior (cuando salgamos de dudas lo publico completo), para obtener la huella de los valores del registro(s) de Facturacion.

En nuestro caso del ejemplo, si tomo los valores del registro de facturacion:

20223T00000006Y84.2.1.256631/07/2022F231/07/2022VENTA MINORISTA01S14.001.000.041.0400000006Y84.2.1.256531/07/20229yYI6U89U3IUIQE345EUGWEBsd7EKFCBP9trtYUJSD0JFFKJKrtthAuysfadfWPESISTEMAS INFORMATICOS TPV00000006YIDENTIFICADOR AEAT XXXX46.243.14501

tengo un sha256 de:

45b36c6aa8b2068545c11a236f257f22754bb0392c87786a62985abcd43541c6

Comprobado en Delphi, y en varias herramientas online.

Sin embargo con el mismo contenido del ejemplo de ermendalenda, tenemos:

005948F5A441A56ABF584804036409719AB89892608FD708BAB8AE5088C896AD

desconozco si el ejemplo tenia bien calculada la huella, o me estoy equivocando en algo.

seccion_31 06-07-2023 15:56:28

me respondo yo mismo:

El control diria que va fuera del "registro de facturacion", por tanto comprendera toda las facturas dentro de esos nodos.

El calculo del sah256 se supone que es con los codigos "<" incluidos ">"

Vease el link del mensaje #529: https://www.clubdelphi.com/foros/sho...&postcount=529

Me falta saber como firmar y enviar el XML. (sobre todo enviar) ¿se pueden hacer pruebas de envio ahora mismo?

Si lo veis bien, puedo ir publicando el codigo.

Saludos

ermendalenda 06-07-2023 17:26:09

Cita:

Empezado por seccion_31 (Mensaje 551977)
me respondo yo mismo:

El control diria que va fuera del "registro de facturacion", por tanto comprendera toda las facturas dentro de esos nodos.

El calculo del sah256 se supone que es con los codigos "<" incluidos ">"

Vease el link del mensaje #529: https://www.clubdelphi.com/foros/sho...&postcount=529

Me falta saber como firmar y enviar el XML. (sobre todo enviar) ¿se pueden hacer pruebas de envio ahora mismo?

Si lo veis bien, puedo ir publicando el codigo.

Saludos

Hola.
Que yo sepa, aún no están definidas las firmas ni los envios, no puedes hacer esas pruebas.
El hash efectivamente es sobre el nodo de registros... con la etiqueta (de dicho nodo) de inicio y fin incluidas

seccion_31 07-07-2023 08:12:08

Buenos dias !

Ya tengo el codigo para firmar el xml, utilizando el comando de linea de autofirma que funciona perfecto.

solo me quedaria saber como enviarlo, aunque no este definida todavia la url, y ya publico el codigo un poco como guia creo que puede ser interesante. (en el codigo anterior hay un fallo, en usohorario (falta la h) husohorario)

x favor ¿alguien puede ayudarme con el envío del XML? (y guardar la respuesta)

gracias !

seccion_31 07-07-2023 08:25:25

Cita:

Empezado por ermendalenda (Mensaje 551980)
Hola.
Que yo sepa, aún no están definidas las firmas ni los envios, no puedes hacer esas pruebas.
El hash efectivamente es sobre el nodo de registros... con la etiqueta (de dicho nodo) de inicio y fin incluidas

gracias por tu respuesta,

a ver si encuentro ayuda para enviar el xml.

saludos !

ermendalenda 07-07-2023 16:31:01

Cita:

Empezado por seccion_31 (Mensaje 551997)
gracias por tu respuesta,

a ver si encuentro ayuda para enviar el xml.

saludos !

Hola
Donde has conseguido los parámetros de la firma que hay que aplicar a los xmls y si es cades xades...?
Sabes si la firma va con Timestamp de un organismo verificado?

seccion_31 07-07-2023 17:50:15

Cita:

Empezado por ermendalenda (Mensaje 552012)
Hola
Donde has conseguido los parámetros de la firma que hay que aplicar a los xmls y si es cades xades...?
Sabes si la firma va con Timestamp de un organismo verificado?


Le digo autofirma command line, que me firme el XML, y me devuelve un XML con un codigo añadido bastante grande.

Paso ese XML firmado a un par de webs para que lo comprueben y al propio autofirma, y confirman que esta correctamente firmado.

Hasta ahi.

Informacion: https://firmaelectronica.gob.es/Home...Firma-OLD.html

Cita:

Formatos XAdES, CAdES y PAdES
Estos son los formatos y versiones de firma admitidos para hacer trámites con las Administraciones Públicas.
El portal Valide y la aplicación @firma permiten la firma de documentos electrónicos en los formatos XAdES, CAdES y PAdES.



XAdES: para ficheros de tamaño pequeño (hasta 4 MB)

CAdES: para ficheros de tamaño grande (a partir de 4 MB)

PAdES: para ver la información de tu firma y el contenido una vez firmado (PDF).

Revisare los datos de la firma a ver que me dicen, Pero puedes probarlo facilmente con el autofirma windows, seleccionando manualmente el XML y firmandolo.

Parametros del autofirma: (que soportan esos tres formatos)

Cita:

-gui (Realiza la operación con entorno gráfico. Tiene prioridad sobre -certgui)
-certgui (Usa un dialogo gráfico para la selección del certificado de firma)
-i inputfile (Ruta del fichero de entrada)
-o outputfile (Ruta del fichero de salida)
-algorithm algo (Algoritmo de firma)
-format (Establece el formato de firma)
auto (Selección de formato en base al fichero de entrada)
cades (Formato CAdES)
pades (Formato PAdES)
xades (Formato XAdES)

facturae (Firma de factura electronica)
ooxml (Formato OOXML)
odf (Formato ODF)
-config extraParams (Properties en texto plano con la configuración de la operación)
-store (Establece el almacén de claves. Por defecto, el del sistema)
auto (Almacén de claves del sistema)
windows (Almacén de claves de Windows)
mac (Almacén de claves de Mac OS X)
mozilla (Almacén de claves de Mozilla Firefox)
dni (DNI electrónico)
pkcs12:p12file (Almacén PKCS#12. "p12file" es la ruta del almacén)
pkcs11:p11file (Almacén PKCS#11. "p11file" es la ruta del controlador)

-password password (Establece la contraseña del almacén)
-alias alias (Alias del certificado de firma)
-filter filter (Filtro para seleccionar el certificado de firma)
-xml (Formatea la respuesta como XML)

ermendalenda 07-07-2023 21:01:41

Sí, se como funciona gracias, era por si habías visto algo de los parametros para firmas que se me escapara.

seccion_31 08-07-2023 10:25:03

Voy a compartir mi experiencia hasta hoy, me gustaría por favor que la comentarais

NO conozco bien los terminos tecnicos para expresar, asi que ya disculpareis.


Publicacion de los servicios WSDL por la AEAT
https://prewww2.aeat.es/static_files...cturacion.wsdl
Para mi la publicacion de los esquemas WSDL estan incompletos, no hay forma de crear ninguna estructura y faltan definiciones.

Por tanto es imposible probar nada desde ahi. si quiera invocar el procedimiento de envio. Ni compilar.


Publicacion de los XSD por la AEAT
https://prewww2.aeat.es/static_files...nformacion.xsd
Es una publicacion completa, que aparentemente se puede importar en delphi, mediante XML Binding para componer mas facilmente el esquema XML
En mi caso no he sabido como hacerla funcionar mas alla de rellenar el apartado "cabecera" y sus subnodos he sido incapaz de seguir completando el resto de nodos.


Composicion manual del XML
https://www.clubdelphi.com/foros/sho...&postcount=811
Visto lo anterir, he tenido que componer manualmente los XML, en mi opinion no ha quedado mal. (vease el codigo que publique)
post #811

Ese codigo lo he mejorado, en espera de publicarlo cuando tengamos alguna informacion mas.

Firma del XML
Creo que autofirma command line, puede hacerse cargo de la firma del XML

Envio del XML
Aunque nadie del hilo se ha pronunciado como enviar el XML firmado, se puede utilizar un THTTPRIO crear -un objeto del tipo requerido vacio- e interceptar el evento BeforeExecute para cargar el XML.
Eso ahora mismo no se puede hacer, porque como he indicado en el primer punto veo el WSDL incompleto. (pero lo he probado con el SII, y funciona)

Respuesta de la AEAT
Cita:

Buenos días:

Lamento indicarle que actualmente no hay ningún entorno de pruebas disponible ni está toda la documentación técnica necesaria, por tanto para obtener información más detallada habrá que esperar a la publicación de la OM (de forma que, basándose en esta, se pueda especificar cada detalle y generar la documentación que falta, como pueden ser los documentos de Validaciones y errores o las preguntas frecuentes).
Nota: es una lastima no haber sabido hacer funcionar el XML Binding para componer el XML.

Un saludo a tod@s y buen fin de semana.

Neftali [Germán.Estévez] 10-07-2023 08:42:51

Cita:

Empezado por seccion_31 (Mensaje 552027)
Respuesta de la AEAT
Buenos días:

Lamento indicarle que actualmente no hay ningún entorno de pruebas disponible ni está toda la documentación técnica necesaria, por tanto para obtener información más detallada habrá que esperar a la publicación de la OM (de forma que, basándose en esta, se pueda especificar cada detalle y generar la documentación que falta, como pueden ser los documentos de Validaciones y errores o las preguntas frecuentes).

Pues más claro imposible.
Ya lo he dicho en varias ocasiones.

Creo que no vale la pena seguir hasta que no se publique la documentación técnica necesarias. Es dar palos de ciego.

seccion_31 11-07-2023 19:51:01

buenas tardes !

tras varias consultas con la AEAT, he llegado a la conclusión que hoy no hay mucha mas información disponible.

Tras leer el PDF informativo, parece que el envio al sistema verifactu sera opcional:
https://www.agenciatributaria.es/sta...tubre_2022.pdf

Pagina 9


Sobre programacion, como no puedo quedarme quieto y no tengo los WSDL, he desarrollado una funcion capaz de convertir un TRecord a XML, usando las rttis, incluyendo anidaciones y toda clase arrays, de tal forma que facilmente se puede componer no solo la factura, sino cualquier estructura TRecord.

Actualmente los tipos que he creado han sido para el alta de facturacion y anulacion.

Este foro me ayudo mucho con el SII, y me gustaria viendo que tenemos tiempo, aportar lo que pueda, y que os animeis a colgar codigo, en mi caso para devolver lo aprendido.

Pero como no quiero crear mas confusion voy a postear unas porciones de ejemplo: para que os hagais una idea.
(Ha costado un par de minutos desarrollar la anulacion de facturas).


type (parcial)

Código:

  TRegistroFacturacion=record

        PeriodoLiquidacion:TPeriodoliquidacion;

        IDFactura:TIDFactura;

        tipoFactura:string;
        FechaOperacion:string;
        DescripcionOperacion:String;

        Desglose:array of TDesglose;

        ImporteTotal:string;

        Contraparte:TContraparte;

        EncadenamientoFacturaAnterior:TEncadenamiento;
        SistemaInformatico:TSistemaInformatico;
  end;

  TDatosControl=record
        huella:string;
        TipoHash:string;
        FechaGenRegistro:string;
        HoraGenRegistro:string;
        HUsoHorarioGenRegistro:string;
        Incidencia:string;
  end;

  TRegistroAltaFacturas=record
        empty:boolean;              //<- interpretado por la funcion xmlRecord (no genera XML), permite incluir o no el nodo.  (es opcional, y se puede añadir en cualquier nodo)

        RegistroFacturacion: TRegistroFacturacion;
        DatosControl: TDatosControl;
  end;

  TSistemaFacturacionAltaFact=record
        Cabecera:TCabecera;
        RegistroAltaFacturas:array[1..1000] of  TRegistroAltaFacturas;    // <- diseñado fijo pero podria ser un array dinamico, como desglose. (cada elemento incluye empty para determinar si hay factura)
  end;


codigo: (parcial)

Código:

var
  j:integer;
begin
      // vaciar array de facturas
      for j:=1 to 1000 do
          veriFactu.RegistroAltaFacturas[j].empty:=true;        // <-propiedad opcional "empty" no genera XML pero permite decidir si se genera el nodo, o no.

      // empezar a cargar datos:
      veriFactu.Cabecera.IDVersion:='0.1';
      veriFactu.Cabecera.ObligadoEmision.NombreRazon:='EMPRESA PRUEBAS';
      veriFactu.Cabecera.ObligadoEmision.NIF:='00000006Y';

      // cargar facturas
      veriFactu.RegistroAltaFacturas[1].empty:=false;
      veriFactu.RegistroAltaFacturas[1].RegistroFacturacion.PeriodoLiquidacion.ejercicio:='2022';
      veriFactu.RegistroAltaFacturas[1].RegistroFacturacion.PeriodoLiquidacion.periodo:='3T';

      veriFactu.RegistroAltaFacturas[1].RegistroFacturacion.IDFactura.IdEmisorFactura.NIF:='00000006Y';
      veriFactu.RegistroAltaFacturas[1].RegistroFacturacion.IDFactura.NumSerieFacturaEmisor:='84.2.1.2566';
      veriFactu.RegistroAltaFacturas[1].RegistroFacturacion.IDFactura.FechaExpedicionFacturaEmisor:='31/07/2022';

      veriFactu.RegistroAltaFacturas[1].RegistroFacturacion.tipoFactura:='F2';
      veriFactu.RegistroAltaFacturas[1].RegistroFacturacion.FechaOperacion:='31/07/2022';
      veriFactu.RegistroAltaFacturas[1].RegistroFacturacion.DescripcionOperacion:='VENTA MINORISTA';

      // un desglose
      setLength(veriFactu.RegistroAltaFacturas[1].RegistroFacturacion.Desglose,1);
      veriFactu.RegistroAltaFacturas[1].RegistroFacturacion.Desglose[0].claveRegimen:='01';
      veriFactu.RegistroAltaFacturas[1].RegistroFacturacion.Desglose[0].calificacionOperacion:='S1';

....

etc.... llenando el record.... y finalmente:

      // crear archivo XML desde el record  (aqui se hace la magia)
    // parametros:  tipo de dato, el record "master" del alta,  un pointer a la variable de ese record, el archivo xml a crear, y el callback para calcular huellas y lo que haga falta. (opcional)
      recordToXML('uVeriExp.TSistemaFacturacionAltaFact', @veriFactu, 'c:\pruebas\v1.xml', calcularHuellas );

callback, (opcional) para calcular huellas, es llamado cada vez que se analiza un nodo o value en el record.
Es decir cuando se va construyendo el XML desde el record, se va llamando a este callback y se intercepta el nodo registrofacturacion para calcular la huella.

Código:

// CALLBACK de nodos y valores

parametros del callback:  xmlFile en construccion, xmlArray: indice si se esta dentro de un array dentro del record, xmlNodo y xmlLabel identificador del nodo y etiqueta de valor, xmlValue, valor de la etiqueta, que puede ser alterado en el callback, y xmlLabelFin, etiqueta marcador de fin de valor.  </

Segun en que momento se este procesado el record, el callback recibe unos u otros valores. xmlArray en nuestro ejemplo tendria sentido, dentro de la zona desglose o registrodefacturacion, fuera marcara -1.


procedure calcularHuellas(xmlFile:TStringList; xmlarray:integer; xmlNodo, xmlLabel:string; var xmlValue:string; xmlLabelFin:string);
var
    j:integer;
    numeroAnterior:string;
begin
    //
    // calcular huella
    //
      if (uppercase(xmlNodo)='<CABECERA>') then
      begin
          _huella:='';
          _huella256:='';
      end;

      if (uppercase(xmlNodo)='<REGISTROFACTURACION>') then    // empezamos a guardar el registro
      begin
          _huella:=xmlNodo;
          exit;
      end;

      if (uppercase(xmlNodo)='</REGISTROFACTURACION>') then // finalizamos y calculamos
      begin
          _huella:=_huella+xmlNodo;
          _huella256:=THashSHA2.GetHashString(_huella, SHA256);
          veriFactu.RegistroAltaFacturas[xmlArray+1].DatosControl.huella:=_huella256;

          _huella:='';
          exit;
      end;

      if _huella<>'' then                      // vamos guardando la huella por cada nodo y valor
        _huella:=_huella+xmlLabel+xmlValue+xmlLabelFin;


      if uppercase(xmlLabel)='<HUELLA>' then    // colocamos la huella
      begin
              xmlValue:=_huella256;
              _huella256:='';
              exit;
      end;

        /////// HUELLA FACTURA ANTERIOR //////////////
      if uppercase(xmlLabel)='<HUELLAFACTURAANTERIOR>' then
      begin
            numeroAnterior:=veriFactu.RegistroAltaFacturas[xmlArray+1].RegistroFacturacion.EncadenamientoFacturaAnterior.NumSerieFacturaAnterior;
            for j:=1 to 1000 do
            begin
                if (veriFactu.RegistroAltaFacturas[j].RegistroFacturacion.IDFactura.NumSerieFacturaEmisor=numeroAnterior)and
                  (not veriFactu.RegistroAltaFacturas[j].empty) then
                begin
                    xmlValue:=veriFactu.RegistroAltaFacturas[j].DatosControl.huella;
                    exit;
                end;
            end;
            xmlValue:='';
      end;
      // si no estuviera en este bloque habria que buscarla ¿en una base de datos?

end;


pablog2k 11-09-2023 16:48:19

Buenas tardes, a ver si me aclaro con todo esto:
por una parte tenemos la ley, que salió en el boe en julio 2021: https://www.boe.es/buscar/doc.php?id=BOE-A-2021-11473

por otra parte tenemos el reglamento de digitalización, donde se incluyen los requisitos informaticos...etc, con fecha febrero 2022: https://www.hacienda.gob.es/Document...talizacion.pdf

luego, tenemos en la web de verifactu:https://www.agenciatributaria.es/AEA...ERI_FACTU.html un enlace a un pdf con unas novedades en el reglamento de digitalización, con fecha junio 2022: https://www.agenciatributaria.es/sta.../Novedades.pdf.
En este enlace se indican cambios en el reglamento de digitalización, como por ejemplo:
Se elimina la referencia a la función de cierre del periodo impositivo. Asimismo, se cambia la redacción para simplificarla y aclararla con la intención de que se entienda que se ciñe al encadenamiento (vía huellas) de los registros de facturación, y no a su posible paso por distintos sistemas informáticos.

Y mi duda es, todos estos cambios que se indican en el ultimo link que he puesto... están ya bien redactados en algún sitio? es decir, en el reglamento de digitalización, pero actualizado?? porque estamos ya en septiembre 2023....

saludos

ermendalenda 12-09-2023 00:53:45

Cita:

Empezado por pablog2k (Mensaje 552478)
Buenas tardes, a ver si me aclaro con todo esto:
por una parte tenemos la ley, que salió en el boe en julio 2021: https://www.boe.es/buscar/doc.php?id=BOE-A-2021-11473

por otra parte tenemos el reglamento de digitalización, donde se incluyen los requisitos informaticos...etc, con fecha febrero 2022: https://www.hacienda.gob.es/Document...talizacion.pdf

luego, tenemos en la web de verifactu:https://www.agenciatributaria.es/AEA...ERI_FACTU.html un enlace a un pdf con unas novedades en el reglamento de digitalización, con fecha junio 2022: https://www.agenciatributaria.es/sta.../Novedades.pdf.
En este enlace se indican cambios en el reglamento de digitalización, como por ejemplo:
Se elimina la referencia a la función de cierre del periodo impositivo. Asimismo, se cambia la redacción para simplificarla y aclararla con la intención de que se entienda que se ciñe al encadenamiento (vía huellas) de los registros de facturación, y no a su posible paso por distintos sistemas informáticos.

Y mi duda es, todos estos cambios que se indican en el ultimo link que he puesto... están ya bien redactados en algún sitio? es decir, en el reglamento de digitalización, pero actualizado?? porque estamos ya en septiembre 2023....

saludos

Aún nada, esto va para largo. Demasiada incertidumbre en el gobierno para acometer un proyecto tan polémico.

pablog2k 12-09-2023 07:59:33

Cita:

Empezado por ermendalenda (Mensaje 552479)
Aún nada, esto va para largo. Demasiada incertidumbre en el gobierno para acometer un proyecto tan polémico.

vale,gracias por la respuesta , veremos a ver en que acaba todo esto.... :)

CarlosMz 20-09-2023 08:45:05

Es curioso, hay quien afirma que la AEAT ya está sancionando por esta nueva ley.
Evidentemente no por todos los apartados nuevos como verifactu

Tenéis noticias al respecto ?

Neftali [Germán.Estévez] 20-09-2023 09:27:17

Cita:

Empezado por CarlosMz (Mensaje 552564)
Es curioso, hay quien afirma que la AEAT ya está sancionando por esta nueva ley.
Evidentemente no por todos los apartados nuevos como verifactu

¿Qué ley? ¿Quien lo afirma? ¿Dónde?
Si hace un par de meses comentábamos esto:
https://www.clubdelphi.com/foros/sho...&postcount=823

No es posible que estén sancionando por la "Ley Antifraude" (que no existe).
Otra cosa sería sancionar por la "Ley de Facturación" (por ejemplo) que ya hace años que está vigente.

CarlosMz 20-09-2023 09:53:29

En la web leyantifraude.com

Casimiro Noteví 20-09-2023 10:45:10

Cita:

Empezado por CarlosMz (Mensaje 552568)
En la web leyantifraude.com

En esa web dice al principio, en grande:
Cita:

Reglamento AEAT — borrador — ya disponible.

espinete 20-09-2023 10:53:20

Esa web me da a mí que no es más que un metemiedos para intentar colar alguna suscripción a las empresas, o alguna homologación, etc

pablog2k 20-09-2023 11:06:43

Cita:

Empezado por espinete (Mensaje 552574)
Esa web me da a mí que no es más que un metemiedos para intentar colar alguna suscripción a las empresas, o alguna homologación, etc

coincido, yo también me encontré con esa web y pensé lo mismo.
No creo que puedan sancionar si no hay ni orden ministerial ni nada.....

espinete 20-09-2023 12:45:06

Entiendo que puedan sancionar por no cumplir la normativa, que creo que es de 2003 (pero NADIE cumple), y que impide borrar facturas, modificarlas, etc. Supuestamente, por Ley, habría que crear una rectificativa, etc.

Nosotros todavía tenemos (muchos) clientes que te preguntan cómo esconder facturas, borrarlas como si no se hubieran hecho, cambiarles el número, etc. y eso supuestamente sí que está prohibido, y creo recordar que la multa iba incluso para los desarrolladores de software por permitirlo.

Pero claro, eso es una cosa, y Veri*Factu es otra.

Neftali [Germán.Estévez] 20-09-2023 17:13:08

Cita:

Empezado por CarlosMz (Mensaje 552568)
En la web leyantifraude.com

:mad::mad:
Cita:

Empezado por espinete (Mensaje 552574)
Esa web me da a mí que no es más que un metemiedos para intentar colar alguna suscripción a las empresas, o alguna homologación, etc

+1
Me lo ha quitado de la boca y no lo puedo explicar mejor.

Primero te asusto con los 150.000€ en grande.
Luego te vendo auditorías, adaptaciones, asesoramiento, cursos, servicios legales,...

newtron 21-09-2023 09:27:15

Bueno... a mi un distribuidor ya me dice que algún cliente le ha comprado a alguna empresa que afirma que su software es totalmente compatible con Verifactu y el nuestro no. Así está la cosa...

CarlosMz 21-09-2023 17:11:11

Según he leído, de la Ley Antifraude sí están vigentes las sanciones por estos apartados:

a) permitan llevar contabilidades distintas en los términos del artículo 200.1.d) de esta Ley;
b) permitan no reflejar, total o parcialmente, la anotación de transacciones realizadas;
c) permitan registrar transacciones distintas a las anotaciones realizadas;
d) permitan alterar transacciones ya registradas incumpliendo la normativa aplicable;

La verdad es que estoy perdido, por ejemplo un albarán es transacción ? o se refiere solo a facturas ?
Puedo borrar/modificar albaranes ? y presupuestos ?

Muchas gracias por responder

Neftali [Germán.Estévez] 21-09-2023 17:25:10

Cita:

Empezado por CarlosMz (Mensaje 552599)
Según he leído, de la Ley Antifraude sí están vigentes las sanciones por estos apartados...

¿Seguro que eso no está dentro de la ley de facturación?

Cita:

Empezado por CarlosMz (Mensaje 552599)
La verdad es que estoy perdido, por ejemplo un albarán es transacción ?
Puedo borrar/modificar albaranes ? y presupuestos ?

Yo diría que no, sólo facturas.

Cita:

Empezado por CarlosMz (Mensaje 552599)
Puedo borrar/modificar albaranes ? y presupuestos ?

Si.

novatico 27-09-2023 09:57:15

Puedo borrar/modificar albaranes ? y presupuestos ?

Siempre que no se haya emitido la factura correspondiente a esos documentos.

CarlosMz 28-09-2023 10:59:50

Muchas gracias por contestar a todos.

Otra consulta cuando hacéis una factura la trabáis directamente ?
trabajáis con facturas borrador ?
Permitís modificar facturas total o parcialmente ?

muchas gracias de nuevo


La franja horaria es GMT +2. Ahora son las 13:42:08.

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