123 lines
6.0 KiB
SQL
123 lines
6.0 KiB
SQL
-- Schema PostgreSQL — Alemão Conveniências
|
|
-- Fase 1: migração do sql.js para PostgreSQL
|
|
|
|
-- Extensões
|
|
CREATE EXTENSION IF NOT EXISTS "pgcrypto";
|
|
|
|
-- ─────────────────────────────────────────────────────────────────
|
|
-- ADMINS
|
|
-- ─────────────────────────────────────────────────────────────────
|
|
CREATE TABLE IF NOT EXISTS admins (
|
|
id SERIAL PRIMARY KEY,
|
|
username TEXT UNIQUE NOT NULL,
|
|
password_hash TEXT NOT NULL,
|
|
nome TEXT,
|
|
email TEXT,
|
|
telefone TEXT,
|
|
created_at TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
|
|
-- ─────────────────────────────────────────────────────────────────
|
|
-- USERS (compradores / leads)
|
|
-- ─────────────────────────────────────────────────────────────────
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
id SERIAL PRIMARY KEY,
|
|
nome TEXT NOT NULL,
|
|
email TEXT UNIQUE,
|
|
cpf TEXT,
|
|
telefone TEXT,
|
|
ip TEXT,
|
|
source TEXT DEFAULT 'hotspot',
|
|
password_hash TEXT,
|
|
timestamp TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
|
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_users_email ON users(email) WHERE email IS NOT NULL;
|
|
|
|
-- ─────────────────────────────────────────────────────────────────
|
|
-- RAFFLES (sorteios)
|
|
-- ─────────────────────────────────────────────────────────────────
|
|
CREATE TABLE IF NOT EXISTS raffles (
|
|
id SERIAL PRIMARY KEY,
|
|
titulo TEXT NOT NULL,
|
|
descricao TEXT,
|
|
preco_numero NUMERIC(10,2) DEFAULT 5.00,
|
|
total_numeros INTEGER DEFAULT 500,
|
|
status TEXT DEFAULT 'active' CHECK (status IN ('draft','active','finished')),
|
|
ativo INTEGER DEFAULT 1, -- compatibilidade com código existente
|
|
data_criacao TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
|
|
-- ─────────────────────────────────────────────────────────────────
|
|
-- TICKETS (números comprados)
|
|
-- ─────────────────────────────────────────────────────────────────
|
|
CREATE TABLE IF NOT EXISTS tickets (
|
|
id SERIAL PRIMARY KEY,
|
|
raffle_id INTEGER NOT NULL REFERENCES raffles(id) ON DELETE CASCADE,
|
|
numero INTEGER NOT NULL,
|
|
usuario_nome TEXT NOT NULL,
|
|
usuario_telefone TEXT,
|
|
usuario_cpf TEXT,
|
|
data_compra TIMESTAMPTZ DEFAULT NOW(),
|
|
UNIQUE (raffle_id, numero)
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_tickets_raffle ON tickets(raffle_id);
|
|
CREATE INDEX IF NOT EXISTS idx_tickets_cpf ON tickets(usuario_cpf);
|
|
|
|
-- ─────────────────────────────────────────────────────────────────
|
|
-- PROMOTIONS
|
|
-- ─────────────────────────────────────────────────────────────────
|
|
CREATE TABLE IF NOT EXISTS promotions (
|
|
id SERIAL PRIMARY KEY,
|
|
nome TEXT NOT NULL,
|
|
descricao TEXT,
|
|
preco_original NUMERIC(10,2),
|
|
preco_promocional NUMERIC(10,2) NOT NULL,
|
|
imagem TEXT DEFAULT '',
|
|
ativo INTEGER DEFAULT 1,
|
|
data_criacao TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
|
|
-- ─────────────────────────────────────────────────────────────────
|
|
-- PLUGINS
|
|
-- ─────────────────────────────────────────────────────────────────
|
|
CREATE TABLE IF NOT EXISTS plugins (
|
|
id TEXT PRIMARY KEY,
|
|
active INTEGER DEFAULT 0,
|
|
installed_at TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS plugin_configs (
|
|
plugin_id TEXT NOT NULL,
|
|
key TEXT NOT NULL,
|
|
value TEXT,
|
|
PRIMARY KEY (plugin_id, key)
|
|
);
|
|
|
|
-- ─────────────────────────────────────────────────────────────────
|
|
-- RAFFLE RESULTS & LOGS (Fase 2)
|
|
-- ─────────────────────────────────────────────────────────────────
|
|
ALTER TABLE raffles ADD COLUMN IF NOT EXISTS start_at TIMESTAMPTZ;
|
|
ALTER TABLE raffles ADD COLUMN IF NOT EXISTS end_at TIMESTAMPTZ;
|
|
|
|
CREATE TABLE IF NOT EXISTS raffle_results (
|
|
id SERIAL PRIMARY KEY,
|
|
raffle_id INTEGER NOT NULL REFERENCES raffles(id) ON DELETE CASCADE UNIQUE,
|
|
winner_ticket_id INTEGER NOT NULL REFERENCES tickets(id),
|
|
seed TEXT NOT NULL,
|
|
algorithm_version TEXT DEFAULT '1.0',
|
|
drawn_at TIMESTAMPTZ DEFAULT NOW(),
|
|
created_at TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS raffle_draw_logs (
|
|
id SERIAL PRIMARY KEY,
|
|
raffle_id INTEGER NOT NULL REFERENCES raffles(id) ON DELETE CASCADE,
|
|
seed TEXT,
|
|
result_number INTEGER,
|
|
executed_at TIMESTAMPTZ DEFAULT NOW(),
|
|
ip TEXT,
|
|
created_at TIMESTAMPTZ DEFAULT NOW()
|
|
);
|