domingo, 14 de febrero de 2010

Factura Electrónica de Exportación y ejemplo soap simple

El Web Service de Factura Electrónica de Exportación (WSFEX) es un nuevo servicio web de la AFIP para autorizar facturas electrónicas de comercio exterior (obtener el CAE).

Para poder usar estos webservices, como se comento en varias oportunidades, desarrollamos interfaces propias hechas en Python debido a la incompatibilidad y complejidad de otras soluciones (.NET, Java, PHP).

A continuación se presenta un ejemplo de cuatro simples pasos, sobre como usar SoapClient y SimpleXmlElement para consultar fácilmente los servicios web de AFIP:

Paso 1: Importar las clases que necesitamos utilizar de nuestras librerias de XML y SOAP:
from simplexml import SimpleXMLElement
from soap import SoapClient

Paso 2: Revisar el wsdl que describe los servicios y extraer URL, acción y espacio de nombres (buscar atributos location, soapAction -sin la operación-, targetNamespace respectivamente):
WSFEXURL = "https://wswhomo.afip.gov.ar/wsfex/service.asmx"
SOAP_ACTION = 'http://ar.gov.afip.dif.fex/'
SOAP_NS = "http://ar.gov.afip.dif.bfe/"

Paso 3: Creamos nuesto cliente SOAP de servicio web:
client = SoapClient(WSFEXURL,action=SOAP_ACTION, namespace=SOAP_NS, trace=True)

Paso 4: Llamamos a la función remota, por Ej. FEXDummy que obtiene el estado de los servidores de la AFIP. Para ello debemos invocar el método "virtual" del objeto client de acuerdo como especifíca el wsdl (se recomienda leer el manual del desarrollador que proporciona AFIP ya que el wsdl no es muy intuitivo). Como respuesta nos devuelve un objeto XML al cual podemos acceder directamente por sus atributos:
response = client.FEXDummy()
result = response.FEXDummyResult
print str(result.AppServer)
print str(result.DbServer)
print str(result.AuthServer)

Esto es todo, si funcionan bien nos debería imprimir el estado de los servidores (OK si estan funcionando).

Notar la simplicidad y dinamismo gracias a Python, sin perder flexibilidad, pudiendo invocar métodos arbitrarios y convertir los tipos de datos según nuestras necesidades.

En este caso el método del servicio web no recibe parámetros, si los tuviera se pasarían como argumentos por nombre (usando valores simples, diccionarios u objetos) de Python, ej.: 
response = client.FEXGetPARAM_MON(Auth={"Token": token, "Sign": sign, "Cuit":long(cuit)})
También puede tomarse como referencia los ejemplos de AFIP hechos en PHP, ya que desarrollamos estas herramientas para que sean similares.

El código completo para utilizar el servicio web de factura electrónica de exportación puede ser descargado de google code

Para más información y novedades sobre estos temas exite un grupo de noticia, el sitio con información general del proyecto y la páginas sobre factura electrónicainformación técnica y la interfaz PyAfipWs.

6 comentarios:

  1. hola! como consigo acceso a:
    http://www.sistemasagiles.com.ar/trac/wiki/ManualPyAfipWs

    Gracias por el aporte!!!

    ResponderEliminar
  2. Hola! existe una API para php para poder adaptar nuestro sistema de facturacion para webhosting que corre en linux/apache/php para que pueda incluir el CAE en las facturas generadas ?

    ResponderEliminar
  3. Hola! existe una API para php para poder adaptar nuestro sistema de facturacion para webhosting que corre en linux/apache/php para que pueda incluir el CAE en las facturas generadas ?

    ResponderEliminar
  4. estamos trabajando en una aplicacion para facturar en java se puede hacer la conexion para que timbren la factura?

    ResponderEliminar

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.