| 1 | CREATE OR REPLACE FUNCTION trg_fn_prevent_overpaid_invoice()
|
|---|
| 2 | RETURNS TRIGGER
|
|---|
| 3 | LANGUAGE plpgsql
|
|---|
| 4 | AS $$
|
|---|
| 5 | DECLARE
|
|---|
| 6 | v_invoice_total NUMERIC;
|
|---|
| 7 | v_invoice_status TEXT;
|
|---|
| 8 | v_total_paid NUMERIC;
|
|---|
| 9 | BEGIN
|
|---|
| 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;
|
|---|
| 53 | END;
|
|---|
| 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 |
|
|---|
| 60 | DROP TRIGGER IF EXISTS trg_prevent_overpaid_invoice ON payments;
|
|---|
| 61 | drop function if exists trg_fn_prevent_overpaid_invoice();
|
|---|
| 62 |
|
|---|
| 63 | CREATE TRIGGER trg_prevent_overpaid_invoice
|
|---|
| 64 | BEFORE INSERT OR UPDATE ON payments
|
|---|
| 65 | FOR EACH ROW
|
|---|
| 66 | EXECUTE FUNCTION trg_fn_prevent_overpaid_invoice(); |
|---|