merchant

Merchant backend to process payments, run by merchants
Log | Files | Refs | Submodules | README | LICENSE

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 $$;