NOVATECS AGENTS · M4
Presentación técnica · 2026-04-17
← Volver a Agentes

Módulo 4 — Órdenes de Compra

Siete agentes IA coordinando el ciclo de vida completo de las órdenes de compra, desde la generación hasta el cierre, con comunicación bidireccional vía WhatsApp, OCR Vision sobre evidencias subidas por el proveedor, y escalamiento automático a humanos cuando es necesario.

7 agentes LangGraph Multi-tenant WhatsApp + Email Vision Haiku OCR Cron diario

Arquitectura — 7 agentes IA

Supervisor (Sonnet) orquesta. Cada sub-agente tiene una responsabilidad única, con tools específicos y prompts prescriptivos que prohíben interpretar contenido del proveedor como instrucciones.

SUPERVISOR M4
Orquestador principal
Recibe 5 tipos de triggers (crear_oc, mensaje_proveedor, imagen_proveedor, vigilante_diario, crear_oc_sin_enviar). Decide qué sub-agente invocar y nunca se comunica directamente con el exterior.
SonnetLangGraph supervisorrecursion_limit=25
1 · GENERADOR
Crea la OC + PDF
Renderiza plantilla Jinja2 (StrictUndefined) con data del proveedor + items. Genera PDF con WeasyPrint y lo sube a Supabase Storage. Inserta en DB con estado=borrador.
Sonnetweasyprintjinja2
2 · VALIDADOR
Pre-envío
Valida proveedor aprobado, contrato vigente (si aplica), items con cantidad + precio positivos, monto > 0, moneda MXN/USD/EUR, RFC formato MX, fecha entrega futura.
SonnetHeurísticas+regex RFC
3 · COMUNICADOR
WhatsApp + Email
Envía OC al proveedor (PDF adjunto), nudge de acuse, y responde mensajes redactados por Seguimiento. Respeta oc_simulation_mode para testing sin consumir APIs.
HaikuWhatsApp CloudMS Graph
4 · SEGUIMIENTO
Clasifica + cronograma
Clasifica respuestas del proveedor (acuse, confirmación, cambio, entrega) con heurísticas. Actualiza estado + propone respuesta sugerida. Escala a humano si no clasifica.
SonnetFSM transitions
5 · ESCALADOR
Notifica al comprador
Crea notificaciones en dashboard cuando Seguimiento o Vigilante determinan que el caso requiere humano (cambio fecha, monto excede límite, disputa, etc).
Haikunotificaciones
6 · LECTOR OCR
Vision para evidencias
Cuando proveedor sube foto (OC firmada, remisión, factura) por WA, el Lector extrae metadata estructurada y actualiza el estado de la OC automáticamente.
Haiku VisionJSON extract
7 · VIGILANTE
Cron diario
Barrido diario (07:15 AM vía systemd timer) detectando OCs sin acuse, retrasos en entrega y modificadas estancadas. Cada alerta dispara Comunicador o Escalador.
Haikusystemd timer

Flujo happy path — OC completa

De creación a cierre, con los 7 agentes coordinados.

1
Comprador crea OC en dashboard
Form web con proveedor, items, monto. O importa CSV para bulk.
API: POST /api/ordenes
2
Generador renderiza PDF
Jinja2 + WeasyPrint → PDF en Supabase Storage. OC queda en estado borrador.
oc_generador
3
Validador checkea todo
Proveedor aprobado, contrato vigente, items válidos, fecha futura, RFC formato. Si falla, retorna errores y bloquea.
oc_validador
4
Comunicador envía al proveedor
WhatsApp con PDF signed URL + email. OC → estado enviada. Evento envio_oc en timeline.
oc_comunicador
5
Proveedor responde por WhatsApp
"Recibido" / "acuso" / foto de OC firmada / cambio de fecha / remisión de entrega.
webhook whatsapp
6
Seguimiento clasifica + Lector OCR
Texto → heurísticas. Imagen → Vision JSON extract. Cada uno actualiza estado y registra evento en el cronograma.
oc_seguimiento + oc_lector
7
Si requiere humano → Escalador
Crea notificación dashboard + meta con motivo. Visible en tab "Escaladas".
oc_escalador
8
Vigilante barre todas las OCs (diario)
Detecta atrasos y dispara nudge o escalamiento. Sin acuse > 2 días, retraso entrega > 3 días, modificadas > 5 días.
oc_vigilante (cron 07:15)
9
Cierre por comprador
Cuando surtida_completa, el comprador cierra manualmente. Evento "cierre" en el timeline.
API: POST /ordenes/<id>/cerrar

Máquina de estados

9 estados posibles. El validador bloquea transiciones inválidas.

