sábado, 26 de noviembre de 2011

Trazabilidad de Medicamentos, Operaciones Cambiarias y Remito Electrónico

En el proyecto PyAfipWs se ha agregado soporte para varios webservices:


Con estos servicios web el proyecto PyAfipWs se ha expandido más allá de los webservices de AFIP, incluyendo otras entidades y servicios, completando e integrando las funcionalidades más usadas por sistemas de gestión en Argentina, no solo para python sino que con la interfaz COM se pueden usar desde otros lenguajes en Windows (Visual Basic, Visual Fox Pro, Delphi, ABAP - SAP, etc.) e incluso con interfaces de texto o por linea de comando en otras plataformas (DOS, UNIX).
Próximamente se agregará soporte para archivos CSV, DBF (dBase, FoxPro, Clipper, etc.), extendiendo y facilitando aún más el acceso a estos servicios web desde lenguajes de programación legados.

Respecto a la librería PySimpleSOAP, se realizaron las siguientes mejoras para soportar los nuevos webservices:

  • Mejoras en analisis de WSDL (separando nombres de elementos y tipos complejos, reconocimiento de las diferentes partes de los mensajes, tag vacios)
  • Soporte de SOAP Header (encabezados para autenticación)
  • Soporte básico para WSSE (WebService-Security Extensions)
  • Ajustes por servidor, para formar el requerimiento según cada plataforma evitando incompatibilidades (por ej., no enviar tag vacio a JBoss-AS pero si )
Las modificaciones experimentales están en una rama propia del repositorio, ya que algunos cambios pueden introducir incompatibilidades hacia atrás o todavía no son del todo definitivos. Más información en:

Gracias a tener un desarrollo propio para la comunicación SOAP se pudieron solucionar estos y otros inconvenientes, incluso cuando otras soluciones para webservices fallaban o no se ajustaban a los requerimientos (que por cierto, ningun servicio web ha sido igual a otro, cada nuevo webservice introduce ligeras incompatibilidades, interpretaciones diferentes del standard SOAP o nuevas características).

El servicio COT no es un webservice tradicional ya que no utiliza XML para el requerimiento ni SOAP para la respuesta, teniendo su propio esquema, por lo que solo se uso SimpleXMLElement de PySimpleSOAP (manejo de xml simple estilo objetos), y se adapto un WebClient para codificar los métodos POST. 
Gracias a Matias Gieco por aportar los ejemplos iniciales que posibilitaron desarrollar el componente.

Más información sobre el proyecto en:


Anuncios completos:

sábado, 11 de junio de 2011

Invitación al Público "PyDay 2011 Gonzalez Catan"


PyAr, el grupo de usuarios de Python Argentina, está orgulloso de anunciar que se encuentra abierta la inscripción para el evento PyDay Gonzalez Catán 2011: "Jornada de Programación en Python" a realizarse el sábado 16 de Julio de 2011 de 9 a 19hs en el Instituto Superior Tecnológico Blaise Pascal que contará con Charlas Introductorias y Talleres Prácticos sobre este incipiente lenguaje de programación, reconocido en el ambiente del Software Libre y visto como una creciente alternativa a Java.NET y PHP por su simplicidad, versatilidad y facilidad de uso, utilizado actualmente por miles de empresas, incluyendo a Google, NASA y YouTube.

http://www.pyday.com.ar/catan2011

El evento, de fácil acceso ubicado en el conurbano bonaerense (aprox. 1 hora de Capital), contará con la presencia de DocentesProfesionalesAlumnos y Entusiastas de diferentes puntos del Gran Buenos Aires y de varias provincias del Interior del País, representantes de diversas comunidades de Software Libre (PythonUbuntuMozilla yPostgreSQL, entre otras).

El lema de la jornada es "Python en el mundo real" mostrando casos concretos de aplicación de este lenguaje con ejemplos simples al alcance de todos que demuestran su alta potencialidad e impacto actual.
Los temas principales de la jornada serán: Software LibreEducación (nivel secundario y terciario), Desarrollo Web(django, web2py), Aplicaciones Visuales (wx, gtk, qt), Presentación Proyectos (factura electrónica, voto electrónico, trabajos finales y tesis de graduados), VideojuegosCooperativas, Economía Social y Oportunidades Laborales.

