feat: initial commit - lealtad demo n8n
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
-- 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');
|
||||
Reference in New Issue
Block a user