191 lines
8.0 KiB
PL/PgSQL
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);
|