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

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