Validando la factura electrónica en Paraguay

6 de junio de 2024 por
Gustavo Orrillo
| Sin comentarios aún
 

La validación de una factura en forma electrónica tiene al menos dos pasos. El primero es la confirmación de la factura de Odoo. Y luego la validación (o timbrado) electrónica ya sea por la autoridad impositiva correspondiente, o el servicio que brinda un API para validar las facturas electrónicas.

A nivel código... se ve en resumidas de la siguiente manera:

def action_confirm(self):    
​res = super(AccountMove, self).action_confirm()
​""" aca se hace la validación electrónica """
return res

Entonces si uno analiza los módulos de factura electrónica (ya sea para Argentina, Uruguay y Paraguay) uno siempre va a encontrar un archivo llamado account_move.py donde va a encontrar un método que sigue el patrón descrito anteriormente. 

Que se hace en esa sección que realiza la validación electrónica? Supongamos que vamos a validar la factura electrónica mediante un API (como puede ser en Uruguay y Paraguay). Lo primero que se hace es establecer la URL del API donde se va a validar la factura:

url = "%s/%s/de/create"%(self.env['ir.config_parameter'].sudo().get_param('facturasend_url'),rec.company_id.tenant_id)

En este caso se tiene un parámetro con la URL del API de la factura electrónica, más otros parámetros (por ejemplo el tenant ID). Esta información la encuentran en el API correspondiente, por ejemplo Biller o FacturaSend. Luego se crea el header con el que se va a autorizar la factura electrónica (por ejemplo con el bearer token establecido a nivel compañía)

headers = {
"Content-Type": "application/json",
"Authorization": "Bearer api_key_%s"%(rec.company_id.bearer_token)
}

Luego se crea un diccionario con los campos que se necesitan (como está descrito en la documentación del API). Y luego se convierte dicho diccionario a formato JSON y se lo postea en el API

invoice_dict = {...}
payload = json.dumps(invoice_dict)
rec.request = payload
self.env.cr.commit()
response = requests.request("POST", url, headers=headers, data=payload)

Noten lo siguiente. Hay un campo llamado request donde vamos a guardar los contenidos del payload que vamos a postear (fundamental para hacer debugging). Y commiteamos antes de hacer la solicitud (lo que plantea que en caso de haber error, se tenga que volver atrás el documento posteado anteriormente).

Y luego de recibida la respuesta, se chequea que su status sea el correcto y se hace el mapeo de campos correspondientes:

response = requests.request("POST", url, headers=headers, data=payload)
if response.status_code < 400:
res = response.json()
rec.response = response.text
result = res.get('result')
delist = result.get('deList')
if delist and type(delist) == list:
delist = delist[0]
rec.cdc = delist.get('cdc')
rec.numero = delist.get('numero')
rec.name = rec.numero
rec.estado = delist.get('estado')
rec.respuesta_codigo = delist.get('respuesta_codigo')
rec.respuesta_mensaje = delist.get('respuesta_mensaje')
self.env.cr.commit()

Lo que nos brinda el siguiente resultado al validar una factura electrónicamente en Paraguay:


Bien, ese es el patrón que se sigue para validar las facturas de forma electrónica. Es válido en Argentina, Uruguay, Paraguay... no me sorprendería que en otros países sea parecido. En otros posts vamos a seguir hablando de como se implementa Odoo con factura electrónica en Paraguay.

Gustavo Orrillo 6 de junio de 2024
Compartir
Archivar
Identificarse dejar un comentario