El API de FacturaSend utiliza para autenticarse el método de Bearer Token. Tanto el Bearer Token como el Tenant ID lo establecemos en la compañía (en el caso del conector de Biller para Uruguay lo hacemos en el diario de ventas). Son decisiones de diseño.
Con la librería requests dicha autenticación la hacemos de la siguiente manera:
import requests
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer api_key_MI_API_KEY"
}
Establecemos un diccionario con el API Key provista por FacturaSend.
Bien, ahora tenemos que capturar los departamentos (similar a provincias), distritos (similar a nuestros partidos) y ciudades (no necesita introducción). Para capturar esta información FacturaSend brinda un webservice con la siguiente sintaxis
# Obtiene los departamentos
curl \
GET "https://api.facturasend.com.py/<tenantId>/departamentos" \
-H "Authorization: Bearer api_key_<hdiweuw-92jwwle...>"
Lo cual llega el momento de utilizar requests, toma la siguiente sintaxis. Primero capturamos los departamentos y luego los procesamos. Este es un extracto del código que lo hace para los departamentos:
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer api_key_%s"%(self.bearer_token),
}
facturasend_url = self.env['ir.config_parameter'].get_param('facturasend_url')
if facturasend_url:
if not facturasend_url.endswith('/'):
facturasend_url = facturasend_url + '/%s/departamentos'%(self.tenant_id)
else:
facturasend_url = facturasend_url + '%s/departamentos'%(self.tenant_id)
else:
raise ValidationError('No está definida la URL de FacturaSend')
response = requests.get(facturasend_url,headers=headers)
if response.status_code == 200:
res = response.json()
result = res.get('result')
for depto in result:
vals = {
'set_code': depto.get('codigo',''),
'code': depto.get('codigo',''),
'name': depto.get('descripcion','N/A'),
'country_id': self.env.ref('base.py').id,
}
state_id = self.env['res.country.state'].search([('set_code','=',depto.get('codigo')),('country_id','=',self.env.ref('base.py').id)])
if not state_id:
return_id = self.env['res.country.state'].create(vals)
Como pueden ver, nos autenticamos primero y luego obtenemos la lista de departamentos. Luego iteramos departamento por departamento e insertamos el departamento si el mismo no se encuentra disponible
Luego, departamento por departamento capturamos los distritos
Para finalmente capturar las ciudades
Los mantendremos al tanto con los avances de este trabajo.