diff --git a/schema/deploy/trigger_functions/protect_date_overlap.sql b/schema/deploy/trigger_functions/protect_date_overlap.sql new file mode 100644 index 0000000000..a0e6d4349a --- /dev/null +++ b/schema/deploy/trigger_functions/protect_date_overlap.sql @@ -0,0 +1,31 @@ +-- Deploy ggircs-portal:trigger_functions/protect_date_overlap to pg +-- requires: schema_ggircs_portal_private + +begin; + create or replace function ggircs_portal_private.protect_date_overlap() + returns trigger as $$ + declare + temp_row record; + + begin + + for temp_row in + select * from ggircs_portal.reporting_year + loop + if (new.reporting_year != temp_row.year) then + if ((new.reporting_period_start between temp_row.reporting_period_start and temp_row.reporting_period_end) + or (new.reporting_period_end between temp_row.reporting_period_start and temp_row.reporting_period_end) + or (new.application_open_time between temp_row.application_open_time and temp_row.application_close_time) + or (new.application_close_time between temp_row.application_open_time and temp_row.application_close_time)) then + raise exception 'New date range entry overlaps with date range for reporting year %', temp_row.reporting_year; + end if; + end if; + end loop; + + return new; + end; + $$ language plpgsql volatile; + +comment on function ggircs_portal_private.protect_date_overlap is 'Trigger function excepts if a date range in reporting_year overlaps with another row'; + +commit; diff --git a/schema/revert/trigger_functions/protect_date_overlap.sql b/schema/revert/trigger_functions/protect_date_overlap.sql new file mode 100644 index 0000000000..3ba1793441 --- /dev/null +++ b/schema/revert/trigger_functions/protect_date_overlap.sql @@ -0,0 +1,7 @@ +-- Revert ggircs-portal:trigger_functions/protect_date_overlap from pg + +begin; + +drop function ggircs_portal_private.protect_date_overlap; + +commit; diff --git a/schema/sqitch.plan b/schema/sqitch.plan index 972ff343b6..090d5a61e4 100644 --- a/schema/sqitch.plan +++ b/schema/sqitch.plan @@ -197,4 +197,5 @@ computed_columns/application_revision_ciip_incentive [computed_columns/applicati @v1.10.1 2020-10-15T17:41:54Z Matthieu Foucault # release v1.10.1 @v1.11.0 2020-10-22T00:27:09Z Dylan Leard # release v1.11.0 function_current_timestamp [function_current_timestamp@v1.10.1] 2020-10-30T23:15:30Z Pierre Bastianelli # Change ggircs_portal.current_timestamp() to use the mockable now() call instead -@v1.12.0 2020-11-16T16:53:25Z Dylan Leard,,, # release v1.12.0 +@v1.12.0 2020-11-16T16:53:25Z Dylan Leard # release v1.12.0 +trigger_functions/protect_date_overlap [schema_ggircs_portal_private] 2020-11-25T19:17:30Z Dylan Leard # Trigger function to deny changes if a date range overlaps another diff --git a/schema/verify/trigger_functions/protect_date_overlap.sql b/schema/verify/trigger_functions/protect_date_overlap.sql new file mode 100644 index 0000000000..60046789d6 --- /dev/null +++ b/schema/verify/trigger_functions/protect_date_overlap.sql @@ -0,0 +1,7 @@ +-- Verify ggircs-portal:trigger_functions/protect_date_overlap on pg + +begin; + +select pg_get_functiondef('ggircs_portal_private.protect_date_overlap()'::regprocedure); + +rollback;