Files
Idalecio Schvartz Sobrinho 271a43e5a9 legivel por inteiro
2026-06-30 11:06:09 -03:00

103 lines
2.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
### 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`.
```sql
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
```sql
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
```sql
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();
```