Saltar al contenido
Agents Finance
Caso de usoEvidencia: Experiencia propia

Un partner de Odoo en Ecuador lleva su propia área financiera con Claude: presupuesto en vivo, cobranza, retenciones faltantes y viáticos

Resumen: Trescloud, partner Gold de Odoo en Ecuador, conectó Claude a su propio Odoo, sus hojas de cálculo, Looker y Gmail para que su área financiera consulte presupuesto, MRR, cartera vencida, retenciones de clientes faltantes y revise facturas de viáticos. Lo cuenta su directora financiera, sin cifras medidas; Trescloud vende este montaje como Trescloud IA.

Publicada el 13 min de lectura2786 palabras

Diagrama: facturas, compras y suscripciones de Odoo llegan a Claude por un conector MCP con los permisos del usuario; Claude devuelve reportes, alertas y borradores que el área financiera revisa y envía.
Diagrama propio del montaje que describe Trescloud.Imagen: Agents Finance · Obra propia

Qué hacen y cómo

Trescloud implementa Odoo en Ecuador, Panamá y Miami. Su directora financiera, Jessica Tipán, explica cómo trabaja el área financiera de la propia empresa con Claude conectado a Odoo, hojas de cálculo, Drive, Looker y Gmail, lo mismo que Trescloud ofrece a sus clientes como Trescloud IA. El presupuesto operativo está estructurado por actividades y códigos departamentales y conectado en vivo a la facturación de compras en Odoo, así que el equipo pregunta cómo va el presupuesto y obtiene el avance por departamento. Un dashboard de MRR muestra el ingreso recurrente, los contratos y el avance frente a la meta por comercial. Claude convierte los datos de contabilidad analítica de Looker en boletines con márgenes y variaciones explicadas. Un reporte de cartera vencida en tiempo real y una auditoría de suscripciones señalan clientes con saldo pendiente desde el primer día de atraso y suscripciones activas que dejaron de facturarse. Otro reporte muestra las retenciones de clientes que no han llegado, algo que los filtros nativos de Odoo no enseñan directamente. Claude revisa las facturas de cada viaje frente a la normativa de hospedaje, alimentación, movilización y misceláneos, y redacta borradores en Gmail para enviar comprobantes de pago, pedir retenciones y recordar cobros. Un vídeo complementario enseña la conexión: una integración creada en Odoo, cuya URL de servidor, ID y secreto de cliente se pegan en un conector personalizado de Claude, y un inicio de sesión OAuth con los permisos del propio usuario de Odoo.

Resultado declarado

Según la directora financiera de Trescloud: la respuesta sobre el presupuesto, que antes tomaba días de consolidación, llega al instante; el MRR se genera en minutos en lugar de días en Excel; los boletines analíticos se hacen en una fracción de los días que costaban; la cobranza pasó de reactiva a proactiva, con alertas desde el primer día de atraso; las suscripciones que no se facturan a tiempo ya no pasan desapercibidas durante semanas, y la revisión de viáticos es más rápida y coherente. Asegura que es la operación real de su área financiera, no una demo. No hay horas medidas, tasas de error, importes ni costes, nada lo ha comprobado un tercero y la empresa vende el mismo servicio.

Ojo con la evidencia. Alguien cuenta cómo lo hace o lo ha hecho, sin cifras contrastables. Es práctica documentada, no una prueba de que funcione en tu caso.

Qué se ha probado de verdad

El 26 y el 27/10/2026 leímos el artículo de la directora financiera (28/07/2026), la publicación de LinkedIn con la transcripción de su vídeo (31/07/2026), el vídeo de YouTube sobre la conexión de Claude con Odoo por MCP (29/07/2026, subtítulos automáticos en español) y la página de Trescloud IA. Comprobamos la documentación de los conectores personalizados y del conector de Gmail de Claude, el apartado de retención de cliente de la localización ecuatoriana de Odoo, el aviso de Odoo sobre el fin de XML-RPC y JSON-RPC, el artículo 8 del Reglamento de Comprobantes de Venta, Retención y Documentos Complementarios del SRI y los precios de Claude en su página oficial. No hemos visto el Odoo de Trescloud, ni sus prompts, reportes o módulo de integración, y el vídeo no aclara si el menú de integraciones es de Odoo estándar o un módulo propio de Trescloud. El script de Python de abajo solo se ha ejecutado con CSV ficticios y contra un servidor XML-RPC falso local; los prompts, las instrucciones del proyecto y el archivo de política son plantillas sin probar.

