viernes, 19 de mayo de 2017

GTXSII. Visual Basic .NET


Estamos trabajando muy duro en intentar en soportar más lenguajes de programación para nuestra librería GtxSII, para el Suministro Inmediato de Información.

Ahora sumamos el soporte de  Visual Basic, VB.NET, ejemplo muy simple de código, para
crear una factura emitida;


Public Class Form1 Public oGtxSii As Object Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load oGtxSii = CreateObject("GTXSII") End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click MsgBox(oGtxSii.Version) End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click Dim oServicio = oGtxSii.Create("SuministroLRFacturasEmitidas") Dim oRequest = oServicio.oRequest oRequest.Cabecera.Titular.NombreRazon = TextRazon.Text oRequest.Cabecera.Titular.NIF = TextNIF.Text oRequest.Cabecera.TipoComunicacion = "A0" Dim oFacturaEmitida = oRequest.GetFactura() oFacturaEmitida.PeriodoImpositivo.Ejercicio = 2017 oFacturaEmitida.PeriodoImpositivo.Periodo = "03" oFacturaEmitida.IDFactura.NIF = TextNIF.Text oFacturaEmitida.IDFactura.NumSerieFacturaEmisor = TextFactura.Text oFacturaEmitida.IDFactura.FechaExpedicionFacturaEmisor = Date.ParseExact(TextFecha.Text, "dd/MM/yyyy", System.Globalization.DateTimeFormatInfo.InvariantInfo) oFacturaEmitida.FacturaExpedida.TipoFactura = "F1" oFacturaEmitida.FacturaExpedida.ClaveRegimenEspecialOTrascendencia = "01" oFacturaEmitida.FacturaExpedida.ImporteTotal = 270.0 oFacturaEmitida.FacturaExpedida.DescripcionOperacion = "Ventas de productos" oFacturaEmitida.FacturaExpedida.Contraparte.NombreRazon = "EMPRESAXXXX" oFacturaEmitida.FacturaExpedida.Contraparte.NIFRepresentante = "" oFacturaEmitida.FacturaExpedida.Contraparte.NIF = "A17035080" Dim Sujeta = oFacturaEmitida.FacturaExpedida.TipoDesglose.DesgloseFactura.Sujeta Sujeta.TipoNoExenta = "S1" Dim oDetalleIVA = Sujeta.GetDetalleIVA() oDetalleIVA.TipoImpositivo = 21 oDetalleIVA.BaseImponible = 123.97 oDetalleIVA.CuotaRepercutida = 26.03 If oServicio.Send() Then TextRequest.Text = oRequest.GetXML() Dim oResponse = oServicio.oResponse viewResponse(oResponse) Else TextRequest.Text = oRequest.GetXML() If oServicio.nHostError = -1 Then MsgBox("Incidencia detectada " & CStr(oServicio.nHostError) & " " & oServicio.cHostErrorMsg) Else Dim oResponse = oServicio.oResponse If IsNothing(oResponse) Then MsgBox("Incidencia detectada " & CStr(oServicio.nHostError) & " " & oServicio.cHostErrorMsg) Else viewResponse(oResponse) End If End If End If oServicio = Nothing oRequest = Nothing End Sub Private Sub viewResponse(oResponse As Object) Dim cValue cValue = "CSV :" + oResponse.CSV + vbCrLf + "IDVersionSii:" + oResponse.Cabecera.IDVersionSii + vbCrLf + "NombreRazon :" + oResponse.Cabecera.Titular.NombreRazon + vbCrLf + "NIF :" + oResponse.Cabecera.Titular.NIF + vbCrLf + "EstadoEnvio :" + oResponse.EstadoEnvio + vbCrLf + "NIFPresentador :" + oResponse.DatosPresentacion.NIFPresentador + vbCrLf + "TimestampPresentacion :" + oResponse.DatosPresentacion.TimestampPresentacion + vbCrLf + "------------------------REGISTROS----------------------------------" + vbCrLf For Each oRespuesta In oResponse.RespuestaLinea cValue = cValue + "EstadoRegistro :" + oRespuesta.EstadoRegistro + vbCrLf + "CodigoErrorRegistro :" + oRespuesta.CodigoErrorRegistro + vbCrLf + "DescripcionErrorRegistro :" + oRespuesta.DescripcionErrorRegistro + vbCrLf Dim oFactura = oRespuesta.IDFactura cValue = cValue + "NIF :" + oFactura.NIF + vbCrLf + "NumSerieFacturaEmisor :" + oFactura.NumSerieFacturaEmisor + vbCrLf + "NumSerieFacturaEmisorResumenFin :" + oFactura.NumSerieFacturaEmisorResumenFin + vbCrLf + "FechaExpedicionFacturaEmisor :" + oFactura.FechaExpedicionFacturaEmisor + vbCrLf Next TextResponse.Text = cValue End Sub End Class



