Skip to content

Commit

Permalink
feat(db): allow creation of new application revisions when window closed
Browse files Browse the repository at this point in the history
This only allows new revisions where version_number > 1
  • Loading branch information
matthieu-foucault committed Sep 1, 2020
1 parent da8ed73 commit d994824
Show file tree
Hide file tree
Showing 13 changed files with 370 additions and 29 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ begin
values (application_id_input, new_version_number);

select reporting_year from ggircs_portal.opened_reporting_year() into current_reporting_year;
if current_reporting_year is null then
if new_version_number <= 1 and current_reporting_year is null then
raise exception 'The application window is closed';
end if;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
-- Deploy ggircs-portal:function_create_application_revision_mutation_chain to pg
-- requires: table_application_revision_status

begin;

create or replace function ggircs_portal.create_application_revision_mutation_chain(application_id_input int, last_revision_id_input int)
returns ggircs_portal.application_revision
as $function$
declare
new_version_number int;
form_result_id int;
current_reporting_year int;
temp_row record;
form_result jsonb;
init_function varchar(1000);
query text;
result ggircs_portal.application_revision;
facility_id_input int;
has_swrs_data boolean default false;
begin
new_version_number := last_revision_id_input + 1;

-- Insert new row in application_revision
insert into ggircs_portal.application_revision(application_id, version_number)
values (application_id_input, new_version_number);

select reporting_year from ggircs_portal.opened_reporting_year() into current_reporting_year;
if current_reporting_year is null then
raise exception 'The application window is closed';
end if;

-- Insert new value with application_id fk and version 1 into application_revision_status
insert into ggircs_portal.application_revision_status(application_id, version_number, application_revision_status)
values (application_id_input, new_version_number, 'draft');

select facility_id from ggircs_portal.application where id = application_id_input into facility_id_input;

for temp_row in
select form_id from ggircs_portal.ciip_application_wizard
loop
-- Populate new revision of form_results with data from previous result on new revision creation
if last_revision_id_input > 0 then
select fr.form_result from ggircs_portal.form_result fr
where fr.form_id = temp_row.form_id
and fr.application_id = application_id_input
and fr.version_number=last_revision_id_input
into form_result;

else
-- Populate initial version of application form results with data from swrs or empty results
if ((select fj.name from ggircs_portal.form_json as fj where temp_row.form_id = fj.id) in ('Production', 'fuel')) then
form_result='[{}]';
else
form_result = '{}';
end if;
if (select prepopulate_from_swrs from ggircs_portal.form_json where id = temp_row.form_id) then
select form_result_init_function from ggircs_portal.form_json where id = temp_row.form_id into init_function;
if (init_function is not null) then
query := format('select * from ggircs_portal.%I($1, $2);', init_function);
execute query
using facility_id_input, current_reporting_year
into form_result;
end if;
end if;

end if;

-- loop over what is in the wizard, not the forms in case some forms get added/disabled etc
insert into ggircs_portal.form_result(form_id, application_id, version_number, form_result)
values (temp_row.form_id, application_id_input, new_version_number, form_result) returning id into form_result_id;

if last_revision_id_input = 0 then
-- Create form result statuses
insert into ggircs_portal.form_result_status(application_id, form_id, form_result_status)
values (application_id_input, temp_row.form_id, 'in review');
end if;

end loop;

-- If the application's facility has a report_id then there is a swrs report.
if (exists(select id from ggircs_portal.facility where id=facility_id_input and report_id is not null)
and last_revision_id_input = 0) then
has_swrs_data := true;
end if;

-- Create a duplicate revision 'version 0' with form_results if has_swrs_data = true;
if (has_swrs_data) then
insert into ggircs_portal.application_revision(application_id, version_number)
values (application_id_input, 0);
insert into ggircs_portal.application_revision_status(application_id, version_number, application_revision_status)
values (application_id_input, 0, 'submitted');
for temp_row in
select form_id from ggircs_portal.ciip_application_wizard
loop
insert into ggircs_portal.form_result(form_id, application_id, version_number, form_result)
values (temp_row.form_id, application_id_input, 0, (select fr.form_result
from ggircs_portal.form_result fr
where fr.application_id = application_id_input
and fr.form_id = temp_row.form_id
and fr.version_number = 1));
end loop;
end if;

select * from ggircs_portal.application_revision where application_id = application_id_input and version_number = new_version_number into result;
return result;
end;
$function$ language plpgsql strict volatile;

grant execute on function ggircs_portal.create_application_revision_mutation_chain to ciip_administrator, ciip_analyst, ciip_industry_user;

