|
Last change
on this file since 42da64d was 42da64d, checked in by Andrej <asumanovski@…>, 8 weeks ago |
|
Fixed auth issue
|
-
Property mode
set to
100644
|
|
File size:
1.6 KB
|
| Line | |
|---|
| 1 | -- Validate finance percentages on insert/update
|
|---|
| 2 | -- Ensures the five budget fields sum to ~100 (tolerance 0.01) and each is between 0 and 100
|
|---|
| 3 | -- Schema: trekr
|
|---|
| 4 |
|
|---|
| 5 | CREATE OR REPLACE FUNCTION trekr.fn_validate_finance_percentages()
|
|---|
| 6 | RETURNS trigger
|
|---|
| 7 | LANGUAGE plpgsql
|
|---|
| 8 | AS $$
|
|---|
| 9 | DECLARE
|
|---|
| 10 | s NUMERIC;
|
|---|
| 11 | eps CONSTANT NUMERIC := 0.01; -- allow small rounding differences
|
|---|
| 12 | vals NUMERIC[] := ARRAY[NEW.spending_budget, NEW.saving_budget, NEW.investing_budget, NEW.donation_budget, NEW.credit];
|
|---|
| 13 | v NUMERIC;
|
|---|
| 14 | BEGIN
|
|---|
| 15 | -- Null checks: all five values must be provided (business rule)
|
|---|
| 16 | FOREACH v IN ARRAY vals LOOP
|
|---|
| 17 | IF v IS NULL THEN
|
|---|
| 18 | RAISE EXCEPTION 'All 5 finance percentage values are required';
|
|---|
| 19 | END IF;
|
|---|
| 20 | IF v < 0 OR v > 100 THEN
|
|---|
| 21 | RAISE EXCEPTION 'Finance percentage values must be between 0 and 100';
|
|---|
| 22 | END IF;
|
|---|
| 23 | END LOOP;
|
|---|
| 24 |
|
|---|
| 25 | s := (NEW.spending_budget + NEW.saving_budget + NEW.investing_budget + NEW.donation_budget + NEW.credit)::numeric;
|
|---|
| 26 | IF abs(s - 100) > eps THEN
|
|---|
| 27 | RAISE EXCEPTION 'Finance percentages must sum to 100 (got: %)', s;
|
|---|
| 28 | END IF;
|
|---|
| 29 |
|
|---|
| 30 | RETURN NEW;
|
|---|
| 31 | END;
|
|---|
| 32 | $$;
|
|---|
| 33 |
|
|---|
| 34 | -- Trigger on finance_users table
|
|---|
| 35 | DO $$
|
|---|
| 36 | BEGIN
|
|---|
| 37 | IF NOT EXISTS (
|
|---|
| 38 | SELECT 1 FROM pg_trigger t
|
|---|
| 39 | JOIN pg_class c ON t.tgrelid = c.oid
|
|---|
| 40 | WHERE t.tgname = 'trg_validate_finance_percentages' AND c.relname = 'finance_users'
|
|---|
| 41 | ) THEN
|
|---|
| 42 | CREATE TRIGGER trg_validate_finance_percentages
|
|---|
| 43 | BEFORE INSERT OR UPDATE ON trekr.finance_users
|
|---|
| 44 | FOR EACH ROW
|
|---|
| 45 | EXECUTE FUNCTION trekr.fn_validate_finance_percentages();
|
|---|
| 46 | END IF;
|
|---|
| 47 | END$$;
|
|---|
| 48 |
|
|---|
Note:
See
TracBrowser
for help on using the repository browser.