Cita:
Empezado por Rja750
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.