Cómo replicarlo

Empieza con preguntas de solo lectura. Crea en Odoo un usuario dedicado cuyos permisos coincidan con lo que la IA puede ver, conecta Claude a Odoo con un conector MCP con OAuth (la integración de tu partner, el MCP propio de Odoo si tu edición lo trae o un servidor de código abierto de confianza) y permite sin preguntar solo las herramientas de lectura. Escribe las reglas en un proyecto de Claude: citar números de registro, no contabilizar ni enviar nada, y Gmail solo para borradores. Después añade un control cada vez: presupuesto frente a real por departamento, cartera vencida, retenciones de clientes faltantes tras cinco días hábiles, suscripciones con la próxima factura vencida y la revisión de viáticos. Ejecuta un script determinista junto a Claude para las listas que deben estar completas.

En dos frases

Trescloud, partner de Odoo en Ecuador, conectó Claude a su propio Odoo, sus hojas de cálculo, Looker y Gmail, y su directora financiera describe siete tareas que el área ya le encarga: seguimiento del presupuesto, MRR, boletines analíticos, cobranza, retenciones de clientes faltantes, revisión de facturas de viáticos y borradores de correo. Es un relato de primera mano, sin cifras medidas, de una empresa que vende ese mismo montaje: léelo como un buen mapa de lo que se puede probar, no como una prueba de ahorro.

Por qué importa este caso

Casi todos los casos de agentes de IA en contabilidad de este otoño vienen de usuarios de QuickBooks y Xero en Estados Unidos. Este viene de una consultora latinoamericana de Odoo que además es su primer cliente, y toca problemas que existen en muchos países pero casi nunca salen en las demos: comprobantes de retención que el cliente debe emitir en pocos días, suscripciones que dejan de facturarse sin que nadie lo note y viáticos que tienen que cumplir una normativa.

También es un ejemplo limpio del patrón que vemos en los mejores casos del directorio: la IA lee el ERP con un conector que hereda los permisos del usuario, prepara listas y borradores, y las personas deciden. Nadie dice que Claude contabilice asientos ni mueva dinero. Compáralo con el fundador español que pasó de Holded a Odoo Community con Claude Code, que sí deja escribir al agente, con un agente auditor delante.

Quién lo hace

Trescloud se presenta como partner Gold de Odoo desde 2011, con más de 15 años de trayectoria y presencia en Ecuador, Panamá y Miami. El artículo lo firma su directora financiera, Jessica Tipán, y se publicó en el blog de la empresa el 28/07/2026 con las etiquetas «Contabilidad Ecuatoriana», «Odoo Enterprise» y «16.0». Tres días después, la empresa publicó en LinkedIn un vídeo corto en el que un avatar de IA de la directora cuenta lo mismo, y el 29/07 subió a YouTube otro vídeo, presentado por un avatar del arquitecto de soluciones Castor Calle, que enseña cómo se conecta Claude con Odoo por MCP.

Interés comercial. Trescloud lo vende como Trescloud IA a usuarios de Odoo 16 o superior, sean clientes suyos o de otro partner. Su página de producto tiene una calculadora de «horas recuperadas» cuyos valores son los que mueves con los controles, no resultados de clientes. Aquí no usamos ninguno.

Herramientas y arquitectura

Tabla de las siete tareas: presupuesto, MRR, analítica, cobranza, retenciones, viáticos y correo, con los datos que lee cada una, lo que produce Claude y la decisión que sigue siendo humana.
Las siete tareas tal como las describe la directora financiera · tabla de Agents Finance, obra propia

