-- Deploy numerus:edit_payment to pg
-- requires: roles
-- requires: schema_numerus
-- requires: payment
-- requires: expense_payment
-- requires: currency
-- requires: parse_price
-- requires: tag_name
-- requires: update_expense_payment_status

begin;

set search_path to numerus, public;

create or replace function edit_payment(payment_slug uuid, payment_date date, payment_account_id integer, description text, amount text, tags tag_name[]) returns uuid as
$$
declare
	pid integer;
	eid integer;
	amount_cents integer;
begin
	update payment
	set payment_date = edit_payment.payment_date
	  , payment_account_id = edit_payment.payment_account_id
	  , description = edit_payment.description
	  , amount = parse_price(edit_payment.amount, decimal_digits)
	  , tags = edit_payment.tags
	from currency
	where slug = payment_slug
	and currency.currency_code = payment.currency_code
	returning payment_id, payment.amount
	into pid, amount_cents
	;

	select expense_id into eid
	from expense_payment
	where payment_id = pid;

	if eid is not null then
		perform update_expense_payment_status(pid, eid, amount_cents);
	end if;

	return payment_slug;
end
$$
	language plpgsql
;

revoke execute on function edit_payment(uuid, date, integer, text, text, tag_name[]) from public;
grant execute on function edit_payment(uuid, date, integer, text, text, tag_name[]) to invoicer;
grant execute on function edit_payment(uuid, date, integer, text, text, tag_name[]) to admin;

commit;