Este sistema te permite controlar la rentabilidad de tus pedidos de WooCommerce, calculando automáticamente costes y beneficios.
- Recepción automática de pedidos via webhook de WooCommerce
- Gestión de costes de productos con edición inline
- Gestión de métodos de envío (Nacex, Correos, otros)
- Coste de empaquetado configurable por pedido
- Dashboard de rentabilidad con estadísticas
- Alertas cuando hay productos o envíos sin coste asignado
- Filtros por fecha para análisis temporal
- Tablas con TanStack Table y shadcn/ui
Copia los archivos a tu proyecto existente:
# Schemas de base de datos
cp src/db/schema/wc-orders.ts tu-proyecto/src/db/schema/
cp src/db/schema/wc-order-items.ts tu-proyecto/src/db/schema/
cp src/db/schema/products.ts tu-proyecto/src/db/schema/
cp src/db/schema/shipping-methods.ts tu-proyecto/src/db/schema/
cp src/db/schema/profitability-settings.ts tu-proyecto/src/db/schema/
# Módulo de rentabilidad
cp -r src/modules/profitability tu-proyecto/src/modules/
# Página del dashboard
cp -r src/app/\(admin\)/profitability tu-proyecto/src/app/\(admin\)/
# Webhook
cp -r src/app/api/webhooks/woocommerce/order-created tu-proyecto/src/app/api/webhooks/woocommerce/
# Utilidades (actualiza tu archivo existente)
# Añade las funciones formatCurrency, formatDate, etc. a tu lib/utils.ts
# Middleware (añade la nueva ruta pública)
# Añade "/api/webhooks/woocommerce/order-created" a publicPatternsAñade los exports de los nuevos schemas:
// Profitability / Rentabilidad
export { default as wcOrders, wcOrdersRelations } from "./wc-orders";
export { default as wcOrderItems, wcOrderItemsRelations } from "./wc-order-items";
export { default as products, productsRelations } from "./products";
export { default as shippingMethods, shippingMethodsRelations } from "./shipping-methods";
export { default as profitabilitySettings } from "./profitability-settings";Opción A - Usar el archivo SQL directamente en Supabase:
# Ve a tu dashboard de Supabase > SQL Editor
# Ejecuta el contenido de drizzle/0002_profitability_tables.sqlOpción B - Usar Drizzle migrations:
pnpm run db:generate
pnpm run db:migratepnpm add @tanstack/react-table date-fns react-day-picker-
Ve a WooCommerce > Ajustes > Avanzado > Webhooks
-
Crea un nuevo webhook:
- Nombre:
Nuevo pedido - Rentabilidad - Estado: Activo
- Tema:
Pedido creado(Order created) - URL de entrega:
https://tu-dominio.com/api/webhooks/woocommerce/order-created - Secreto: El mismo valor que tienes en
WOOCOMMERCE_WEBHOOK_SECRET - Versión API:
WP REST API Integration v3
- Nombre:
-
Guarda el webhook
Accede a /admin/profitability para ver:
- Estadísticas generales: Ventas, costes, beneficio y margen
- Tabla de pedidos: Con alerta si faltan costes
- Tabla de productos: Con edición inline de costes
- Configuración: Métodos de envío y coste de empaquetado
- Ve a la pestaña "Productos"
- Los productos sin coste muestran un icono
⚠️ - Haz clic en el icono de lápiz para editar el coste
- El coste se aplica automáticamente a todos los pedidos existentes
- Ve a la pestaña "Configuración"
- En la sección "Métodos de Envío", edita el coste y proveedor de cada método
- Los métodos se crean automáticamente cuando llega un pedido con un método nuevo
- Ve a la pestaña "Configuración"
- En la tarjeta "Coste de Empaquetado", edita el valor (por defecto 0.90€)
- Este coste se suma automáticamente a cada pedido
Para cada pedido:
Beneficio = Total Venta - (Coste Productos + Coste Envío + Coste Empaquetado)
Margen = (Beneficio / Total Venta) × 100
El sistema muestra alertas cuando:
- Un pedido tiene productos sin coste asignado
- Un pedido tiene un método de envío sin coste asignado
- Hay productos en el catálogo sin coste
- Hay métodos de envío activos sin coste
src/
├── app/
│ ├── (admin)/
│ │ └── profitability/
│ │ └── page.tsx # Dashboard principal
│ └── api/
│ └── webhooks/
│ └── woocommerce/
│ └── order-created/
│ └── route.ts # Webhook para recibir pedidos
├── db/
│ └── schema/
│ ├── wc-orders.ts # Tabla de pedidos
│ ├── wc-order-items.ts # Tabla de items
│ ├── products.ts # Tabla de productos con costes
│ ├── shipping-methods.ts # Tabla de métodos de envío
│ └── profitability-settings.ts # Configuración
├── lib/
│ └── utils.ts # Funciones de formateo
└── modules/
└── profitability/
├── actions/
│ └── index.ts # Server Actions
├── services/
│ ├── dashboard-service.ts # Lógica del dashboard
│ ├── products-service.ts # Gestión de productos
│ └── shipping-service.ts # Gestión de envíos
├── types/
│ └── index.ts # Tipos TypeScript
└── ui/
└── components/
├── orders-table.tsx
├── orders-columns.tsx
├── products-table.tsx
├── products-columns.tsx
├── shipping-methods-card.tsx
├── packaging-cost-card.tsx
├── stats-cards.tsx
└── date-range-picker.tsx
Edita src/app/api/webhooks/woocommerce/order-created/route.ts en la función findOrCreateShippingMethod:
if (lowerMethodId.includes("seur") || lowerTitle.includes("seur")) {
provider = "seur";
}Edita src/modules/profitability/types/index.ts:
export const DEFAULT_PACKAGING_COST = "1.20"; // Nuevo valor- Los costes de productos se actualizan retroactivamente en los pedidos existentes
- El webhook ignora pedidos duplicados (por
wc_order_id) - Los pedidos actualizados solo modifican el estado, no recrean los items