Las piezas, según el artículo y el vídeo:

  • Odoo guarda las facturas de compra (con códigos de actividad y de departamento para el presupuesto), las facturas de venta, las suscripciones y los documentos tributarios ecuatorianos.
  • Claude se conecta a Odoo con un conector personalizado por MCP. En el vídeo, un administrador abre un menú de Integraciones en Odoo, crea una integración para Claude (el mismo menú ofrece Gemini, ChatGPT y n8n), copia la URL del servidor, el ID y el secreto del cliente y los añade como conector personalizado en Claude. Después, el usuario inicia sesión en Odoo en el navegador y permite el acceso.
  • Los permisos son los del usuario de Odoo. «Si el usuario tiene acceso solo a ventas, no podrá consultar información de compras», dice el presentador. El vídeo recomienda marcar «Permitir siempre» en la herramienta de solo lectura para que Claude no pida autorización en cada consulta.
  • Hojas de cálculo, Drive y Looker guardan la estructura del presupuesto y los datos de contabilidad analítica que Claude convierte en boletines.
  • Gmail está conectado para que Claude prepare borradores: envío de comprobantes de pago, solicitud de retenciones faltantes y recordatorios de cobranza.

Hay dos cosas que no se dicen: si el menú de Integraciones es de Odoo estándar o un módulo propio de Trescloud, y si algún conector puede escribir en Odoo. Suponemos un uso de solo lectura porque todos los ejemplos son reportes, alertas o borradores.

Las siete tareas, una a una

1. Presupuesto en tiempo real. El presupuesto operativo está organizado por actividades y códigos departamentales y conectado en vivo a la facturación de compras en Odoo. El equipo pregunta «¿cómo vamos con el presupuesto?» y obtiene el avance real por departamento, en lugar de un reporte que tardaba días en consolidarse. Lo difícil no es la IA: es codificar cada factura con actividad y departamento, que es lo que permite responder.

2. MRR por comercial. Un dashboard conectado a Odoo muestra el ingreso recurrente, el detalle de contratos y el avance frente a la meta de cada comercial, «generado en minutos en lugar de días de trabajo en Excel».

3. Boletines analíticos. La contabilidad analítica se consolida en Looker y Claude la convierte en boletines interactivos: comparativos, márgenes por línea de negocio y variaciones explicadas. En el vídeo, el avatar de la directora añade que incluso sugiere caminos a tomar «como un consultor estratégico». Esa es la parte que más hay que revisar.

4. Cobranza desde el primer día. Un reporte de cartera vencida en tiempo real muestra qué clientes deben, cuánto y desde cuándo, y una auditoría de suscripciones detecta las activas que dejaron de facturarse a tiempo, «algo que antes podía pasar desapercibido durante semanas».

5. Retenciones de clientes faltantes. En Ecuador, el cliente que es agente de retención debe emitir el comprobante de retención al pagar o al acreditar en cuenta, y tenerlo disponible dentro de los cinco días hábiles siguientes a la presentación del comprobante de venta (artículo 8 del Reglamento de Comprobantes de Venta, Retención y Documentos Complementarios). En la localización ecuatoriana de Odoo, la retención de cliente se registra desde la factura validada con Add Withhold. Trescloud creó un reporte de facturas que aún no tienen retención, «un dato que con los filtros nativos de Odoo simplemente no se puede visualizar de forma directa», para reclamarlas antes de que se conviertan en un problema tributario.

6. Viáticos frente a la normativa. Cuando el personal viaja, Claude revisa cada factura del viaje frente a la normativa de hospedaje, alimentación, movilización y misceláneos, y señala lo que no encaja. La publicación de LinkedIn habla de «normativa interna y legal». El equipo también lo usa para buscar hospedaje y pasajes.

7. Borradores de correo. Con Gmail conectado, Claude redacta los correos repetitivos: envío de comprobantes de pago, solicitud de retenciones faltantes y recordatorios de facturas vencidas.

Lo que la fuente no cuenta

No hay cifras: ni horas ahorradas, ni retenciones recuperadas, ni tasa de errores, ni coste. Los prompts, la definición de los reportes y el módulo de integración no se publican. Quienes presentan ambos vídeos son avatares de IA, así que son piezas de marketing producidas, aunque la directora firme el texto. Y el relato viene de una empresa que vende exactamente este servicio. Lo valioso es la lista de tareas y el modelo de permisos, que sí puedes comprobar tú.

