From c657fdccbfad0c6356c592299561a8b78f2c1945 Mon Sep 17 00:00:00 2001 From: George Schena Date: Tue, 27 Aug 2024 16:14:19 +0100 Subject: [PATCH] Implement interruption pages for ENIC --- .../review_enic_interruption_controller.rb | 24 ++++ app/models/application_form.rb | 14 ++ .../_not_needed.html.erb | 16 +++ .../_waiting_maybe.html.erb | 20 +++ .../review_enic_interruption/show.html.erb | 10 ++ .../review_interruption/show.html.erb | 7 +- config/routes/candidate.rb | 1 + spec/models/application_form_spec.rb | 35 +++++ ...pplication_wiith_enic_interruption_spec.rb | 123 ++++++++++++++++++ 9 files changed, 249 insertions(+), 1 deletion(-) create mode 100644 app/controllers/candidate_interface/course_choices/review_enic_interruption_controller.rb create mode 100644 app/views/candidate_interface/course_choices/review_enic_interruption/_not_needed.html.erb create mode 100644 app/views/candidate_interface/course_choices/review_enic_interruption/_waiting_maybe.html.erb create mode 100644 app/views/candidate_interface/course_choices/review_enic_interruption/show.html.erb create mode 100644 spec/system/candidate_interface/submitting/candidate_submitting_application_wiith_enic_interruption_spec.rb diff --git a/app/controllers/candidate_interface/course_choices/review_enic_interruption_controller.rb b/app/controllers/candidate_interface/course_choices/review_enic_interruption_controller.rb new file mode 100644 index 00000000000..843b4a698cc --- /dev/null +++ b/app/controllers/candidate_interface/course_choices/review_enic_interruption_controller.rb @@ -0,0 +1,24 @@ +module CandidateInterface + module CourseChoices + class ReviewEnicInterruptionController < CandidateInterface::CourseChoices::BaseController + before_action :redirect_to_your_applications_if_submitted + before_action :viewed_enic_interruption_page, only: :show + + def show + set_enic_reviewed_cookie + end + + private + + def viewed_enic_interruption_page + if cookies[:viewed_enic_interruption_page] == 'true' + redirect_to candidate_interface_course_choices_course_review_and_submit_path(@application_choice.id) + end + end + + def set_enic_reviewed_cookie + cookies[:viewed_enic_interruption_page] = { value: 'true' } + end + end + end +end diff --git a/app/models/application_form.rb b/app/models/application_form.rb index 1efd14612c7..1ae44245003 100644 --- a/app/models/application_form.rb +++ b/app/models/application_form.rb @@ -206,6 +206,20 @@ def touch_choices application_choices.touch_all end + def any_qualification_enic_reason_not_needed? + return false if application_qualifications.empty? + + application_qualifications.all?(&:enic_reason_not_needed?) + end + + def qualifications_enic_reasons_waiting_or_maybe? + return false if application_qualifications.empty? + + application_qualifications.count do |qualification| + qualification.enic_reason_waiting? || qualification.enic_reason_maybe? + end >= 1 + end + def missing_enic_reference_for_non_uk_qualifications? @missing_enic_reference_for_non_uk_qualifications ||= application_qualifications .where.not(institution_country: 'GB') diff --git a/app/views/candidate_interface/course_choices/review_enic_interruption/_not_needed.html.erb b/app/views/candidate_interface/course_choices/review_enic_interruption/_not_needed.html.erb new file mode 100644 index 00000000000..e550c2d5086 --- /dev/null +++ b/app/views/candidate_interface/course_choices/review_enic_interruption/_not_needed.html.erb @@ -0,0 +1,16 @@ +
+
+
+

You have not included a UK ENIC reference number

+ +

Including a UK ENIC reference number in your application makes youn around 30% more likely to receive an offer.

+

If you apply for a UK ENIC statement of comparability (opens in new tab) <%= govuk_link_to('save this application as a draft', candidate_interface_course_choices_course_review_path(current_application.id)) %> and include the reference number in your application it makes it easier for training providers to understand your qualifications.

+

