Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Envío de registros y sus respuestas (https://www.clubdelphi.com/foros/forumdisplay.php?f=66)
-   -   Demo con código Verifactu.dll para (delphi 7) (https://www.clubdelphi.com/foros/showthread.php?t=97004)

starlet 20-03-2025 19:16:58

Otro más que aterriza por aquí.

Me he enterado tarde de este proyecto que puede ser un "salva vidas" literal para mucha gente, entre los que me incluyo.

Cuanto tiempo me habría ahorrado si me hubiese enterado antes..

Mil gracias a seccion_31!!!!

Estoy analizando todo. Pero al intentar la demo, no hace nada, compila sin errores, pero no muestra formulario. Se cierra automáticamente.

Estoy haciendo algo mal?. Evidentemente se me escapa algo, pq al resto de la gente le funciona.

Versión Delphi 10.1 y 11.3

Gracias,

mqm 21-03-2025 14:21:26

Cita:

Empezado por starlet (Mensaje 562922)
Otro más que aterriza por aquí.

Me he enterado tarde de este proyecto que puede ser un "salva vidas" literal para mucha gente, entre los que me incluyo.

Cuanto tiempo me habría ahorrado si me hubiese enterado antes..

Mil gracias a seccion_31!!!!

Estoy analizando todo. Pero al intentar la demo, no hace nada, compila sin errores, pero no muestra formulario. Se cierra automáticamente.

Estoy haciendo algo mal?. Evidentemente se me escapa algo, pq al resto de la gente le funciona.

Versión Delphi 10.1 y 11.3

Gracias,

El formulario principal tiene visible = false
Ponlo a true

seccion_31 22-03-2025 07:48:53

Cita:

Empezado por mqm (Mensaje 562949)
El formulario principal tiene visible = false
Ponlo a true

gracias

que horror, se debio quedar a false en algun momento y como en D7 se abre sin problema ni cuenta me di.

gracias por todos los apoyos, y gracias a los que habeis contribuido, porque hemos pasado por varias fases:

al principio era un servidor de mensajes, que luego gracias a darkdudae y su aviso, paso a ser DLL, que parece mas profesional
a los usuarios del foro que han contribuido para aislar el xml del registro y poder archivarlo, cosa que no tenia ni idea
y finalmente el tema de comprender el encadenamiento que estaba muy equivocado.

fallos, no se si saldran muchos mas, ahora, tampoco se si falta alguna caracteristica clave como las dos ultimas mencionadas arriba.

Un saludo a todos, y me alegro de que este sirviendo para su fin.

starlet 22-03-2025 11:42:04

Cita:

Empezado por mqm (Mensaje 562949)
El formulario principal tiene visible = false
Ponlo a true

Lo primero, pedir disculpas, por la repetición de mensajes. Juro que al postear el mensaje me daba error, y no se publicaba, y hoy, aparecen de golpe varias repeticiones del mismo mensaje.

Pido a los moderadores, que sólo dejen uno. Gracias

Respecto a visible = false en el form principal, sí, ya lo había visto y por supuesto lo he puesto a true, pero sigue exactamente igual. Y como digo lo he probado con 2 versiones diferentes de Delphi.

Evidentemente, asumo que es un error de mi equipo, pero no tengo ni idea de qué puede ser, porque desarrollo en este equipo sin ningún problema desde hace varios años.

Reitero mi agradecimiento a seccion_31 y a todos los que habéis contribuido en este proyecto y desde ahora en lo que pueda, intentaré ayudar igualmente.

seccion_31 22-03-2025 12:04:37

Cita:

Empezado por starlet (Mensaje 562972)
Lo primero, pedir disculpas, por la repetición de mensajes. Juro que al postear el mensaje me daba error, y no se publicaba, y hoy, aparecen de golpe varias repeticiones del mismo mensaje.

Pido a los moderadores, que sólo dejen uno. Gracias

Respecto a visible = false en el form principal, sí, ya lo había visto y por supuesto lo he puesto a true, pero sigue exactamente igual. Y como digo lo he probado con 2 versiones diferentes de Delphi.

Evidentemente, asumo que es un error de mi equipo, pero no tengo ni idea de qué puede ser, porque desarrollo en este equipo sin ningún problema desde hace varios años.

Reitero mi agradecimiento a seccion_31 y a todos los que habéis contribuido en este proyecto y desde ahora en lo que pueda, intentaré ayudar igualmente.

Has instalado el capicom ?

seccion_31 22-03-2025 12:13:44

Cita:

Empezado por ontisoft (Mensaje 562942)
Hola de nuevo. Llevo un par de meses desconectado y veo que este proyecto a seguido avanzando bastante.
Gracias a todos por vuestro esfuerzo y trabajo.

Yo comencé con la demo trasteando y probando con Delphi 12 y tenia muy buena pinta.

Pero por lo que veo ahora os centráis mas en un componente DLL para Delphi 7.

Mi pregunta es, las mejoras de la DLL ¿se están llevando también a la demo inicial, o ya solo os centráis en la DLL?

¿La DLL se puede integrar también en Delphi 12 o solo es para versiones antiguas?

Quiero ponerme ya en serio con este asunto, y si puedo aportar algo en el proceso lo hare encantado.

La demo inicial sigue los cambios de la DLL. Incluso muy mejorada.

En principio la DLL y el componente se puede usar desde cualquier versión. De delphi.

Si vas a usar la DLL puedes ver la llamada desde el.componente.

También podrías usar la unidad de funciones sin su encapsulado de DLL llamando sin más a su unidad

ramherfer 22-03-2025 12:28:23

Hola buenos días.
¿Teneis algún mecanismo para que antes de realizar un envío comprobar si el servicio de la AEAT se encuentra activo o no?.

creo que VeriFactuD7.final( LogFile ) No me está creando el fichero log

Un saludo,

seccion_31 22-03-2025 12:29:53

Cita:

Empezado por ramherfer (Mensaje 562975)
Hola buenos días.
¿Teneis algún mecanismo para que antes de realizar un envío comprobar si el servicio de la AEAT se encuentra activo o no?.

Un saludo,

Podrías hacer una consulta simple

seccion_31 22-03-2025 12:33:29

Cita:

Empezado por ramherfer (Mensaje 562975)
Hola buenos días.
¿Teneis algún mecanismo para que antes de realizar un envío comprobar si el servicio de la AEAT se encuentra activo o no?.

creo que VeriFactuD7.final( LogFile ) No me está creando el fichero log

Un saludo,

Con la DLL el log quedo obsoleto

ramherfer 22-03-2025 12:35:00

Cita:

Empezado por seccion_31 (Mensaje 562976)
Podrías hacer una consulta simple

No quisiera hacer consultas muy recurrentes para no tener conflictos, voy a intentarlo y antes de hacer un envio consultar.

gracias por informar con el tema del log.

seccion_31 22-03-2025 12:39:38

Cita:

Empezado por ramherfer (Mensaje 562978)
No quisiera hacer consultas muy recurrentes para no tener conflictos, voy a intentarlo y antes de hacer un envio consultar.

gracias por informar con el tema del log.

también me había planteado comprobar el estado de la AEAT pero solo al abrir el programa.

Incluso habia pensado hacer una función de ese tipo, a ver si hay otra forma...

Con otro tema: Pensé en validar el.vies y está la función dentro, pero no me válida casi nunca y lo dejé por imposible.


Slds,!

ramherfer 22-03-2025 13:58:23

Voy de momento a usar esta función con la URL del Endpoint de la AEAT

Código Delphi [-]
function VerificarServicioSOAP(const URL: string; Intentos: Integer): Boolean;
var
  HTTP: TIdHTTP;
  SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
  I: Integer;
begin
  Result := False; 
  HTTP := TIdHTTP.Create(nil);
  SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  try
    HTTP.IOHandler := SSLHandler;
    HTTP.ReadTimeout := 5000; 

    for I := 1 to Intentos do
    begin
      try
        HTTP.Head(URL);
        Result := True; // El servicio está activo
        Exit;
      except
        on E: EIdException do
          ; // Oculta cualquier error de Indy
        on E: Exception do
          ; // Oculta otros errores generales
      end;
    end;
  finally
    SSLHandler.Free;
    HTTP.Free;
  end;
end;

Con un elemento visual en verde si está activo y en rojo si NO está activo en el statusBar.
Esto en el hilo principal de la aplicación y si al ir a remitir facturas a la señora AEAT si está inactivo que ni lo intente.
Ya que en estos momentos está caido lo tengo a modo de pruebas

seccion_31 22-03-2025 14:24:02

Cita:

Empezado por ramherfer (Mensaje 562981)
Voy de momento a usar esta función con la URL del Endpoint de la AEAT

Código Delphi [-]
function VerificarServicioSOAP(const URL: string; Intentos: Integer): Boolean;
var
  HTTP: TIdHTTP;
  SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
  I: Integer;
begin
  Result := False; 
  HTTP := TIdHTTP.Create(nil);
  SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  try
    HTTP.IOHandler := SSLHandler;
    HTTP.ReadTimeout := 5000; 

    for I := 1 to Intentos do
    begin
      try
        HTTP.Head(URL);
        Result := True; // El servicio está activo
        Exit;
      except
        on E: EIdException do
          ; // Oculta cualquier error de Indy
        on E: Exception do
          ; // Oculta otros errores generales
      end;
    end;
  finally
    SSLHandler.Free;
    HTTP.Free;
  end;
end;

Con un elemento visual en verde si está activo y en rojo si NO está activo en el statusBar.
Esto en el hilo principal de la aplicación y si al ir a remitir facturas a la señora AEAT si está inactivo que ni lo intente.
Ya que en estos momentos está caido lo tengo a modo de pruebas

Con tu permiso lo coloco en el componente

Slds !

seccion_31 22-03-2025 16:59:35

verificar que la AEAT esta ahi.

He usado el codigo de ramherfer con algun cambio para que me funcionara, y hoy da como activa la web de la aeat cuando tiene un error, el tipico del fin de semana:

Cita:

Descripción: UNSUCCESSFUL EXECUTION CAUSED BY AN UNAVAILABLE RESOURCE. REASON 00C90081, TYPE OF RESOURCE 00000210, AND RESOURCE NAME DBTCCSOR.TSTCCSOR.00000001. SQLCODE=-904, SQLSTATE=57011, DRIVER=4.33.43
La pagina existe, y por tanto aparece como activa, pero con error. Entrar en analizar su contenido me parece un poco exagerado. Es mi opinión. Ademas de necesitar las dlls adiciones para que funcione el ssl.

Por lo que creo que es mejor incorporar una consulta, la mas simple, de un día determinado, por ejemplo del día siguiente. (no se si dejara).

Otro tema es la frecuencia de revision planteada.

Saludos !

Nota: ya esta incpororada la funcion, para ello consulta una factura, llamada PING en el periodo y fecha actuales con el certificado de la sesion. Es inmediato y seguro.

mqm 22-03-2025 17:26:52

Buenas session_31.
Yo lo que hago en tu componente es lo que dices, una consulta inexstente y listo.

Código Delphi [-]
procedure TForm1.VerificaConexíonClick(Sender: TObject);
var
   ejercicio, periodo, numero: string;
   desde, hasta: TDatetime;
   resultado: TConsultaResultado;
begin
   // Datos esenciales de inicio de sesion para consulta
   VeriFactuD7.Certificado               := comboCertificados.text;
   VerifactuD7.Emisor.NombreRazonEmisor  := editEmisor.Text;
   VerifactuD7.Emisor.nifEmisor          := editNIFEmisor.Text;
   VerifactuD7.Simular                   := false;
   VerifactuD7.urlEndPoint               := editURL.text;

   // si se filtra por sistema informatico colocar los datos
   if filtroSIF.checked then
   begin
       VerifactuD7.SistemaInformatico.razonSocial       := editRazonSocial.Text;
       VerifactuD7.SistemaInformatico.nif               := editNIF.Text;
       VerifactuD7.SistemaInformatico.nombre            := editNombre.Text;
       VerifactuD7.SistemaInformatico.ID                := editID.Text;
       VerifactuD7.SistemaInformatico.Version           := editVersion.Text;
       VerifactuD7.SistemaInformatico.NumeroInstalacion := editInstalacion.Text;
   end;

   // Archivo XML vacío que se guardará como referencia de la consulta
   VeriFactuD7.filenameXML_Envio       := xmlEnvioConsulta;
   VeriFactuD7.filenameXML_Respuesta   := xmlRespuestaConsulta; 

   // Iniciar Sesión
   if not VeriFactuD7.inicio then
   begin
       ShowMessage('Error Iniciando Sesion');
       Exit;
   end;

     // Asignar parámetros mínimos válidos
     ejercicio := IntToStr(YearOf(Now));   // Año actual
     periodo := FormatDateTime('mm', Now); // Mes actual
     numero := '';                         // Consulta sin número específico
     desde := Now;                         // Fecha actual como ejemplo
     hasta := Now;                         // Mismo día para una consulta mínima válida

   // Intentar la consulta vacía
   if VeriFactuD7.consulta(ejercicio, periodo, numero, desde, hasta, filtroSIF.Checked, resultado) then
   begin
       ShowMessage('Conexión exitosa con el servidor.');
   end
   else
   begin
       ShowMessage('Error en la conexión: ' + resultado.errorDes);
   end;

   // Terminar sesión
   VeriFactuD7.final('');
end;

seccion_31 22-03-2025 17:30:56

si, creo que la consulta inexistente es lo mejor.

ahora se reducira a:

Código:

            VeriFactuD7.Certificado              :=comboCertificados.text;
            VerifactuD7.Emisor.NombreRazonEmisor :=editEmisor.Text;
            VerifactuD7.Emisor.nifEmisor        :=editNIFEmisor.Text;
            VerifactuD7.urlEndPoint              :=editURL.text;  // endpoint de la AEAT

            if veriFactuD7.VerifactuActivo then
                statusBar1.panels[1].Text:='AEAT Activa'
            else
                statusBar1.panels[1].Text:='AEAT Inactiva';


y si tienes el certificado ya cargado mucho menos codigo. Sin iniciar sesion.

Ya esta incluido el ejemplo en la Demo

Y la publicare la semana del 31 ; ) como version 2.1 con los cambios que vayan apareciendo.

Saludos !

: )

