Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Proyecto SIF/Veri*Factu/Ley Antifraude > Registros de Facturacion y Eventos (XML)
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo Hace 2 Semanas
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.874
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 rci Ver Mensaje
...
El problema lo tenemos cuando hay un ordenador con una configuración de zona horaria y otro con otra configuración.
En nuestro caso, que también trabajamos con un servidor (SQLServer y donde están los servicios de envío), tenemos una función que nos devuelve la fecha/hora del Servidor (SQLSerevr).
En algunos casos (no en todos) no cogemos la hora del equipo, sino la del servidor (para el tema de Ley antifraude lo hemos usado en varios sitios).
__________________
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
  #2  
Antiguo Hace 2 Semanas
rci rci is offline
Miembro
 
Registrado: nov 2020
Posts: 416
Poder: 5
rci Va por buen camino
Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
En nuestro caso, que también trabajamos con un servidor (SQLServer y donde están los servicios de envío), tenemos una función que nos devuelve la fecha/hora del Servidor (SQLSerevr).
En algunos casos (no en todos) no cogemos la hora del equipo, sino la del servidor (para el tema de Ley antifraude lo hemos usado en varios sitios).
Muchas gracias Neftali.
Nosotros también usamos la fecha y hora del servidor SQL server, y procuramos que ese servidor siempre esté en la hora exacta. No usamos la hora local del ordenador porque pueden estar fuera de hora y tampoco consultamos la hora de internet (ROA) a cada factura para evitar tantas consultas.
Pero independientemente de esto, nos ocurre lo mencionado en el primer post. Porque esa fecha hora del servidor SQL, al pasarla a DateTime, no tiene el huso y luego depende de donde se utilice ese DateTime, genera una FechaHoraHusoGenRegistro distinta.

Para coger la hora del servidor SQL primero usábamos la consulta
Código SQL [-]
SELECT GETDATE()
Pero solo devuelve un DateTime (sin huso)
Luego probamos con la consulta
Código SQL [-]
SELECT SYSDATETIMEOFFSET()
Que devuelve un DateTimeOffset, este tipo si que tiene una propiedad Offset con el desplazamiento de la hora respecto de la hora universal coordinada (UTC).

Esto seria fantástico si en la clase de VeriFactu que se genera al importar el WSDL, el objeto FechaHoraHusoGenRegistro fuera DateTimeOffset, pero no lo es.
Y estamos con el mismo problema

Muchas gracias
Responder Con Cita
  #3  
Antiguo Hace 2 Semanas
Jarogo08 Jarogo08 is offline
Miembro
 
Registrado: ene 2025
Posts: 78
Poder: 1
Jarogo08 Va por buen camino
Cita:
Empezado por rci Ver Mensaje
SELECT SYSDATETIMEOFFSET()

Que devuelve un DateTimeOffset, este tipo si que tiene una propiedad Offset con el desplazamiento de la hora respecto de la hora universal coordinada (UTC).

Esto seria fantástico si en la clase de VeriFactu que se genera al importar el WSDL, el objeto FechaHoraHusoGenRegistro fuera DateTimeOffset, pero no lo es.
Y estamos con el mismo problema

¿y no puedes crear una función en el Visual que te devuelva un string, con el formato que necesita Verifactu?

si haciendo el "SYSDATETIMEOFFSET" obtienes algo como esto: "2025-04-16 16:44:01.6718891 +02:00"

y Verifactu necesita algo como esto: "2025-04-16T16:44:01+02:00"

entiendo que no sería difícil crear una función que haga la consulta, la ponga en el formato de Verifactu y la devuelva como string.

Y si la haces y la pones aquí, ya la aprovecho yo
Responder Con Cita
  #4  
Antiguo Hace 2 Semanas
Jarogo08 Jarogo08 is offline
Miembro
 
Registrado: ene 2025
Posts: 78
Poder: 1
Jarogo08 Va por buen camino
Venga... ya la hice yo, la pongo aquí que mañana es festivo y estoy de buenas

