Un tema que siempre tuve pendiente fue automatizar el ingreso de facturas de proveedores. Tuve un tibio inicio con el tema con el archivo de AFIP, pero la verdad tampoco es tan buena idea porque los impuestos internos nunca están discriminados (el día que los impuestos internos de las facturas estén estandarizados y bien discriminados, vamos a ser un país diferente) pero además porque la gente de AFIP vive cambiando la estructura del archivo.
Pero un par de semanas atrás escuché a un cliente decir que Claude podía a partir de un PDF generar un archivo CSV con la información de las facturas, así que pensé "es un buen arranque". Y empecé a trabajar en el tema. Probé con los archivos CSVs y son un buen punto de partida, para un prototipo. Al poco tiempo pasé a utilizar el API de Anthropic y pude armar una solución en Odoo que permitía, a partir del ingreso del PDF de las facturas de proveedores, crear la factura entera y además hacerle correcciones (por ejemplo el ingreso manual de impuestos)
Esta solución consta de una cabecera, y luego de líneas. Donde en cada línea tenemos un nombre, un campo binario con el PDF del archivo, y el total calculado de la factura y el total capturado por el API del PDF de la factura

Decidí usar el JSON generado por el API de Anthropic debido a que el JSON es más confiable que el CSV que puede generar un usuario.
Y tenemos dos botones. Uno para procesar (que lee el PDF, extrae el JSON con el API de Anthropic y crea la factura en base al mismo). Y otro para agregar impuestos creados manualmente.
Bien, como se lee el PDF y se extrae el JSON? De la siguiente manera:
self.ensure_one()
api_key = self.env['ir.config_parameter'].sudo().get_param('ANTHROPIC_KEY')
client = anthropic.Anthropic(api_key=api_key)
# In Odoo, binary fields are already base64-encoded
# e.g. record.datas, record.file, attachment.datas, etc.
pdf_data = self.pdf_file.decode("utf-8") # just decode bytes to string
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[
{
"role": "user",
"content": [
{
"type": "document",
"source": {
"type": "base64",
"media_type": "application/pdf",
"data": pdf_data,
},
},
"type": "text",
"text": """Extract all vendor bill information from this PDF.
Return ONLY a valid JSON object — no markdown, no explanation, no extra text.
Use null for any field not found in the document.
{
"vendor": {
"name": "",
"address": "",
"phone": "",
"email": "",
"tax_id": ""
},
"bill_to": {
"name": "",
"address": ""
},
"invoice_number": "",
"invoice_date": "",
"due_date": "",
"payment_terms": "",
"currency": "",
"line_items": [
{
"description": "",
"quantity": 0,
"unit_price": 0,
"total": 0
}
}
],
"subtotal": 0,
"tax_rate": 0,
"tax_amount": 0,
"discount": 0,
"total": 0,
"amount_due": 0,
"notes": "",
"bank_details": {
"bank_name": "",
"account_number": "",
"routing_number": "",
"iban": "",
"swift": ""
}
}"""
}
],
}
],
)
# 3. Parse the JSON response
raw_text = response.content[0].text.strip()
Donde pueden ver, es una llamada bastante sencilla en la cual le paso el prompt con la estructura del json que necesito. Y la paso al API de Anthropic que me responde el json con la información del PDF que le envié usando el SDK de Antrhopic.
El segundo y natural paso, es crear la factura de proveedor y la del proveedor mismo (si este no existiese). De eso voy a hablar en otro post. Los impuestos agregados manualmente, se agregan a la factura con el botón "Agregar impuestos". Como funciona se explica en este otro post que detalla como agregar manualmente impuestos a una factura.
En este post quería explicar como usar el API de Anthropic para extraer la información de una factura de un proveedor. Y como sería el flujo de trabajo. La idea es que no sea del todo automático debido a que el usuario debe ingresar el PDF con la factura, controlar los totales para asegurarse que estan bien, y luego ingresar manualmente los impuestos. No es perfecto, pero es mucho mejor que la alternativa, que el usuario ingrese manualmente decenas de facturas.
También quería mencionar el costo de una solución así, es realmente barato. Creo que para unas 20 o 25 facturas, el procesamiento me costó menos de un dolar
