mirror of
https://github.com/IdalecioSch/dbTrabai.git
synced 2026-07-27 16:26:04 -03:00
2.3 KiB
2.3 KiB
3 — Trigger antes de insercao pra poder ja ser chamada ao inserir dados
Fun trigger 1 atualiza encomenda.valor quando insere/altera/exclui
Calcula o valor da encomenda quando adiciona um novo item no pedido, formula: material.custo + LENGTH(item.frase) × material.valor_letra.
CREATE FUNCTION fun_att_valor_enc()
RETURNS TRIGGER AS $$
DECLARE
val_enc_id INTEGER;
BEGIN
IF TG_OP = 'DELETE' THEN
val_enc_id := OLD.encomenda_id; -- old pq pega o item.encomenda id antes de apagar
ELSE
val_enc_id := NEW.encomenda_id; -- new pq pega o item.encomenda_id depois de alterar/inserir
END IF;
UPDATE encomenda
SET valor = (
SELECT COALESCE(
SUM(m.custo + LENGTH(i.frase) * m.valor_letra), 0.00
)
-- Coalese pq ele tenta pegar sum, se ficar null, retorna 0.00 msm, como um operador ternario
FROM item i
JOIN placa p ON p.id = i.placa_id
JOIN material m ON m.id = p.material_id
WHERE i.encomenda_id = val_enc_id
)
WHERE id = val_enc_id;
IF TG_OP = 'UPDATE' AND OLD.encomenda_id <> NEW.encomenda_id THEN
UPDATE encomenda
SET valor = (
SELECT COALESCE(
SUM(m.custo + LENGTH(i.frase) * m.valor_letra), 0.00
)
FROM item i
JOIN placa p ON p.id = i.placa_id
JOIN material m ON m.id = p.material_id
WHERE i.encomenda_id = OLD.encomenda_id
)
WHERE id = OLD.encomenda_id;
END IF;
IF TG_OP = 'DELETE' THEN
RETURN OLD;
ELSE
RETURN NEW;
END IF;
END;
$$ LANGUAGE plpgsql;
fun trigger 2 — registra recebimento quando fecha encomenda
Quando encomenda.situacao() passa de aberta pra Fechada, bota uma linha em recebimento com:
- snal = 1/2 do valor total -> vence na data encomenda.data
- resto = restante -> vence na data de encomenda.entrega
CREATE OR REPLACE FUNCTION fun_fechar_encomenda()
RETURNS TRIGGER AS $$
BEGIN
-- so quando muda de Aberta pra Fechada
IF NEW.situacao = 'Fechada' AND OLD.situacao = 'Aberta' THEN
INSERT INTO recebimento (encomenda_id, sinal, data_sinal, restante, data_restante)
VALUES (
NEW.id,
(NEW.valor * 0.50),
NEW.data,
(NEW.valor * 0.50),
NEW.entrega
);
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
triggers
CREATE TRIGGER trg_fechar_encomenda
AFTER UPDATE ON encomenda
FOR EACH ROW
EXECUTE FUNCTION fun_fechar_encomenda();
CREATE TRIGGER trg_att_valor_enc
AFTER INSERT OR UPDATE OR DELETE ON item
FOR EACH ROW
EXECUTE FUNCTION fun_att_valor_enc();