y buenas tardes

mqm 25-03-2025 13:04:24

en el proceso siguiente:

Código Delphi [-]
procedure TForm1.procesarEnvio(resultado:TResultadoEnvio);
var
  desError,error,estado,factura, emisor, huella:string;

  aFactura:TRegistroFactura;

  j:integer;
begin
      memoXML.Lines.LoadFromFile(xmlEnvio);
      memoXML.Text:=FormatXMLData(memoXML.Text);

      memoRes.lines.clear;
      memoRes.lines.Add('Se ha realizado el envío');
      memoRes.Lines.Add('');
      memoRes.Lines.Add('Estado Del Envio:'+resultado.EstadoEnvio );
      memoRes.lines.Add('CSV: ' + resultado.CSV);
      memoRes.lines.Add('TimeStamp: ' + resultado.Fecha+' '+resultado.Hora);
      memoRes.Lines.Add('');

Creo que resultado.Fecha+' '+resultado.Hora estan cambiados. ya que devuelve 11:59:10 25/03/2025

seccion_31 25-03-2025 20:06:48

Ya esta corregido !

gracias por el aviso.

Por cierto starlet ¿has podido probar la demo?


slds !

Cita:

Empezado por mqm (Mensaje 563087)
en el proceso siguiente:

Código Delphi [-]
procedure TForm1.procesarEnvio(resultado:TResultadoEnvio);
var
  desError,error,estado,factura, emisor, huella:string;

  aFactura:TRegistroFactura;

  j:integer;
