Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   TICKET BAI (TicketBAI); Nuevo sistema de la Agencia Tributaria del Pais Vasco (https://www.clubdelphi.com/foros/showthread.php?t=94264)

ermendalenda 22-09-2021 16:04:15

Cita:

Empezado por rci (Mensaje 543031)
Hola, veo que comentais mucho sobre el número de serie del dispositivo, pero yo tengo entendido que debido a la imposibilidad técnica de saberlo en todos los casos, es un valor que no es obligatorio y por lo tanto no lo relleno y no me he preocupado en obtenerlo.


Es así o estoy equivocado?


Muchas gracias

Yo he entendido que quiere usar un certificado de dispositivo para firmar, nada que ver con identificar el dispositivo en el fichero tbai que de momento no es obligatorio

rci 22-09-2021 16:16:50

Cita:

Empezado por ermendalenda (Mensaje 543033)
Yo he entendido que quiere usar un certificado de dispositivo para firmar, nada que ver con identificar el dispositivo en el fichero tbai que de momento no es obligatorio


Tienes razón, ahora me he fijado en eso.
Yo me referia al campo de la HuellaTBAI


Muchas gracias

Noe277 22-09-2021 16:39:34

Cita:

Empezado por ermendalenda (Mensaje 543033)
Yo he entendido que quiere usar un certificado de dispositivo para firmar, nada que ver con identificar el dispositivo en el fichero tbai que de momento no es obligatorio

Nosotros lo estamos metiendo como obligatorio y les obligamos a que lo pidan. Puedo tener a 10 usuarios atacando a una misma empresa y de esta manera puedo llevar la concatenación de las facturas por equipo y si falla algo en algún equipo no fastidia a los demás.

Sistel 22-09-2021 16:40:03

Cita:

Empezado por rci (Mensaje 543030)
Hola Espinete,
En bizkaia se pospone la obligatoriedad de Batuz y de ticketBAI también

Hola rci y Espinete,

Aunque se posponga la obligatoriedad de TicketBAI-Batuz en Bizkaia, puede ser muy interesante implementarlo de forma voluntaria.
Han aprobado, recientemente, una deducción del 15% de la base imponible del Impuesto sobre Sociedades (o del IRPF en el caso de autónomos) durante el 2022 y 2023 a quienes lo pongan en marcha.
(Aparte del 30% de gasto deducible por la puesta en marcha)

Saludos

ermendalenda 22-09-2021 16:51:41

Cita:

Empezado por Noe277 (Mensaje 543035)
Nosotros lo estamos metiendo como obligatorio y les obligamos a que lo pidan. Puedo tener a 10 usuarios atacando a una misma empresa y de esta manera puedo llevar la concatenación de las facturas por equipo y si falla algo en algún equipo no fastidia a los demás.

Sí, yo también, pero meto la MAC, que además la uso como parte de la licencia del software junto a la id del disco, del procesador. Y de otras.

ermendalenda 22-09-2021 16:56:18

Por cierto alguien conoce el blockchain? (intercambios de ficheros JSON) parecido al p2p pero con firma electrónica. Esperemos que la Aeat no se vaya por esos derroteros para la gestión similar a TicketBai. Da miedete meterse en otro tema.

tejano 22-09-2021 17:33:18

Cita:

Empezado por ermendalenda (Mensaje 543032)
A ver este tema me interesa. Lo que yo haría es intentar hablar con un emisor de certificados de dispositivos por ejemplo IZENPE para que te aconseje por que lo que yo pienso puedo estar equivicado:
El certificado de dispositivo se solicita sobre un número de serie y el certificado no va a comprobar que corresponde, pero si será necesario para posibles inspecciones que garantice un número de serie único y sigo pensando que te puede servir la MAC, y si te da 2 o as seguramente puedas identificarlas por software en un orden y puedes coger siempre la primera.

Yo utilizo el comando "wmic bios get serialnumber" para saber la serie del dispositivo.

De echo, he creado un certificado de dispositivo de Izenpe con esta serie.

ermendalenda 22-09-2021 17:44:21

Cita:

Empezado por tejano (Mensaje 543040)
Yo utilizo el comando "wmic bios get serialnumber" para saber la serie del dispositivo.

De echo, he creado un certificado de dispositivo de Izenpe con esta serie.

Gracias. Pues ya le has respondido y muy interesante.

HerensugeBeltz 22-09-2021 17:44:51

Cita:

Empezado por tejano (Mensaje 543040)
Yo utilizo el comando "wmic bios get serialnumber" para saber la serie del dispositivo.

De echo, he creado un certificado de dispositivo de Izenpe con esta serie.

En mi PC no puedo leer el serialnumber de la BIOS, por lo que uso el de la placa base.
A la hora de pedir el certificado, a Izenpe por ejemplo, comunicará el nº de serie que desees, BIOS o placa.

En nuestro caso, si el certificado de la firma es de dispositivo comprobamos que coincida con alguno de los dos, BIOS o placa. En caso contrario lanzamos un error.

ermendalenda 22-09-2021 17:54:04

Esta es la función en VB que uso para leer Identicador y serie procesador, es algo mas completo para evitar la duplicidad.
Código:

Public Function GetOsBitness() As String
    Dim ProcessorSet As Object
    Dim WMI As Object
    Dim CPU As Object
    Dim obj As Object
    Dim objs As Object
    Set WMI = GetObject("WinMgmts:")
    Set objs = WMI.InstancesOf("WIN32_BaseBoard")
    For Each obj In objs
        procid = procid & obj.SerialNumber
        If procid < objs.Count Then procid = procid & "."
    Next
   
    MBSerialNumber = procid
    procid = LTrim$(procid)
    procid = RTrim$(procid)
    Set ProcessorSet = GetObject("WinMgmts:"). _
    ExecQuery("SELECT * FROM Win32_Processor")
    For Each CPU In ProcessorSet
        GetOsBitness = CStr(CPU.AddressWidth)
       
    Next
    GetOsBitness = procid & " " & GetOsBitness
End Function


ermendalenda 22-09-2021 17:58:40

Si lo necesitas te hago un exe que te genere un fichero

Ramon88 22-09-2021 19:21:39

Cita:

Empezado por ermendalenda (Mensaje 543010)
En Vb cambiando poca cosa te vale para net:
Código:

Private Declare Function WideCharToMultiByte Lib "kernel32" ( _
    ByVal CodePage As Long, _
    ByVal dwFlags As Long, _
    ByVal lpWideCharStr As Long, _
    ByVal cchWideChar As Long, _
    ByVal lpMultiByteStr As Long, _
    ByVal cbMultiByte As Long, _
    ByVal lpDefaultChar As Long, _
    ByVal lpUsedDefaultChar As Long) As Long

Dim CRC8_Table As Variant
' CodePage constant for UTF-8
Private Const CP_UTF8 = 65001

''' Return byte array with VBA "Unicode" string encoded in UTF-8
Function Utf8BytesFromString(strInput As String) As Variant
    Dim nBytes As Long
    ' Catch empty or null input string
    Utf8BytesFromString = vbNullString
    If Len(strInput) < 1 Then Exit Function
    ' Get length in bytes *including* terminating null
    nBytes = WideCharToMultiByte(CP_UTF8, 0&, ByVal StrPtr(strInput), -1, 0&, 0&, 0&, 0&)
    ' We don't want the terminating null in our byte array, so ask for `nBytes-1` bytes
    Dim abBuffer() As Byte
   
    ReDim abBuffer(nBytes - 2)  ' NB ReDim with one less byte than you need
    nBytes = WideCharToMultiByte(CP_UTF8, 0&, ByVal StrPtr(strInput), -1, ByVal VarPtr(abBuffer(0)), nBytes - 1, 0&, 0&)
    Utf8BytesFromString = abBuffer
End Function


Public Function crc8(buffer As String, Polynom, Initial As Variant) As Variant
CRC8_Table = Array(&H0, &H7, &HE, &H9, &H1C, &H1B, &H12, &H15, _
    &H38, &H3F, &H36, &H31, &H24, &H23, &H2A, &H2D, &H70, &H77, &H7E, &H79, &H6C, &H6B, &H62, &H65, _
    &H48, &H4F, &H46, &H41, &H54, &H53, &H5A, &H5D, &HE0, &HE7, &HEE, &HE9, &HFC, &HFB, &HF2, &HF5, _
    &HD8, &HDF, &HD6, &HD1, &HC4, &HC3, &HCA, &HCD, &H90, &H97, &H9E, &H99, &H8C, &H8B, &H82, &H85, _
    &HA8, &HAF, &HA6, &HA1, &HB4, &HB3, &HBA, &HBD, &HC7, &HC0, &HC9, &HCE, &HDB, &HDC, &HD5, &HD2, _
    &HFF, &HF8, &HF1, &HF6, &HE3, &HE4, &HED, &HEA, &HB7, &HB0, &HB9, &HBE, &HAB, &HAC, &HA5, &HA2, _
    &H8F, &H88, &H81, &H86, &H93, &H94, &H9D, &H9A, &H27, &H20, &H29, &H2E, &H3B, &H3C, &H35, &H32, _
    &H1F, &H18, &H11, &H16, &H3, &H4, &HD, &HA, &H57, &H50, &H59, &H5E, &H4B, &H4C, &H45, &H42, _
    &H6F, &H68, &H61, &H66, &H73, &H74, &H7D, &H7A, &H89, &H8E, &H87, &H80, &H95, &H92, &H9B, &H9C, _
    &HB1, &HB6, &HBF, &HB8, &HAD, &HAA, &HA3, &HA4, &HF9, &HFE, &HF7, &HF0, &HE5, &HE2, &HEB, &HEC, _
    &HC1, &HC6, &HCF, &HC8, &HDD, &HDA, &HD3, &HD4, &H69, &H6E, &H67, &H60, &H75, &H72, &H7B, &H7C, _
    &H51, &H56, &H5F, &H58, &H4D, &H4A, &H43, &H44, &H19, &H1E, &H17, &H10, &H5, &H2, &HB, &HC, _
    &H21, &H26, &H2F, &H28, &H3D, &H3A, &H33, &H34, &H4E, &H49, &H40, &H47, &H52, &H55, &H5C, &H5B, _
    &H76, &H71, &H78, &H7F, &H6A, &H6D, &H64, &H63, &H3E, &H39, &H30, &H37, &H22, &H25, &H2C, &H2B, _
    &H6, &H1, &H8, &HF, &H1A, &H1D, &H14, &H13, &HAE, &HA9, &HA0, &HA7, &HB2, &HB5, &HBC, &HBB, _
    &H96, &H91, &H98, &H9F, &H8A, &H8D, &H84, &H83, &HDE, &HD9, &HD0, &HD7, &HC2, &HC5, &HCC, &HCB, _
    &HE6, &HE1, &HE8, &HEF, &HFA, &HFD, &HF4, &HF3)
 
  Dim data As Variant
    data = Utf8BytesFromString(buffer)
  Dim alen, i As Integer
  Dim crc As Byte
  'data = Buffer ':= TEncoding.UTF8.GetBytes(Cadena);
  alen = UBound(data)
  crc = 0
   
  For i = 0 To alen
    crc = CRC8_Table((crc Xor data(i)) And &HFF)
 
Next
    crc8 = crc And &HFF



End Function

Para llamar a la función y que te devuelva en cr8:
cr8 = crc8(Cadena_enviada, 7, 0)


iNITIAL Y POLYNOM CREO QUE PUEDES OBVIARLAS


Pues te lo agradezco muchisimo! me esta dando fallo en la linea

Código:

nBytes = WideCharToMultiByte(CP_UTF8, 0&, ByVal StrPtr(strInput), -1, 0&, 0&, 0&, 0&)
Exactamente en WideCharToMultiByte
Subo la funcion en si:
Código:

Private Declare Function WideCharToMultiByte Lib "kernel32" (
      ByVal CodePage As Long,
      ByVal dwFlags As Long,
      ByVal lpWideCharStr As Long,
      ByVal cchWideChar As Long,
      ByVal lpMultiByteStr As Long,
      ByVal cbMultiByte As Long,
      ByVal lpDefaultChar As Long,
      ByVal lpUsedDefaultChar As Long) As Long

    Dim CRC8_Table As Object
    ' CodePage constant for UTF-8
    Private Const CP_UTF8 = 65001

Tambien me da error aqui(Exactamente en Array(Es un tipo de clase y no se puede usar como una expresion)):
Código:

Public Function crc8(buffer As String, Polynom As Object, Initial As Object) As Object
        CRC8_Table = Array(&H0, &H7, &HE, &H9, &H1C, &H1B, &H12, &H15,
            &H38, &H3F, &H36, &H31, &H24, &H23, &H2A, &H2D, &H70, &H77, &H7E, &H79, &H6C, &H6B, &H62, &H65,
            &H48, &H4F, &H46, &H41, &H54, &H53, &H5A, &H5D, &HE0, &HE7, &HEE, &HE9, &HFC, &HFB, &HF2, &HF5,
            &HD8, &HDF, &HD6, &HD1, &HC4, &HC3, &HCA, &HCD, &H90, &H97, &H9E, &H99, &H8C, &H8B, &H82, &H85,
            &HA8, &HAF, &HA6, &HA1, &HB4, &HB3, &HBA, &HBD, &HC7, &HC0, &HC9, &HCE, &HDB, &HDC, &HD5, &HD2,
            &HFF, &HF8, &HF1, &HF6, &HE3, &HE4, &HED, &HEA, &HB7, &HB0, &HB9, &HBE, &HAB, &HAC, &HA5, &HA2,
            &H8F, &H88, &H81, &H86, &H93, &H94, &H9D, &H9A, &H27, &H20, &H29, &H2E, &H3B, &H3C, &H35, &H32,
            &H1F, &H18, &H11, &H16, &H3, &H4, &HD, &HA, &H57, &H50, &H59, &H5E, &H4B, &H4C, &H45, &H42,
            &H6F, &H68, &H61, &H66, &H73, &H74, &H7D, &H7A, &H89, &H8E, &H87, &H80, &H95, &H92, &H9B, &H9C,
            &HB1, &HB6, &HBF, &HB8, &HAD, &HAA, &HA3, &HA4, &HF9, &HFE, &HF7, &HF0, &HE5, &HE2, &HEB, &HEC,
            &HC1, &HC6, &HCF, &HC8, &HDD, &HDA, &HD3, &HD4, &H69, &H6E, &H67, &H60, &H75, &H72, &H7B, &H7C,
            &H51, &H56, &H5F, &H58, &H4D, &H4A, &H43, &H44, &H19, &H1E, &H17, &H10, &H5, &H2, &HB, &HC,
            &H21, &H26, &H2F, &H28, &H3D, &H3A, &H33, &H34, &H4E, &H49, &H40, &H47, &H52, &H55, &H5C, &H5B,
            &H76, &H71, &H78, &H7F, &H6A, &H6D, &H64, &H63, &H3E, &H39, &H30, &H37, &H22, &H25, &H2C, &H2B,
            &H6, &H1, &H8, &HF, &H1A, &H1D, &H14, &H13, &HAE, &HA9, &HA0, &HA7, &HB2, &HB5, &HBC, &HBB,
            &H96, &H91, &H98, &H9F, &H8A, &H8D, &H84, &H83, &HDE, &HD9, &HD0, &HD7, &HC2, &HC5, &HCC, &HCB,
            &HE6, &HE1, &HE8, &HEF, &HFA, &HFD, &HF4, &HF3)

        Dim data As Object
        data = Utf8BytesFromString(buffer)
        Dim alen, i As Integer
        Dim crc As Byte
        'data = Buffer ':= TEncoding.UTF8.GetBytes(Cadena);
        alen = UBound(data)
        crc = 0

        For i = 0 To alen
            crc = CRC8_Table((crc Xor data(i)) And &HFF)

        Next

        crc8 = crc And &HFF

    End Function


ermendalenda 22-09-2021 20:10:36

1 Archivos Adjunto(s)
Cita:

Empezado por Ramon88 (Mensaje 543046)
Pues te lo agradezco muchisimo! me esta dando fallo en la linea

Código:

nBytes = WideCharToMultiByte(CP_UTF8, 0&, ByVal StrPtr(strInput), -1, 0&, 0&, 0&, 0&)
Exactamente en WideCharToMultiByte
Subo la funcion en si:
Código:

Private Declare Function WideCharToMultiByte Lib "kernel32" (
      ByVal CodePage As Long,
      ByVal dwFlags As Long,
      ByVal lpWideCharStr As Long,
      ByVal cchWideChar As Long,
      ByVal lpMultiByteStr As Long,
      ByVal cbMultiByte As Long,
      ByVal lpDefaultChar As Long,
      ByVal lpUsedDefaultChar As Long) As Long

    Dim CRC8_Table As Object
    ' CodePage constant for UTF-8
    Private Const CP_UTF8 = 65001

Tambien me da error aqui(Exactamente en Array(Es un tipo de clase y no se puede usar como una expresion)):
Código:

Public Function crc8(buffer As String, Polynom As Object, Initial As Object) As Object
        CRC8_Table = Array(&H0, &H7, &HE, &H9, &H1C, &H1B, &H12, &H15,
            &H38, &H3F, &H36, &H31, &H24, &H23, &H2A, &H2D, &H70, &H77, &H7E, &H79, &H6C, &H6B, &H62, &H65,
            &H48, &H4F, &H46, &H41, &H54, &H53, &H5A, &H5D, &HE0, &HE7, &HEE, &HE9, &HFC, &HFB, &HF2, &HF5,
            &HD8, &HDF, &HD6, &HD1, &HC4, &HC3, &HCA, &HCD, &H90, &H97, &H9E, &H99, &H8C, &H8B, &H82, &H85,
            &HA8, &HAF, &HA6, &HA1, &HB4, &HB3, &HBA, &HBD, &HC7, &HC0, &HC9, &HCE, &HDB, &HDC, &HD5, &HD2,
            &HFF, &HF8, &HF1, &HF6, &HE3, &HE4, &HED, &HEA, &HB7, &HB0, &HB9, &HBE, &HAB, &HAC, &HA5, &HA2,
            &H8F, &H88, &H81, &H86, &H93, &H94, &H9D, &H9A, &H27, &H20, &H29, &H2E, &H3B, &H3C, &H35, &H32,
            &H1F, &H18, &H11, &H16, &H3, &H4, &HD, &HA, &H57, &H50, &H59, &H5E, &H4B, &H4C, &H45, &H42,
            &H6F, &H68, &H61, &H66, &H73, &H74, &H7D, &H7A, &H89, &H8E, &H87, &H80, &H95, &H92, &H9B, &H9C,
            &HB1, &HB6, &HBF, &HB8, &HAD, &HAA, &HA3, &HA4, &HF9, &HFE, &HF7, &HF0, &HE5, &HE2, &HEB, &HEC,
            &HC1, &HC6, &HCF, &HC8, &HDD, &HDA, &HD3, &HD4, &H69, &H6E, &H67, &H60, &H75, &H72, &H7B, &H7C,
            &H51, &H56, &H5F, &H58, &H4D, &H4A, &H43, &H44, &H19, &H1E, &H17, &H10, &H5, &H2, &HB, &HC,
            &H21, &H26, &H2F, &H28, &H3D, &H3A, &H33, &H34, &H4E, &H49, &H40, &H47, &H52, &H55, &H5C, &H5B,
            &H76, &H71, &H78, &H7F, &H6A, &H6D, &H64, &H63, &H3E, &H39, &H30, &H37, &H22, &H25, &H2C, &H2B,
            &H6, &H1, &H8, &HF, &H1A, &H1D, &H14, &H13, &HAE, &HA9, &HA0, &HA7, &HB2, &HB5, &HBC, &HBB,
            &H96, &H91, &H98, &H9F, &H8A, &H8D, &H84, &H83, &HDE, &HD9, &HD0, &HD7, &HC2, &HC5, &HCC, &HCB,
            &HE6, &HE1, &HE8, &HEF, &HFA, &HFD, &HF4, &HF3)

        Dim data As Object
        data = Utf8BytesFromString(buffer)
        Dim alen, i As Integer
        Dim crc As Byte
        'data = Buffer ':= TEncoding.UTF8.GetBytes(Cadena);
        alen = UBound(data)
        crc = 0

        For i = 0 To alen
            crc = CRC8_Table((crc Xor data(i)) And &HFF)

        Next

        crc8 = crc And &HFF

    End Function


Te dejo un ejecutable para que lo uses

keys 23-09-2021 08:10:41

En nuestro caso nos hemos encontrado con ordenadores que "wmic bios get serialnumber" no devuelve nada. Es mas en nuestro caso al obtener el certificado de dispositivo en Izenpe no encontraron ningún número que le proporcionara el equipo. Al final nos hicieron abrir el equipo y mirar el numero de seire que trae la palaca base en una pegatina.

Por lo tanto el numero de seire del dispositivo puede ser cualquier cosa. Nosotros lo que hacemos es que si utiliza un certificado de dispositivo nos tiene que indicar el uaurio el número de serie que le ha otrogado la entidad certificadora.

Ramon88 23-09-2021 09:43:57

Cita:

Empezado por ermendalenda (Mensaje 543048)
Te dejo un ejecutable para que lo uses


Eres increible, muchas gracias!

Neftali [Germán.Estévez] 23-09-2021 10:00:10

Cita:

Empezado por ermendalenda (Mensaje 543048)
Te dejo un ejecutable para que lo uses


En otro de los hilos tiene disponible lo mismo, pero en DLL (y el ejemplo de llamada), por si te puede servir.
https://www.clubdelphi.com/foros/sho...&postcount=607

Sistel 23-09-2021 10:17:08

Cita:

Empezado por espinete (Mensaje 543026)
...
Gipuzkoa y Araba sí permiten el envío del ticket en el momento de hacer la factura (no como Bizkaia que se hacía de 1000 en 1000). ¿Eso ha cambiado también? ¿Cómo y cuándo se hace el envío a Bizkaia tras los cambios de Batuz?
...

Hola espinete,

En Batuz (Bizkaia) los plazos para el envío de los ficheros TicketBAI son los mismos de presentación de IVA (trimestral en la mayoría de los casos, mensuales en algunos casos y en el plazo de 4 días laborables para los obligados al SII)
Ten en cuenta que a la entrada en funcionamiento de Batuz desaparecen las declaraciones de IVA (al igual que las declaraciones de operaciones con terceros, de SII y del Impuesto sobre Sociedades)
Hacienda enviará un borrador (ya que los datos ya los tiene por habérsele enviado por LROE) y sólo habrá que aceptarlo o solicitar cambios (enviando documentación que los avale).

Que se permitan envíos de hasta 1.000 facturas en los LROE 140 y 240, no obliga a hacerlos tan grandes.
Nadie te impide enviar cada fichero TicketBAI (mediante LROE) en el mismo momento de crearse y firmarse.
Es mucho más sencillo controlar la respuesta al envío de un solo fichero.
Y es una buena forma de estar al día y prevenir posibles problemas por pérdidas de datos.

Saludos

sEngine 23-09-2021 10:21:19

Cita:

Empezado por keys (Mensaje 543021)
Releyendo el mensaje que acaban de enviar de Bizkaia.



Por lo tanto vamos a estan sin entorno de pruebas hasta mediados de noviembre (:confused:), vamos a tener que enviar al real. Si es que puedes, ya que me imagino que tendrás que tener una empresa de Bizkaia y tener un certificado real de producción como dice el mensaje.

Que majos :eek:


Facilitando las cosas a los que no tenemos empresa en Bizkaia... que majos son

ermendalenda 23-09-2021 10:29:28

A mi me ha pasado lo que ha vosotros con lo del WMI, incluso al clonar equipos(HD) me clona el sn (supongo que lo lee del registro de sistema).

Que es lo que nunca me falla y siempre me da un número distinto para cada equipo,
combinar el WMI & SN(HD) & MAC, así me aseguro que si clonamos cuando compro equipos de las mismas caracteristicas no voy a tener el problema. La MAC nunca la clona pero hay que tener cuidado.

Os dejo un ejecutable que genera un .ini con los datos principales del equipo, para que tengais variedad con el número de serie.
Ojo que en determinados equipos, si no esta conectado en red, devuelve vacia la MAC. Así que si vais a usar la MAC tenedlo en cta.

ermendalenda 23-09-2021 10:30:40

1 Archivos Adjunto(s)
Faltaba el fichero, no lo ha pillado:D

ermendalenda 23-09-2021 10:35:26

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 543054)
En otro de los hilos tiene disponible lo mismo, pero en DLL (y el ejemplo de llamada), por si te puede servir.
https://www.clubdelphi.com/foros/sho...&postcount=607

Gracias, esta bieen saberlo y que haya variedad.

Pau Haro 23-09-2021 10:46:08

Problemas al enviar TicketBAI a Alava con Java
 
Buenas,

Estoy intentado enviar facturas al servicio de TicketBAI de Alava usando Java, anteriormente ya hemos enviado satisfactoriamente facturas a las diputaciones de Gipuzkoa y Bizkaia. Pero ahora con Alava, no podemos ya que el Java nos pide tener el certificado X.509 dentro del JKS "Java KeyStore" para poder comunicarse de forma segura. ¿Alguien que este usando Java y que haya tenido el mismo problema con Alava?

Tampoco puedo descargar el certificado directamente desde la URL del servicio como hice con Gipuzkoa y Bizkaia ya que la pagina ni me carga, así que no se que hacer exactamente.

Muchas gracias!

ermendalenda 23-09-2021 11:20:21

Cita:

Empezado por ermendalenda (Mensaje 543038)
Por cierto alguien conoce el blockchain? (intercambios de ficheros JSON) parecido al p2p pero con firma electrónica. Esperemos que la Aeat no se vaya por esos derroteros para la gestión similar a TicketBai. Da miedete meterse en otro tema.

Corrijo.
Esto (tbai) también es blockchain.

Neftali [Germán.Estévez] 23-09-2021 12:13:05

Cita:

Empezado por ermendalenda (Mensaje 543059)
Faltaba el fichero, no lo ha pillado:D

Si puedes subir el código fuente, mejor.
Si no puede ser, pues igualmente se agradece el aporte.
^\||/^\||/^\||/

ermendalenda 23-09-2021 12:21:48

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 543064)
Si puedes subir el código fuente, mejor.
Si no puede ser, pues igualmente se agradece el aporte.
^\||/^\||/^\||/

Aquí tienes
Código:

Private Type OSVERSIONINFO
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber As Long
    dwPlatformId As Long
    szCSDVersion As String * 128
    wServicePackMajor As Variant
  wServicePackMinor As Variant
  wSuiteMask As Variant
  wProductType As Byte
  wReserved As Byte
End Type

Private Declare Function GetVersionExA Lib "kernel32" _
    (lpVersionInformation As OSVERSIONINFO) As Integer


Private Declare Function SHFormatDrive Lib "shell32" _
    (ByVal hwnd As Long, ByVal Drive As Long, ByVal fmtID As Long, _
    ByVal options As Long) As Long
Private Declare Function GetDriveType Lib "kernel32" Alias _
    "GetDriveTypeA" (ByVal nDrive As String) As Long
 

Private Declare Function GetVolumeInformation& Lib "kernel32" Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, ByVal pVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long)



Function PRINCIPAL()
    Close #1
    Open App.Path & "\SN-Equipo.ini" For Output Shared As #1
    Print #1, GetOsBitness
    Close #1
 
End Function

Private Function devuelve_version() As String
Dim osinfo As OSVERSIONINFO
    Dim retvalue As Integer
    Dim nversion As Double
    devuelve_version = ""
    osinfo.dwOSVersionInfoSize = 148
    osinfo.szCSDVersion = Space$(128)
    retvalue = GetVersionExA(osinfo)
        nversion = osinfo.dwMajorVersion + (osinfo.dwMinorVersion / 10)
        Select Case (nversion)
            Case 5#
                devuelve_version = "Windows-2000"
            Case 5.1
                devuelve_version = "Windows-XP"
            Case 5.2
                If osinfo.wProductType = 2 Then
                    devuelve_version = "Server-2003"
                Else
                    If osinfo.wProductType = 1 Then
                        devuelve_version = "Windows-Home-Server"
                    Else
                        devuelve_version = "Windows-XP-Profesional-x64-Edition"
                    End If
                End If
            Case 6#
                If osinfo.wProductType = 2 Or osinfo.wProductType = 3 Then
                    devuelve_version = "Server-2008"
                Else
                    devuelve_version = "Windows-Vista"
                End If
            Case 6.1
                If osinfo.wProductType = 2 Or osinfo.wProductType = 3 Then
                    devuelve_version = "Server-2008-R2"
                Else
                    devuelve_version = "Windows-7"
                End If
               
            Case 6.2
                If osinfo.wProductType = 2 Or osinfo.wProductType = 3 Then
                    devuelve_version = "Windows-Server-2012"
                Else
                    devuelve_version = "Windows-8"
                   
                End If
            Case 6.3
                If osinfo.wProductType = 2 Or osinfo.wProductType = 3 Then
                    devuelve_version = "Windows-8.1"
                Else
                    devuelve_version = "Windows-Server-2012-R2"
                End If
           
            Case 10#
                If osinfo.wProductType = 2 Or osinfo.wProductType = 3 Then
                    devuelve_version = "Windows-Server-2016"
                Else
                    devuelve_version = "Windows-10"
               
                End If
            Case 11#
                If osinfo.wProductType = 2 Or osinfo.wProductType = 3 Then
                    devuelve_version = "Windows-Server>2020"
                Else
                    devuelve_version = "Windows-11"
               
                End If
        End Select
               
        If osinfo.dwMajorVersion = 3 And osinfo.dwMinorVersion = 51 And osinfo.dwBuildNumber = 1057 And osinfo.dwPlatformId = 2 Then
            devuelve_version = "Windows NT 3.1"
        ElseIf osinfo.dwMajorVersion = 4 And (osinfo.dwMinorVersion = 0 Or osinfo.dwMinorVersion = 10) And osinfo.dwBuildNumber >= 67109814 And osinfo.dwPlatformId = 1 Then
            devuelve_version = "Windows 95"
        ElseIf osinfo.dwMajorVersion = 4 And osinfo.dwMinorVersion = 0 And osinfo.dwBuildNumber = 1381 And osinfo.dwPlatformId = 2 Then
            devuelve_version = "Windows NT 4.0"
        Else
           
            'Windows 98? - Not sure what to put here
       
        End If
   
End Function

Public Function GetOsBitness() As String
Dim cad1 As String * 256
    Dim cad2 As String * 256
    Dim numSerie As Variant
    Dim longitud As Long
    Dim flag As Long
    Dim unidad As String
    Dim ProcessorSet As Object
    Dim WMI As Object
    Dim CPU As Object
    Dim obj As Object
    Dim objs As Object
    Set WMI = GetObject("WinMgmts:")
    Set objs = WMI.InstancesOf("WIN32_BaseBoard")
    For Each obj In objs
        procid = procid & obj.SerialNumber
       
        If procid < objs.Count Then procid = procid & "."
    Next
    mbserialnumber = procid
    procid = LTrim$(procid)
    procid = RTrim$(procid)
   
    'SI NECESITAIS EL PROCESADOR 32 O 64 ACTIVAR PERO ES UN POCO LENTO
    'Set ProcessorSet = GetObject("WinMgmts:"). _
    'ExecQuery("SELECT * FROM Win32_Processor")
    'For Each CPU In ProcessorSet
    '    GetOsBitness = CStr(CPU.AddressWidth)
    '
    'Next
    GetOsBitness = "ProcesadorSN= " & procid
   
   
    leeridcomputadora = "Sin Conexión"
    strComputer = "."
   
    Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
   
    Set colNetAdapters = objWMIService.ExecQuery("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")
   
    For Each OBJITEM In colNetAdapters
        leeridcomputadora = OBJITEM.MACAddress
 
    Exit For
    Next
    leeridcomputadora2 = leeridcomputadora
    While InStr(1, leeridcomputadora2, ":") > 0
        leeridcomputadora2 = Left(leeridcomputadora2, InStr(1, leeridcomputadora2, ":") - 1) & Right(leeridcomputadora2, Len(leeridcomputadora2) - InStr(1, leeridcomputadora2, ":"))
           
    Wend
    numerie = ""
    unidad = ""
    If Len(App.Path) > 1 Then
        If Mid(App.Path, 2, 1) = ":" Then
            unidad = Left(App.Path, 2) & "\"
            Call GetVolumeInformation(unidad, cad1, 256, numSerie, longitud, flag, cad2, 256)
   
        End If
    End If
    GetOsBitness = GetOsBitness & vbCrLf & "MAC= " & leeridcomputadora & vbCrLf & "MACsp= " & leeridcomputadora2 & vbCrLf & "HD-Serial= " & numSerie & vbCrLf & "HD_UNID= " & unidad & vbCrLf & "VER= " & devuelve_version
   
End Function


Neftali [Germán.Estévez] 23-09-2021 13:40:43

Cita:

Empezado por ermendalenda (Mensaje 543066)
Aquí tienes


Gracias.
He actualizado el hilo de los recursos.
Para añadir link al código, al ejecutable y también he puesto la DLL (MSVBVM50.DLL) necesaria para los que no la tienen de VB.

HerensugeBeltz 23-09-2021 14:01:59

Cita:

Empezado por keys (Mensaje 543050)
En nuestro caso nos hemos encontrado con ordenadores que "wmic bios get serialnumber" no devuelve nada. Es mas en nuestro caso al obtener el certificado de dispositivo en Izenpe no encontraron ningún número que le proporcionara el equipo. Al final nos hicieron abrir el equipo y mirar el numero de seire que trae la palaca base en una pegatina.

Por lo tanto el numero de seire del dispositivo puede ser cualquier cosa.

¿Habéis probado wmic baseboard get serialnumber?
Debería daros el nº de serie de la placa, que debería coincidir con el de la pegatina.

ermendalenda 23-09-2021 14:04:29

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 543068)
Gracias.
He actualizado el hilo de los recursos.
Para añadir link al código, al ejecutable y también he puesto la DLL (MSVBVM50.DLL) necesaria para los que no la tienen de VB.

Te dejo mejor un instalador del MSV... para no tener que registrarlo a mano.

HerensugeBeltz 23-09-2021 14:06:00

Cita:

Empezado por ermendalenda (Mensaje 543058)
A mi me ha pasado lo que ha vosotros con lo del WMI, incluso al clonar equipos(HD) me clona el sn (supongo que lo lee del registro de sistema).
Que es lo que nunca me falla y siempre me da un número distinto para cada equipo,
combinar el WMI & SN(HD) & MAC, así me aseguro que si clonamos cuando compro equipos de las mismas caracteristicas no voy a tener el problema. La MAC nunca la clona pero hay que tener cuidado.

Si cambias la tarjeta de red, ¿no cambia la MAC y se invalida el nº de serie del certificado?
Lo de clonar el equipo y que mantenga el nº de serie anterior me parece muy raro :confused:

ermendalenda 23-09-2021 14:07:06

pues no me deja, 624Kbv\||/

ermendalenda 23-09-2021 14:13:07

Cita:

Empezado por HerensugeBeltz (Mensaje 543071)
Si cambias la tarjeta de red, ¿no cambia la MAC y se invalida el nº de serie del certificado?
Lo de clonar el equipo y que mantenga el nº de serie anterior me parece muy raro :confused:

Si cambias cualquier cosa de las 3 se debe invalidar, lo mismo que si se rompe la placa base la CPU, el HD, etc.. estas cambiando un numero de serie de un elemento del equipo. En ese caso deben actualizar el certificado (Anular y pedir otro, o si te lo permite, modificarlo), siempre que ese numero lo hayas usado para el cerificado del dispositivo.

Cita:

Lo de clonar el equipo y que mantenga el nº de serie anterior me parece muy raro
Pues me ha pasado con equipos idénticos, creo que el comando wmi lee del registro de sistema y si windows no detecta cambios (al clonar el disco) este no se actualiza, cosa que no pasa con la MAC que lo detecta,

ermendalenda 23-09-2021 14:20:54

Cita:

Empezado por HerensugeBeltz (Mensaje 543069)
¿Habéis probado wmic baseboard get serialnumber?
Debería daros el nº de serie de la placa, que debería coincidir con el de la pegatina.

Está bien tenerlo, también la da el ejecutable y fuentes de lo que he subido.

espinete 23-09-2021 14:42:33

Cita:

Empezado por rci (Mensaje 543030)
Hola Espinete,
En bizkaia se pospone la obligatoriedad de Batuz y de ticketBAI también

Lo último que supe es que posponían Batuz, pero no TicketBAI. Significa esto que me puedo olvidar de Bizkaia por ahora y centrarme en Gipuzkoa y Araba?
Es que no me queda muy claro con los últimos avisos que me han enviado de Batuz...

Entiendo que para Gipuzkoa y Araba sigue todo como antes: generar el xml, firmarlo y enviarlo (no como Bizkaia, que había que crear otro xml para los envíos).

¿Qué se haría entonces con Bizkaia para enviar el ticketbai a Hacienda, si ya no se hace con los xmls de envío del 140/240?

ermendalenda 23-09-2021 15:42:34

Cita:

Empezado por espinete (Mensaje 543075)
Lo último que supe es que posponían Batuz, pero no TicketBAI. Significa esto que me puedo olvidar de Bizkaia por ahora y centrarme en Gipuzkoa y Araba?
Es que no me queda muy claro con los últimos avisos que me han enviado de Batuz...

Entiendo que para Gipuzkoa y Araba sigue todo como antes: generar el xml, firmarlo y enviarlo (no como Bizkaia, que había que crear otro xml para los envíos).

¿Qué se haría entonces con Bizkaia para enviar el ticketbai a Hacienda, si ya no se hace con los xmls de envío del 140/240?

Entiendo que lo que posponen es la obligatoriedad hasta el 2024 (Incluyendo TickeBai), pero el que lo quiera implantar ya, pueden(o deberian poder que eso es otra)

Ramon88 23-09-2021 16:46:51

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 543054)
En otro de los hilos tiene disponible lo mismo, pero en DLL (y el ejemplo de llamada), por si te puede servir.
https://www.clubdelphi.com/foros/sho...&postcount=607


No puedo usar la DLL.
Error:
Asegurese de que tiene acceso al archivo y de que es un ensamblado o componente COM válido.

ermendalenda 23-09-2021 16:51:06

Cita:

Empezado por Ramon88 (Mensaje 543079)
No puedo usar la DLL.
Error:
Asegurese de que tiene acceso al archivo y de que es un ensamblado o componente COM válido.

Mira si tienes una carpeta en \Windows\syswow64 y registra la ahí
Si y tuviera más capacidad para subirlo te subiria el instalador de la dll

ermendalenda 23-09-2021 17:15:40

Aqui tienes el instalador de la dll
https://www.filemail.com/d/wheiqnfrdwkmvgk

Ramon88 23-09-2021 17:21:47

Cita:

Empezado por ermendalenda (Mensaje 543081)
Aqui tienes el instalador de la dll
https://www.filemail.com/d/wheiqnfrdwkmvgk


Estas en todo! si vienes por Valencia estas invitado a una buena paella! jeje

Ramon88 23-09-2021 17:25:14

Termino de encontrar una función en .Net que si no me equivoco funciona bien.
Código:

    Function CRC_8(ByVal Txt As String) As Byte
        Dim Poly() As Byte = {1, 0, 0, 0, 0, 0, 1, 1, 1}
        Dim MessageBits As New List(Of Byte)
        Dim MsgBinString As String = ""
        'Compute the message binary
        For Each C As Char In Txt
            Dim S As String = Convert.ToString(Asc(C), 2)
            If S.Length < 8 Then S = New String("0"c, 8 - S.Length) & S

            MsgBinString &= S
        Next
        For Each C As Char In MsgBinString
            If C = "0"c Then MessageBits.Add(0) Else MessageBits.Add(1)
        Next
        'add 8 bits set to zero
        MessageBits.AddRange(New Byte() {0, 0, 0, 0, 0, 0, 0, 0})
        'compute CRC
        While MessageBits.Count > 8
            If MessageBits(0) = 0 Then
                MessageBits.RemoveAt(0)
                Continue While
            End If
            For x = 0 To 8 '<--9 bits
                MessageBits(x) = MessageBits(x) Xor Poly(x)
            Next
        End While
        'put the result in byte format and return
        Dim Result As Byte = 0
        For x = 0 To 7
            Result = Result Or (MessageBits(7 - x) << x)
        Next
        Return Result
    End Function


ermendalenda 23-09-2021 17:37:40

Si te funciona perfecto. Pruébalo y dale.
Aunque no sé, me da la sensación de que le falta la tabla crc8 y el polynomio no me cuadra. No me hagas caso por que yo la función no la entiendo ni me he puesto a entenderla


La franja horaria es GMT +2. Ahora son las 12:14:54.

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