pg_triggers.sql (6166B)
1 -- 2 -- This file is part of TALER 3 -- Copyright (C) 2026 Taler Systems SA 4 -- 5 -- TALER is free software; you can redistribute it and/or modify it under the 6 -- terms of the GNU General Public License as published by the Free Software 7 -- Foundation; either version 3, or (at your option) any later version. 8 -- 9 -- TALER is distributed in the hope that it will be useful, but WITHOUT ANY 10 -- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR 11 -- A PARTICULAR PURPOSE. See the GNU General Public License for more details. 12 -- 13 -- You should have received a copy of the GNU General Public License along with 14 -- TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/> 15 -- 16 17 CREATE OR REPLACE FUNCTION merchant_orders_insert_statistics_trigger() 18 RETURNS TRIGGER 19 LANGUAGE plpgsql 20 AS $$ 21 BEGIN 22 CALL merchant_do_bump_number_stat 23 ('orders-created' 24 ,CURRENT_TIMESTAMP(0)::TIMESTAMP 25 ,1); 26 RETURN NEW; 27 END $$; 28 29 30 CREATE OR REPLACE FUNCTION merchant_contract_terms_insert_statistics_trigger() 31 RETURNS TRIGGER 32 LANGUAGE plpgsql 33 AS $$ 34 BEGIN 35 CALL merchant_do_bump_number_stat 36 ('orders-claimed' 37 ,CURRENT_TIMESTAMP(0)::TIMESTAMP 38 ,1); 39 RETURN NEW; 40 END $$; 41 42 43 CREATE OR REPLACE FUNCTION merchant_contract_terms_update_statistics_trigger() 44 RETURNS TRIGGER 45 LANGUAGE plpgsql 46 AS $$ 47 DECLARE 48 my_rec RECORD; 49 BEGIN 50 IF (NEW.wired AND NOT OLD.wired) 51 THEN 52 CALL merchant_do_bump_number_stat 53 ('orders-settled' 54 ,CURRENT_TIMESTAMP(0)::TIMESTAMP 55 ,1); 56 END IF; 57 IF (NEW.paid AND NOT OLD.paid) 58 THEN 59 CALL merchant_do_bump_number_stat 60 ('orders-paid' 61 ,CURRENT_TIMESTAMP(0)::TIMESTAMP 62 ,1); 63 FOR my_rec IN 64 SELECT total_without_fee 65 FROM merchant_deposit_confirmations 66 WHERE order_serial = NEW.order_serial 67 LOOP 68 CALL merchant_do_bump_amount_stat 69 ('payments-received-after-deposit-fee' 70 ,CURRENT_TIMESTAMP(0)::TIMESTAMP 71 ,my_rec.total_without_fee); 72 END LOOP; 73 FOR my_rec IN 74 SELECT deposit_fee 75 FROM merchant_deposits 76 WHERE deposit_confirmation_serial IN 77 (SELECT deposit_confirmation_serial 78 FROM merchant_deposit_confirmations 79 WHERE order_serial = NEW.order_serial) 80 LOOP 81 CALL merchant_do_bump_amount_stat 82 ('total-deposit-fees-paid' 83 ,CURRENT_TIMESTAMP(0)::TIMESTAMP 84 ,my_rec.deposit_fee); 85 END LOOP; 86 END IF; 87 RETURN NEW; 88 END $$; 89 90 91 CREATE OR REPLACE FUNCTION merchant_refunds_insert_statistics_trigger() 92 RETURNS TRIGGER 93 LANGUAGE plpgsql 94 AS $$ 95 BEGIN 96 CALL merchant_do_bump_amount_stat 97 ('refunds-granted' 98 ,CURRENT_TIMESTAMP(0)::TIMESTAMP 99 ,NEW.refund_amount); 100 RETURN NEW; 101 END $$; 102 103 104 CREATE OR REPLACE FUNCTION merchant_transfer_signatures_insert_statistics_trigger() 105 RETURNS TRIGGER 106 LANGUAGE plpgsql 107 AS $$ 108 BEGIN 109 CALL merchant_do_bump_amount_stat 110 ('wire-fees-paid' 111 ,CURRENT_TIMESTAMP(0)::TIMESTAMP 112 ,NEW.wire_fee); 113 RETURN NEW; 114 END $$; 115 116 117 CREATE OR REPLACE FUNCTION merchant_issued_tokens_insert_statistics_trigger() 118 RETURNS TRIGGER 119 LANGUAGE plpgsql 120 AS $$ 121 BEGIN 122 CALL merchant_do_bump_number_stat 123 ('tokens-issued' 124 ,CURRENT_TIMESTAMP(0)::TIMESTAMP 125 ,1); 126 RETURN NEW; 127 END $$; 128 129 130 CREATE OR REPLACE FUNCTION merchant_used_tokens_insert_statistics_trigger() 131 RETURNS TRIGGER 132 LANGUAGE plpgsql 133 AS $$ 134 BEGIN 135 CALL merchant_do_bump_number_stat 136 ('tokens-used' 137 ,CURRENT_TIMESTAMP(0)::TIMESTAMP 138 ,1); 139 RETURN NEW; 140 END $$; 141 142 143 -- Create TRIGGERs to set confirmed/expected status on INSERT. 144 CREATE OR REPLACE FUNCTION merchant_expected_transfers_insert_trigger() 145 RETURNS TRIGGER 146 LANGUAGE plpgsql 147 AS $$ 148 BEGIN 149 UPDATE merchant_transfers 150 SET expected = TRUE 151 WHERE wtid = NEW.wtid 152 AND exchange_url = NEW.exchange_url 153 AND credit_amount = NEW.expected_credit_amount; 154 NEW.confirmed = FOUND; 155 RETURN NEW; 156 END $$; 157 COMMENT ON FUNCTION merchant_expected_transfers_insert_trigger 158 IS 'Sets "confirmed" to TRUE for the new record if the expected transfer was already confirmed, and updates the already confirmed transfer to "expected"'; 159 160 CREATE OR REPLACE FUNCTION merchant_transfers_insert_trigger() 161 RETURNS TRIGGER 162 LANGUAGE plpgsql 163 AS $$ 164 BEGIN 165 UPDATE merchant_expected_transfers 166 SET confirmed = TRUE 167 WHERE wtid = NEW.wtid 168 AND exchange_url = NEW.exchange_url 169 AND expected_credit_amount = NEW.credit_amount; 170 NEW.expected = FOUND; 171 RETURN NEW; 172 END $$; 173 COMMENT ON FUNCTION merchant_transfers_insert_trigger 174 IS 'Sets "expected" to TRUE for the new record if the transfer was already expected, and updates the already confirmed transfer to "confirmed"'; 175 176 177 CREATE OR REPLACE FUNCTION merchant_deposits_insert_statistics_trigger() 178 RETURNS TRIGGER 179 LANGUAGE plpgsql 180 AS $$ 181 BEGIN 182 CALL merchant_do_bump_amount_stat 183 ('deposits-received' 184 ,CURRENT_TIMESTAMP(0)::TIMESTAMP 185 ,NEW.amount_with_fee); 186 CALL merchant_do_bump_amount_stat 187 ('deposits-fees-paid' 188 ,CURRENT_TIMESTAMP(0)::TIMESTAMP 189 ,NEW.deposit_fee); 190 RETURN NEW; 191 END $$; 192 193 194 CREATE OR REPLACE FUNCTION merchant_expected_transfers_insert_statistics_trigger() 195 RETURNS TRIGGER 196 LANGUAGE plpgsql 197 AS $$ 198 BEGIN 199 IF NEW.wire_fee IS NOT NULL 200 THEN 201 CALL merchant_do_bump_amount_stat 202 ('wire-fees-paid' 203 ,CURRENT_TIMESTAMP(0)::TIMESTAMP 204 ,NEW.wire_fee); 205 END IF; 206 RETURN NEW; 207 END $$; 208 209 210 CREATE OR REPLACE FUNCTION merchant_expected_transfers_update_statistics_trigger() 211 RETURNS TRIGGER 212 LANGUAGE plpgsql 213 AS $$ 214 BEGIN 215 IF NEW.wire_fee IS NOT NULL AND OLD.wire_fee IS NULL 216 THEN 217 CALL merchant_do_bump_amount_stat 218 ('wire-fees-paid' 219 ,CURRENT_TIMESTAMP(0)::TIMESTAMP 220 ,NEW.wire_fee); 221 END IF; 222 RETURN NEW; 223 END $$; 224 225 226 CREATE OR REPLACE FUNCTION merchant_kyc_insert_trigger() 227 RETURNS TRIGGER 228 LANGUAGE plpgsql 229 AS $$ 230 BEGIN 231 CALL merchant_send_kyc_notification(NEW.account_serial, 232 NEW.exchange_url); 233 RETURN NEW; 234 END $$; 235 236 CREATE OR REPLACE FUNCTION merchant_kyc_update_trigger() 237 RETURNS TRIGGER 238 LANGUAGE plpgsql 239 AS $$ 240 BEGIN 241 CALL merchant_send_kyc_notification(NEW.account_serial, 242 NEW.exchange_url); 243 RETURN NEW; 244 END $$;