Files
App-Estoque-LiberiKids/sql/create-tables.sql
2025-10-14 14:04:17 -03:00

191 lines
8.0 KiB
PL/PgSQL

-- =====================================================
-- SCRIPT DE CRIAÇÃO DAS TABELAS - LIBERI KIDS ESTOQUE
-- =====================================================
-- 1. TABELA DE FORNECEDORES
CREATE TABLE IF NOT EXISTS fornecedores (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
razao_social TEXT NOT NULL,
telefone TEXT,
whatsapp TEXT,
endereco TEXT,
email TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- 2. TABELA DE PRODUTOS
CREATE TABLE IF NOT EXISTS produtos (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
id_produto TEXT,
marca TEXT NOT NULL,
nome TEXT NOT NULL,
estacao TEXT NOT NULL,
genero TEXT DEFAULT 'Unissex',
fornecedor_id UUID REFERENCES fornecedores(id),
valor_compra DECIMAL(10,2) NOT NULL,
valor_revenda DECIMAL(10,2) NOT NULL,
foto_principal_url TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- 3. TABELA DE VARIAÇÕES DE PRODUTOS
CREATE TABLE IF NOT EXISTS produto_variacoes (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
produto_id UUID NOT NULL REFERENCES produtos(id) ON DELETE CASCADE,
tamanho TEXT NOT NULL,
cor TEXT NOT NULL,
quantidade INTEGER NOT NULL DEFAULT 0,
foto_url TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- 4. TABELA DE CLIENTES
CREATE TABLE IF NOT EXISTS clientes (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
nome_completo TEXT NOT NULL,
email TEXT,
telefone TEXT,
whatsapp TEXT,
endereco TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- 5. TABELA DE TIPOS DE DESPESAS
CREATE TABLE IF NOT EXISTS tipos_despesas (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
nome TEXT NOT NULL UNIQUE,
descricao TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- 6. TABELA DE DESPESAS
CREATE TABLE IF NOT EXISTS despesas (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tipo_despesa_id UUID NOT NULL REFERENCES tipos_despesas(id),
fornecedor_id UUID REFERENCES fornecedores(id),
data_despesa DATE NOT NULL,
valor DECIMAL(10,2) NOT NULL,
descricao TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- 7. TABELA DE VENDAS
CREATE TABLE IF NOT EXISTS vendas (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
cliente_id UUID REFERENCES clientes(id),
tipo_pagamento TEXT NOT NULL CHECK (tipo_pagamento IN ('vista', 'parcelado')),
valor_total DECIMAL(10,2) NOT NULL,
desconto DECIMAL(10,2) DEFAULT 0,
parcelas INTEGER DEFAULT 1,
valor_parcela DECIMAL(10,2) DEFAULT 0,
data_venda DATE NOT NULL,
observacoes TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- 8. TABELA DE ITENS DE VENDA
CREATE TABLE IF NOT EXISTS venda_itens (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
venda_id UUID NOT NULL REFERENCES vendas(id) ON DELETE CASCADE,
produto_id UUID NOT NULL REFERENCES produtos(id),
variacao_id UUID REFERENCES produto_variacoes(id),
quantidade INTEGER NOT NULL,
valor_unitario DECIMAL(10,2) NOT NULL,
valor_total DECIMAL(10,2) NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- 9. TABELA DE CONFIGURAÇÕES
CREATE TABLE IF NOT EXISTS configuracoes (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tipo TEXT NOT NULL UNIQUE,
configuracao JSONB NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- =====================================================
-- ÍNDICES PARA PERFORMANCE
-- =====================================================
CREATE INDEX IF NOT EXISTS idx_produtos_fornecedor ON produtos(fornecedor_id);
CREATE INDEX IF NOT EXISTS idx_produto_variacoes_produto ON produto_variacoes(produto_id);
CREATE INDEX IF NOT EXISTS idx_despesas_tipo ON despesas(tipo_despesa_id);
CREATE INDEX IF NOT EXISTS idx_despesas_fornecedor ON despesas(fornecedor_id);
CREATE INDEX IF NOT EXISTS idx_despesas_data ON despesas(data_despesa);
CREATE INDEX IF NOT EXISTS idx_vendas_cliente ON vendas(cliente_id);
CREATE INDEX IF NOT EXISTS idx_vendas_data ON vendas(data_venda);
CREATE INDEX IF NOT EXISTS idx_venda_itens_venda ON venda_itens(venda_id);
CREATE INDEX IF NOT EXISTS idx_venda_itens_produto ON venda_itens(produto_id);
CREATE INDEX IF NOT EXISTS idx_configuracoes_tipo ON configuracoes(tipo);
-- =====================================================
-- TRIGGERS PARA UPDATED_AT
-- =====================================================
-- Função para atualizar updated_at
CREATE OR REPLACE FUNCTION update_updated_at_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
$$ language 'plpgsql';
-- Triggers para as tabelas
CREATE TRIGGER update_fornecedores_updated_at BEFORE UPDATE ON fornecedores FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_produtos_updated_at BEFORE UPDATE ON produtos FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_produto_variacoes_updated_at BEFORE UPDATE ON produto_variacoes FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_clientes_updated_at BEFORE UPDATE ON clientes FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_despesas_updated_at BEFORE UPDATE ON despesas FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_vendas_updated_at BEFORE UPDATE ON vendas FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_configuracoes_updated_at BEFORE UPDATE ON configuracoes FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
-- =====================================================
-- DADOS INICIAIS
-- =====================================================
-- Inserir tipos de despesas padrão
INSERT INTO tipos_despesas (nome, descricao) VALUES
('Aluguel', 'Despesas com aluguel do estabelecimento'),
('Energia Elétrica', 'Conta de luz'),
('Água', 'Conta de água'),
('Internet', 'Serviços de internet e telefone'),
('Marketing', 'Despesas com publicidade e marketing'),
('Transporte', 'Combustível, manutenção de veículos'),
('Materiais', 'Materiais de escritório e loja'),
('Outros', 'Outras despesas diversas')
ON CONFLICT (nome) DO NOTHING;
-- =====================================================
-- POLÍTICAS RLS (Row Level Security)
-- =====================================================
-- Habilitar RLS nas tabelas
ALTER TABLE fornecedores ENABLE ROW LEVEL SECURITY;
ALTER TABLE produtos ENABLE ROW LEVEL SECURITY;
ALTER TABLE produto_variacoes ENABLE ROW LEVEL SECURITY;
ALTER TABLE clientes ENABLE ROW LEVEL SECURITY;
ALTER TABLE tipos_despesas ENABLE ROW LEVEL SECURITY;
ALTER TABLE despesas ENABLE ROW LEVEL SECURITY;
ALTER TABLE vendas ENABLE ROW LEVEL SECURITY;
ALTER TABLE venda_itens ENABLE ROW LEVEL SECURITY;
ALTER TABLE configuracoes ENABLE ROW LEVEL SECURITY;
-- Políticas para permitir todas as operações (ajuste conforme necessário)
CREATE POLICY "Enable all operations for authenticated users" ON fornecedores FOR ALL USING (true);
CREATE POLICY "Enable all operations for authenticated users" ON produtos FOR ALL USING (true);
CREATE POLICY "Enable all operations for authenticated users" ON produto_variacoes FOR ALL USING (true);
CREATE POLICY "Enable all operations for authenticated users" ON clientes FOR ALL USING (true);
CREATE POLICY "Enable all operations for authenticated users" ON tipos_despesas FOR ALL USING (true);
CREATE POLICY "Enable all operations for authenticated users" ON despesas FOR ALL USING (true);
CREATE POLICY "Enable all operations for authenticated users" ON vendas FOR ALL USING (true);
CREATE POLICY "Enable all operations for authenticated users" ON venda_itens FOR ALL USING (true);
CREATE POLICY "Enable all operations for authenticated users" ON configuracoes FOR ALL USING (true);