Cópialo y adáptalo

Trescloud no ha publicado archivos, prompts ni código, así que nada de lo que sigue es suyo. Todo es una plantilla de Agents Finance basada en las tareas y la conexión que describen la directora y el vídeo. El script de Python se publica con licencia MIT-0; el resto es de uso y adaptación libres. Usa una base de pruebas o un usuario de solo lectura hasta que te fíes de los resultados.

Requisitos previos

  • Una base de Odoo que puedas conectar a un proveedor de IA y un usuario de Odoo dedicado a la IA, con permisos solo sobre lo que debe ver. El conector hereda esos permisos.
  • Una conexión MCP a Odoo: la integración de tu partner, el MCP propio de Odoo si tu edición lo trae o un servidor de código abierto que hayas revisado (mira el servidor MCP de la comunidad para Odoo). Los conectores personalizados están disponibles en el plan gratuito de Claude (un conector) y en los de pago, y Claude llega a ellos desde la nube de Anthropic, así que el servidor debe ser accesible desde internet.
  • Para el script: Python 3.9 o superior y exportaciones CSV de las vistas de lista de Odoo o una clave de API del usuario de solo lectura.

1. Lista de comprobación de la conexión (plantilla de Agents Finance basada en el vídeo)

ODOO (administrador)
[ ] Crea un usuario "Lector IA" solo con los menús y las compañías que la IA puede ver.
[ ] Crea la integración / servidor MCP para la IA y copia: URL del servidor, ID y secreto del cliente.
[ ] Guarda el secreto en un gestor de contraseñas, nunca en un chat ni en un documento compartido.

CLAUDE (Personalizar > Conectores > Añadir conector personalizado)
[ ] Ponle el nombre de la empresa y el rol, p. ej. "Odoo - Lector IA".
[ ] Pega la URL del servidor; usa tu propio cliente OAuth con el ID y el secreto.
[ ] Conecta e inicia sesión en Odoo como "Lector IA", no como administrador.
[ ] Permisos de herramientas: "Permitir siempre" solo en las de lectura; "Preguntar" o desactivadas las que escriben.
[ ] No uses Investigación con herramientas de escritura activas: puede llamarlas sin preguntar.

GMAIL (conector de Google Workspace)
[ ] Conecta solo el buzón que envía los correos de finanzas.
[ ] Mantén la aprobación previa para enviar, responder o reenviar. El equipo envía; Claude redacta.

CADA TRIMESTRE
[ ] Revisa los permisos del usuario de IA, la lista de conectores y quién accede al proyecto de Claude.

2. Instrucciones del proyecto de Claude (plantilla de Agents Finance)

Pégalo en las instrucciones de un proyecto de Claude que use el área financiera.

# Asistente financiero de <EMPRESA> (Odoo, solo lectura)

## Rol
Ayudas al área financiera a responder preguntas con datos de Odoo, la hoja del presupuesto y las exportaciones de Looker.
Nunca contabilizas, editas, borras, concilias ni pagas nada en Odoo. Nunca envías correos: solo creas borradores.

## Reglas
- Cada cifra debe citar su fuente: números de registro de Odoo (factura, compra, suscripción), nombre del reporte y periodo, o archivo y pestaña.
- Si los datos no responden la pregunta, di qué falta. No estimes.
- Indica el periodo y la moneda de cada importe. Nuestro ejercicio fiscal va de <EJERCICIO>.
- Presupuesto: lo real son las facturas de compra validadas por código de departamento y de actividad. Las facturas sin código van en una línea aparte "sin código"; nunca las repartas.
- Cobranza: una factura está vencida desde el día siguiente a su vencimiento. Agrupa por cliente y por tramos de 1-30, 31-60, 61-90 y más de 90 días.
- Retenciones de clientes (Ecuador): señala las facturas de venta validadas sin retención registrada tras <DIAS_RETENCION> días hábiles desde la fecha de la factura, salvo los clientes de la lista de exentos. Feriados: <ARCHIVO_FERIADOS>.
- Suscripciones: señala las suscripciones activas cuya próxima fecha de factura ya pasó.
- Las recomendaciones van en una sección aparte titulada "Para que decida el equipo".

