Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-07-2023
seccion_31 seccion_31 is offline
Miembro
 
Registrado: ene 2017
Posts: 112
Poder: 8
seccion_31 Va por buen camino
Cita:
Empezado por ermendalenda Ver Mensaje
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 !
Responder Con Cita
  #2  
Antiguo 07-07-2023
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 872
Poder: 3
ermendalenda Va por buen camino
Cita:
Empezado por seccion_31 Ver Mensaje
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?

Última edición por ermendalenda fecha: 07-07-2023 a las 16:36:38.
Responder Con Cita
  #3  
Antiguo 07-07-2023
seccion_31 seccion_31 is offline
Miembro
 
Registrado: ene 2017
Posts: 112
Poder: 8
seccion_31 Va por buen camino
Cita:
Empezado por ermendalenda Ver Mensaje
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)
pkcs1212file (Almacén PKCS#12. "p12file" es la ruta del almacén)
pkcs1111file (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)

Última edición por seccion_31 fecha: 07-07-2023 a las 18:01:04. Razón: aportar mas informacion
Responder Con Cita
  #4  
Antiguo 07-07-2023
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 872
Poder: 3
ermendalenda Va por buen camino
Sí, se como funciona gracias, era por si habías visto algo de los parametros para firmas que se me escapara.
Responder Con Cita
  #5  
Antiguo 08-07-2023
seccion_31 seccion_31 is offline
Miembro
 
Registrado: ene 2017
Posts: 112
Poder: 8
seccion_31 Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 10-07-2023
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.286
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por seccion_31 Ver Mensaje
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #7  
Antiguo 11-07-2023
seccion_31 seccion_31 is offline
Miembro
 
Registrado: ene 2017
Posts: 112
Poder: 8
seccion_31 Va por buen camino
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;
Responder Con Cita
Respuesta



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

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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Hijo de Informáticos gluglu Humor 3 13-03-2007 11:05:35
Adictos informaticos ... Trigger Humor 2 11-10-2004 12:18:32
Nosotros los Informáticos Trigger Humor 1 10-10-2004 14:58:09
Patrón de los Informáticos. obiwuan Varios 20 10-09-2003 14:44:54
Chistes Informaticos jhonny Humor 2 11-08-2003 21:59:09


La franja horaria es GMT +2. Ahora son las 17:17:34.


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