martes, 2 de mayo de 2017

GTXSII. Nuestra solución al Suministro Inmediato de Información.


Bien es sabido que el próximo 1 de Julio entra en vigor la nueva ley sobre la declaración del IVA para determinadas empresas que cumplan unos requisitos.

Desde getex hemos estado trabajando duro para poder ofrecer una solución profesional a todos nuestros compañeros y amigos programadores de Harbour y sus variantes.

Pero hemos intentado ir un poco más allá, y aún a costa de dedicar más horas y recursos, hemos creado además una DLL que puede ser usado por otros lenguajes, como ;

Visual Basic, Foxpro, Alaska xbase++, scripting desde sistema o JavaScript, Delphi, etc..
Desde Fivewin pasando por Xailer, usando compiladores de BCC o Mingw. 

Además, también hemos portado la validación de NIF, persona física o jurídica de la AET, y estamos también la portando la consulta de operadores intracomunitarios a través de VIES.

Tenéis toda la información en http://www.getex.net/sii/

martes, 25 de abril de 2017

Convertir XML a Hash en Harbour ( Update V )


Bueno, pues de probar con un montón de XML diferentes , me encuentro que uno de tantos cientos probamos, no lo hace como se esperaba.

Simplificando y reduciendo el XML para ver donde está el problema;


<?xml version="1.0" encoding="utf-8"?>
 <UpdateCustomerProfile> 
     <request> 
          <Id>001</Id> 
          <ReservationNumber>123456</ReservationNumber>
          <Email> 
                 <string>uno@moo.com</string>
                 <string>dos@moo.com</string>
          </Email>
     </request>
</UpdateCustomerProfile>

Al pasar por la función XMTOHASH( ), el efecto que ocurre es que solo tendremos el valor
de string, con el ultimo valor, dos@moo.com

¿ Y porque ocurre esto ? 

Ocurre simplemente, porque se ha llegado al final , y no tiene hijos,  y como el node se llama igual, lo que hace la función es volver asignarle a hash con la clave string ,que si tenemos, con el nuevo valor.
La consecuencia es que no podemos tener los valores de ninguna de las maneras.


Como podéis observa en la imagen, el hash solo podemos tener el último valor del string.

Bien, ¿ como solucionarlo  ? 

Sencillamente, vamos a crear un array de childs, que en caso que  la clave sea igual a lo que tengo, se guardará posteriormente para remplazar el valor que hay por este array child.
En casos como este, tendremos que preguntar si el valor del hash["string"] de que tipo es,
CARACTER o ARRAY, para procesar posteriormente el hash.

Aquí el código final, en color azul, el parche aplicar a la funcion recursiva NodeToHash();