## Formato de respuesta
1. Respuesta corta (3 líneas).
2. Tabla con las cifras y sus fuentes.
3. Excepciones y datos que faltan.
4. Para que decida el equipo.

3. Cinco prompts (plantillas de Agents Finance)

PRESUPUESTO
¿Cómo vamos con el presupuesto operativo de <AÑO> hasta el <FECHA>? Para cada código de departamento:
presupuesto, real según facturas de compra validadas, % consumido y las 3 facturas más grandes. Añade una
línea aparte con las facturas sin código de departamento o de actividad y sus números.

COBRANZA
Lista los clientes con saldo vencido al <FECHA>, agrupados por tramos de 1-30, 31-60, 61-90 y más de 90 días,
con números de factura e importes. Después, lista las suscripciones activas cuya próxima fecha de factura sea
anterior al <FECHA>.

RETENCIONES FALTANTES
Lista las facturas de venta validadas con fecha anterior al <FECHA_CORTE> que no tienen retención de cliente
registrada. Excluye los clientes de la lista de exentos adjunta. Para cada una: cliente, número, fecha, total
y días hábiles transcurridos.

VIÁTICOS
Adjunto las facturas del viaje <CODIGO_VIAJE> (<CIUDAD>, <FECHAS>) y nuestra política de viáticos. Clasifica
cada factura como hospedaje, alimentación, movilización o misceláneos, compárala con los límites y las fechas
de la política y lista todo lo que quede fuera de la política o de las fechas del viaje. No decidas reembolsos.

BORRADORES DE CORREO
Para cada cliente de la lista de retenciones faltantes, crea un borrador en Gmail (no lo envíes) al contacto
de facturación de Odoo, en español, breve y cordial, citando número de factura, fecha y total, y pidiendo el
comprobante de retención. Reúne todos los borradores en una lista para que los revise.

4. Script de controles deterministas (plantilla de Agents Finance, MIT-0)

Las listas que deben estar completas (todas las facturas vencidas, todas las retenciones faltantes) es mejor sacarlas con código y que Claude las explique después. Este script lee exportaciones CSV de las vistas de lista de Odoo, o descarga las facturas de venta validadas con la API externa de Odoo y una clave de solo lectura, y escribe archivos para revisar. XML-RPC está obsoleto desde Odoo 19 y se eliminará en Odoo 22 (Online 21.1); en versiones nuevas usa la API JSON-2 o las exportaciones CSV. Las retenciones salen de un CSV exportado porque los nombres de campo dependen de tus módulos de localización. El código y sus comentarios son idénticos en ambas versiones del artículo.

#!/usr/bin/env python3
# Agents Finance template based on the controls Trescloud describes (2026). Licence: MIT-0.
# Read-only checks on Odoo exports: receivables ageing, customer withholdings not yet
# received after N business days, and subscriptions whose next invoice date has passed.
# Input: CSV exports from Odoo list views (or --fetch-invoices via the external API).
# Output: CSV files for review. It never writes to Odoo and never sends anything.
import argparse, csv, datetime as dt, os, sys
from collections import defaultdict

def d(s):
    s = (s or "").strip()[:10]
    return dt.date.fromisoformat(s) if s else None

def money(s):
    s = (s or "0").replace(",", "").strip()
    return round(float(s or 0), 2)

def business_days_between(start, end, holidays):
    # business days after `start` up to and including `end` (Mon-Fri, minus holidays)
    n, day = 0, start
    while day < end:
        day += dt.timedelta(days=1)
        if day.weekday() < 5 and day not in holidays:
            n += 1
    return n

def read_csv(path):
    with open(path, newline="", encoding="utf-8-sig") as f:
        return list(csv.DictReader(f))

def write_csv(path, rows, fields):
    with open(path, "w", newline="", encoding="utf-8") as f:
        w = csv.DictWriter(f, fieldnames=fields)
        w.writeheader()
        w.writerows(rows)

