SMART CONNECTION
Banco · Canal B2G
Documento 42 · Producto Técnico

Licitaciones & Compra Ágil

Canal B2G del Marketplace · réplica de Mercado Público en estilo workzone SMC · filtros, fichas, pipeline comercial, RADAR de proveedores, base de datos, APIs y paridad MP↔Marketplace.

Versión
1.0
Fecha
2026-06-18
Autor
Architect + Backend + Hoku + Cerebro
Status
🟢 Live en PROD (Fase 1) · Fase 2 datos en curso
Tabla de contenidos

Índice

  1. 01 · Premisa y alcance
  2. 02 · Licitaciones (ex Oportunidades) · fusión
  3. 03 · Compra Ágil · sección nueva
  4. 04 · Modelo de datos (Supabase)
  5. 05 · APIs (lectura + sync)
  6. 06 · Integraciones escalables (patrón 2-niveles)
  7. 07 · Paridad MP↔Marketplace (2 scripts)
  8. 08 · Fase 2 · datos exactos

01 · Premisa y alcance

El canal B2G del Marketplace replica las dos vías de compra del Estado en Mercado Público — Licitaciones y Compra Ágil — con el estilo del workzone SMC y, encima, un pipeline comercial propio (detección → seguimiento → decisión → oferta) que Mercado Público no da.

Se renombró "Oportunidades" → "Licitaciones" en toda la UI. Se sumó la sección Compra Ágil. Ambas comparten el mismo patrón: lista expandible (clic = despliega ficha + DECISIÓN + score) y filtros tipo Mercado Público.

VíaQué esSección
LicitacionesProcesos > 100 UTM (LE/LP/LR…)/dashboard/mercado-publico/oportunidades
Compra ÁgilCompras < 100 UTM · publicar+cotizar en 1 paso/dashboard/mercado-publico/compra-agil

02 · Licitaciones (ex Oportunidades) · fusión

Fusión: se conservó 100% la lista expandible + DECISIÓN + SCORE existentes, y se sumaron los filtros de Mercado Público y la data enriquecida.

Filtros (sidebar izquierdo)

Rubro → Subcategoría → Producto (dependientes) · Región · Tipo de licitación (nombre completo: LP → "Licitación Pública ≥ 1.000 UTM e inferior a 2.000 UTM") · Estado · Presupuesto (Publicado / No publicado) · Fecha de cierre (Este mes / Próximo / 3m+) · Garantía · Comprador · Proveedor · Score mínimo · Mercado · "Solo productos" (excluye servicios).

Ficha enriquecida (al desplegar)

Monto en CLP + UTM · Tipo nombre completo · Región / mercado · Fecha de publicación · Compras efectuadas y Reclamos por pago no oportuno del comprador (señales de riesgo de pago) · más el SCORE de 6 preguntas y el panel DECISIÓN (A ofertar / Ofertada [manual, gate con correo+fecha] / Descartar · quién oferta · nota · análisis profundo · flujo automático).

03 · Compra Ágil · sección nueva

Réplica del buscador de Compra Ágil de Mercado Público, en estilo workzone SMC y con el mismo patrón fusionado.

Ejemplo real cargado: 2694-122-COT26 · Servicio de alarma · I. Municipalidad de Cartagena · $3.000.000.

04 · Modelo de datos (Supabase · yjjtbwfgtoepsevvkzta)

TablaRol
licitacionesLicitaciones B2G (+ columnas nuevas: region, fecha_publicacion)
b2g_compra_agilNueva · Compras Ágiles (< 100 UTM)
b2g_proveedor_precioAbastecimiento: proveedores+precio/unidad (RADAR descubre, humano valida)
b2g_utm_diariaNueva · valor UTM del día (CLP↔UTM)
b2g_seguimiento (+canal)Pipeline comercial · canal = licitacion | compra_agil
b2g_md_org (+métricas)Comprador · compras_efectuadas_12m, reclamos_pago_12m

Todas con RLS activo · acceso server-side (service_role). Aditivas (IF NOT EXISTS).

05 · APIs

Lectura

EndpointQué hace
POST /api/mercado-publico/optimizar-ofertaRecomendación IA por unidad (genérico, no solo $/kg) · degradación elegante si la IA rate-limita
GET/POST/PATCH /api/mercado-publico/proveedoresAbastecimiento: listar / alta (upsert) / validar (HITL)
POST /api/mercado-publico/radar-proveedoresRADAR auto-discovery (SoloTodo) · candidatos a validar
GET /api/mercado-publico/compra-agilLista Compra Ágil (DB + seed fallback · filtros)
GET /api/meli/me/items-histHistorial de ofertas MeLi (serie temporal)

Sync / Cron (Bearer CRON_SECRET)

EndpointQué hace
GET /api/cron/sync-licitacionesParidad incremental Licitaciones (OCDS)
GET /api/cron/sync-compra-agilParidad Compra Ágil (API 403 → bulk Datos Abiertos)
GET /api/cron/sync-utmValor UTM del día (mindicador.cl) — Fase 2
GET /api/cron/cleanup-histRetención 90 días del historial de ofertas

06 · Integraciones escalables (patrón 2-niveles)

Con muchas integraciones, el patrón escalable NO es "un POST que lleva GET/PATCH" (rompe REST: cache, semántica, debugging). Lo correcto, en 2 niveles:

  1. Nivel recurso (REST): GET/POST/PATCH por ruta de recurso (ej. /proveedores). Cacheable, estándar, debuggeable.
  2. Nivel registro/adapter: registry de conectores (lib/adapters/suppliers + api-inventory + smc-registry.json) → 1 interfaz, fuentes pluggables (firecrawl/meli/solotodo). Cliente fetch unificado con retry/timeout/fallback/log (patrón runAIChain generalizado).
  3. Gateway / Playground (acá sí el "2-niveles"): un POST /api/gateway {op:'get'|'patch', recurso, …} que despacha a los recursos REST. Sirve para el Playground (catálogo vivo) y operaciones batch, sin romper REST en producción.

Beneficio: menos superficie, más reuso, crece sin acoplarse. Las secciones Arquitectura / Integración / API Playground reflejan este modelo.

07 · Paridad MP↔Marketplace (2 scripts)

Objetivo: que Licitaciones y Compra Ágil entreguen la misma info que Mercado Público.

ScriptOpción A (incremental)Opción B (paridad total)
sync-licitacionesOCDS API por fecha (mp-client + persistLicitacion) · funciona, rate-limit en volumenBulk Datos Abiertos ChileCompra (archivo)
sync-compra-agilAPI restringida (HTTP 403) · endpoint configurableBulk Datos Abiertos (única vía real)

El muro: la API OCDS/Compra Ágil rate-limita y devuelve 403 en volumen. Para paridad total la vía robusta es la descarga masiva de Datos Abiertos, no llamada por llamada. Los 2 scripts incrementales quedan operativos para el día a día; el bulk es Fase 2.

08 · Fase 2 · datos exactos

DatoFuenteDificultad
Valor UTM del díamindicador.cl/api/utm🟢 fácil
Región + fecha publicación licitaciónOCDS Mercado Público🟡 media
Publicado / No publicado (conteos)derivado de monto🟢 fácil
Compra Ágil (~8.332)Bulk Datos Abiertos🟡 media
Compras efectuadas + reclamos pagoficha del comprador (scrape)🔴 difícil

Mientras tanto, esos campos muestran "s/d" — no se inventan números.