Files
acmcc/supabase/migrations/20260511231254_53741e2b-db93-41cd-b03d-94cc800874c1.sql
2026-06-01 20:19:26 -04:00

44 lines
1.3 KiB
PL/PgSQL

CREATE OR REPLACE FUNCTION public.get_required_approvals_for_bill(p_bill_id uuid)
RETURNS integer
LANGUAGE plpgsql
STABLE SECURITY DEFINER
SET search_path TO 'public'
AS $function$
DECLARE
v_assoc uuid;
v_amount numeric;
v_vendor text;
v_rule public.bill_approval_rules%ROWTYPE;
v_required integer;
BEGIN
SELECT b.association_id, b.amount, COALESCE(v.name, b.notes, '')
INTO v_assoc, v_amount, v_vendor
FROM public.bills b
LEFT JOIN public.vendors v ON v.id = b.vendor_id
WHERE b.id = p_bill_id;
IF v_assoc IS NULL THEN RETURN NULL; END IF;
SELECT * INTO v_rule FROM public.bill_approval_rules WHERE association_id = v_assoc;
IF v_rule.id IS NULL OR v_rule.enabled = false THEN
RETURN NULL;
END IF;
SELECT required_approvals INTO v_required
FROM public.bill_approval_rule_vendor_exceptions
WHERE rule_id = v_rule.id AND lower(vendor_name) = lower(v_vendor)
LIMIT 1;
IF v_required IS NOT NULL THEN RETURN v_required; END IF;
SELECT required_approvals INTO v_required
FROM public.bill_approval_rule_thresholds
WHERE rule_id = v_rule.id
AND COALESCE(v_amount,0) >= min_amount
AND (max_amount IS NULL OR COALESCE(v_amount,0) <= max_amount)
ORDER BY min_amount DESC
LIMIT 1;
IF v_required IS NOT NULL THEN RETURN v_required; END IF;
RETURN v_rule.required_approvals;
END;
$function$;