DatabaseProgramming: 04 Suspend overdue accounts.sql

File 04 Suspend overdue accounts.sql, 1.6 KB (added by 231139, 10 days ago)
Line 
1DROP PROCEDURE IF EXISTS public.proc_suspend_overdue_accounts();
2DROP PROCEDURE IF EXISTS public.proc_suspend_overdue_accounts(date);
3
4CREATE PROCEDURE public.proc_suspend_overdue_accounts(p_as_of_date date DEFAULT CURRENT_DATE)
5LANGUAGE plpgsql
6AS $$
7DECLARE
8 v_invoices_marked integer;
9 v_accounts_suspended integer;
10 v_subscriptions_suspended integer;
11BEGIN
12 UPDATE public.invoices i
13 SET status = 'overdue'
14 WHERE i.status IN ('issued', 'partially_paid')
15 AND i.due_date < p_as_of_date
16 AND public.fn_get_invoice_remaining_balance(i.invoice_id) > 0.01;
17 GET DIAGNOSTICS v_invoices_marked = ROW_COUNT;
18
19 UPDATE public.accounts a
20 SET account_status = 'suspended'
21 WHERE a.account_status = 'active'
22 AND EXISTS (
23 SELECT 1 FROM public.invoices i
24 WHERE i.account_id = a.account_id
25 AND i.status = 'overdue'
26 AND public.fn_get_invoice_remaining_balance(i.invoice_id) > 0.01
27 );
28 GET DIAGNOSTICS v_accounts_suspended = ROW_COUNT;
29
30 PERFORM set_config('app.change_reason', 'Suspended automatically because account has overdue debt', true);
31 UPDATE public.subscriptions s
32 SET status = 'suspended'
33 WHERE s.status = 'active'
34 AND EXISTS (
35 SELECT 1 FROM public.accounts a
36 WHERE a.account_id = s.account_id AND a.account_status = 'suspended'
37 );
38 GET DIAGNOSTICS v_subscriptions_suspended = ROW_COUNT;
39
40 RAISE NOTICE '% invoice(s) marked overdue, % account(s) and % subscription(s) suspended.',
41 v_invoices_marked, v_accounts_suspended, v_subscriptions_suspended;
42END;
43$$;
44