Si uno desarrolla en Odoo tarde o temprano debe integrar su solución con algún API. Por ejemplo, en mi caso en los últimos doce meses debí integrar diversos Odoo con las siguientes API: facturasend de Paraguay, Nosis, MercadoLibre, Vtex (en tres meses procesamos más de 2000 pedidos para un sitio de comercio electrónico uruguayo), Dragonfish, un WMS propietario... esos son algunos que me acuerdo ahora. Muchos servicios de factura electrónica en Latinoamérica se implementan con REST, Biller es el primero que me viene a la mente.
Es importantisimo saber trabajar con REST si uno es un desarrollador y obligatorio si uno es un desarrollador semi-senior (tampoco es tan dificil). Es por eso que vamos a dar un pequeño ejemplo de como hacerlo.
Lo primero que uno debe hacer es conocer como funciona la librería requests. Esta librería permite hacer requests de HTTP de forma sencilla (lo verán más abajo). En un módulo de odoo la importamos de la siguiente manera:
import requests
Despues cuando llega el momento de integrarse con algun servicio de tercero, por lo general nos piden que nos autentiquemos mediante un token. Por ejemplo en el caso de VTEX nos piden que nos autentiquemos usando un token y un key que nos proveen. En nuestro caso los almacenamos en la empresa con la que estamos trabajando y con ellos armamos un diccionario con los datos del header:
headers = {
'Accept': 'application/json',
'Content-Type': 'application/json',
'X-VTEX-API-AppKey': company_id.app_key,
'X-VTEX-API-AppToken': company_id.app_token,
}
Y luego realizamos realizamos la llamada GET al API pasando el encabezado que acabamos de definir (en este caso estamos obteniendo la lista de los pedidos. Si quieren mas información pueden recurrir a la documentación de Vtex que es bastante extensa).
En esta llamada al API de REST (que es un request HTTP a un endpoint o URL, en este caso dicha url la definimos en una columna de la empresa) podemos brindarle parametros (por ejemplo el rango de fechas)
date_from = '2001-01-01'
date_to = '2099-11-30'
date_range = (("creationDate:[%sT02:00:00.000Z TO %sT23:59:59.999Z]") %(str(date_from), str(date_to)))
order_status = "ready-for-handling"
params = {
'f_creationDate': date_range,
'per_page': 100,
#+54 9 11 6124-4201'f_status': order_status
}
response = requests.request("GET", company_id.url_orders, headers=headers, params=params, data=payload)
Y como pueden ver, realizamos un GET a la URL pasando como parametros los datos de autenticacion y el date_range con el que deseamos procesar lás órdenes.
El resultado de esta llamada va a ser un diccionario que tiene una variable status_code, que debemos chequear para conocer el resultado del pedido. Si el status_code es 200, el pedido funcionó sin problemas:
if response.status_code == 200:
# procesamiento de pedidos
Y por ultimo, si el pedido fue exitoso, la respuesta tiene un método llamado json que nos brinda un diccionario con los datos de respuesta que nos brinda la llamada. Nosotros recorreremos los items que nos devuelve y por cada uno crearemos un pedido:
for item in response.json()['list']:
vtex_order_number = item.get('orderId')
vtex_creation_date = item.get('creationDate')
vtex_client_name = item.get('clientName')
vtex_status = item.get('status')
if vtex_status != 'ready-for-handling':
continue
partner_id = self.env['res.partner'].search([('name','=',vtex_client_name)],limit=1)
if not partner_id:
partner_id = self.env['res.partner'].create({'name': vtex_client_name})
vals = {
'is_vtex': True,
'vtex_order_number': vtex_order_number,
'name': vtex_order_number,
'partner_id': partner_id.id,
'vtex_client_name': vtex_client_name,
'vtex_creation_date': vtex_creation_date,
'vtex_status': vtex_status,
'company_id': company_id.id,
}
order_id = self.env['sale.order'].search([('vtex_order_number','=',vtex_order_number)])
if not order_id:
order_id = self.env['sale.order'].create(vals)
Esto es un ejemplo de como interactuar desde Odoo con REST usando la libreria requests. Tambien se pueden hacer llamadas POST, pero no son muy diferentes a lo que estamos viendo ahora. Lo importante es la logica de negocios con la que estamos trabajando, como funciona el API (es fundamental como está implementada y lo bien que esté documentada)