STATIC FUNCTION NodeToHash( node ) Local hNext Local hHashChild := {=>} Local hHash := {=>} Local node2 Local hChild := {=>}, cKey /* hChild es un hash, que tiene la key en el cual vamos añadiendo
en el array los elementos iguales. */ WHILE node != NIL IF mxmlGetType( node ) == MXML_ELEMENT if HB_HHASKEY( hHash, mxmlGetElement( node ) ) if valtype( hHash[ mxmlGetElement( node ) ] ) <> "A" if empty( hChild ) hChild[ mxmlGetElement( node ) ] := {} aadd( hChild[ mxmlGetElement( node ) ] , hHash[ mxmlGetElement( node ) ] ) aadd( hChild[ mxmlGetElement( node ) ] , mxmlGetOpaque( node ) ) // Mas el valor del nuevo nodo else aadd( hChild[ mxmlGetElement( node ) ], mxmlGetOpaque( node ) ) // Mas el valor del nuevo nodo endif hHash[ mxmlGetElement( node ) ] := mxmlGetOpaque( node ) else // Es un array, por lo tanto, no lo tocamos endif else hHash[ mxmlGetElement( node ) ] := mxmlGetOpaque( node ) endif if empty( mxmlGetOpaque( node ) ) // Miramos dentro hNext := mxmlWalkNext( node, node, MXML_DESCEND ) if hNext != NIL hHashChild := NodeToHash( hNext ) // Correcion de Posible bug. Un elemento con espacios en blanco, deja descender un nivel!, cuando no debería! // example <element> </element> if hHashChild != NIL .and. !empty( hHashChild ) if empty( hHash[ mxmlGetElement( node ) ] ) hHash[ mxmlGetElement( node ) ] := {} endif if HB_MXMLGETATTRSCOUNT( node ) > 0 hHashChild[ mxmlGetElement( node ) + "@attr"] := HB_MXMLGETATTRS( node ) endif AADD( hHash[ mxmlGetElement( node ) ], hHashChild ) endif else //// if HB_MXMLGETATTRSCOUNT( node ) > 0 if empty( hHash[ mxmlGetElement( node ) ] ) hHash[ mxmlGetElement( node ) ] := {} endif AADD( hHash[ mxmlGetElement( node ) ], HB_MXMLGETATTRS( node ) ) endif endif else if HB_MXMLGETATTRSCOUNT( node ) > 0 hHash[ mxmlGetElement( node ) + "@attr"] := HB_MXMLGETATTRS( node ) endif endif ENDIF node := mxmlGetNextSibling( node ) END WHILE
 // En caso que el array tenga mas de un elemento, tenemos que alimentarlo
// con el array de su clave.
   if !empty( hChild )
      cKey := hb_HKeyAt( hChild, 1) 
      hHash[ cKey ] := hChild[ cKey ]
   endif   
return hHash

Como consecuencia de este trozo de código ,  ahora tenemos en un array los elementos disponibles;

Si si, eso esta muy bien, pero algo como esto; ( Incrédulos ;-)  )


<?xml version="1.0" encoding="utf-8"?>
 <UpdateCustomerProfile> 
     <request> 
          <Id>001</Id> 
          <ReservationNumber>123456</ReservationNumber>
          <Email> 
                 <string>uno@moo.com</string>
                 <string>dos@moo.com</string>
                 <string>
                      <string>compicado@es.es</string>
                 </string>
          </Email>
     </request>
</UpdateCustomerProfile>




Disfruten del parche! 

miércoles, 22 de marzo de 2017

Se rompió la BIOS.

Estaba yo dispuesto a pasar un fin de semana de relax en el ordenador , cuando de repente, lo que nunca me había pasado, y mira que se me han roto casi TODO lo que cae en mis manos ;





ACOJONADO!!! Al menos se recupero con el Backup

¿ La consecuencia de esto ? Pues el efecto lateral en Linux /Linux Ubuntu es que dejaron de funcionar los USB-2, solo los UBS-3 iban, pero lo pero de todo ello, es que las conexiones Bluetooh, Red, Impresoras, etc dejaron de funcionar.

Rebuscando por Internet, creo que hace tiempo ya lo realice en prueba y error, encontré que la placa
GIGABYTE GA-990FXA-UD3  hay que activar en la BIOS,  IOMMU to "Enabled". !!!!


Ahora ya funciona RED y USB.

"La IOMMU es una unidad de gestión de la memoria, similar a la MMU, que se sitúa entre un bus de E/S y la memoria." Pues cony, DEJALO ACTIVADO POR DEFECTO!!!! ;-)

GTXSII. Visual Basic .NET

Estamos trabajando muy duro en intentar en soportar más lenguajes de programación para nuestra librería GtxSII, para el Suministro Inmedi...