Las distintas actividades se detallán en el sitio:
http://www.pyday.com.ar/catan2011/conference/schedule
    La jornada se enmarca en el Proyecto Curricular Institucional de la Carrera "Analista de Sistemas" orientado al Software Libre y se contempla reservar aulas para espacios abiertos, temas avanzados, posters, presentación de proyectos, stands de comunidades, reuniones, mini-sprints de desarrollo, charlas relámpagos espontáneas no programadas y consultas del público en general.
    Son bienvenidos los colaboradores, empresas, entidades y comunidades interesadas en participar y auspiciar la jornada.

    El evento es de entrada libre y gratuita previa inscripción web (cupos limitados):

    http://www.pyday.com.ar/catan2011/user/register

    Se entregarán Certificados de Asistencia emitidos por el Instituto (sin costo)

    viernes, 10 de junio de 2011

    Avances PyRece: WSFEv1, varias mejoras (XML/TXT/DBF/JSON) y rediseño

    Continuando con el constante trabajo y avance del proyecto de factura electrónica y software libre, ya esta publicado la nueva versión del aplicativo libre y gratuito para gestionar facturas electrónicas utilizando los webservices de AFIP:

    http://sites.google.com/site/pyafipws/anuncios/actualizacionpyrece123e

    Esta actualización contempla soporte para WSFEv1 (el servicio web "versión 1" de mercado interno que entra en vigencia el 1° de Julio y afecta principalmente a importadores, monotributistas, turismo, etc.)

    Además, se realizó un rediseño interno separandolo en módulos reutilizables en dos áreas: Formatos de archivos de intercambio y generación de PDF:

    • formato_csv.py: para planillas de cálculo 
    • formato_txt.py: para archivos de texto de campos con ancho fijo (por ej. Cobol) similar a SIAP RECE 
    • formato_xml.py: para archivos similares al Facturador Plus (utilizando SimpleXmlElement para serialización automática)
    • formato_dbf.py: para tablas compatibles con dBase, Clipper y FoxPro
    • formato_json.py: que exporta/importa los diccionarios de Python con simplejson
    • pyfepdf.py: modulo ya existente para generar los PDF (reutilizado) aprovechando el diseñador visual

    Esto fue posible luego de unificar la representación interna de las facturas electrónicas, ajustando los campos para diferentes formatos a una estructura en común compartida por todos los módulos.

    A su vez, se resolvieron algunos bugs por el tema de la codificación de DBF que serán enviados al desarrollador de dicha librería a la brevedad.

    Todos estos cambios posibilitan en el futuro agregar soporte para otros formatos y webservices (WSFEX Exportación -RG2758-, WSMTX -RG2904, Bonos fiscales, etc.), que será el próximo paso a implementar.

    Si bien se mejoro un poco el aspecto de la interfaz, estamos trabajando para la modernización de la interfaz, implicando una separación en capas para la integración de las tres soluciones:


    Por todos estos motivos, se buscan testers, empaquetadores y colaboradores interesados en estos temas, proximamente nos vamos a estar reuniendo en el PyDay de Catán para tratar el estado del proyecto y los pasos a seguir, los esperamos:

    http://www.pyday.com.ar/catan2011

    martes, 15 de febrero de 2011

    Novedades PyAfipWs -Factura Electrónica- (instalador nsis, pythoncom, soap)

    Recientemente liberé una nueva actualización de la biblioteca PyAfipWs, con varias mejoras:
    http://www.pyafipws.com.ar/anuncios/nuevoinstalador106ayejemplosparawsfev1
    A continuación se detallan los temas técnicos:

    Extension a py2exe para generar un instalador NSIS:

    Inicialmente usaba un .BAT para generar el instalador (7-zip autoextraible), para simplificar y mejorar el proceso (detectar archivos en uso, desinstalar copia previa, mostrar licencia, elegir directorio, internacionalización), desarrollé nsis.py, una extensión para py2exe, que agregando dos lineas a un setup.py crea un paquete unico con todo incluido, usando Nullsoft Scriptable Install System:

    from nsis import build_installer
    setup(
    ...
    cmdclass = {"py2exe": build_installer}
    )

    Más info en:
    http://code.google.com/p/pyafipws/source/browse/setup_wsfev1.py
    http://code.google.com/p/pyafipws/source/browse/nsis.py

    El código está adaptado de una ejemplo de py2exe para Inno Setup. 

    PythonCOM y la ruta de instalación

    Para poder acceder a archivos locales en un ambiente empaquetado con py2exe, en general es trivial salvo que el script sea una DLL, ya que el interprete Python se "embebe" dentro del programa anfitrión, y los métodos estándard para determinar donde está ubicado el script fallan.
    La solución mas simple fue usar:

    • sys.executable para cuando el script es un .EXE
    • win32api.GetModuleFileName(sys.frozendllhandle) para cuando el script es un .DLL
    • __file__ cuando se ejecuta directamente el .PY

    Más info en:
    http://code.google.com/p/pyafipws/source/browse/wsfev1.py#129

    Type Library y PythonCOM:

    Algunos lenguajes de tipado estático (C#, versiones de Cobol) necesitan para las interfaces COM una librería de tipos (mejor conocidas como .TLB) para referenciar y determinar los métodos, parámetros y valores devueltos, ya que Python es un lenguaje dinámico que no ofrece dicha información.
    Para mi sorpresa, las implementaciones en lenguajes de tipado estático tampoco parecen ofrecerla, y es necesario en todos los casos usar un compilador de un lenguaje especial de MS (IDL):
    http://code.google.com/p/pyafipws/source/browse/pyafipws.idl
    Para que lo reconozca hay que agregar al objeto python los atributos _typelib_guid_, _typelib_version_, _com_interfaces_
    http://code.google.com/p/pyafipws/source/browse/pyafipws.py#57

    Igualmente todo este tema esta deshabilitado ya que el tipado estático ocasiona más problemas que los que resuelve (sobre todo con el registro, DLL hell, falta de flexibilidad, etc.), y hay métodos alternativos más simples para acceder a PythonCOM desde C# y lenguajes similares.

    Mi agradecimiento a Mark Hammond (el creador de python-win32) por señalar al ejemplo "pippo" en el directorio win32com\test, como muestra de una asociación entre un objeto Python COM y su TLB.

    Mejorando la performance SOAP WSDL:

    El protocolo SOAP es complejo, y analizar el XML de la descripción de un webservice (WSDL) para poder comunicarse con el, es un proceso un poco costoso.
    Gracias a Python la solución se simplificó bastante, ya que permite guardar y recuperar las estructuras de datos ya procesadas, sin necesidad de artefactos o código generado como en otros lenguajes (.NET, Java, etc.):
    http://code.google.com/p/pysimplesoap/source/browse/pysimplesoap/client.py#244

    Con el módulo cPickle de la librería estándar (implementado en C) se mejoro el tiempo para cargar un WSDL de 0.4 segundos a aproximadamente a 0.001 segundos, ~ 400 veces más rápido. Con pickle nativo (implementado en python) la mejora era un poco menos significativa (~ 40 veces más rápido).
    Los test fueron realizados en una netbook para un webservice medianamente complejo, YMMV

    Licencia y Aviso Legal

    CC BY-SACopyright (C) 2009 - 2013 Mariano Reingart reingart@gmail.com - Visite el sitio http://reingart.blogspot.com/ para novedades. Salvo indicación contraria, el texto de esta página está disponible bajo la Licencia Creative Commons Atribución Compartir Igual 3.0 Unported; podrían ser aplicables cláusulas adicionales.

    Se solicita mantener el aviso de copyright (enlazando al texto original), compartir las obras derivadas bajo la misma licencia, y si es, posible comunicando al autor cualquier mejora. No utilizar logotipos ni marcas sin la debida autorización de sus titulares.

    Toda información es proporcionada a Titulo Informativo y se entrega como está, sin garantías explícitas ni implicitas de ningún tipo, incluyendo sin limitación, pérdida de ganancias, interrupción de negocios, pérdida de programas u otros datos en sistemas de computación o cualquier otro reclamo. Al usarla acepta hacerlo bajo su propia responsabilidad, conociendo la normativa y reglamentaciones existentes. En caso de controversias respecto del presente, usted acepta presentarlas y resolverlas exclusivamente en la jurisdicción de los Tribunales Ordinarios Civiles y Comerciales del Departamento Judicial de Morón, Provincia de Buenos Aires, Argentina, renunciando expresamente a cualquier otro fuero que pudiere corresponder.