If you don’t include a UK ENIC statement of comparability and the provider asks for one, it could cause delays.

+
+ +
+ <%= govuk_button_to('Continue without a UK ENIC number', candidate_interface_course_choices_course_review_and_submit_path(@application_choice.id), method: :get) %> + <%= govuk_link_to('Save this application as a draft', candidate_interface_course_choices_course_review_path(current_application.id)) %> +
+
+
diff --git a/app/views/candidate_interface/course_choices/review_enic_interruption/_waiting_maybe.html.erb b/app/views/candidate_interface/course_choices/review_enic_interruption/_waiting_maybe.html.erb new file mode 100644 index 00000000000..339b58b62fc --- /dev/null +++ b/app/views/candidate_interface/course_choices/review_enic_interruption/_waiting_maybe.html.erb @@ -0,0 +1,20 @@ +
+
+
+

You have not included a UK ENIC reference number

+ +

+ You have said you had, or planned. to <%= govuk_link_to('apply for a statement of comparability from UK ENIC (opens in new tab)', 'https://www.enic.org.uk/Qualifications/SOC/Default.aspx') %> + but you have not added the reference number to this application. +

+

If you have a UK ENIC reference number, you should add it to your qualifications details.

+

If you are still waiting then you can <%= govuk_link_to('save this application as a draft', candidate_interface_course_choices_course_review_path(current_application.id)) %> and come back to add your UK ENIC reference number later.

+

You can also submit your application without the UK ENIC reference number and contact the training provider when it arrives.