begin
      memoXML.Lines.LoadFromFile(xmlEnvio);
      memoXML.Text:=FormatXMLData(memoXML.Text);

      memoRes.lines.clear;
      memoRes.lines.Add('Se ha realizado el envío');
      memoRes.Lines.Add('');
      memoRes.Lines.Add('Estado Del Envio:'+resultado.EstadoEnvio );
      memoRes.lines.Add('CSV: ' + resultado.CSV);
      memoRes.lines.Add('TimeStamp: ' + resultado.Fecha+' '+resultado.Hora);
      memoRes.Lines.Add('');

Creo que resultado.Fecha+' '+resultado.Hora estan cambiados. ya que devuelve 11:59:10 25/03/2025


seccion_31 26-03-2025 09:48:39

parece que han cambiado esto en la normativa: desde el 18 de marzo:

Cita:

15.6.9 ClaveRegimen 18. Recargo de equivalencia
- Sólo se puede cumplimentar TipoRecargoEquivalencia y CuotaRecargoEquivalencia
cuando CalificacionOperacion es “S1”.
- Si CalificacionOperacion es “S1”:
 Si Impuesto = “01” (IVA) o no se cumplimenta (considerándose “01” – IVA), sólo
se podrá cumplimentar TipoRecargoEquivalencia y CuotaRecargoEquivalencia si
ClaveRegimen igual a “18”.
 Si Impuesto = “01” (IVA) o no se cumplimenta (considerándose “01” – IVA) y
