68 lines
1.7 KiB
PL/PgSQL
68 lines
1.7 KiB
PL/PgSQL
-- Deploy numerus:add_payment to pg
|
||
-- requires: roles
|
||
-- requires: schema_numerus
|
||
-- requires: payment
|
||
-- requires: expense_payment
|
||
-- requires: company
|
||
-- requires: currency
|
||
-- requires: parse_price
|
||
-- requires: tag_name
|
||
-- requires: update_expense_payment_status
|
||
|
||
begin;
|
||
|
||
set search_path to numerus, public;
|
||
|
||
create or replace function add_payment(company integer, expense_id integer, payment_date date, payment_account_id integer, description text, amount text, tags tag_name[]) returns uuid as
|
||
$$
|
||
declare
|
||
pslug uuid;
|
||
pid integer;
|
||
amount_cents integer;
|
||
begin
|
||
insert into payment
|
||
( company_id
|
||
, payment_account_id
|
||
, description
|
||
, payment_date
|
||
, amount
|
||
, currency_code
|
||
, payment_status
|
||
, tags
|
||
)
|
||
select company_id
|
||
, payment_account_id
|
||
, description
|
||
, payment_date
|
||
, parse_price(amount, currency.decimal_digits)
|
||
, currency_code
|
||
, 'complete'
|
||
, tags
|
||
from company
|
||
join currency using (currency_code)
|
||
where company.company_id = add_payment.company
|
||
returning payment_id, slug, payment.amount
|
||
into pid, pslug, amount_cents
|
||
;
|
||
|
||
if expense_id is not null then
|
||
-- must be inserted before updating statuses, so that it can see this
|
||
-- payment’s amount too.
|
||
insert into expense_payment (expense_id, payment_id)
|
||
values (expense_id, pid);
|
||
|
||
perform update_expense_payment_status(pid, expense_id, amount_cents);
|
||
end if;
|
||
|
||
return pslug;
|
||
end
|
||
$$
|
||
language plpgsql
|
||
;
|
||
|
||
revoke execute on function add_payment(integer, integer, date, integer, text, text, tag_name[]) from public;
|
||
grant execute on function add_payment(integer, integer, date, integer, text, text, tag_name[]) to invoicer;
|
||
grant execute on function add_payment(integer, integer, date, integer, text, text, tag_name[]) to admin;
|
||
|
||
commit;
|