← Volver al catálogo

💰 Cost Tracker — coste real por pedido

Archivo: agentes/finanzas/cost-tracker.ts · Plist: com.rifai.cost-tracker · Horario: cada hora (StartInterval 3600s)

Qué hace

Calcula el coste real y el margen de cada pedido de Shopify de los últimos 30 días. Por cada pedido suma coste de producto, envío GLS y comisión de Shopify, y deriva el profit y el % de margen. Guarda todo en una base SQLite local (data/finanzas.db) para tener histórico y alimentar al P&L diario. Si encuentra pedidos con margen por debajo del 10% manda una alerta a Fernando (finanzas) vía el router de notificaciones.

Cómo funciona

1. Parsea .env con el snippet estándar de la flota y crea data/ si no existe.

2. ensureDB() crea la tabla order_costs en SQLite usando el binario sqlite3 del sistema (vía execSync).

3. getRecentOrders(30) pide a Shopify los pedidos status=any de los últimos 30 días (limit 250) con sus line_items.

4. Por cada pedido, trackOrder():

  • Coste producto: para cada línea intenta leer el coste real (variant → inventory_item.cost) vía getVariantCost(); si no existe, estima un 40% del precio de venta y marca estimated=true.
  • Coste envío: usa el envío cobrado al cliente si lo hay; si el envío fue gratis, imputa 5,50 € de GLS por defecto.
  • Comisión pago: revenue × 2.9% + 0.25 €.
  • Calcula costTotal, profit y marginPct.

5. upsert() hace INSERT OR REPLACE en la tabla (clave: order_id), guardando también financial/fulfillment status.

6. Acumula los pedidos con margen <10% y, si hay alguno, los envía (top 5) con notify({ event: 'finance_margin_low', level: 'warning' }).

Datos/APIs

  • Shopify Admin API (2024-10): orders.json, variants/{id}.json, inventory_items/{id}.json.
  • .env: SHOPIFY_STORE, SHOPIFY_ACCESS_TOKEN.
  • SQLite local vía CLI sqlite3 (no librería npm): data/finanzas.db.
  • notify-router (tools/notify-router.ts) → evento finance_margin_low → Fernando (TELEGRAM_FINANCE_TOKEN, TELEGRAM_CHAT_ID). Constantes de coste hardcodeadas (GLS 5,50 €, fee 2.9%+0.25 €, margen estimado 40%).

Cómo probarlo

cd /Users/user/rifai-agents && npx tsx agentes/finanzas/cost-tracker.ts

No tiene ventana horaria ni flag FORCE: siempre procesa y escribe en la BD. Esperado: log con Pedidos últimos 30d: N, ✅ Procesados: N, ⚠️ Margen <10%: M. Si M>0, manda alerta a Fernando. Verifica la BD con sqlite3 data/finanzas.db "SELECT COUNT(*) FROM order_costs".

Si se rompe / recuperar

  • Recargar el plist:
  launchctl unload ~/Library/LaunchAgents/com.rifai.cost-tracker.plist
  launchctl load   ~/Library/LaunchAgents/com.rifai.cost-tracker.plist
  • Logs: /Users/user/rifai-agents/logs/cost-tracker.log
  • Si falla sqlite3, comprobar que el binario existe (which sqlite3). Si la BD se corrompe, se puede borrar data/finanzas.db y el agente la recrea en el siguiente ciclo (perdiendo histórico).

Cómo replicarlo

  • Snippet de carga de .env + credenciales Shopify (SHOPIFY_STORE, SHOPIFY_ACCESS_TOKEN).
  • sqlite3 instalado y tabla order_costs (ver ensureDB()).
  • Lógica de costes: producto (inventory_item.cost o estimación 40%), envío (cobrado o 5,50 € GLS), comisión (2.9%+0.25 €).
  • Acceso a tools/notify-router.ts con el evento finance_margin_low registrado.
  • Plist launchd con StartInterval 3600.