dashboard
This commit is contained in:
90
db/migrations/20260127100000_woo_orders_cache.sql
Normal file
90
db/migrations/20260127100000_woo_orders_cache.sql
Normal file
@@ -0,0 +1,90 @@
|
||||
-- migrate:up
|
||||
|
||||
-- Tabla de cache de pedidos de WooCommerce
|
||||
-- Almacena pedidos localmente para estadísticas y listado rápido
|
||||
CREATE TABLE woo_orders_cache (
|
||||
id SERIAL PRIMARY KEY,
|
||||
tenant_id UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
|
||||
woo_order_id BIGINT NOT NULL,
|
||||
status VARCHAR(50),
|
||||
total NUMERIC(12,2),
|
||||
currency VARCHAR(10) DEFAULT 'ARS',
|
||||
date_created TIMESTAMPTZ NOT NULL,
|
||||
date_paid TIMESTAMPTZ,
|
||||
|
||||
-- Filtros del dashboard
|
||||
source VARCHAR(20) DEFAULT 'web', -- 'whatsapp' | 'web'
|
||||
is_delivery BOOLEAN DEFAULT false,
|
||||
is_cash BOOLEAN DEFAULT false,
|
||||
|
||||
-- Cliente
|
||||
customer_name VARCHAR(255),
|
||||
customer_phone VARCHAR(50),
|
||||
customer_email VARCHAR(255),
|
||||
|
||||
-- Dirección de envío (para futuro mapa de calor)
|
||||
shipping_address_1 VARCHAR(255),
|
||||
shipping_address_2 VARCHAR(255),
|
||||
shipping_city VARCHAR(100),
|
||||
shipping_state VARCHAR(100),
|
||||
shipping_postcode VARCHAR(20),
|
||||
shipping_country VARCHAR(10) DEFAULT 'AR',
|
||||
|
||||
-- Dirección de facturación
|
||||
billing_address_1 VARCHAR(255),
|
||||
billing_city VARCHAR(100),
|
||||
billing_state VARCHAR(100),
|
||||
billing_postcode VARCHAR(20),
|
||||
|
||||
-- Raw para debugging
|
||||
raw JSONB,
|
||||
|
||||
created_at TIMESTAMPTZ DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ DEFAULT NOW(),
|
||||
|
||||
UNIQUE(tenant_id, woo_order_id)
|
||||
);
|
||||
|
||||
CREATE INDEX idx_woo_orders_tenant_date ON woo_orders_cache(tenant_id, date_created DESC);
|
||||
CREATE INDEX idx_woo_orders_source ON woo_orders_cache(tenant_id, source);
|
||||
CREATE INDEX idx_woo_orders_city ON woo_orders_cache(tenant_id, shipping_city);
|
||||
|
||||
-- Tabla de detalle de items (productos por pedido)
|
||||
-- Permite calcular stats por producto (kg vendidos, unidades, facturación)
|
||||
CREATE TABLE woo_order_items (
|
||||
id SERIAL PRIMARY KEY,
|
||||
tenant_id UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
|
||||
woo_order_id BIGINT NOT NULL,
|
||||
woo_product_id BIGINT,
|
||||
|
||||
-- Datos del producto
|
||||
product_name VARCHAR(255) NOT NULL,
|
||||
sku VARCHAR(100),
|
||||
|
||||
-- Cantidades y precios
|
||||
quantity NUMERIC(10,3) NOT NULL, -- Soporta decimales para kg
|
||||
unit_price NUMERIC(12,2), -- Precio unitario
|
||||
line_total NUMERIC(12,2), -- quantity * unit_price
|
||||
|
||||
-- Tipo de unidad (para stats de kg vs unidades)
|
||||
sell_unit VARCHAR(20) DEFAULT 'unit', -- 'kg' | 'unit' | 'pack'
|
||||
|
||||
created_at TIMESTAMPTZ DEFAULT NOW(),
|
||||
|
||||
FOREIGN KEY (tenant_id, woo_order_id)
|
||||
REFERENCES woo_orders_cache(tenant_id, woo_order_id) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
CREATE INDEX idx_woo_items_order ON woo_order_items(tenant_id, woo_order_id);
|
||||
CREATE INDEX idx_woo_items_product ON woo_order_items(tenant_id, woo_product_id);
|
||||
|
||||
-- migrate:down
|
||||
|
||||
DROP INDEX IF EXISTS idx_woo_items_product;
|
||||
DROP INDEX IF EXISTS idx_woo_items_order;
|
||||
DROP TABLE IF EXISTS woo_order_items;
|
||||
|
||||
DROP INDEX IF EXISTS idx_woo_orders_city;
|
||||
DROP INDEX IF EXISTS idx_woo_orders_source;
|
||||
DROP INDEX IF EXISTS idx_woo_orders_tenant_date;
|
||||
DROP TABLE IF EXISTS woo_orders_cache;
|
||||
Reference in New Issue
Block a user