ClaveRegimen igual a “18”, es oblig
Cita:

1.0.3 18/03/2025 Se incluye nuevo “Aceptado con errores” al hacer
un mal uso del primer registro.
Se incluye nueva validación para la clave de
régimen 18 (Recargo de equivalencia)
Se elimina validación de NIFs iguales entre emisor
y destinatario (Facturas de autoconsumo)
Fuente: https://www.agenciatributaria.es/static_files/AEAT_Desarrolladores/EEDD/IVA/VERI-FACTU/Validaciones_Errores_Veri-Factu.pdf


Asi que he probado a intentar subir una factura usando la demoD7 con REQ y me la ha rechazado:

Incorrecto 1279 Si el impuesto es IVA(01) o vacio, solo se podrá informar TIPORECARGOEQUIVALENCIA y CUOTARECARGOEQUIVALENCIA si la clave de régimen es 18.

Este sera otro cambio que llevara la version 2.1

Si alguien quiere comentarlo....

Saludos !

delphiGar 26-03-2025 10:46:14

Cita:

Empezado por seccion_31 (Mensaje 563125)
parece que han cambiado esto en la normativa: desde el 18 de marzo:





Fuente: https://www.agenciatributaria.es/static_files/AEAT_Desarrolladores/EEDD/IVA/VERI-FACTU/Validaciones_Errores_Veri-Factu.pdf


Asi que he probado a intentar subir una factura usando la demoD7 con REQ y me la ha rechazado:

Incorrecto 1279 Si el impuesto es IVA(01) o vacio, solo se podrá informar TIPORECARGOEQUIVALENCIA y CUOTARECARGOEQUIVALENCIA si la clave de régimen es 18.

Este sera otro cambio que llevara la version 2.1

Si alguien quiere comentarlo....

Saludos !

Esto lo estamos comentado en dos hilos distinto, pero te resumo:

Si la factura lleva Recago de Equivalencia la ClaveRegimen tiene que ser 18, y aclaro, si la emite es por que puede hacerlo con recargo. Si esta en Recargo de Equivalencia el OT no puede emitir facturas con RE, por lo tanto sera la clave 01 u otra.


La franja horaria es GMT +2. Ahora son las 19:08:40.

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