Archive for the 'Programación' Category

SII (Suministro Inmediato de Información) en Visual FoxPro sin morir en el intento

Esto estaba ya casi abandonado, pero añado un post explicando mis vicisitudes en el trabajo conectando con los servicios web de Hacienda para remitir el SII (Suministro Inmediato de Información) por si a alguien está en la misma situación de desespero y mis avances en el tema le resultan útiles, aunque no creo que quede ya nadie en la misma situación: en las empresas normales esto se resolvió hace meses, pero en mi empresa somos tan chulos que dejamos esto para una semana antes de entrar en vigor.

La situación es la siguiente: aplicación de gestión desarrollada en Visual FoxPro, por lo que nuestra intención es hacerlo también en VFP. La generación de XMLs no supone ningún problema, ya me he pegado antes con ellos en el índice único de ANCERT, los hacemos a mano (mejor dicho a martillo), y aunque es un trabajo costoso y sufrido no supone mayor problema. El tema de realizar la conexión segura y envío a los servicios web de Hacienda ya es otra historia, no es una técnica que usemos habitualmente más allá de conexiones simples como las del Catastro, y la de Hacienda, con certificados seguros mediante, dista mucho de ser simple.

Los primeros intentos fueron infructuosos y por más que buscamos información no conseguimos resolverlo. Intentamos resolverlo de forma nativa en VFP mediante _ws3client.vcx (la forma nativa que tiene VFP para tratar con los web services) y también con MSSOAP.SoapClient30, las dos funcionaban parcialmente pero se atascaban a la hora procesar el certificado seguro, y por más que buscamos y probamos cosas –y creedme, busqué y probé de TODO– no conseguimos pasar de ahí. Incluso me lancé de forma desesperada a una solución híbrida en Visual Basic .net, generando los XML en Fox, enviándolos con el bridge .net y procesando la respuesta de nuevo con Fox, pero las prisas y desarrollar algo en una herramienta que no es la habitual no es la mejor combinación.

Al final y casi de casualidad lo intenté mediante una conexión simple HTTP (la forma más sencilla y clásica de consumir servicios web) y funcionó sin muchos problemas y desde Fox, quedando además el código resultante en unas ridículas cuatro líneas (quitando todas las validaciones y controles adicionales, claro). A continuación dejo el código simplificado y detalles técnicos por si a alguien les resulta útil:

Lo primero es generar los XML, como he dicho anteriormente lo hacemos a mano mediante:

set console off
set talk off
set textmerge on to memvar xmltmp NOSHOW
*...
set textmerge to

*Conversión UTF-8
xmltmp =STRCONV(xmltmp,9)

Después de eso iniciamos la conexión al web service. Las conexiones HTTP no entienden de namesservices ni de bindingports, así que lo que hago es abrir el .wsdl del servicio que queremos enviar (los siete disponibles están en el anexo I del manual de Hacienda, o aquí), y extraigo la dirección de los servicios a llamar que se encuentran al final en el tag <wsdl:service name=”siiService”>. Tener en cuenta que hay direcciones para producción y para pruebas, por lo que habrá que tratar las dos como corresponda.


IF UPPER(thisform.cmbModo.displayValue)="PRUEBAS"
sEndPoint="https://www7.aeat.es/wlpl/SSII-FACT/ws/fe/SiiFactFEV1SOAP"
ELSE
sEndPoint="https://www1.agenciatributaria.gob.es/wlpl/SSII-FACT/ws/fe/SiiFactFEV1SOAP"
endif

IF TYPE("oHTTP")#"O"
oHTTP=createobject("winhttp.winhttprequest.5.1")
endif
oHTTP.Open("POST", sEndPoint, .F.)

