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)
-   -   Ojo con el TimeStamp de Respuesta (https://www.clubdelphi.com/foros/showthread.php?t=97016)

ermendalenda 14-11-2024 16:02:53

Ojo con el TimeStamp de Respuesta
 
Por si a alguien le sirve:
Ya alguien comentó que el timestamp no lo devuelve si no ha aceptado al menos un registro del lote.
Pero, el nuevo tiempo sí o sea, hay que volver a esperar 60 segundos a partir de cuando?
Pues no está muy claro, pero me voy a anotar la fecha hora de mi sistema como si fuera el timestamp cuando no haya timestamp de vuelta.

bmfranky 14-11-2024 16:47:15

Cita:

Empezado por ermendalenda (Mensaje 559753)
Por si a alguien le sirve:
Ya alguien comentó que el timestamp no lo devuelve si no ha aceptado al menos un registro del lote.
Pero, el nuevo tiempo sí o sea, hay que volver a esperar 60 segundos a partir de cuando?
Pues no está muy claro, pero me voy a anotar la fecha hora de mi sistema como si fuera el timestamp cuando no haya timestamp de vuelta.

Yo, personalmente uso siempre el timestamp que yo uso, que ahora lo pillo no de mi sistema , sino del ROA, vosotros deveriais hacer lo mismo, y compararlo con el que devuelven, si esta, por si tenes mucho desfase, no quedaros fuera del tiempo por unos segundos, digo vosotros porque yo no hago, ni planeo hacer envios multiples encadenados, y si tengo problemas de conexion, guardo la factura como una proforma, con su numero de proforma y cuando tenga conexion, las facturo, que en eso no ponen de momento pegas.

razorxxx 05-12-2024 13:47:54

Cita:

Empezado por bmfranky (Mensaje 559755)
Yo, personalmente uso siempre el timestamp que yo uso, que ahora lo pillo no de mi sistema , sino del ROA, vosotros deveriais hacer lo mismo, y compararlo con el que devuelven, si esta, por si tenes mucho desfase, no quedaros fuera del tiempo por unos segundos, digo vosotros porque yo no hago, ni planeo hacer envios multiples encadenados, y si tengo problemas de conexion, guardo la factura como una proforma, con su numero de proforma y cuando tenga conexion, las facturo, que en eso no ponen de momento pegas.

Hola bmfranky, ¿podrías publicar un ejemplo en Delphi de cómo obtener la hora del servidor ROA de la AEAT? Esto ya me dijeron que es importante, ya que en ocasiones a los ordenadores se les desconfigura la fecha-hora o algún listillo la cambia a mano.

bmfranky 05-12-2024 17:15:45

Cita:

Empezado por razorxxx (Mensaje 560490)
Hola bmfranky, ¿podrías publicar un ejemplo en Delphi de cómo obtener la hora del servidor ROA de la AEAT? Esto ya me dijeron que es importante, ya que en ocasiones a los ordenadores se les desconfigura la fecha-hora o algún listillo la cambia a mano.

Hola, lo siento pero yo uso c#, so sabria realizar la conversion correctamente, le pongo mi codigo.
Código:

        /// <summary>
        /// Devuelve la hora actual formateada con uso horario.
        /// </summary>
        /// <returns>Hora actual formateada.</returns>
        public static string leeFechaHoraInternet()
        {
            string retorno = DateTime.Now.ToString("yyyy-MM-dd'T'HH:mm:ssK");
            System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            try
            {
                HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("https://www2.roa.es/cgi-bin/horautc");//https://worldtimeapi.org/api/ip");
                webRequest.Method = "GET";
                HttpWebResponse respuesta = (HttpWebResponse) webRequest.GetResponse();
                if(respuesta.StatusCode == HttpStatusCode.OK)
                {
                    Stream strmRespuesta = respuesta.GetResponseStream();
                    StreamReader leeRespuesta = new StreamReader(strmRespuesta);
                    string jsonRespuesta = leeRespuesta.ReadToEnd();
                    long ticks = long.Parse(jsonRespuesta.Replace("\\n", ""));
                    var fechora = Org.BouncyCastle.Utilities.Date.DateTimeUtilities.UnixMsToDateTime(ticks).ToLocalTime();//esta la uso yo porque tengo bouncy instalado
                    //desde el paquete nuget BouncyCastle
                    retorno = fechora.ToString("yyyy-MM-dd'T'HH:mm:ssK");                             
                }
            }
            catch(Exception Exc)
            {
                retorno = DateTime.Now.ToString("yyyy-MM-dd'T'HH:mm:ssK");
            }
            return retorno;
        }


Puede preguntar a @novatico
Cita:

Empezado por novatico (Mensaje 559492)
Es que yo no tomo la fecha hora del sistema, sino que la tomo de internet.

Incluso he encontrado la forma de tomar el "unixtime" del ROA (Real Observatorio de la Armada) que es el dato oficial que tomas todos los organismos estatales, incluida la AEAT.
Solo hay que tener en cuenta, además, el desfase por la zona horaria.

Aunque de momento no lo he implementado y lo tomo de "http://date.jsontest.com" al que tambien hay que añadir el desfase de zona.

Es que tengo clientes "muy amigos" de cambiar la fecha y hora del sistema.

El decia tener un control creado para ello.

mqm 06-12-2024 13:36:59

Aqua lo tenéis convertido a Delphi 10 y probado. Espero que os sirva


Código Delphi [-]
unit Unit2;

interface

uses
  System.SysUtils, System.DateUtils, IdHTTP, IdSSLOpenSSL, System.JSON;

function LeeFechaHoraInternet: string;

implementation

function LeeFechaHoraInternet: string;
var
  Http: TIdHTTP;
  SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
  Respuesta: string;
  JsonRespuesta: TJSONObject;
  UnixTicks: Int64;
  FechaHora: TDateTime;
begin
  Result := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss"Z"', Now); // Formato inicial por defecto
  Http := TIdHTTP.Create(nil);
  SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  try
    Http.IOHandler := SSLHandler;
    Http.Request.Accept := 'application/json';
    Http.Request.UserAgent := 'Mozilla/5.0 (compatible; Delphi)';
    try
      // Realiza la solicitud a la API
      Respuesta := Http.Get('https://www2.roa.es/cgi-bin/horautc');

      // Si la respuesta es un número de ticks Unix, conviértelo
      UnixTicks := StrToInt64(Trim(Respuesta)); // Ajusta el formato si la API devuelve algo diferente
      FechaHora := UnixToDateTime(UnixTicks div 1000); // Divide entre 1000 para convertir milisegundos a segundos
      FechaHora := TTimeZone.Local.ToLocalTime(FechaHora);
      Result := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss"Z"', FechaHora);
    except
      on E: Exception do
        // En caso de error, retorna la hora local
        Result := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss"Z"', Now);
    end;
  finally
    Http.Free;
    SSLHandler.Free;
  end;
end;
end.


Librerías utilizadas:

IdHTTP y IdSSLOpenSSL para manejar la conexión HTTPS.
System.DateUtils para trabajar con fechas y convertir ticks Unix a TDateTime.
Formato de la fecha: Utiliza FormatDateTime para formatear las fechas en el formato ISO 8601 con zona horaria.

Manejo de errores: Si ocurre un error durante la solicitud HTTP, devuelve la hora local en el formato esperado.

Conversión de ticks Unix: La API devuelve ticks Unix en milisegundos. Esto se divide entre 1000 para convertirlos a segundos antes de usar UnixToDateTime.

Dependencia de OpenSSL: Asegúrate de que tu entorno tenga acceso a las DLL de OpenSSL (libeay32.dll y ssleay32.dll o sus equivalentes actuales) para que TIdSSLIOHandlerSocketOpenSSL funcione correctamente.

mqm 06-12-2024 14:15:49

Y esto seria para delphi 7:
Código:

unit Unit2;

interface

uses
  Windows, SysUtils, IdHTTP, IdSSLOpenSSL, DateUtils;

function LeeFechaHoraInternet: string;

implementation


function GetTimeZoneOffset: TDateTime;
var
  TZInfo: TTimeZoneInformation;
  Bias: Integer;
begin
  case GetTimeZoneInformation(TZInfo) of
    TIME_ZONE_ID_STANDARD, TIME_ZONE_ID_DAYLIGHT:
      Bias := TZInfo.Bias + TZInfo.DaylightBias; // Ajuste según horario de verano
    else
      Bias := 0; // Si no se puede determinar la zona horaria, se asume UTC
  end;
  Result := Bias / MinsPerDay; // Convertir minutos a días
end;

function LeeFechaHoraInternet: string;
var
  Http: TIdHTTP;
  SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
  Respuesta: string;
  UnixTicks: Int64;
  FechaHoraUTC, FechaHoraLocal: TDateTime;
  TimeZoneOffset: TDateTime;
begin
  Result := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss"Z"', Now); // Valor predeterminado
  Http := TIdHTTP.Create(nil);
  SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  SSLHandler.SSLOptions.Method := sslvTLSv1_2;
  try
    Http.IOHandler := SSLHandler;
    Http.Request.Accept := 'application/json';
    Http.Request.UserAgent := 'Mozilla/5.0 (compatible; Delphi)';
    try
      // Realizar la solicitud HTTP
//      Respuesta := Http.Get('https://www2.roa.es/cgi-bin/horautc');
      Respuesta := Http.Get('https://www.google.com');

      // Convertir la respuesta (ticks Unix) a DateTime
      UnixTicks := StrToInt64(Trim(Respuesta));
      FechaHoraUTC := UnixDateDelta + (UnixTicks div SecsPerDay) + (UnixTicks mod SecsPerDay) / SecsPerDay;

      // Obtener el desfase horario
      TimeZoneOffset := GetTimeZoneOffset;
      FechaHoraLocal := FechaHoraUTC - TimeZoneOffset;

      // Devolver la fecha y hora en formato ISO 8601
      Result := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss"Z"', FechaHoraLocal);
    except
      on E: Exception do
        // En caso de error, devolver la hora actual
      // result := E.Message;
        Result := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss"Z"', Now);
    end;
  finally
    Http.Free;
    SSLHandler.Free;
  end;
end;
end.


Sandy656 07-12-2024 06:49:31

Hola.

He intentado usar la función pero me sale este error. ¿Sabéis como poder solucionarlo?

Error connecting with SSL. error 1409442E:SSL routines:SSL3_READ_BYTES: tlsv 1 alert protocol version

Gracias!!!!

mqm 07-12-2024 10:21:16

prueba con este: A mi me funciona correctamente en delphi 7
Código:

unit Unit2;

interface

uses
  Windows, SysUtils, IdHTTP, IdSSLOpenSSL, DateUtils;

function LeeFechaHoraInternet: string;

implementation


function GetTimeZoneOffset: TDateTime;
var
  TZInfo: TTimeZoneInformation;
  Bias: Integer;
begin
  case GetTimeZoneInformation(TZInfo) of
    TIME_ZONE_ID_STANDARD, TIME_ZONE_ID_DAYLIGHT:
      Bias := TZInfo.Bias + TZInfo.DaylightBias; // Ajuste según horario de verano
    else
      Bias := 0; // Si no se puede determinar la zona horaria, se asume UTC
  end;
  Result := Bias / MinsPerDay; // Convertir minutos a días
end;

function LeeFechaHoraInternet: string;
var
  Http: TIdHTTP;
  SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
  Respuesta: string;
  UnixTicks: Int64;
  FechaHoraUTC, FechaHoraLocal: TDateTime;
  TimeZoneOffset: TDateTime;
begin
  Result := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss"Z"', Now); // Valor predeterminado
  Http := TIdHTTP.Create(nil);
  SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  try
    SSLHandler.SSLOptions.Method := sslvTLSv1_2;  // Usar TLS 1.2
    SSLHandler.SSLOptions.SSLVersions := [sslvTLSv1_2];
    SSLHandler.SSLOptions.Mode := sslmClient;    // Modo cliente
    // Configurar cliente con este manejador SSL
//    IdHTTP1.IOHandler := SSLHandler;
//    IdHTTP1.Request.UserAgent := 'Mozilla/5.0';
    // Realiza la conexión HTTP/HTTPS
//    IdHTTP1.Get('https://yourserver.com');
    Http.IOHandler := SSLHandler;
    Http.Request.Accept := 'application/json';
    Http.Request.UserAgent := 'Mozilla/5.0 (compatible; Delphi)';
    try
      // Realizar la solicitud HTTP
      Respuesta := Http.Get('https://www2.roa.es/cgi-bin/horautc');
//    Respuesta := Http.Get('https://www.google.com');

      // Convertir la respuesta (ticks Unix) a DateTime
      UnixTicks := StrToInt64(Trim(Respuesta));
      FechaHoraUTC := UnixDateDelta + (UnixTicks div SecsPerDay) + (UnixTicks mod SecsPerDay) / SecsPerDay;

      // Obtener el desfase horario
      TimeZoneOffset := GetTimeZoneOffset;
      FechaHoraLocal := FechaHoraUTC - TimeZoneOffset;

      // Devolver la fecha y hora en formato ISO 8601
      Result := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss"Z"', FechaHoraLocal);
    except
      on E: Exception do
        // En caso de error, devolver la hora actual
        result := E.Message;
//        Result := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss"Z"', Now);
    end;
  finally
    Http.Free;
    SSLHandler.Free;
  end;
end;
end.


Sandy656 07-12-2024 10:46:37

Gracias por la respuesta tan rápida.

He probado el código y en la línea "Respuesta := Http.Get('https://www2.roa.es/cgi-bin/horautc');" me sigue saliendo el error.
Me da que hay algún problema de compatibilidad de versiones de SSL o algo así.

Un saludo.

ermendalenda 07-12-2024 10:48:46

Desactiva el antivirus y prueba

mqm 07-12-2024 11:07:38

La dll que estoy usando son :ssleay32.dll version 1.0.2.21
libeay32.dll version 1.0.2.21

delphiGar 07-12-2024 14:48:46

En delphi con Indy tiene cuatro protocolos distintos para hacerlo de una manera mucho mas sencilla y ademas te sincroniza la hora con el PC.

Os pongo un ejemplo de dos de ellos con TidTimeUDP y TidSNTP:

Código Delphi [-]
unit main;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdSNTP, IdBaseComponent, IdComponent,
  IdUDPBase, IdUDPClient, IdTimeUDP, Vcl.StdCtrls;

type
  TForm5 = class(TForm)
    btnRespuesta: TButton;
    edProtocoloSNTP: TEdit;
    edHoraPTime: TEdit;
    procedure btnRespuestaClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    function obtenerFechaHoraProtocoloTiempo( server: string; sincronizarHora: Boolean = False ): TDateTime;
    function obtenerFechaHoraProtocoloSNTP( server: string; sincronizarHora: Boolean = False ): TDateTime;
  end;

var
  Form5: TForm5;

implementation

{$R *.dfm}

procedure TForm5.btnRespuestaClick(Sender: TObject);
begin
  // Pedimos hora al servidor y sincronizamos protocolo de Tiempo
  edHoraPTime.Text := DateTimeToStr( obtenerFechaHoraProtocoloTiempo( 'hora.roa.es',  True ) );
  // Pedimos hora al servidor y no sincronixamos hora protocolo SNTP
  edProtocoloSNTP.Text := DateTimeToStr( obtenerFechaHoraProtocoloSNTP( 'hora.roa.es' ) );
end;

function TForm5.obtenerFechaHoraProtocoloSNTP(server: string;  sincronizarHora: Boolean ): TDateTime;
var
  serverSNTP: TIdSNTP;
begin

  serverSNTP := TIdSNTP.Create( Self );
  serverSNTP.Host := server;
  Result := serverSNTP.DateTime;
  if ( sincronizarHora ) then
    serverSNTP.SyncTime;
 
  serverSNTP.Free;

end;

function TForm5.obtenerFechaHoraProtocoloTiempo(server: string;  sincronizarHora: Boolean  ): TDateTime;
var
  serverITimeUDP: TIdTimeUDP;
begin

  serverITimeUDP := TIdTimeUDP.Create( Self );
  serverITimeUDP.Host := server;
  Result:= serverITimeUDP.DateTime;
  if ( sincronizarHora ) then
    serverITimeUDP.SyncTime;

 serverITimeUDP.Free

end;

end.

Sandy656 08-12-2024 10:16:28

Hola.

He probado el código y funciona de maravilla. Solo que hay que ejecutar la aplicación en modo administrador.

Seguiré investigando el error "connecting with SSL. error 1409442E:SSL routines:SSL3_READ_BYTES: tlsv 1 alert protocol version"

Muchas gracias.

ermendalenda 08-12-2024 10:21:17

Creo que hay una opción en la s propiedades(botón derecho raton) para que siempre se ejecute como administrador o metiendo la aplicación en un .bat y las propiedades del .bat como administrador, alguna vez lo he hecho.

Sandy656 08-12-2024 10:32:49

Si en las propiedades del acceso directo, en opciones avanzadas, hay un check para ejecutar como administrador. Pero ¿Habría alguna forma de actualizar la hora del sistema sin entrar como administrador?
.

CarlosArjonomia 08-12-2024 10:51:14

En Windows ¿Porqué no comprobáis que el parámetro "Establecer hora automáticamente" este activado?.

Con eso ya tenéis una capa de seguridad para aseguraos que la hora es correcta.

Se puede lograr utilizando llamadas a la API de Windows y accediendo al registro, ya que esta configuración está almacenada allí.

La clave relevante del registro es:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters

Dentro de esta clave, el valor Type indica cómo se configura la hora del sistema:

"NTP" indica que la sincronización automática está activada (Network Time Protocol).
"NoSync" indica que no está activada.

ermendalenda 08-12-2024 11:16:28

Cita:

Empezado por Sandy656 (Mensaje 560558)
Si en las propiedades del acceso directo, en opciones avanzadas, hay un check para ejecutar como administrador. Pero ¿Habría alguna forma de actualizar la hora del sistema sin entrar como administrador?
.

Si, espera
Te lo pongo

ermendalenda 08-12-2024 11:26:24

Cita:

Empezado por Sandy656 (Mensaje 560558)
Si en las propiedades del acceso directo, en opciones avanzadas, hay un check para ejecutar como administrador. Pero ¿Habría alguna forma de actualizar la hora del sistema sin entrar como administrador?
.

El problema es que yo uso vb
pero en .net hay comandos directos.
te pongo como me funciona a mi

Generas desde la aplicacion un .bat y le pones estas 3 lineas:
"cmd /c Time " & hora_buff
"cmd /c date " & date_buff
"exit"

donde date_buff u hora_buff son las horas capturadas poniendo la fecha en formato español dd/mm/yyyy
y despues ejecutas desde el programa:
ShellExecute 0, "runas", "[pathcompleto archivo.bat]", requireAdministrator, vbNullString, 0

el shellexexute es de las apis de windows y tienes que declarar esta funcion

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Segun como tengas el windows configurado te puede salir un mensaje de que es una aplicacion externa o algo asi, y le tienes que decir que no te avise mas poniendole al minimo la barra de avisos.

Te recomiendo que le pongas un sleep (espera) de 0.5segundos despues de la ejecucion del shellexecute

delphiGar 08-12-2024 11:29:23

Cita:

Empezado por Sandy656 (Mensaje 560556)
Hola.

He probado el código y funciona de maravilla. Solo que hay que ejecutar la aplicación en modo administrador.

Seguiré investigando el error "connecting with SSL. error 1409442E:SSL routines:SSL3_READ_BYTES: tlsv 1 alert protocol version"

Muchas gracias.

El permiso de Administrador lo requiere si estas como usuario y le indicas en la funcion que quieres sincronizar la hora ( Por esto te pide el permiso ),
si lo que quieres es recuperar solo la hora no hace falta el permiso de administrador,
lo unico que cuando llames a las funciones, no le indiques True o no indiques nada.

El ejecutable puedes ponerlo para que se ejecute en modo administrador desde las opciones del proyecto en el apartado Application -> Manifest -> Execution Level -> Require Adminsitrator

Sandy656 08-12-2024 11:47:54

Voy a probar lo que habéis puesto. Qué haríamos sin la ayuda de este foro. Sois los mejores.

Muchas gracias!!!!

razorxxx 10-12-2024 15:30:01

Cita:

Empezado por mqm (Mensaje 560518)
Aqua lo tenéis convertido a Delphi 10 y probado. Espero que os sirva


Código Delphi [-]
unit Unit2;

interface

uses
  System.SysUtils, System.DateUtils, IdHTTP, IdSSLOpenSSL, System.JSON;

function LeeFechaHoraInternet: string;

implementation

function LeeFechaHoraInternet: string;
var
  Http: TIdHTTP;
  SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
  Respuesta: string;
  JsonRespuesta: TJSONObject;
  UnixTicks: Int64;
  FechaHora: TDateTime;
begin
  Result := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss"Z"', Now); // Formato inicial por defecto
  Http := TIdHTTP.Create(nil);
  SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  try
    Http.IOHandler := SSLHandler;
    Http.Request.Accept := 'application/json';
    Http.Request.UserAgent := 'Mozilla/5.0 (compatible; Delphi)';
    try
      // Realiza la solicitud a la API
      Respuesta := Http.Get('https://www2.roa.es/cgi-bin/horautc');

      // Si la respuesta es un número de ticks Unix, conviértelo
      UnixTicks := StrToInt64(Trim(Respuesta)); // Ajusta el formato si la API devuelve algo diferente
      FechaHora := UnixToDateTime(UnixTicks div 1000); // Divide entre 1000 para convertir milisegundos a segundos
      FechaHora := TTimeZone.Local.ToLocalTime(FechaHora);
      Result := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss"Z"', FechaHora);
    except
      on E: Exception do
        // En caso de error, retorna la hora local
        Result := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss"Z"', Now);
    end;
  finally
    Http.Free;
    SSLHandler.Free;
  end;
end;
end.


Librerías utilizadas:

IdHTTP y IdSSLOpenSSL para manejar la conexión HTTPS.
System.DateUtils para trabajar con fechas y convertir ticks Unix a TDateTime.
Formato de la fecha: Utiliza FormatDateTime para formatear las fechas en el formato ISO 8601 con zona horaria.

Manejo de errores: Si ocurre un error durante la solicitud HTTP, devuelve la hora local en el formato esperado.

Conversión de ticks Unix: La API devuelve ticks Unix en milisegundos. Esto se divide entre 1000 para convertirlos a segundos antes de usar UnixToDateTime.

Dependencia de OpenSSL: Asegúrate de que tu entorno tenga acceso a las DLL de OpenSSL (libeay32.dll y ssleay32.dll o sus equivalentes actuales) para que TIdSSLIOHandlerSocketOpenSSL funcione correctamente.

Hola a todos. ¿Realmente se puede usar https://www2.roa.es/cgi-bin/horautc, o hay que usar alguna URL propia de la AEAT?
Cuando pregunté al mail de Veri*Factu me remitieron a la siguiente web: https://sede.agenciatributaria.gob.e...a_oficial.html, pero no me he puesto a leerla a fondo.

bmfranky 10-12-2024 15:39:56

Cita:

Empezado por razorxxx (Mensaje 560613)
Hola a todos. ¿Realmente se puede usar https://www2.roa.es/cgi-bin/horautc, o hay que usar alguna URL propia de la AEAT?
Cuando pregunté al mail de Veri*Factu me remitieron a la siguiente web: https://sede.agenciatributaria.gob.e...a_oficial.html, pero no me he puesto a leerla a fondo.

Hola, la hora oficial del gobierno de españa , para todas las paginas oficiales, derivan de la que pones, que a su vez coje la hora del Real Observatorio de la Armada (ROA) que es la que cojemos nosotros, desde la pagina que ellos referencian , no hay forma de capturar la hora, solo esta alli, para que la veas...

YellowStone 10-12-2024 16:04:57

Cita:

Empezado por razorxxx (Mensaje 560613)
Hola a todos. ¿Realmente se puede usar https://www2.roa.es/cgi-bin/horautc, o hay que usar alguna URL propia de la AEAT?
Cuando pregunté al mail de Veri*Factu me remitieron a la siguiente web: https://sede.agenciatributaria.gob.e...a_oficial.html, pero no me he puesto a leerla a fondo.

Tampoco es que tenga mucho que leer, que son 25 líneas :D

Pero si, se puede usar.

razorxxx 10-12-2024 16:42:23

Cita:

Empezado por YellowStone (Mensaje 560615)
Tampoco es que tenga mucho que leer, que son 25 líneas :D

Pero si, se puede usar.

Me refería a los enlaces dentro de esa URL hombre!

razorxxx 10-12-2024 16:44:53

Cita:

Empezado por bmfranky (Mensaje 560614)
Hola, la hora oficial del gobierno de españa , para todas las paginas oficiales, derivan de la que pones, que a su vez coje la hora del Real Observatorio de la Armada (ROA) que es la que cojemos nosotros, desde la pagina que ellos referencian , no hay forma de capturar la hora, solo esta alli, para que la veas...

Aclarado gracias!

razorxxx 12-12-2024 11:10:51

Les traigo una pequeña mejora del código de mqm, que permite pasarle el UTC que queramos. Por tanto, independientemente de la fecha, hora y región que tenga el equipo desde el que se ejecuta la aplicación, nos dará siempre la fecha-hora de Internet correcta:

Código Delphi [-]
function TPPRUEBAS.LeerFechaHoraInternet(UTC: Integer): string;
var
   Https: TIdHTTP;
   SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
   Respuesta: string;
   UnixTicks: Int64;
   FechaHora: TDateTime;
begin
     Result := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss"Z"', Now); // Formato inicial por defecto
     try
        SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
        SSLHandler.SSLOptions.SSLVersions := [sslvTLSv1_2];  // TLS 1.2 es compatible desde Windows 7 SP1 y Server 2008 R2 SP1, y aún no ha sido descatalogado
        SSLHandler.SSLOptions.Mode := sslmClient;
        Https := TIdHTTP.Create(nil);
        Https.IOHandler := SSLHandler;
        Https.Request.Accept := 'text/html';
        Https.Request.UserAgent := 'Mozilla/5.0 (compatible; Delphi)';
        Https.ConnectTimeout := 5000;  // Máximo 5 segundos para establecer la conexión con el servidor
        Https.ReadTimeout := 5000;  // Máximo 5 segundos para obtener la respuesta
        try
           Respuesta := Https.Get('https://www2.roa.es/cgi-bin/horautc');  // Realiza la solicitud a la API del ROA
           UnixTicks := StrToInt64(Trim(Respuesta));  // Si la respuesta viene en formato Unix (ajusta el formato si la API devuelve algo diferente)
           FechaHora := UnixToDateTime(UnixTicks div 1000);  // Divide entre 1000 para convertir milisegundos a segundos
           FechaHora := IncHour(FechaHora, UTC);  // Adaptarlo al huso horario seleccionado en el parámetro UTC: 1 = UTC+1 (Península y Baleares), 0 = UTC+0 (Canarias), etc
           Result := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss"Z"', FechaHora);  // Formatear la fecha-hora en el formato aceptado por Veri*Factu
           Consola.Lines.Add('Fecha-hora de internet sincronizada correctamente.');
        except
              on E: Exception do
              begin
                   // En caso de error, retorna la hora local y avisa de ello en la consola
                   Result := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss"Z"', Now);
                   Consola.Lines.Add('No se pudo sincronizar la fecha-hora de internet. Se muestra la fecha-hora del equipo.');
              end;
        end;
     finally
            If Assigned(Https) Then Https.Free;
            If Assigned(SSLHandler) Then SSLHandler.Free;
     end;
end;

razorxxx 12-12-2024 11:48:01

Estuve intentando hacer la función anterior con TRESTClient, pero al ejecutar la petición me da el error 403 forbidden:

Código Delphi [-]
RESTClient.Authenticator := nil;
RESTClient.BaseURL := 'https://www2.roa.es/cgi-bin/';
RESTClient.ContentType := 'text/html; charset=UTF-8';
Request.Resource := 'horautc';
Request.Method := TRESTRequestMethod.rmGET;
Try
   Request.Execute;
Except
   on E: Exception do
   Begin
    Consola.Lines.Add('Error en la petición "' + Request.Resource + '": ' + E.ClassName + ' - ' + E.Message);
    Result := FALSE;
    EXIT;
   End;
End;

¿Alguien tiene idea de cómo hacer que funcione con TRESTClient? Esto nos ahorraría tener que usar las librerías Openssl.

razorxxx 12-12-2024 13:10:28

Lo conseguí con objetos TNetHTTPClient:

Código Delphi [-]
function TPPRUEBAS.LeerFechaHoraInternet(UTC: Integer): string;
var
   UnixTicks: Int64;
   FechaHora: TDateTime;
   HttpClient: TNetHTTPClient;
   HttpResponse: IHTTPResponse;
begin
     Result := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss"Z"', Now); // Formato inicial por defecto
     Try
        HttpClient := TNetHTTPClient.Create(nil);
        Try
           // Ejecutar la solicitud
           HttpResponse := HttpClient.Get('https://www2.roa.es/cgi-bin/horautc');  // Realizar la solicitud a la API del ROA
           If HttpResponse.StatusCode = 200 Then
           Begin
                UnixTicks := StrToInt64(Trim(HttpResponse.ContentAsString));  // Si la respuesta viene en formato Unix (ajusta el formato si la API devuelve algo diferente)
                FechaHora := UnixToDateTime(UnixTicks div 1000);  // Divide entre 1000 para convertir milisegundos a segundos
                FechaHora := IncHour(FechaHora, UTC);  // Adaptarlo al huso horario indicado en el parámetro UTC: 1 = UTC+1 (Península y Baleares), 0 = UTC+0 (Canarias), etc
                Result := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss"Z"', FechaHora);  // Formatear la fecha-hora en el formato aceptado por Veri*Factu
                Consola.Lines.Add('Fecha-hora de internet sincronizada correctamente.');
           End
           Else
               Consola.Lines.Add('Error: ' + HttpResponse.StatusCode.ToString + ' ' + HttpResponse.StatusText);
        Except
              on E: Exception do
              Begin
                   // En caso de error, retorna la hora local y avisa de ello en la consola
                   Result := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss"Z"', Now);
                   Consola.Lines.Add('No se pudo sincronizar la fecha-hora de internet. Se muestra la fecha-hora del equipo.');
              End;
        End;
     Finally
            If Assigned(HttpClient) Then HttpClient.Free;
     End;
end;

Acordarse de poner en el uses: System.Net.HttpClient, System.Net.URLClient, System.Net.HttpClientComponent

Neftali [Germán.Estévez] 12-12-2024 15:06:32

Actualizado el mensaje #2 que recopila códigos con este hilo.

RUBEN_SP 12-12-2024 19:07:45

Cita:

Empezado por CarlosArjonomia (Mensaje 560560)
En Windows ¿Porqué no comprobáis que el parámetro "Establecer hora automáticamente" este activado?.

Con eso ya tenéis una capa de seguridad para aseguraos que la hora es correcta.

Se puede lograr utilizando llamadas a la API de Windows y accediendo al registro, ya que esta configuración está almacenada allí.

La clave relevante del registro es:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters

Dentro de esta clave, el valor Type indica cómo se configura la hora del sistema:

"NTP" indica que la sincronización automática está activada (Network Time Protocol).
"NoSync" indica que no está activada.

¿puedes poner el código que usas para hacer esa llamada a la api y comprobar la clave del registro?

Rja750 30-01-2025 16:14:37

En mi caso no uso la fecha del sistema ni de la AEAT, porque la AEAT va a estar muchas veces caida y el registro deberiamos grabarlo si o si en nuestros SIF y darle la factura verificable al cliente final. Si no quieres seguir facturando sin tener conexion a la AEAT pues un control en nuestro registro a modo de campo y aviso en pantalla y no seguimos facturando hasta que se restablezca la conexion con la AEAT (Bucle Timer), Una vez restablecida la comunicacion se envia el ultimo registro como se tenga que enviar y a seguir facturando. Pero la hora tiene que ser exacta, de lo contrario nos va a dar mucho dolor de cabeza tener registros rechazados por fechas, horas y huellas que no coinciden apilados en los clientes. Si tenemos un cliente que no se ha dado cuenta de que tiene la fecha y hora mal ¿que hacemos? Le podemos poner un control y decirle que cambie la pila de la CPU o pasamos de eso y mientras que su SO funcione y tenga internet, calculamos la fecha y hora fuera del Sistema, calculamos si estamos en invierno o verano para aplicar a la UTC el horario que tenemos en España(península) UTC + 1 o nó, pero todo fuera del sistema y de la AEAT que tambien cojera la hora por servidores sincronizados por satélite como Nopuedoponerenlaces.roa.es/cgi-bin/horautc

Este codigo está en VB.net para el que le venga bien. Esta comentado

Código:

  Try
                'Puede que tengas que ponerlo para asegurarte que el servidor no te rechaza por falta de seguridad
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12

            Dim url As String = "Nopuedoponerenlaces.roa.es/cgi-bin/horautc"

            Dim request As WebRequest = WebRequest.Create(url)
            request.Timeout = 5000 ' Tiempo de espera de 5 segundos creo que sobrado

            Dim response As WebResponse = request.GetResponse() ' obtengo la respuesta del servidor

            Dim responseText As String
            Using stream As Stream = response.GetResponseStream()
                Using reader As New StreamReader(stream)
                    responseText = reader.ReadToEnd().Trim() ' Limpiar espacios o caracteres extra
                End Using
            End Using

            ' Tenemos una respuesta en una cadena de numeros(String) y hay que convertirla a un número de milisegundos
            Dim timestamp As Long
            If Long.TryParse(responseText, timestamp) Then 'Esta comprobacion la podemos omitir porque responseText siempre sera una cadena de                                                                                numeros convertible a long pero bueno...
                Dim utcTime As DateTime = DateTimeOffset.FromUnixTimeMilliseconds(timestamp).UtcDateTime

            'Determinar si estamos en horario de verano o invierno en España
                Dim year As Integer = utcTime.Year
                Dim ultimoMarzo As DateTime = New DateTime(year, 3, DateTime.DaysInMonth(year, 3))

                ' Buscamos el último domingo de marzo que es cuando entra el horario de verano)
                While ultimoMarzo.DayOfWeek <> DayOfWeek.Sunday
                    ultimoMarzo = ultimoMarzo.AddDays(-1)
                End While
                ultimoMarzo = New DateTime(year, 3, ultimoMarzo.Day, 2, 0, 0, DateTimeKind.Utc)

                ' Buscamos el último domingo de octubre que es cuando termina el horario de verano
                Dim ultimoOctubre As DateTime = New DateTime(year, 10, DateTime.DaysInMonth(year, 10))

                While ultimoOctubre.DayOfWeek <> DayOfWeek.Sunday
                    ultimoOctubre = ultimoOctubre.AddDays(-1)
                End While
                ultimoOctubre = New DateTime(year, 10, ultimoOctubre.Day, 1, 0, 0, DateTimeKind.Utc)

                ' Si estamos entre marzo y octubre estamos en horario de verano si no estamos en horario de invierno
                Dim esHorarioVerano As Boolean = utcTime >= ultimoMarzo AndAlso utcTime < ultimoOctubre

                ' Aplicamos 2 o 1 segun sea
                Dim offsetEspaña As Integer = If(esHorarioVerano, 2, 1)

                ' Calculamos la hora en España sin tener en cuenta el sistema
                Dim horaLocalEspaña As DateTime = utcTime.AddHours(offsetEspaña)

                ' lo muestro para que se vea, pero cada cual aplica a su forma
                MsgBox("Hora ajustada en España (Península): " & horaLocalEspaña.ToString("yyyy-MM-dd HH:mm:ss") & " (UTC+" & offsetEspaña & ")")
            Else
                MsgBox("Error: No se pudo interpretar el timestamp del servidor.")
            End If

        Catch ex As Exception
            MsgBox("Error al obtener la hora UTC: " & ex.Message)
        End Try


ermendalenda 30-01-2025 17:19:52

Cita:

Empezado por Rja750 (Mensaje 561579)
En mi caso no uso la fecha del sistema ni de la AEAT, porque la AEAT va a estar muchas veces caida y el registro deberiamos grabarlo si o si en nuestros SIF y darle la factura verificable al cliente final. Si no quieres seguir facturando sin tener conexion a la AEAT pues un control en nuestro registro a modo de campo y aviso en pantalla y no seguimos facturando hasta que se restablezca la conexion con la AEAT (Bucle Timer), Una vez restablecida la comunicacion se envia el ultimo registro como se tenga que enviar y a seguir facturando. Pero la hora tiene que ser exacta, de lo contrario nos va a dar mucho dolor de cabeza tener registros rechazados por fechas, horas y huellas que no coinciden apilados en los clientes. Si tenemos un cliente que no se ha dado cuenta de que tiene la fecha y hora mal ¿que hacemos? Le podemos poner un control y decirle que cambie la pila de la CPU o pasamos de eso y mientras que su SO funcione y tenga internet, calculamos la fecha y hora fuera del Sistema, calculamos si estamos en invierno o verano para aplicar a la UTC el horario que tenemos en España(península) UTC + 1 o nó, pero todo fuera del sistema y de la AEAT que tambien cojera la hora por servidores sincronizados por satélite como Nopuedoponerenlaces.roa.es/cgi-bin/horautc
Este codigo está en VB.net para el que le venga bien. Esta comentado
Try
'Puede que tengas que ponerlo para asegurarte que el servidor no te rechaza por falta de seguridad
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12

Dim url As String = "Nopuedoponerenlaces.roa.es/cgi-bin/horautc"

Dim request As WebRequest = WebRequest.Create(url)
request.Timeout = 5000 ' Tiempo de espera de 5 segundos creo que sobrado

Dim response As WebResponse = request.GetResponse() ' obtengo la respuesta del servidor

Dim responseText As String
Using stream As Stream = response.GetResponseStream()
Using reader As New StreamReader(stream)
responseText = reader.ReadToEnd().Trim() ' Limpiar espacios o caracteres extra
End Using
End Using

' Tenemos una respuesta en una cadena de numeros(String) y hay que convertirla a un número de milisegundos
Dim timestamp As Long
If Long.TryParse(responseText, timestamp) Then 'Esta comprobacion la podemos omitir porque responseText siempre sera una cadena de numeros convertible a long pero bueno...
Dim utcTime As DateTime = DateTimeOffset.FromUnixTimeMilliseconds(timestamp).UtcDateTime

'Determinar si estamos en horario de verano o invierno en España
Dim year As Integer = utcTime.Year
Dim ultimoMarzo As DateTime = New DateTime(year, 3, DateTime.DaysInMonth(year, 3))

' Buscamos el último domingo de marzo que es cuando entra el horario de verano)
While ultimoMarzo.DayOfWeek <> DayOfWeek.Sunday
ultimoMarzo = ultimoMarzo.AddDays(-1)
End While
ultimoMarzo = New DateTime(year, 3, ultimoMarzo.Day, 2, 0, 0, DateTimeKind.Utc)

' Buscamos el último domingo de octubre que es cuando termina el horario de verano
Dim ultimoOctubre As DateTime = New DateTime(year, 10, DateTime.DaysInMonth(year, 10))

While ultimoOctubre.DayOfWeek <> DayOfWeek.Sunday
ultimoOctubre = ultimoOctubre.AddDays(-1)
End While
ultimoOctubre = New DateTime(year, 10, ultimoOctubre.Day, 1, 0, 0, DateTimeKind.Utc)

' Si estamos entre marzo y octubre estamos en horario de verano si no estamos en horario de invierno
Dim esHorarioVerano As Boolean = utcTime >= ultimoMarzo AndAlso utcTime < ultimoOctubre

' Aplicamos 2 o 1 segun sea
Dim offsetEspaña As Integer = If(esHorarioVerano, 2, 1)

' Calculamos la hora en España sin tener en cuenta el sistema
Dim horaLocalEspaña As DateTime = utcTime.AddHours(offsetEspaña)

' lo muestro para que se vea, pero cada cual aplica a su forma
MsgBox("Hora ajustada en España (Península): " & horaLocalEspaña.ToString("yyyy-MM-dd HH:mm:ss") & " (UTC+" & offsetEspaña & ")")
Else
MsgBox("Error: No se pudo interpretar el timestamp del servidor.")
End If

Catch ex As Exception
MsgBox("Error al obtener la hora UTC: " & ex.Message)
End Try

Hola
Ya cada uno que diseñe como crea más conveniente, pero no acabo de entender algunas cuestiones que planteas, por ejemplo la hora se coge del ROA(armada) no es de la aeat.
Otra cosa 3s el timestamp de la respuesta del ultimo envio.
Por otro lado dices como de darle la posibilidaf(supongo que te refieres a parametrizae) la decisión de que si no se puede enviar no se puede facturar, cosa que particularmente veo un error por varios motivos, primero que el vendedor tiene que tener instrucciones de que hacer en ese caso(se lo anota?, le dice al valiente que no se factura?, se vende pero sin facturar?) Otra cosa que tu sistema dependa de Internet para generar los qr, so no no tiene sentido, se acumula y se envía como incidencia cuando vuelva imternet, pararlo es más negativo que positivo. No sé, cada uno vé claro su operativa según su soft2are y el tipo de clientes.

ermendalenda 30-01-2025 17:45:39

Otra cosa, octubre de 2026 es, presumiblemente, el último cambio de horario, com lo cual nos quedarimos con horario de invierno eternamente( a mi particularmente me gusta mas el horario de verano incluso para invierno). Me lo he dejado previsto, incluso parametrizado por si vuelven a cambiar de idea, y esa fecha está ahí al lado.
Por otro lado si vas a controlar las horas es recomendable desactivar de Windows/linux/otros cualquier intención de estos de cambios automáticos

Rja750 30-01-2025 18:38:48

Cita:

Empezado por ermendalenda (Mensaje 561581)
Hola
Ya cada uno que diseñe como crea más conveniente, pero no acabo de entender algunas cuestiones que planteas, por ejemplo la hora se coge del ROA(armada) no es de la aeat.
Otra cosa 3s el timestamp de la respuesta del ultimo envio.
Por otro lado dices como de darle la posibilidaf(supongo que te refieres a parametrizae) la decisión de que si no se puede enviar no se puede facturar, cosa que particularmente veo un error por varios motivos, primero que el vendedor tiene que tener instrucciones de que hacer en ese caso(se lo anota?, le dice al valiente que no se factura?, se vende pero sin facturar?) Otra cosa que tu sistema dependa de Internet para generar los qr, so no no tiene sentido, se acumula y se envía como incidencia cuando vuelva imternet, pararlo es más negativo que positivo. No sé, cada uno vé claro su operativa según su soft2are y el tipo de clientes.

Me refiero a que cuando no haya conexión con la AEAT se puede seguir haciendo facturas proformas igualmente verificable y encadenadas sin intentar de nuevo enviarlas hasta que no se restablezca la conexión y entonces enviarlas con incidencia pero exactamente igual o en el caso que tengas que hacer 20 facturas hoy en la mañana, si no tengo conexión facturo por la tarde. Imagínate que alguien ha hecho una remesa a sus clientes y debe enviarle las facturas a sus correspondientes email, puede hacerlo por la mañana o por la tarde. Es según a lo que este enfocado el SIF y el negocio que se gestiona.
He hablado con algunos gestores y me comentan que tienen muchos problemas con la conexión con la AEAT en el envío de documentación y no es nuevo de ahora, imagino que cuando estemos todos atacando a sus servidores va a ser lo más. Bueno el tema del desfase horario si lo van a quitar simplificaría más el código pero tendremos que tenerlo en cuenta.

ermendalenda 30-01-2025 20:53:01

Cita:

Empezado por Rja750 (Mensaje 561583)
Me refiero a que cuando no haya conexión con la AEAT se puede seguir haciendo facturas proformas igualmente verificable y encadenadas sin intentar de nuevo enviarlas hasta que no se restablezca la conexión y entonces enviarlas con incidencia pero exactamente igual o en el caso que tengas que hacer 20 facturas hoy en la mañana, si no tengo conexión facturo por la tarde. Imagínate que alguien ha hecho una remesa a sus clientes y debe enviarle las facturas a sus correspondientes email, puede hacerlo por la mañana o por la tarde. Es según a lo que este enfocado el SIF y el negocio que se gestiona.
He hablado con algunos gestores y me comentan que tienen muchos problemas con la conexión con la AEAT en el envío de documentación y no es nuevo de ahora, imagino que cuando estemos todos atacando a sus servidores va a ser lo más. Bueno el tema del desfase horario si lo van a quitar simplificaría más el código pero tendremos que tenerlo en cuenta.

No te creas, el SII está funcionando bien.
Sigo sin entender muy bien tu prodecimiento, pero el que la lleva...Las proformas no llevan QR y las facturas normales se pueden generar e intentar enviar al momento , y se teintenta hasta que se pueda, si el problema es de ellos ya lo identificarán.

Rja750 30-01-2025 21:38:51

Cita:

Empezado por ermendalenda (Mensaje 561587)
No te creas, el SII está funcionando bien.
Sigo sin entender muy bien tu prodecimiento, pero el que la lleva...Las proformas no llevan QR y las facturas normales se pueden generar e intentar enviar al momento , y se teintenta hasta que se pueda, si el problema es de ellos ya lo identificarán.

Si yo envío una factura y no hay conexión no obtengo respuesta ¿no? simplemente no se ha enviado. Guardo esa factura como registro de mi SIF en mi BD y marco que no ha habido conexión, pero el cliente se lleva su factura verifactu, claro que al comprobar el QR obtendrá esta respuesta "En estos momentos no tenemos ese registro, inténtalo mas tarde" o algo así. Se sigue trabajando y emitimos la factura que le sigue con toda la operativa como si no hubiese pasado nada y ahora si hay conexión. ¿Que es lo que ocurre? ¿entra esa factura sin haber metido la anterior? imagino que no porque hay un salto y por ende un rechazo. Entonces ¿cual es la operativa? ¿dejamos de facturar para volver a enviar las dos factura con incidencia? y cuando hayamos acabado de enviar, ya podemos seguir facturando la siguiente? no tengo eso claro.

Neftali [Germán.Estévez] 31-01-2025 08:48:49

Actualizo el mensaje #2 con la recopilación de códigos.
Gracias por compartirlos.

ermendalenda 31-01-2025 08:58:37

Cita:

Empezado por Rja750 (Mensaje 561588)
Si yo envío una factura y no hay conexión no obtengo respuesta ¿no? simplemente no se ha enviado. Guardo esa factura como registro de mi SIF en mi BD y marco que no ha habido conexión, pero el cliente se lleva su factura verifactu, claro que al comprobar el QR obtendrá esta respuesta "En estos momentos no tenemos ese registro, inténtalo mas tarde" o algo así. Se sigue trabajando y emitimos la factura que le sigue con toda la operativa como si no hubiese pasado nada y ahora si hay conexión. ¿Que es lo que ocurre? ¿entra esa factura sin haber metido la anterior? imagino que no porque hay un salto y por ende un rechazo. Entonces ¿cual es la operativa? ¿dejamos de facturar para volver a enviar las dos factura con incidencia? y cuando hayamos acabado de enviar, ya podemos seguir facturando la siguiente? no tengo eso claro.

Hola
No puedes/debes poner el envío de la factura como parte de la operativa del cobro de la factura, o sea, hay unos controles definidos en la norma que te obligan a que esos envíos lo hagas en segundo plano, por ejemplo, hay que respetar unos tiempos de espera entre envios, también por el escenario que pones de ejemplo, si en un momento dato no hay conexión puedes seguir emitiendo y encadenando y cuando haya conexión tienes que volver. A comenzar el control de flujos, ver cuantas tienes pendientes de enviar, y enviarlas juntas en un soloenvio(máximo 1000 facturas), pero no puedes hacer saltar en los envíos, tiene que ser secuencialmente r3specto a su generación cronológica y encadenamiento.
Creo que te tienes que repasar la documentación de verifactu empezando por la Orden Ministerial.
Saludos

rci 31-01-2025 09:03:12

Cita:

Empezado por Rja750 (Mensaje 561588)
Si yo envío una factura y no hay conexión no obtengo respuesta ¿no? simplemente no se ha enviado. Guardo esa factura como registro de mi SIF en mi BD y marco que no ha habido conexión, pero el cliente se lleva su factura verifactu, claro que al comprobar el QR obtendrá esta respuesta "En estos momentos no tenemos ese registro, inténtalo mas tarde" o algo así. Se sigue trabajando y emitimos la factura que le sigue con toda la operativa como si no hubiese pasado nada y ahora si hay conexión. ¿Que es lo que ocurre? ¿entra esa factura sin haber metido la anterior? imagino que no porque hay un salto y por ende un rechazo. Entonces ¿cual es la operativa? ¿dejamos de facturar para volver a enviar las dos factura con incidencia? y cuando hayamos acabado de enviar, ya podemos seguir facturando la siguiente? no tengo eso claro.

Yo creo que si que "entra la siguiente" y sin rechazo. Pero teóricamente vas reintentando enviar hasta que ya tienes conexión y cuando ya la tienes, empiezas a enviar por orden.

Exacto, eso que ha dicho ermendalenda

Rja750 31-01-2025 10:08:57

Cita:

Empezado por rci (Mensaje 561591)
Yo creo que si que "entra la siguiente" y sin rechazo. Pero teóricamente vas reintentando enviar hasta que ya tienes conexión y cuando ya la tienes, empiezas a enviar por orden.

Exacto, eso que ha dicho ermendalenda

Gracias. No sabia que se pudiera mandar con saltos y era lo que quería saber. Entonces la operativa cambia. Seguimos estudiando, aprendiendo y compartiendo.


La franja horaria es GMT +2. Ahora son las 15:25:07.

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