| 1 | --======================================================================================================================
|
|---|
| 2 | -- PROCEDURES
|
|---|
| 3 | --======================================================================================================================
|
|---|
| 4 |
|
|---|
| 5 | --1. Трансфер на сметки во иста валута
|
|---|
| 6 | CREATE 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 | $$
|
|---|
| 14 | DECLARE
|
|---|
| 15 | v_ref VARCHAR(30);
|
|---|
| 16 | v_type_id INT;
|
|---|
| 17 | v_curr INT;
|
|---|
| 18 | BEGIN
|
|---|
| 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);
|
|---|
| 56 | END;
|
|---|
| 57 | $$;
|
|---|
| 58 |
|
|---|
| 59 | --2. Трансфер на сметки во различна валута
|
|---|
| 60 | CREATE 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 | $$
|
|---|
| 68 | DECLARE
|
|---|
| 69 | v_from_curr INT;
|
|---|
| 70 | v_to_curr INT;
|
|---|
| 71 | v_ref VARCHAR(30);
|
|---|
| 72 | v_type_id INT;
|
|---|
| 73 | BEGIN
|
|---|
| 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);
|
|---|
| 110 | END;
|
|---|
| 111 | $$;
|
|---|
| 112 |
|
|---|
| 113 |
|
|---|
| 114 | -- 3. Уплата на средства на сметка
|
|---|
| 115 | CREATE 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 | $$
|
|---|
| 125 | DECLARE
|
|---|
| 126 | v_deposit_type_id INT;
|
|---|
| 127 | v_ref_number VARCHAR(30);
|
|---|
| 128 | v_transaction_id INT;
|
|---|
| 129 | BEGIN
|
|---|
| 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;
|
|---|
| 153 | END;
|
|---|
| 154 | $$;
|
|---|
| 155 |
|
|---|
| 156 | CALL sp_deposit(1001, 5000.00, 1, 1, 61735);
|
|---|
| 157 |
|
|---|
| 158 |
|
|---|
| 159 |
|
|---|
| 160 | -- 4. Исплата на средства од сметка
|
|---|
| 161 | CREATE 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 | $$
|
|---|
| 171 | DECLARE
|
|---|
| 172 | v_withdrawal_type_id INT;
|
|---|
| 173 | v_ref_number VARCHAR(30);
|
|---|
| 174 | v_current_balance DECIMAL(20, 2);
|
|---|
| 175 | v_transaction_id INT;
|
|---|
| 176 | BEGIN
|
|---|
| 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;
|
|---|
| 211 | END;
|
|---|
| 212 | $$;
|
|---|
| 213 |
|
|---|
| 214 | CALL sp_withdraw(1001, 1500.00, 1, 1, 61735);
|
|---|