+
+ +
+ <%= govuk_button_to('Enter a UK ENIC number', candidate_interface_continuous_applications_details_path, method: :get) %> + <%= govuk_link_to('Continue without adding a UK ENIC number', candidate_interface_course_choices_course_review_and_submit_path(@application_choice.id)) %> +
+
+
diff --git a/app/views/candidate_interface/course_choices/review_enic_interruption/show.html.erb b/app/views/candidate_interface/course_choices/review_enic_interruption/show.html.erb new file mode 100644 index 00000000000..e2b9220e302 --- /dev/null +++ b/app/views/candidate_interface/course_choices/review_enic_interruption/show.html.erb @@ -0,0 +1,10 @@ +<% content_for :title, t('page_titles.application_review_and_submit', provider_name: @application_choice.provider.name) %> +<% content_for(:before_content, govuk_back_link_to(candidate_interface_continuous_applications_choices_path)) %> + +<% if current_application.qualifications_enic_reasons_waiting_or_maybe? %> + <%= render 'waiting_maybe' %> +<% end %> + +<% if current_application.any_qualification_enic_reason_not_needed? %> + <%= render 'not_needed' %> +<% end %> diff --git a/app/views/candidate_interface/course_choices/review_interruption/show.html.erb b/app/views/candidate_interface/course_choices/review_interruption/show.html.erb index 140abe07f2b..7ec53f67d1b 100644 --- a/app/views/candidate_interface/course_choices/review_interruption/show.html.erb +++ b/app/views/candidate_interface/course_choices/review_interruption/show.html.erb @@ -18,7 +18,12 @@ <%= govuk_button_to('Edit your personal statement', candidate_interface_edit_becoming_a_teacher_path, method: :get) %> - <%= govuk_link_to('Continue without editing', candidate_interface_course_choices_course_review_and_submit_path(@application_choice.id)) %> + + <% if current_application.qualifications_enic_reasons_waiting_or_maybe? || current_application.any_qualification_enic_reason_not_needed? %> + <%= govuk_link_to('Continue without editing', candidate_interface_course_choices_course_review_enic_interruption_path(@application_choice.id)) %> + <% else %> + <%= govuk_link_to('Continue without editing', candidate_interface_course_choices_course_review_and_submit_path(@application_choice.id)) %> + <% end %> diff --git a/config/routes/candidate.rb b/config/routes/candidate.rb index c0989c408bc..9f6e0b1fa6c 100644 --- a/config/routes/candidate.rb +++ b/config/routes/candidate.rb @@ -361,6 +361,7 @@ get '/:application_choice_id/review' => 'course_choices/review#show', as: :course_choices_course_review get '/:application_choice_id/review-interruption' => 'course_choices/review_interruption#show', as: :course_choices_course_review_interruption + get '/:application_choice_id/review-enic-interruption' => 'course_choices/review_enic_interruption#show', as: :course_choices_course_review_enic_interruption get '/:application_choice_id/review-and-submit' => 'course_choices/review_and_submit#show', as: :course_choices_course_review_and_submit get '/blocked-submissions' => 'course_choices/blocked_submissions#show', as: :course_choices_blocked_submissions diff --git a/spec/models/application_form_spec.rb b/spec/models/application_form_spec.rb index 51da341c2ca..68598a5c8b7 100644 --- a/spec/models/application_form_spec.rb +++ b/spec/models/application_form_spec.rb @@ -333,6 +333,41 @@ end end + describe '#qualifications_enic_reasons_waiting_or_maybe?' do + it 'returns true if 1 or more qualifications have an enic_reason of waiting or maybe' do + application_form = create(:application_form) + create(:degree_qualification, enic_reference: '12345', institution_country: 'GB', enic_reason: 'waiting', application_form: application_form) + + expect(application_form.qualifications_enic_reasons_waiting_or_maybe?).to be(true) + end + + it 'returns false if no qualifications have an enic_reason of waiting or maybe' do + application_form = create(:application_form) + create(:degree_qualification, enic_reference: '12345', institution_country: 'GB', enic_reason: 'not_needed', application_form: application_form) + + expect(application_form.qualifications_enic_reasons_waiting_or_maybe?).to be(false) + end + end + + describe '#any_qualification_enic_reason_not_needed?' do + it 'returns true if ALL qualifications have an enic_reason of not_needed' do + application_form = create(:application_form) + create(:degree_qualification, enic_reference: '12345', institution_country: 'GB', enic_reason: 'not_needed', application_form: application_form) + create(:degree_qualification, enic_reference: '12346', institution_country: 'GB', enic_reason: 'not_needed', application_form: application_form) + create(:degree_qualification, enic_reference: '12347', institution_country: 'GB', enic_reason: 'not_needed', application_form: application_form) + + expect(application_form.any_qualification_enic_reason_not_needed?).to be(true) + end + + it 'returns false if any qualification has an enic_reason that is not_needed' do + application_form = create(:application_form) + create(:degree_qualification, enic_reference: '12345', institution_country: 'GB', enic_reason: 'not_needed', application_form: application_form) + create(:degree_qualification, enic_reference: '12348', institution_country: 'GB', enic_reason: 'obtained', application_form: application_form) + + expect(application_form.qualifications_enic_reasons_waiting_or_maybe?).to be(false) + end + end + describe '#missing_enic_reference_for_non_uk_qualifications?' do it 'returns false if there are no application_qualifications which are non_uk and have no enic_reference' do application_form = create(:application_form) diff --git a/spec/system/candidate_interface/submitting/candidate_submitting_application_wiith_enic_interruption_spec.rb b/spec/system/candidate_interface/submitting/candidate_submitting_application_wiith_enic_interruption_spec.rb new file mode 100644 index 00000000000..bf83a6ca489 --- /dev/null +++ b/spec/system/candidate_interface/submitting/candidate_submitting_application_wiith_enic_interruption_spec.rb @@ -0,0 +1,123 @@ +require 'rails_helper' + +RSpec.describe 'Candidate submits the application with enic interruption pages' do + include CandidateHelper + include SignInHelper + + scenario 'Candidate submits an application with all applications having an enic_reason of not_needed', :js do + given_i_am_signed_in + + when_i_have_completed_my_application_and_have_added_primary_as_a_course_choice_with_not_needed_qualification + and_i_continue_with_my_application + + when_i_save_as_draft + and_i_am_redirected_to_the_application_dashboard + and_my_application_is_still_unsubmitted + and_i_continue_with_my_application + + when_i_click_to_review_my_application + then_i_see_a_interruption_page_for_personal_statement + when_i_continue_without_editing + then_i_see_a_interruption_page_for_not_needed_enic + then_the_viewed_enic_interruption_page_cookie_to_be_set + end + + scenario 'Candidate submits an application with an application having an enic_reason of maybe', :js do + given_i_am_signed_in + + when_i_have_completed_my_application_and_have_added_primary_as_a_course_choice_with_waiting_or_maybe_qualification + and_i_continue_with_my_application + + when_i_save_as_draft + and_i_am_redirected_to_the_application_dashboard + and_my_application_is_still_unsubmitted + and_i_continue_with_my_application + + when_i_click_to_review_my_application + then_i_see_a_interruption_page_for_personal_statement + when_i_continue_without_editing + then_i_see_a_interruption_page_for_waiting_or_maybe_enic + then_the_viewed_enic_interruption_page_cookie_to_be_set + end + + def when_i_have_completed_my_application_and_have_added_primary_as_a_course_choice_with_not_needed_qualification + given_i_have_a_primary_course_choice(application_form_completed: true) + add_not_needed_qualification + end + + def when_i_have_completed_my_application_and_have_added_primary_as_a_course_choice_with_waiting_or_maybe_qualification + given_i_have_a_primary_course_choice(application_form_completed: true) + add_waiting_or_maybe_qualification + end + + def given_i_have_a_primary_course_choice(application_form_completed:) + completed_section_trait = application_form_completed.present? ? :completed : :minimum_info + + @provider = create(:provider, name: 'Gorse SCITT', code: '1N1') + site = create( + :site, + name: 'Main site', + code: '-', + provider: @provider, + address_line1: 'Gorse SCITT', + address_line2: 'C/O The Bruntcliffe Academy', + address_line3: 'Bruntcliffe Lane', + address_line4: 'MORLEY, lEEDS', + postcode: 'LS27 0LZ', + ) + @course = create(:course, :open, name: 'Primary', code: '2XT2', provider: @provider) + @course_option = create(:course_option, site:, course: @course) + current_candidate.application_forms.delete_all + current_candidate.application_forms << build(:application_form, completed_section_trait, becoming_a_teacher: 'I want to teach') + @application_choice = create(:application_choice, :unsubmitted, course_option: @course_option, application_form: current_candidate.current_application) + end + + def add_not_needed_qualification + @application_choice.application_form.application_qualifications << build(:application_qualification, enic_reason: 'not_needed') + end + + def add_waiting_or_maybe_qualification + @application_choice.application_form.application_qualifications << build(:application_qualification, enic_reason: 'maybe') + end + + def when_i_save_as_draft + click_link_or_button 'Save as draft' + end + + def and_my_application_is_still_unsubmitted + expect(@application_choice.reload).to be_unsubmitted + end + + def and_i_am_redirected_to_the_application_dashboard + expect(page).to have_content t('page_titles.application_dashboard') + expect(page).to have_content 'Gorse SCITT' + end + + def when_i_go_back + click_link_or_button 'Back' + end + + def then_i_see_a_interruption_page_for_personal_statement + expect(page).to have_content 'Your personal statement is 4 words.' + end + + def then_i_see_a_interruption_page_for_not_needed_enic + expect(page).to have_content 'You have not included a UK ENIC reference number' + expect(page).to have_content 'Including a UK ENIC reference number in your application makes youn around 30% more likely to receive an offer.' + expect(page).to have_current_path( + candidate_interface_course_choices_course_review_enic_interruption_path(@application_choice.id), + ) + end + + def then_i_see_a_interruption_page_for_waiting_or_maybe_enic + expect(page).to have_content 'You have not included a UK ENIC reference number' + expect(page).to have_content 'If you have a UK ENIC reference number, you should add it to your qualifications details.' + expect(page).to have_current_path( + candidate_interface_course_choices_course_review_enic_interruption_path(@application_choice.id), + ) + end + + def then_the_viewed_enic_interruption_page_cookie_to_be_set + expect(page.driver.browser.manage.cookie_named('viewed_enic_interruption_page')[:value]).to eq('true') + end +end