Código:
Function ObtenerFechaHora() As String
        Dim retorno As String = ""

        '-------------------------------------------
        '1 - COGEMOS LA HORA DE INTERNET
        '-------------------------------------------

        Try
            ServicePointManager.SecurityProtocol = CType(3072, SecurityProtocolType)    'TLS 1.2

            Dim webRequest As HttpWebRequest = CType(Net.WebRequest.Create("https://www2.roa.es/cgi-bin/horautc"), HttpWebRequest)
            webRequest.Method = "GET"
            Dim respuesta As HttpWebResponse = CType(webRequest.GetResponse(), HttpWebResponse)

            If respuesta.StatusCode = HttpStatusCode.OK Then
                Dim strmRespuesta As Stream = respuesta.GetResponseStream()
                Dim leeRespuesta As New StreamReader(strmRespuesta)
                Dim jsonRespuesta As String = leeRespuesta.ReadToEnd()
                Dim ticks As Long = Long.Parse(jsonRespuesta.Replace("\n", ""))
                Dim fechora As DateTime = Org.BouncyCastle.Utilities.Date.DateTimeUtilities.UnixMsToDateTime(ticks).ToLocalTime()
                retorno = fechora.ToString("yyyy-MM-dd'T'HH:mm:ssK")
            End If

        Catch Ex As Exception
            'MsgBox(Ex.Message, MsgBoxStyle.OkOnly, "ObtenerFechaHora - Internet")
        End Try


        '-------------------------------------------
        '2 - COGEMOS LA HORA DEL SERVIDOR SQL
        '-------------------------------------------

        If retorno = "" Then
            Try
                Dim DAHora As New SqlDataAdapter
                Dim DSHora As New DataSet
                Dim SqlHora As String = "SELECT SYSDATETIMEOFFSET() AS FechaActual"
                DSHora.Reset()
                DAHora = New SqlDataAdapter(SqlHora, Conexion)
                DAHora.Fill(DSHora, "Hora")

                If DSHora.Tables("Hora").Rows.Count = 1 Then
                    Dim RowHora As DataRow = DSHora.Tables("Hora").Rows(0)

                    Dim fechora As DateTime = RowHora.Item("FechaActual").ToString
                    retorno = fechora.ToString("yyyy-MM-dd'T'HH:mm:ssK")
                End If

                DAHora.Dispose()
                DSHora.Dispose()

            Catch Ex As Exception
                'MsgBox(Ex.Message, MsgBoxStyle.OkOnly, "ObtenerFechaHora - Servidor")
            End Try
        End If


        '-------------------------------------------
        '2 - COGEMOS LA HORA DEL EQUIPO
        '-------------------------------------------

        If retorno = "" Then
            retorno = DateTime.Now.ToString("yyyy-MM-dd'T'HH:mm:ssK")
        End If

        Return retorno
    End Function

Primero intenta cogerla de internet, si no es capaz del servidor sql y si no es capaz del equipo

La primera puede dar error si no hay internet o no responde ROA... la segunda debería devolver siempre (si no hay conexión al servidor ya no va a funcionar la aplicación)

Espero que te sirva!
Responder Con Cita
  #5  
Antiguo Hace 2 Semanas
rci rci is offline
Miembro
 
Registrado: nov 2020
Posts: 416
Poder: 5
rci Va por buen camino
Cita:
Empezado por Jarogo08 Ver Mensaje
¿y no puedes crear una función en el Visual que te devuelva un string, con el formato que necesita Verifactu?

si haciendo el "SYSDATETIMEOFFSET" obtienes algo como esto: "2025-04-16 16:44:01.6718891 +02:00"

y Verifactu necesita algo como esto: "2025-04-16T16:44:01+02:00"

entiendo que no sería difícil crear una función que haga la consulta, la ponga en el formato de Verifactu y la devuelva como string.
Hola Jarogo08, este no es exactamente el problema.
Si utilizo un string para almacenar la FechaHoraHusoGenRegistro al generar el registro, ya se guarda correctamente PERO, con las clases que se genera en Visual Studio al importar el WSDL, el campo no es string sino DateTime.

Para utilizar ese string tendría que hacer una de las opciones 2 o 3 que comento en el primer post y que intento evitar

Muchas gracias igualmente
Responder Con Cita
  #6  
Antiguo Hace 2 Semanas
Jarogo08 Jarogo08 is offline
Miembro
 
