103 lines
4.0 KiB
PL/PgSQL
103 lines
4.0 KiB
PL/PgSQL
-- =====================================================
|
|
-- 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);
|