Files
plan-lealtad/supabase/schema.sql
T
2026-05-11 08:30:22 -04:00

84 lines
2.9 KiB
PL/PgSQL

-- 1. Habilitar extensión para IDs seguros (UUID)
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
-- 2. TABLA: Empresas
CREATE TABLE companies (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
name TEXT NOT NULL,
wa_phone_id TEXT -- El ID del número de WhatsApp en Meta
);
-- 3. TABLA: Clientes Finales
CREATE TABLE customers (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
company_id UUID REFERENCES companies(id) ON DELETE CASCADE,
phone TEXT NOT NULL,
name TEXT,
balance NUMERIC(10,2) DEFAULT 0.00,
tier TEXT DEFAULT 'Member', -- Niveles: Member, Gold, Black
bot_state TEXT DEFAULT 'NEW', -- Máquina de estados: NEW, AWAITING_NAME, ACTIVE
pass_id TEXT UNIQUE DEFAULT uuid_generate_v4(),
created_at TIMESTAMPTZ DEFAULT NOW(),
UNIQUE(company_id, phone)
);
-- 4. TABLA: Transacciones
CREATE TABLE transactions (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
customer_id UUID REFERENCES customers(id) ON DELETE CASCADE,
amount_spent NUMERIC(10,2) NOT NULL,
cashback_earned NUMERIC(10,2) NOT NULL,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 5. TRIGGER: Gamificación Automática
CREATE OR REPLACE FUNCTION update_customer_stats() RETURNS TRIGGER AS $$
DECLARE
new_balance NUMERIC;
BEGIN
-- Sumar cashback al cliente
UPDATE customers SET balance = balance + NEW.cashback_earned
WHERE id = NEW.customer_id RETURNING balance INTO new_balance;
-- Lógica de Estatus Dinámico
IF new_balance >= 100 THEN
UPDATE customers SET tier = 'Black' WHERE id = NEW.customer_id;
ELSIF new_balance >= 50 THEN
UPDATE customers SET tier = 'Gold' WHERE id = NEW.customer_id;
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER after_transaction_insert
AFTER INSERT ON transactions
FOR EACH ROW EXECUTE FUNCTION update_customer_stats();
-- 6. RPC: Función de procesamiento para n8n
CREATE OR REPLACE FUNCTION process_wa_customer(p_phone TEXT, p_company_id UUID)
RETURNS TABLE (customer_id UUID, state TEXT, c_name TEXT, pass_id TEXT, c_balance NUMERIC, c_tier TEXT) AS $$
DECLARE
v_id UUID; v_state TEXT; v_name TEXT; v_pass TEXT; v_bal NUMERIC; v_tier TEXT;
BEGIN
-- Buscar cliente existente
SELECT id, bot_state, name, customers.pass_id, balance, tier
INTO v_id, v_state, v_name, v_pass, v_bal, v_tier
FROM customers WHERE phone = p_phone AND company_id = p_company_id;
-- Si es la primera vez que escribe, lo creamos en estado 'NEW'
IF v_id IS NULL THEN
INSERT INTO customers (phone, company_id, bot_state)
VALUES (p_phone, p_company_id, 'NEW')
RETURNING id, bot_state, name, customers.pass_id, balance, tier
INTO v_id, v_state, v_name, v_pass, v_bal, v_tier;
END IF;
RETURN QUERY SELECT v_id, v_state, v_name, v_pass, v_bal, v_tier;
END;
$$ LANGUAGE plpgsql;
-- Ejemplo de inserción de empresa (Descomentar y reemplazar)
-- INSERT INTO companies (name, wa_phone_id)
-- VALUES ('TU_EMPRESA', 'TU_PHONE_NUMBER_ID');