Endpoints de datos de Plant/Vívet (mongoAggregate GCP), contrato de API y planillas fuente
Backend de datos de los dashboards Plant (proyecto GCP vivet-web, NO está en Cloudflare):
- PROD: https://us-central1-vivet-web.cloudfunctions.net/mongoAggregate
- DEV (atribución ML): https://mongoaggregate-ftl2a4nokq-rj.a.run.app/mongoAggregate
- Contrato: POST JSON
{"index": "orders|brands|products", "aggregate": [pipeline]}→ filas. - ⚠️ Ambos son PÚBLICOS sin auth (agujero de seguridad; el plan es cerrarlos con header
x-plant-key cuando todos los consumidores pasen por el Worker — ver monitores-en-vivo-proyecto).
Planillas fuente:
- Objetivos mensuales del monitor: "Metricas VENTAS 2026", pestaña SEGUIMIENTO, fila
OBJETIVO (b2c=PLANT, b2b=PLANT BUSINESS, ml=MERCADO LIBRE, total=TOTALES PLANT).
Hardcodeados en el máster; build_panel.py no los toca.
- Bloque DATA (ranking YTD, márgenes): "seguimiento marcas empresa",
fileId 1xSmDG9E2ezPnFYUEQczX5jOfEJdHgjklGXPV0RjkCmg → seguimiento.xlsx.
- ML por publicación: "Seguimiento ventas ML 2026", fileId
1VDNFAg6_MriVYXxvtM4JSkXD3s6uGpdWBu2cuHl9dnE. Laddubar en ML = "GOLDEN MONKEY".
Reglas de datos críticas (corrección 03-ago-2026): canceladas = shipmentState in
(canceled,cancelled); B2C excluye pending_payment (en B2B es normal por cta cte);
NET = q*price*(1-disc), sin IVA. Deploy encriptado legacy: clave 3339 (débil, se retira
con la migración a Access).
VENTAS DE ML DIRECTO DE LA API (24/08/2026) — reemplaza el espejo DEV
El espejo de Juan (mongoaggregate DEV) se frena solo (24/08 se cortó 14:31). Fuente nueva:
`GET /orders/search?seller=<user_id>&order.date_created.from=YYYY-MM-DDT00:00:00.000-03:00
&order.date_created.to=...&sort=date_asc&limit=50&offset=N` (50 por página, ~0,4s).
Cada order_item trae item.seller_custom_field = producto madre nuestro (por el mapeo
que escribimos) → consolidación a madre sin depender de mapas externos.
Almacén en KV (namespace ML):
mlv:d:<YYYY-MM-DD>= {net, ords, u, h:[24 por hora ART], it:{MLA:{q,net,t}}, sk:{sku:{q,net}}}
(it y sk recortados a top 300 por día)
mlv:idx= {dias:{fecha:{net,ords,u}}, act:<epoch ms>}
Cron (en build_ml.py → refrescarVentasML): recalcula HOY entero cada 15 min (idempotente,
sin dedup frágil) y también AYER si son <03:00 ART. El seller sale de leer(env).user_id.
Backfill histórico: scratchpad/backfill_ml.py <desde YYYY-MM-DD> (63.576 órdenes desde
2026-07-01; ~1.270 páginas). OJO: la API de ML tira 429 si corren dos procesos a la vez.
Deploy de plant-ml: los secretos van como {"type":"inherit"} o se pierden.
⚠️ IVA: LA CONVENCIÓN DE PLANT ES SIN IVA A NIVEL ÍTEM (medido 24/08/2026)
Descubierto al comparar la API de ML contra el espejo (daba +23%). Verificación exacta,
orden por orden:
- Espejo ML: item price 2892,56 · data.total 3500 → ratio 1,2100 = IVA 21%
- PROD B2C (www.plant.com.ar): items 85.446 · total 103.390 → ratio 1,2100
- PROD B2B (business): items 148.566 · total 177.449 → ratio 1,1944 (mezcla 21% y 10,5%)
O sea: net = q*price*(1-disc) en Mongo (PROD y espejo) está SIN IVA; data.total
está CON IVA. La API de ML devuelve unit_price CON IVA (es lo que pagó el comprador).
Para que ML sea comparable hay que dividir por (1+iva).
Tasa por producto: products.data.iva → 7.993 al 0.21, 82 al 0.105, 23 en 0, 347 sin dato.
Guardado en KV ivamap SOLO los que difieren de 0,21 (82 productos, 2 KB); el resto usa 0,21
por defecto. Se resuelve por seller_custom_field (producto madre) de cada order_item.
El espejo además estaba INCOMPLETO: 15/07 tenía 617 órdenes pagas vs 750 de la API
(-17,7%), aunque en plata la diferencia era solo 2,4% (le faltaban órdenes chicas).
✅ VERIFICACIÓN DE LA FUENTE NUEVA DE ML (24/08/2026) — APROBADA
Backfill con IVA corregido: julio $378,1M · agosto (1-23) $302,1M (55 días en KV).
Comparación día a día contra el espejo, misma convención (sin IVA):
15/07 +1,9% · 12/08 +0,7% · 19/08 +1,9% · 22/08 +0,2%.
La fuente nueva da SIEMPRE un poco más porque está completa (al espejo le faltaban órdenes).
Sin escalón: se puede enchufar sin romper el histórico. (Algunas consultas mensuales al
espejo devuelven 0 por timeout — otro motivo para dejar de depender de él.)
Endpoint para los monitores: GET https://ml.plantinterno.com/api/mlv?desde=&hasta=&items=1
→ {dias:{f:{net,ords,u,h[]}}, net, ords, u, items:{MLA:{q,net,t}}, sk:{sku:{q,net}}, act}.
Sirve desde KV (rápido) y tiene CORS abierto para que lo consuma el Pulso.
Datos/plant-datos-endpoints