def fetch_invoices(url, db, user, key, out):
    # Odoo external RPC API (XML-RPC). Deprecated since Odoo 19 and scheduled for removal
    # in Odoo 22 / Online 21.1: on 19+ prefer the JSON-2 API. Use a read-only user's API key.
    import xmlrpc.client
    uid = xmlrpc.client.ServerProxy(f"{url}/xmlrpc/2/common").authenticate(db, user, key, {})
    if not uid:
        sys.exit("Authentication failed")
    m = xmlrpc.client.ServerProxy(f"{url}/xmlrpc/2/object")
    recs = m.execute_kw(db, uid, key, "account.move", "search_read",
        [[["move_type", "=", "out_invoice"], ["state", "=", "posted"]]],
        {"fields": ["name", "partner_id", "invoice_date", "invoice_date_due",
                    "amount_total", "amount_residual", "payment_state"]})
    rows = [{"number": r["name"], "customer": (r["partner_id"] or [0, ""])[1],
             "invoice_date": r["invoice_date"] or "", "due_date": r["invoice_date_due"] or "",
             "total": r["amount_total"], "residual": r["amount_residual"]} for r in recs]
    write_csv(out, rows, ["number", "customer", "invoice_date", "due_date", "total", "residual"])
    return out

def main():
    p = argparse.ArgumentParser(description=__doc__)
    p.add_argument("--invoices", required=True, help="CSV: number,customer,invoice_date,due_date,total,residual")
    p.add_argument("--withholds", help="CSV: invoice_number,withhold_number,date,amount")
    p.add_argument("--subscriptions", help="CSV: reference,customer,next_invoice_date,status")
    p.add_argument("--holidays", help="text file, one YYYY-MM-DD per line")
    p.add_argument("--today", default=dt.date.today().isoformat())
    p.add_argument("--withhold-days", type=int, default=5)
    p.add_argument("--exempt", help="text file, one customer name per line that never withholds")
    p.add_argument("--out", default="out")
    p.add_argument("--fetch-invoices", action="store_true", help="read invoices from Odoo first (env ODOO_URL, ODOO_DB, ODOO_USER, ODOO_KEY)")
    a = p.parse_args()
    today = d(a.today)
    os.makedirs(a.out, exist_ok=True)
    if a.fetch_invoices:
        fetch_invoices(os.environ["ODOO_URL"], os.environ["ODOO_DB"], os.environ["ODOO_USER"],
                       os.environ["ODOO_KEY"], a.invoices)
    holidays = set()
    if a.holidays:
        holidays = {d(x) for x in open(a.holidays) if x.strip() and not x.startswith("#")}
    exempt = set()
    if a.exempt:
        exempt = {x.strip().lower() for x in open(a.exempt, encoding="utf-8") if x.strip()}

    inv = read_csv(a.invoices)
    # 1) Receivables ageing by customer (days past due date)
    buckets = ["current", "1-30", "31-60", "61-90", "90+"]
    ageing = defaultdict(lambda: dict.fromkeys(buckets, 0.0))
    detail = []
    for r in inv:
        res = money(r["residual"])
        if res <= 0:
            continue
        due = d(r["due_date"]) or d(r["invoice_date"])
        late = (today - due).days
        b = "current" if late <= 0 else "1-30" if late <= 30 else "31-60" if late <= 60 else "61-90" if late <= 90 else "90+"
        ageing[r["customer"]][b] += res
        if late > 0:
            detail.append({"customer": r["customer"], "number": r["number"], "due_date": due.isoformat(),
                           "days_late": late, "residual": f"{res:.2f}"})
    rows = []
    for c, v in sorted(ageing.items(), key=lambda kv: -sum(kv[1].values())):
        row = {"customer": c, **{k: f"{x:.2f}" for k, x in v.items()}}
        row["total"] = f"{sum(v.values()):.2f}"
        rows.append(row)
    write_csv(f"{a.out}/ar_ageing.csv", rows, ["customer"] + buckets + ["total"])
    write_csv(f"{a.out}/ar_overdue_detail.csv", sorted(detail, key=lambda x: -x["days_late"]),
              ["customer", "number", "due_date", "days_late", "residual"])
    summary = [f"Open receivables: {sum(money(r['total']) for r in rows):.2f} across {len(rows)} customers",
               f"Overdue invoices: {len(detail)}"]

    # 2) Customer withholdings not received after N business days
    if a.withholds:
        got = defaultdict(float)
        for w in read_csv(a.withholds):
            got[w["invoice_number"].strip()] += money(w["amount"])
        missing = []
        for r in inv:
            if r["customer"].strip().lower() in exempt or r["number"].strip() in got:
                continue
            idate = d(r["invoice_date"])
            n = business_days_between(idate, today, holidays)
            if n > a.withhold_days:
                missing.append({"customer": r["customer"], "number": r["number"],
                                "invoice_date": idate.isoformat(), "business_days": n,
                                "total": f"{money(r['total']):.2f}"})
        write_csv(f"{a.out}/withholds_missing.csv", sorted(missing, key=lambda x: -x["business_days"]),
                  ["customer", "number", "invoice_date", "business_days", "total"])
        summary.append(f"Invoices with no withholding after {a.withhold_days} business days: {len(missing)}")

    # 3) Subscriptions whose next invoice date has passed
    if a.subscriptions:
        late_subs = []
        for s in read_csv(a.subscriptions):
            if s.get("status", "").strip().lower() not in ("in progress", "en progreso", "active", "activa"):
                continue
            nxt = d(s["next_invoice_date"])
            if nxt and nxt < today:
                late_subs.append({"reference": s["reference"], "customer": s["customer"],
                                  "next_invoice_date": nxt.isoformat(), "days_late": (today - nxt).days})
        write_csv(f"{a.out}/subscriptions_not_invoiced.csv", sorted(late_subs, key=lambda x: -x["days_late"]),
                  ["reference", "customer", "next_invoice_date", "days_late"])
        summary.append(f"Active subscriptions past their next invoice date: {len(late_subs)}")

    open(f"{a.out}/summary.txt", "w").write("\n".join(summary) + "\n")
    print("\n".join(summary))