*Elegir Certificado, el common name del certificado se puede sacar de la ventana de certificados de opciones de internet, o mediante comando en la powershell: dir cert:\currentuser\my
*El nombre a sacar viene identificado como CN en algúno de los elementos de la pestaña detalles del certificado
*Debe ser un certificado válido, vigente y dado de alta en Hacienda
oHTTP.SetClientCertificate("CURRENT_USER\My\"+ALLTRIM(emp.cncertif))

ohttp.Send(xmlFraE) && El XML generado junto con las cabeceras y cierres finales

XMLRespuesta=ohttp.ResponseText

*Procesar la respuesta
*...

Y básicamente eso es todo, por supuesto queda todo el tema de la generación, encadenación de distintos servicios (no entiendo muy bien por qué no han definido un único esquema para todos los casos), pero la parte de comunicar con el web service se reduce a eso.

Y para finalizar una cita del entrañable Necronomicón aparentemente dirigida a Visual Fox Pro: “Que no está muerto lo que yace eternamente, y con los eones extraños incluso la muerte puede morir”.

Programando una colección de libros VI

¿Os acordáis de aquél programa que estaba haciendo para mantener una biblioteca personal? ¿Si? Bueno, pues yo no.

Hasta hace unos días, que me volví a acordar de él y le pegué un pequeño repaso. Estaba terminado, con instalador y todo, pero nunca llegué a publicarlo. Mejor tarde que nunca, así que ahora es un buen momento, el caso es que… ya que me pongo le lavo un poco la cara, ¿no?

Y en eso estoy, he reescrito de 0 buena parte del código y he pegado un profundo repaso a todas las ventanas, ahora luce un poquito mejor, es mucho más cómoda gracias al redimensionado de ventanas y las nuevas clases de visualización son bastante más rápidas que las anteriores.

Dejo un par de capturas, y en un par de días espero (por fin) terminarlo definitivamente.

…Click para ampliar…

Visión de portadas (aparte de la clásica vista en lista). La textura de madera de fondo es opcional. Nota: el libro 'Memncoch el diablo' no es que no tenga puntuación, es que esta es un 0.

Remodelada ventana de obtención de portadas desde internet, usando la API de Yahoo. Nota: no me preguntéis que pinta un cómic de El Castigador con Arthur C. Clarke, porque yo tampoco lo se, cosas de Yahoo.

Programando una colección de libros V

Avanzo poco a poco con el proyecto. El caso es que no he hecho prácticamente nada y cuando me pongo con él apenas puedo dedicarle media hora, pero aún con tan poco tiempo voy cerrando cosas.

He implementado (por fin) el sistema de préstamos y de citas, ambos incluidos en la ventana de la ficha del libro, en forma de pestañas. El gestor de citas no sé si será muy práctico, pero hecho está. El gestor de préstamos si que es indudablemente práctico, sobre todo para personas con tan poca memoria como yo, que deja cosas y a veces ya no las vuelve a ver.

Ficha del libro, con pestañas para citas y préstamos

El programa conoce a una lista de nuestros amigos habituales, y anotará en cada libro cuando lo hemos prestado y a quién, quedando marcado en rojo para que sea fácilmente localizable. También he hecho una ventana resumen de préstamos para que con un único vistazo estemos al día de todo lo que nos tienen que devolver. Ahora que lo pienso también sería interesante poder introducir también de forma similar los libros que nos han dejado a nosotros, para que nos sirva de recordatorio.

Anotación de citas

Anotación de citas

A partir de ahora poco queda ya por hacer, porque la base ya está hecha y todo lo que venga son añadidos. Se me ocurre también poder enlazar la ficha de cada libro con el archivo del ebook (libro electrónico) si lo tenemos, para facilitar la consulta y búsqueda, así como algún enlace a webs de descarga de ebooks.

De momento nada más, dejo un par de capturas de las ventanas nuevas. (Los préstamos que aparecen son ficticios, están solo para hacer pruebas).

Pestaña de anotación de préstamos

Pestaña de anotación de préstamos

Ventana de estado de préstamos

Ventana de estado de préstamos

Programando una colección de libros IV

Llevaba tiempo con esto parado, pero recientemente me he puesto manos a la obra otra vez. El caso es que hace poco se lo enseñé a uno de mis jefes para ver si aprovechávamos parte del código que hice para un proyecto de la empresa, y la cosa empezó a reventar por todas partes, así que me decidí a pegarle un repaso y terminarlo.

La sorpresa me la llevé cuando me puse manos a la obra y descubrí que tenía una versión mucho más avanzada y que funcionaba perfectamente, pero a esas alturas ya me había picado el gusanillo de nuevo y he decidido terminarlo y distribuirlo.

He pulido algunos detalles y he implementado una herramienta para obtener la portada de los libros automáticamente a través de Internet, sin recurrir al API de Amazon, solo mediante consultas Winhttp al buscador de Yahoo.

Importador automático de portadas

Me queda aún implementar el sistema de prestamos, algún campo para anotar citas de cada libro y poder imprimirlas u ojearlas cómodamente, y alguna funcionalidad más. ¿Sugerencias?

Aquí un repaso de como ha ido avanzando proyecto:
Programando una colección de libros I
Programando una colección de libros II
Programando una colección de libros III


Flashbacks

RSS Últimos temas escuchados

  • Se ha producido un error; es probable que la fuente esté fuera de servicio. Vuelve a intentarlo más tarde.

Licencia

Creative Commons License


Esta obra está bajo una licencia de Creative Commons.

Member of The Internet Defense League