Registrado: ene 2025
Posts: 78
Poder: 1
Jarogo08 Va por buen camino
Cita:
Empezado por rci Ver Mensaje
Si utilizo un string para almacenar la FechaHoraHusoGenRegistro al generar el registro, ya se guarda correctamente PERO, con las clases que se genera en Visual Studio al importar el WSDL, el campo no es string sino DateTime.

pues a mi usando el objeto me deja asignarle un campo string:

Código:
CType(objectoFactEmitida.RegistroFactura(x).Item, RegistroFacturacionAltaType).FechaHoraHusoGenRegistro = Row.Item("FechaHoraHusoGenRegistro")
CType(objectoFactEmitida.RegistroFactura(x).Item, RegistroFacturacionAltaType).TipoHuella = TipoHuellaType.Item01
CType(objectoFactEmitida.RegistroFactura(x).Item, RegistroFacturacionAltaType).Huella = Row.Item("HuellaVerifactu")
donde "FechaHoraHusoGenRegistro" es un varchar(50) en la tabla del SQL Server
Responder Con Cita
  #7  
Antiguo Hace 2 Semanas
rci rci is offline
Miembro
 
Registrado: nov 2020
Posts: 416
Poder: 5
rci Va por buen camino
Cita:
Empezado por Jarogo08 Ver Mensaje
pues a mi usando el objeto me deja asignarle un campo string:

Código:
CType(objectoFactEmitida.RegistroFactura(x).Item, RegistroFacturacionAltaType).FechaHoraHusoGenRegistro = Row.Item("FechaHoraHusoGenRegistro")
CType(objectoFactEmitida.RegistroFactura(x).Item, RegistroFacturacionAltaType).TipoHuella = TipoHuellaType.Item01
CType(objectoFactEmitida.RegistroFactura(x).Item, RegistroFacturacionAltaType).Huella = Row.Item("HuellaVerifactu")
donde "FechaHoraHusoGenRegistro" es un varchar(50) en la tabla del SQL Server
Supongo que en tu caso, la propiedad FechaHoraHusoGenRegistro del objeto RegistroFacturacionAltaType es de tipo string y lo permite.
En nuestro caso es DateTime y no puedo hacer esa asignación directa sin convertir.

Al importar el WSDL dentro del fichero reference.cs genera el campo así:
Código:
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Order=25)]
    public System.DateTime FechaHoraHusoGenRegistro {
        get {
            return this.fechaHoraHusoGenRegistroField;
        }
        set {
            this.fechaHoraHusoGenRegistroField = value;
            this.RaisePropertyChanged("FechaHoraHusoGenRegistro");
        }
    }
y dentro del fichero SuministroInformacion.xsd también indica dateTime

Código:
<element name="FechaHoraHusoGenRegistro" type="dateTime" />

Gracias igualmente

Última edición por rci fecha: Hace 2 Semanas a las 17:58:53.
Responder Con Cita
  #8  
Antiguo Hace 2 Semanas
Jarogo08 Jarogo08 is offline
Miembro
 
Registrado: ene 2025
Posts: 78
Poder: 1
Jarogo08 Va por buen camino
a mi también me dice que es de tipo Date. Entiendo que a todo el mundo debería decirle lo mismo, porque estamos importando el mismo wsdl:


Código:
        '''<remarks/>
        Public Property FechaHoraHusoGenRegistro() As Date
            Get
                Return Me.fechaHoraHusoGenRegistroField
            End Get
            Set
                Me.fechaHoraHusoGenRegistroField = value
            End Set
        End Property

pero me traga cuando lo que le envío es un string:
Código:
CType(objectoFactEmitida.RegistroFactura(x).Item, RegistroFacturacionAnulacionType).FechaHoraHusoGenRegistro = Row.Item("FechaHoraHusoGenRegistro")
no sé a que puede ser debido, pero te facilitaría mucho si te dejara!
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
Consultas por franja horaria petercat SQL 2 17-04-2018 09:12:29
Obtener zona horaria en window 8 ingabraham Varios 0 28-08-2013 17:53:04
como caambiar la zona horaria desde delphi kurono Varios 4 19-08-2008 06:53:36
Zona Horaria palets API de Windows 2 23-10-2006 19:44:57
Zona horaria Genner Varios 1 17-04-2006 14:22:20


La franja horaria es GMT +2. Ahora son las 11:47:57.


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