if __name__ == "__main__":
    main()

Columnas de entrada y archivo de feriados (datos ficticios):

number,customer,invoice_date,due_date,total,residual
FAC 001-001-000000101,Cliente Ficticio Andes,2026-09-01,2026-10-01,1120.00,1120.00
FAC 001-001-000000103,Cliente Ficticio Andes,2026-10-20,2026-11-19,2240.00,2240.00
FAC 001-001-000000105,Cliente Ficticio Sierra,2026-07-15,2026-08-14,3360.00,3360.00
python3 odoo_finance_checks.py --invoices invoices.csv --withholds withholds.csv \
  --subscriptions subscriptions.csv --holidays holidays.txt --exempt exempt.txt \
  --today 2026-10-26 --out out
# Output with our fictitious files:
# Open receivables: 6809.60 across 3 customers
# Overdue invoices: 3
# Invoices with no withholding after 5 business days: 2
# Active subscriptions past their next invoice date: 1

5. Archivo de política de viáticos (plantilla de Agents Finance)

Adjúntalo al prompt de viáticos. Rellena tus propios límites; no publicamos importes legales ni tributarios.

policy: travel-expenses
version: <YYYY-MM-DD>
currency: USD
categories:
  lodging:   { max_per_night: <AMOUNT>, needs: [invoice in company name, dates within trip] }
  meals:     { max_per_day: <AMOUNT>, alcohol: not_reimbursable }
  transport: { allowed: [taxi, bus, flight economy, mileage], mileage_rate: <RATE> }
  sundries:  { max_per_trip: <AMOUNT>, needs: [description] }
rules:
  - invoice date must fall within the trip dates plus one day
  - every invoice must carry the company's tax ID
  - anything above a limit goes to the approver, never auto-rejected
approver: <ROLE>

6. Revisión mensual (plantilla de Agents Finance)

[ ] Compara la lista de vencidas de Claude con ar_overdue_detail.csv del script: mismas facturas, mismos totales.
[ ] Cada retención faltante tiene un borrador de correo o una nota que explica por qué no.
[ ] Suscripciones con la próxima factura vencida: facturar, pausar o cerrar; deja constancia de la decisión.
[ ] Presupuesto: la línea "sin código" está a cero o explicada.
[ ] Contrasta 5 cifras de los boletines del mes con los reportes de Odoo.
[ ] Revisa los permisos de herramientas en Claude y los del usuario de IA en Odoo.

