-- ===================================================== -- TABELAS PARA SISTEMA DE EMPRÉSTIMOS -- ===================================================== -- 1. TABELA DE EMPRÉSTIMOS CREATE TABLE IF NOT EXISTS emprestimos ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), pessoa VARCHAR(100) NOT NULL DEFAULT 'Maiara', valor_total DECIMAL(10,2) NOT NULL, valor_restante DECIMAL(10,2) NOT NULL, descricao TEXT, data_emprestimo DATE NOT NULL DEFAULT CURRENT_DATE, status VARCHAR(20) NOT NULL DEFAULT 'ativo' CHECK (status IN ('ativo', 'quitado', 'cancelado')), created_at TIMESTAMP DEFAULT NOW(), updated_at TIMESTAMP DEFAULT NOW() ); -- 2. TABELA DE DEVOLUÇÕES/PARCELAS CREATE TABLE IF NOT EXISTS emprestimo_devolucoes ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), emprestimo_id UUID NOT NULL REFERENCES emprestimos(id) ON DELETE CASCADE, valor_devolvido DECIMAL(10,2) NOT NULL, data_devolucao DATE NOT NULL DEFAULT CURRENT_DATE, observacoes TEXT, created_at TIMESTAMP DEFAULT NOW(), updated_at TIMESTAMP DEFAULT NOW() ); -- ===================================================== -- ÍNDICES -- ===================================================== CREATE INDEX IF NOT EXISTS idx_emprestimos_pessoa ON emprestimos(pessoa); CREATE INDEX IF NOT EXISTS idx_emprestimos_status ON emprestimos(status); CREATE INDEX IF NOT EXISTS idx_emprestimos_data ON emprestimos(data_emprestimo); CREATE INDEX IF NOT EXISTS idx_devolucoes_emprestimo ON emprestimo_devolucoes(emprestimo_id); CREATE INDEX IF NOT EXISTS idx_devolucoes_data ON emprestimo_devolucoes(data_devolucao); -- ===================================================== -- TRIGGERS PARA UPDATED_AT -- ===================================================== CREATE TRIGGER update_emprestimos_updated_at BEFORE UPDATE ON emprestimos FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); CREATE TRIGGER update_emprestimo_devolucoes_updated_at BEFORE UPDATE ON emprestimo_devolucoes FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); -- ===================================================== -- FUNÇÃO PARA ATUALIZAR VALOR RESTANTE -- ===================================================== CREATE OR REPLACE FUNCTION atualizar_valor_restante_emprestimo() RETURNS TRIGGER AS $$ BEGIN -- Atualizar valor restante do empréstimo UPDATE emprestimos SET valor_restante = valor_total - ( SELECT COALESCE(SUM(valor_devolvido), 0) FROM emprestimo_devolucoes WHERE emprestimo_id = NEW.emprestimo_id ), status = CASE WHEN (valor_total - ( SELECT COALESCE(SUM(valor_devolvido), 0) FROM emprestimo_devolucoes WHERE emprestimo_id = NEW.emprestimo_id )) <= 0 THEN 'quitado' ELSE 'ativo' END, updated_at = NOW() WHERE id = NEW.emprestimo_id; RETURN NEW; END; $$ LANGUAGE plpgsql; -- Trigger para atualizar automaticamente quando há devolução CREATE TRIGGER trigger_atualizar_valor_restante AFTER INSERT OR UPDATE OR DELETE ON emprestimo_devolucoes FOR EACH ROW EXECUTE FUNCTION atualizar_valor_restante_emprestimo(); -- ===================================================== -- POLÍTICAS RLS (ROW LEVEL SECURITY) -- ===================================================== ALTER TABLE emprestimos ENABLE ROW LEVEL SECURITY; ALTER TABLE emprestimo_devolucoes 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 emprestimos FOR ALL USING (true); CREATE POLICY "Enable all operations for authenticated users" ON emprestimo_devolucoes FOR ALL USING (true); -- ===================================================== -- DADOS INICIAIS (OPCIONAL) -- ===================================================== -- Exemplo de empréstimo inicial (remover se não quiser) -- INSERT INTO emprestimos (pessoa, valor_total, valor_restante, descricao, data_emprestimo) -- VALUES ('Maiara', 500.00, 500.00, 'Empréstimo inicial para teste', CURRENT_DATE);