💰 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íagetVariantCost(); si no existe, estima un 40% del precio de venta y marcaestimated=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,profitymarginPct.
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) → eventofinance_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 borrardata/finanzas.dby 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). sqlite3instalado y tablaorder_costs(verensureDB()).- 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.tscon el eventofinance_margin_lowregistrado. - Plist launchd con
StartInterval3600.