Un ejemplo concreto (ficticio)

El 26 de octubre, una asistente de finanzas ejecuta el script sobre las exportaciones y obtiene dos facturas sin retención tras cinco días hábiles y una suscripción que debió facturarse el 1 de octubre. Pide a Claude, en el proyecto, que explique la lista y redacte los dos correos de retención. Claude cita los números de factura, avisa de que un cliente está en la lista de exentos y se ha omitido, y deja dos borradores en Gmail. Ella los contrasta con Odoo, corrige uno y envía los dos. La suscripción pasa al responsable de la cuenta. La IA no ha cambiado nada en Odoo.

Resultados que declara la fuente

Todo lo afirma la directora financiera de Trescloud y nada está medido: la pregunta del presupuesto se responde «al instante» en lugar de con un reporte que tardaba días; el MRR, en minutos en lugar de días; los boletines analíticos, en «una fracción» del tiempo con «la misma (o mayor) precisión»; la cobranza es proactiva, con alertas desde el primer día de atraso; la revisión de viáticos es más rápida y coherente, y los correos repetitivos ya no se escriben a mano.

Limitaciones y riesgos

  • Evidencia. Una empresa que describe su propio uso, con interés comercial y sin cifras.
  • Exhaustividad. Una respuesta en el chat puede dejarse registros. Usa un script o un reporte guardado de Odoo para las listas que deben estar completas, y que Claude las explique.
  • Permisos. El conector ve lo que ve el usuario de Odoo. Conectar como administrador lo expone todo, incluida la nómina si está en Odoo.
  • Aprobaciones automáticas. «Permitir siempre» es razonable solo para herramientas de lectura. El modo Investigación puede llamar a las herramientas del conector sin preguntar.
  • Correo. Los borradores son seguros; el envío automático no. Mantén la aprobación antes de enviar.
  • Normativa del país. El plazo de cinco días hábiles para la retención es ecuatoriano. En otros países cambian los documentos y los plazos.
  • APIs. Si haces tus propios scripts, prevé el fin de XML-RPC y JSON-RPC en Odoo 22.

Errores frecuentes

  • Pedir el presupuesto antes de que cada factura lleve código de departamento y de actividad.
  • Conectar Claude como administrador de Odoo «para probar» y no cambiarlo nunca.
  • Tomar las recomendaciones del boletín como decisiones.
  • Reclamar retenciones a clientes que no son agentes de retención: mantén una lista de exentos.
  • Olvidar los feriados al contar días hábiles.

Conclusiones

El relato de Trescloud aporta poca prueba y mucho detalle útil. El patrón que describe, un usuario de Odoo con permisos limitados, un conector que los hereda, herramientas de lectura permitidas y todo lo demás con aprobación, más un equipo que conserva las decisiones, es el buen punto de partida para casi cualquier área financiera en Odoo. Añade un script para las listas que deben estar completas y mide tu propio tiempo antes y después, porque esta fuente no lo hace.

Fuentes

Hemos redactado esta ficha con nuestras palabras a partir de las fuentes anteriores y comprobamos que los enlaces funcionaban el 27 de octubre de 2026. ¿Algún dato es incorrecto? Avísanos.

Comparte esta entrada

Esta entrada forma parte de la guía: Agentes de IA para contabilidad · MCP para contabilidad y ERPs

Newsletter

El boletín semanal de Agents Finance

Una vez por semana, los casos de uso, prompts y tutoriales nuevos de IA en finanzas y ERPs. Sin spam; te das de baja con un clic.

Responsable: Agents Finance. Finalidad: enviarte el boletín semanal. Base: tu consentimiento, que puedes retirar en cualquier momento con el enlace de baja de cada email. Encargado: Mailrelay (WEBLEGAL SL). Derechos: acceso, rectificación, supresión y demás, escribiendo a info@agentsfinance.io.

Entradas relacionadas

Seguir explorando