commit;
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ begin;
create or replace function ggircs_portal_private.ensure_window_open_submit_application_status()
returns trigger as $$
begin
if (select reporting_year from ggircs_portal.opened_reporting_year()) is null then
if (select reporting_year from ggircs_portal.opened_reporting_year()) is null and new.version_number <= 1 then
if (new.application_revision_status = 'submitted') then
raise exception 'You cannot submit an application when the application window is closed';
end if;
Expand All @@ -19,6 +19,6 @@ create or replace function ggircs_portal_private.ensure_window_open_submit_appli

grant execute on function ggircs_portal_private.ensure_window_open_submit_application_status to ciip_administrator, ciip_analyst, ciip_industry_user;

comment on function ggircs_portal_private.ensure_window_open_submit_application_status is 'a trigger function that throws an exception if the application window is not opened and the new status is either "draft" or "submitted"';
comment on function ggircs_portal_private.ensure_window_open_submit_application_status is 'a trigger function that throws an exception if the application window is not opened, the application version number is <= 1, and the new status is either "draft" or "submitted"';

commit;
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
-- Deploy ggircs-portal:trigger_functions/ensure_window_open_submit_application_status to pg

begin;

create or replace function ggircs_portal_private.ensure_window_open_submit_application_status()
returns trigger as $$
begin
if (select reporting_year from ggircs_portal.opened_reporting_year()) is null then
if (new.application_revision_status = 'submitted') then
raise exception 'You cannot submit an application when the application window is closed';
end if;
if (new.application_revision_status = 'draft') then
raise exception 'You cannot start a draft when the application window is closed';
end if;
end if;
return new;
end;
$$ language plpgsql;

grant execute on function ggircs_portal_private.ensure_window_open_submit_application_status to ciip_administrator, ciip_analyst, ciip_industry_user;

comment on function ggircs_portal_private.ensure_window_open_submit_application_status is 'a trigger function that throws an exception if the application window is not opened and the new status is either "draft" or "submitted"';

commit;
108 changes: 106 additions & 2 deletions schema/revert/mutations/create_application_revision_mutation_chain.sql
Original file line number Diff line number Diff line change
@@ -1,7 +1,111 @@
-- Revert ggircs-portal:function_create_application_revision_mutation_chain from pg
-- Deploy ggircs-portal:function_create_application_revision_mutation_chain to pg
-- requires: table_application_revision_status

begin;

drop function ggircs_portal.create_application_revision_mutation_chain;
create or replace function ggircs_portal.create_application_revision_mutation_chain(application_id_input int, last_revision_id_input int)
returns ggircs_portal.application_revision
as $function$
declare
new_version_number int;
form_result_id int;
current_reporting_year int;
temp_row record;
form_result jsonb;
init_function varchar(1000);
query text;
result ggircs_portal.application_revision;
facility_id_input int;
has_swrs_data boolean default false;
begin
new_version_number := last_revision_id_input + 1;

-- Insert new row in application_revision
insert into ggircs_portal.application_revision(application_id, version_number)
values (application_id_input, new_version_number);

select reporting_year from ggircs_portal.opened_reporting_year() into current_reporting_year;
if current_reporting_year is null then
raise exception 'The application window is closed';
end if;

-- Insert new value with application_id fk and version 1 into application_revision_status
insert into ggircs_portal.application_revision_status(application_id, version_number, application_revision_status)
values (application_id_input, new_version_number, 'draft');

select facility_id from ggircs_portal.application where id = application_id_input into facility_id_input;

for temp_row in
select form_id from ggircs_portal.ciip_application_wizard
loop
-- Populate new revision of form_results with data from previous result on new revision creation
if last_revision_id_input > 0 then
select fr.form_result from ggircs_portal.form_result fr
where fr.form_id = temp_row.form_id
and fr.application_id = application_id_input
and fr.version_number=last_revision_id_input
into form_result;

else
-- Populate initial version of application form results with data from swrs or empty results
if ((select fj.name from ggircs_portal.form_json as fj where temp_row.form_id = fj.id) in ('Production', 'fuel')) then
form_result='[{}]';
else
form_result = '{}';
end if;
if (select prepopulate_from_swrs from ggircs_portal.form_json where id = temp_row.form_id) then
select form_result_init_function from ggircs_portal.form_json where id = temp_row.form_id into init_function;
if (init_function is not null) then
query := format('select * from ggircs_portal.%I($1, $2);', init_function);
execute query
using facility_id_input, current_reporting_year
into form_result;
end if;
end if;

end if;

