DatabaseCreation: Prevent already paid trigger.sql

File Prevent already paid trigger.sql, 1.9 KB (added by 231094, 3 weeks ago)
Line 
1CREATE OR REPLACE FUNCTION trg_fn_prevent_overpaid_invoice()
2 RETURNS TRIGGER
3LANGUAGE plpgsql
4AS $$
5DECLARE
6 v_invoice_total NUMERIC;
7 v_invoice_status TEXT;
8 v_total_paid NUMERIC;
9BEGIN
10
11 IF NEW.invoice_id IS NULL THEN
12 RETURN NEW;
13 END IF;
14
15 IF NEW.status <> 'completed' THEN
16 RETURN NEW;
17 END IF;
18
19
20 SELECT total_amount,status
21 INTO v_invoice_total, v_invoice_status
22 FROM invoices
23 WHERE invoice_id = NEW.invoice_id;
24
25 IF v_invoice_status = 'cancelled'
26 THEN RAISE EXCEPTION 'PAYMENT REJECTED. Invoice % is cancelled',NEW.invoice_id;
27 END IF;
28
29 SELECT COALESCE(SUM(amount), 0) --ushe kolu ostanuva od fakturata
30 INTO v_total_paid
31 FROM payments
32 WHERE invoice_id = NEW.invoice_id
33 AND status = 'completed'
34 AND payment_id <> NEW.payment_id;
35
36 --ako e vekje platena
37 IF v_total_paid >= v_invoice_total THEN
38 RAISE EXCEPTION
39 'Payment rejected. Invoice % is already fully paid.',
40 NEW.invoice_id;
41 END IF;
42
43 --ako se plakja povekje od toa sto treba
44 IF v_total_paid + NEW.amount > v_invoice_total THEN
45 RAISE EXCEPTION
46 'Payment rejected. Invoice % has remaining balance %, but attempted payment is %.',
47 NEW.invoice_id,
48 v_invoice_total - v_total_paid,
49 NEW.amount;
50 END IF;
51
52 RETURN NEW;
53END;
54$$;
55-- idejata e ako nekoj proba da plati vekje platena faktura da ja odbie
56-- ili ako plati povekje od ostatokot
57-- sluzhi i za protection na cutomer balance triggerot bidejki gi odbiva paymentsot
58
59
60DROP TRIGGER IF EXISTS trg_prevent_overpaid_invoice ON payments;
61drop function if exists trg_fn_prevent_overpaid_invoice();
62
63CREATE TRIGGER trg_prevent_overpaid_invoice
64BEFORE INSERT OR UPDATE ON payments
65FOR EACH ROW
66EXECUTE FUNCTION trg_fn_prevent_overpaid_invoice();