camper/deploy/process_payment_response.sql

90 lines
2.5 KiB
PL/PgSQL

-- Deploy camper:process_payment_response to pg
-- requires: roles
-- requires: schema_camper
-- requires: redsys_response
-- requires: payment
-- requires: payment_redsys_response
-- requires: parse_price
-- requires: currency
begin;
set search_path to camper, public;
create or replace function process_payment_response(payment_slug uuid, response redsys_response) returns text as
$$
declare
pid integer;
next_status text;
begin
if response.transaction_type <> 0 then
raise invalid_parameter_value using message = response.transaction_type || ' is not a processable transaction type';
end if;
update payment
set payment_status = case when response.response_code < 100 then 'completed' else 'failed' end
, updated_at = current_timestamp
where slug = payment_slug
and payment_status in ('pending', 'failed')
returning payment_id, payment_status
into pid, next_status;
if pid is null then
return '';
end if;
insert into payment_redsys_response (
payment_id
, response_code
, date_time
, secure_payment
, transaction_type
, amount
, currency_code
, order_number
, authorization_code
, merchant_code
, terminal_number
, error_code
)
select pid
, response.response_code
, response.date_time
, response.secure_payment
, response.transaction_type
, parse_price(response.amount, decimal_digits)
, response.currency_code
, response.order_number
, response.authorization_code
, response.merchant_code
, response.terminal_number
, response.error_code
from currency
where currency.currency_code = response.currency_code
on conflict (payment_id) do update
set response_code = excluded.response_code
, date_time = excluded.date_time
, secure_payment = excluded.secure_payment
, transaction_type = excluded.transaction_type
, amount = excluded.amount
, currency_code = excluded.currency_code
, order_number = excluded.order_number
, authorization_code = excluded.authorization_code
, merchant_code = excluded.merchant_code
, terminal_number = excluded.terminal_number
, error_code = excluded.error_code
;
return next_status;
end;
$$
language plpgsql
;
revoke execute on function process_payment_response(uuid, redsys_response) from public;
grant execute on function process_payment_response(uuid, redsys_response) to guest;
grant execute on function process_payment_response(uuid, redsys_response) to employee;
grant execute on function process_payment_response(uuid, redsys_response) to admin;
commit;