source: db-scripts/triggers/finance_validate_trigger.sql@ 42da64d

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
5CREATE OR REPLACE FUNCTION trekr.fn_validate_finance_percentages()
6RETURNS trigger
7LANGUAGE plpgsql
8AS $$
9DECLARE
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;
14BEGIN
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;
31END;
32$$;
33
34-- Trigger on finance_users table
35DO $$
36BEGIN
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;
47END$$;
48
Note: See TracBrowser for help on using the repository browser.