Функции, процедури, тригери : procedures.txt

File procedures.txt, 6.8 KB (added by 231068, 7 days ago)
Line 
1--======================================================================================================================
2-- PROCEDURES
3--======================================================================================================================
4
5--1. Трансфер на сметки во иста валута
6CREATE OR REPLACE PROCEDURE sp_transfer_same_currency(
7 p_amount DECIMAL(20, 2),
8 p_from_acc INT,
9 p_to_acc INT,
10 p_emp_counter INT
11)
12 LANGUAGE plpgsql AS
13$$
14DECLARE
15 v_ref VARCHAR(30);
16 v_type_id INT;
17 v_curr INT;
18BEGIN
19 IF NOT fn_is_account_eligible(p_from_acc)
20 OR NOT fn_is_account_eligible(p_to_acc) THEN
21 RAISE EXCEPTION 'Nevalidni smetki';
22 END IF;
23
24 IF (SELECT balance FROM Account WHERE account_id = p_from_acc) < p_amount THEN
25 RAISE EXCEPTION 'Nema dovolno sredstva';
26 END IF;
27
28 SELECT currency_id
29 INTO v_curr
30 FROM Account
31 WHERE account_id = p_from_acc;
32
33 IF v_curr != (SELECT currency_id
34 FROM Account
35 WHERE account_id = p_to_acc) THEN
36 RAISE EXCEPTION 'Valutite ne se isti';
37 END IF;
38
39 v_ref := 'TRF-' || TO_CHAR(NOW(), 'YYYYMMDDHH24MISS');
40
41 SELECT transaction_type_id
42 INTO v_type_id
43 FROM Transaction_type
44 WHERE type_name = 'TRANSFER';
45
46 INSERT INTO Transaction(amount, status, reference_number,
47 account_id, account_id2,
48 transaction_type_id,
49 currency_id, currency_id2,
50 emp_counter_id)
51 VALUES (p_amount, 'COMPLETED', v_ref,
52 p_from_acc, p_to_acc,
53 v_type_id,
54 v_curr, v_curr,
55 p_emp_counter);
56END;
57$$;
58
59--2. Трансфер на сметки во различна валута
60CREATE OR REPLACE PROCEDURE sp_transfer_foreign_currency(
61 p_amount DECIMAL(20, 2),
62 p_from_acc INT,
63 p_to_acc INT,
64 p_emp_counter INT
65)
66 LANGUAGE plpgsql AS
67$$
68DECLARE
69 v_from_curr INT;
70 v_to_curr INT;
71 v_ref VARCHAR(30);
72 v_type_id INT;
73BEGIN
74 IF NOT fn_is_account_eligible(p_from_acc)
75 OR NOT fn_is_account_eligible(p_to_acc) THEN
76 RAISE EXCEPTION 'Nevalidni smetki';
77 END IF;
78
79 IF (SELECT balance FROM Account WHERE account_id = p_from_acc) < p_amount THEN
80 RAISE EXCEPTION 'Nema dovolno sredstva';
81 END IF;
82
83 SELECT currency_id
84 INTO v_from_curr
85 FROM Account
86 WHERE account_id = p_from_acc;
87
88 SELECT currency_id
89 INTO v_to_curr
90 FROM Account
91 WHERE account_id = p_to_acc;
92
93 v_ref := 'TRF-' || TO_CHAR(NOW(), 'YYYYMMDDHH24MISS');
94
95 SELECT transaction_type_id
96 INTO v_type_id
97 FROM Transaction_type
98 WHERE type_name = 'TRANSFER';
99
100 INSERT INTO Transaction(amount, status, reference_number,
101 account_id, account_id2,
102 transaction_type_id,
103 currency_id, currency_id2,
104 emp_counter_id)
105 VALUES (p_amount, 'COMPLETED', v_ref,
106 p_from_acc, p_to_acc,
107 v_type_id,
108 v_from_curr, v_to_curr,
109 p_emp_counter);
110END;
111$$;
112
113
114-- 3. Уплата на средства на сметка
115CREATE OR REPLACE PROCEDURE sp_deposit(
116 p_account_id INT,
117 p_amount DECIMAL(20, 2),
118 p_currency_id INT,
119 p_payment_method INT,
120 p_emp_counter_id INT,
121 p_description VARCHAR DEFAULT 'Уплата на средства'
122)
123 LANGUAGE plpgsql AS
124$$
125DECLARE
126 v_deposit_type_id INT;
127 v_ref_number VARCHAR(30);
128 v_transaction_id INT;
129BEGIN
130 -- Провери дали сметката е активна
131 IF NOT fn_is_account_eligible(p_account_id) THEN
132 RAISE EXCEPTION 'Smetkata ne e aktivna';
133 END IF;
134
135 SELECT transaction_type_id
136 INTO v_deposit_type_id
137 FROM Transaction_type
138 WHERE type_name = 'DEPOSIT';
139
140 v_ref_number := 'TRX-' || LPAD(v_transaction_id::TEXT, 10, '0');
141
142 INSERT INTO Transaction (amount, transaction_date, status, description,
143 reference_number, account_id, transaction_type_id,
144 payment_method_id, currency_id, emp_counter_id)
145 VALUES (p_amount, CURRENT_TIMESTAMP, 'COMPLETED', p_description,
146 v_ref_number, p_account_id, v_deposit_type_id,
147 p_payment_method, p_currency_id, p_emp_counter_id)
148 RETURNING transaction_id INTO v_transaction_id;
149 -- Тригерот trg_update_account_balance го ажурира балансот
150 -- Тригерот trg_auto_generate_receipt генерира Receipt
151
152 RAISE NOTICE 'Уплатата е успешна. Transaction ID: %, Receipt автоматски генериран.', v_transaction_id;
153END;
154$$;
155
156CALL sp_deposit(1001, 5000.00, 1, 1, 61735);
157
158
159
160-- 4. Исплата на средства од сметка
161CREATE OR REPLACE PROCEDURE sp_withdraw(
162 p_account_id INT,
163 p_amount DECIMAL(20, 2),
164 p_currency_id INT,
165 p_payment_method INT,
166 p_emp_counter_id INT,
167 p_description VARCHAR DEFAULT 'Исплата на средства'
168)
169 LANGUAGE plpgsql AS
170$$
171DECLARE
172 v_withdrawal_type_id INT;
173 v_ref_number VARCHAR(30);
174 v_current_balance DECIMAL(20, 2);
175 v_transaction_id INT;
176BEGIN
177 IF NOT fn_is_account_eligible(p_account_id) THEN
178 RAISE EXCEPTION 'Сметката не е активна';
179 END IF;
180
181
182 SELECT balance
183 INTO v_current_balance
184 FROM Account
185 WHERE account_id = p_account_id;
186
187 IF v_current_balance < p_amount THEN
188 RAISE EXCEPTION 'Недоволен баланс: тековен=%, побаран=%.',
189 v_current_balance, p_amount;
190 END IF;
191
192 SELECT transaction_type_id
193 INTO v_withdrawal_type_id
194 FROM Transaction_type
195 WHERE type_name = 'WITHDRAWAL';
196
197 v_ref_number := 'TRX-' || LPAD(v_transaction_id::TEXT, 10, '0');
198
199
200 INSERT INTO Transaction (amount, transaction_date, status, description,
201 reference_number, account_id, transaction_type_id,
202 payment_method_id, currency_id, emp_counter_id)
203 VALUES (p_amount, CURRENT_TIMESTAMP, 'COMPLETED', p_description,
204 v_ref_number, p_account_id, v_withdrawal_type_id,
205 p_payment_method, p_currency_id, p_emp_counter_id)
206 RETURNING transaction_id INTO v_transaction_id;
207 -- Тригерот trg_prevent_negative_balance штити од негативен баланс
208 -- Тригерот trg_update_account_balance го ажурира балансот
209
210 RAISE NOTICE 'Исплатата е успешна. Transaction ID: %', v_transaction_id;
211END;
212$$;
213
214CALL sp_withdraw(1001, 1500.00, 1, 1, 61735);