-- loop over what is in the wizard, not the forms in case some forms get added/disabled etc
insert into ggircs_portal.form_result(form_id, application_id, version_number, form_result)
values (temp_row.form_id, application_id_input, new_version_number, form_result) returning id into form_result_id;

if last_revision_id_input = 0 then
-- Create form result statuses
insert into ggircs_portal.form_result_status(application_id, form_id, form_result_status)
values (application_id_input, temp_row.form_id, 'in review');
end if;

end loop;

-- If the application's facility has a report_id then there is a swrs report.
if (exists(select id from ggircs_portal.facility where id=facility_id_input and report_id is not null)
and last_revision_id_input = 0) then
has_swrs_data := true;
end if;

-- Create a duplicate revision 'version 0' with form_results if has_swrs_data = true;
if (has_swrs_data) then
insert into ggircs_portal.application_revision(application_id, version_number)
values (application_id_input, 0);
insert into ggircs_portal.application_revision_status(application_id, version_number, application_revision_status)
values (application_id_input, 0, 'submitted');
for temp_row in
select form_id from ggircs_portal.ciip_application_wizard
loop
insert into ggircs_portal.form_result(form_id, application_id, version_number, form_result)
values (temp_row.form_id, application_id_input, 0, (select fr.form_result
from ggircs_portal.form_result fr
where fr.application_id = application_id_input
and fr.form_id = temp_row.form_id
and fr.version_number = 1));
end loop;
end if;

select * from ggircs_portal.application_revision where application_id = application_id_input and version_number = new_version_number into result;
return result;
end;
$function$ language plpgsql strict volatile;

grant execute on function ggircs_portal.create_application_revision_mutation_chain to ciip_administrator, ciip_analyst, ciip_industry_user;

commit;
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
-- Revert ggircs-portal:function_create_application_revision_mutation_chain from pg

begin;

drop function ggircs_portal.create_application_revision_mutation_chain;

commit;
Original file line number Diff line number Diff line change
@@ -1,7 +1,24 @@
-- Revert ggircs-portal:trigger_functions/ensure_window_open_submit_application_status from pg
-- Deploy ggircs-portal:trigger_functions/ensure_window_open_submit_application_status to pg

begin;

drop function ggircs_portal_private.ensure_window_open_submit_application_status;
create or replace function ggircs_portal_private.ensure_window_open_submit_application_status()
returns trigger as $$
begin
if (select reporting_year from ggircs_portal.opened_reporting_year()) is null then
if (new.application_revision_status = 'submitted') then
raise exception 'You cannot submit an application when the application window is closed';
end if;
if (new.application_revision_status = 'draft') then
raise exception 'You cannot start a draft when the application window is closed';
end if;
end if;
return new;
end;
$$ language plpgsql;

grant execute on function ggircs_portal_private.ensure_window_open_submit_application_status to ciip_administrator, ciip_analyst, ciip_industry_user;

comment on function ggircs_portal_private.ensure_window_open_submit_application_status is 'a trigger function that throws an exception if the application window is not opened and the new status is either "draft" or "submitted"';

commit;
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
-- Revert ggircs-portal:trigger_functions/ensure_window_open_submit_application_status from pg

begin;

drop function ggircs_portal_private.ensure_window_open_submit_application_status;

commit;
2 changes: 2 additions & 0 deletions schema/sqitch.plan
Original file line number Diff line number Diff line change
Expand Up @@ -183,3 +183,5 @@ search_functions/search_certification_requests [search_functions/search_certific
policies/facility_policies [policies/facility_policies@v1.5.0] 2020-08-27T20:57:07Z Dylan Leard <dylan@button.is> # Migration: make certifier_email comparison case insensitive
@v1.6.1 2020-08-28T16:58:22Z Matthieu Foucault <matthieu@button.is> # release v1.6.1
search_functions/search_all_facilities [search_functions/search_all_facilities@v1.5.0] 2020-08-24T20:55:30Z Dylan Leard <dylan@button.is> # Migration: allow function to filter on different reporting years
trigger_functions/ensure_window_open_submit_application_status [trigger_functions/ensure_window_open_submit_application_status@v1.5.0] 2020-08-24T17:54:35Z Matthieu Foucault <matthieu@button.is> # Applications can be started or submitted when the window is closed if version > 1
mutations/create_application_revision_mutation_chain [mutations/create_application_revision_mutation_chain@v1.5.0] 2020-08-24T18:28:33Z Matthieu Foucault <matthieu@button.is> # allow revisions to be created when the window is closed if version_number > 1
Loading

0 comments on commit d994824

Please sign in to comment.