Files
mercado.clube67.com/backend/database/schema.sql
T

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()
);