borrador
enviada
acuse_recibido
confirmada
modificada
surtida_parcial
surtida_completa
cerrada
cancelada
borrador ─→ enviada ─→ acuse_recibido ─→ confirmada ─→ surtida_parcial ─→ surtida_completa ─→ cerrada
        │           │            │               │
        └───→ cancelada          └──→ modificada (escala comprador) ──→ vuelve a confirmada o cancelada

Modelo de datos

3 tablas per-tenant nuevas. Auditoría completa en oc_eventos.

TablaPropósitoÍndices clave
ordenes_compra Una fila por OC con estado FSM, items jsonb, montos, fechas. proveedor_id, estado, numero_oc, fecha_entrega parcial
oc_eventos Timeline de todos los eventos (envío, acuse, cambio, escalamiento, entrega, cierre). Actor + descripcion + meta jsonb. (oc_id, created_at DESC), tipo
oc_plantillas Plantillas HTML que usa el Generador. Permite OCs con branding del comprador. activa (partial)

Parámetros configurables (tabla parametros)

oc_dias_limite_acuse2 días — antes de nudge
oc_dias_limite_entrega_tolerancia3 días — gracia post-entrega
oc_simulation_modetrue en demo, false en prod
oc_max_monto_sin_escalar500,000 MXN — encima, escala siempre
oc_mensaje_envio_waTemplate WhatsApp envío OC

Integración con M1 + M3

M4 cierra el loop del lifecycle procurement: proveedor dado de alta en M1, con contrato firmado en M3, ahora recibe OCs reales.

← M1 (Alta de Proveedores)

Solo proveedores con estado='aprobado' pueden recibir OCs. Validador bloquea cualquier otro.

← M3 (Contratos)

Si la OC referencia contrato_id, Validador exige estado='firmado_completo' + fecha vigente.

→ WhatsApp bidireccional

Reusa webhook.py de M1 para inbound. Comunicador envía + recibe mensajes del proveedor.

→ Email (MS Graph)

Reusa el sender existente de M1 + M3. OCs salen con PDF adjunto.

→ Supabase Storage

PDFs en documentos/{tenant}/ordenes/{numero_oc}.pdf. Signed URLs 30 min en dashboard.

→ Futuro M5 (Auditoría facturación)

OCs alimentan el cruce OC vs CFDI cuando M5 se construya.

API — Blueprint /api/ordenes/*

21 endpoints. Todos con @auth. Mutations registran Historial.

CRUD:
  GET    /api/ordenes                       lista con filtros
  POST   /api/ordenes                       crea borrador (invoca generador)
  GET    /api/ordenes/<id>                 detalle + eventos timeline
  PUT    /api/ordenes/<id>                 editar (solo borrador)
  DELETE /api/ordenes/<id>                 cancelar

Acciones:
  POST   /api/ordenes/<id>/validar         corre validador
  POST   /api/ordenes/<id>/enviar          validar+enviar (comunicador)
  POST   /api/ordenes/<id>/cerrar          marcar cerrada
  POST   /api/ordenes/<id>/modificar       aplicar cambio items/fecha
  GET    /api/ordenes/<id>/pdf             signed URL 30 min
  GET    /api/ordenes/<id>/eventos         timeline completo

Plantillas:
  GET    /api/ordenes/plantillas            lista
  POST   /api/ordenes/plantillas            crear (admin)
  PUT    /api/ordenes/plantillas/<id>      actualizar (admin)
  DELETE /api/ordenes/plantillas/<id>      archivar (admin)

Admin:
  POST   /api/ordenes/importar              CSV upload
  GET    /api/ordenes/kpis                  KPIs Panel
  GET    /api/ordenes/escaladas             casos con escalamiento

Health:
  GET    /api/ordenes/health                ping + feature flag

Seguridad

Hereda los patterns establecidos en M1/M2/M3.

Multi-tenant strict

Todas las queries usan db() wrapper que resuelve schema por subdomain. Hook pre-commit bloquea supabase.table('ordenes_compra') directo.

Prompt injection A6

Mensajes inbound del proveedor pasan por sanitize_mensaje_inbound(): strip XML tags, escape <>, drop non-printable, truncate 4KB.

FSM transitions

Estados validados por DB check constraint + validador agent. No se puede enviar si no está en borrador; no modificar después de cerrada.

Audit trail completo

Cada acción registrada en oc_eventos + historial_acciones. Trazabilidad end-to-end de cada OC.

Escalación por monto

Montos > oc_max_monto_sin_escalar (500k MXN default) requieren aprobación humana antes del envío.

Simulation mode

Comunicador respeta oc_simulation_mode=true: loggea pero no dispara WhatsApp/email reales. Seguridad en demo.

Números del build

7
Agentes IA
3
Tablas nuevas
21
Endpoints API
12
Tabs dashboard
22
Tests nuevos
9
Estados FSM