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