84 lines
2.9 KiB
PL/PgSQL
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');
|