We only want two statuses for expense: not yet paid (pending), and paid. Thus, it is a bit different from quotes and invoices, because expenses do not pass throw the “workflow” of created→sent→{pending,paid}. That’s way in this case the status field is already in the new expense form, instead of hidden, and by pending is not equivalent to created but unpaid (i.e., the same status color). With the new select field in the form, the file field no longer can span two columns or it would be alone on the next row. Closes #67.
104 lines
4.2 KiB
PL/PgSQL
104 lines
4.2 KiB
PL/PgSQL
-- Test edit_expense
|
||
set client_min_messages to warning;
|
||
create extension if not exists pgtap;
|
||
reset client_min_messages;
|
||
|
||
begin;
|
||
|
||
select plan(13);
|
||
|
||
set search_path to auth, numerus, public;
|
||
|
||
select has_function('numerus', 'edit_expense', array ['uuid', 'text', 'date', 'integer', 'text', 'text', 'integer[]', 'tag_name[]']);
|
||
select function_lang_is('numerus', 'edit_expense', array ['uuid', 'text', 'date', 'integer', 'text', 'text', 'integer[]', 'tag_name[]'], 'plpgsql');
|
||
select function_returns('numerus', 'edit_expense', array ['uuid', 'text', 'date', 'integer', 'text', 'text', 'integer[]', 'tag_name[]'], 'uuid');
|
||
select isnt_definer('numerus', 'edit_expense', array ['uuid', 'text', 'date', 'integer', 'text', 'text', 'integer[]', 'tag_name[]']);
|
||
select volatility_is('numerus', 'edit_expense', array ['uuid', 'text', 'date', 'integer', 'text', 'text', 'integer[]', 'tag_name[]'], 'volatile');
|
||
select function_privs_are('numerus', 'edit_expense', array ['uuid', 'text', 'date', 'integer', 'text', 'text', 'integer[]', 'tag_name[]'], 'guest', array []::text[]);
|
||
select function_privs_are('numerus', 'edit_expense', array ['uuid', 'text', 'date', 'integer', 'text', 'text', 'integer[]', 'tag_name[]'], 'invoicer', array ['EXECUTE']);
|
||
select function_privs_are('numerus', 'edit_expense', array ['uuid', 'text', 'date', 'integer', 'text', 'text', 'integer[]', 'tag_name[]'], 'admin', array ['EXECUTE']);
|
||
select function_privs_are('numerus', 'edit_expense', array ['uuid', 'text', 'date', 'integer', 'text', 'text', 'integer[]', 'tag_name[]'], 'authenticator', array []::text[]);
|
||
|
||
|
||
set client_min_messages to warning;
|
||
truncate expense_tax cascade;
|
||
truncate expense cascade;
|
||
truncate contact cascade;
|
||
truncate tax cascade;
|
||
truncate tax_class cascade;
|
||
truncate payment_method cascade;
|
||
truncate company cascade;
|
||
reset client_min_messages;
|
||
|
||
|
||
set constraints "company_default_payment_method_id_fkey" deferred;
|
||
|
||
insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code, default_payment_method_id)
|
||
values (1, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR', 111)
|
||
;
|
||
|
||
insert into payment_method (payment_method_id, company_id, name, instructions)
|
||
values (111, 1, 'cash', 'cash')
|
||
, (112, 1, 'bank', 'send money to my bank account')
|
||
;
|
||
|
||
set constraints "company_default_payment_method_id_fkey" immediate;
|
||
|
||
insert into tax_class (tax_class_id, company_id, name)
|
||
values (11, 1, 'tax')
|
||
;
|
||
|
||
insert into tax (tax_id, company_id, tax_class_id, name, rate)
|
||
values (3, 1, 11, 'IRPF -15 %', -0.15)
|
||
, (4, 1, 11, 'IVA 21 %', 0.21)
|
||
;
|
||
|
||
insert into contact (contact_id, company_id, name)
|
||
values (12, 1, 'Contact 2.1')
|
||
, (13, 1, 'Contact 2.2')
|
||
;
|
||
|
||
insert into expense (expense_id, company_id, slug, invoice_number, invoice_date, contact_id, amount, currency_code, expense_status, tags)
|
||
values (15, 1, '7ac3ae0e-b0c1-4206-a19b-0be20835edd4', 'INV1', '2023-05-04', 12, 111, 'EUR', 'pending', '{tag1}')
|
||
, (16, 1, 'b57b980b-247b-4be4-a0b7-03a7819c53ae', 'INV2', '2023-05-05', 13, 222, 'EUR', 'paid', '{tag2}')
|
||
;
|
||
|
||
insert into expense_tax (expense_id, tax_id, tax_rate)
|
||
values (15, 4, 0.21)
|
||
, (15, 3, -0.07)
|
||
, (16, 4, 0.20)
|
||
;
|
||
|
||
select lives_ok(
|
||
$$ select edit_expense('7ac3ae0e-b0c1-4206-a19b-0be20835edd4', 'paid', '2023-05-06', 13, 'INV11', '1.12', '{4}', array['tag1']) $$,
|
||
'Should be able to edit the first expense'
|
||
);
|
||
|
||
select lives_ok(
|
||
$$ select edit_expense('b57b980b-247b-4be4-a0b7-03a7819c53ae', 'pending', '2023-05-07', 12, 'INV22', '3.33', '{4,3}', array['tag1', 'tag3']) $$,
|
||
'Should be able to edit the second expense'
|
||
);
|
||
|
||
select bag_eq(
|
||
$$ select invoice_number, invoice_date, contact_id, amount, expense_status, tags from expense $$,
|
||
$$ values ('INV11', '2023-05-06'::date, 13, 112, 'paid', '{tag1}'::tag_name[])
|
||
, ('INV22', '2023-05-07'::date, 12, 333, 'pending', '{tag1,tag3}'::tag_name[])
|
||
$$,
|
||
'Should have updated all expenses'
|
||
);
|
||
|
||
select bag_eq(
|
||
$$ select invoice_number, tax_id, tax_rate from expense_tax join expense using (expense_id) $$,
|
||
$$ values ('INV11', 4, 0.21)
|
||
, ('INV22', 3, -0.15)
|
||
, ('INV22', 4, 0.21)
|
||
$$,
|
||
'Should have updated all expense taxes, added new ones, and removed the ones not given to the function'
|
||
);
|
||
|
||
|
||
select *
|
||
from finish();
|
||
|
||
rollback;
|