Skip to content

Commit

Permalink
ECP is ineligible if policy is closed
Browse files Browse the repository at this point in the history
This is additional functionality, so may want splitting out into a
separate PR, but it was requested as part of this ticket.
If the current acadmic year is after the ECP policy close date, then
selecting an ECP only school should show the claimant the ineligible
screen.
There's a slight bit of trickyness, the ECP::Eligibility model has an
enum for itt academic year, that only allows values for dates within
the ECP policy, or nil, adding a date outside this range throws an
error. The page sequences calls the claim submission form which
constructs an eligibility to check if the journey is completed, if the
user chooses an itt date that's outside the ECP policy range (possible
for future academic years) constructing the ecp eligibility throws an
error. To avoid this we're using the new `validate` option on enum, so
rather than throw an error when adding a date out side the range it now
generates a validation error. Some of the tests needed updating to add a
valid itt academic year as now ecp eligibility isn't valid if it's
missing the itt year.
  • Loading branch information
rjlynch committed Dec 11, 2024
1 parent e60be77 commit 5650863
Show file tree
Hide file tree
Showing 9 changed files with 149 additions and 14 deletions.
5 changes: 5 additions & 0 deletions app/models/concerns/eligibility_checkable.rb
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ def trainee_teacher?

def common_ineligible_attributes?
[
policy_closed?,
indicated_ineligible_school?,
supply_teacher_lacking_either_long_contract_or_direct_employment?,
poor_performance?,
Expand All @@ -59,6 +60,10 @@ def common_ineligible_attributes?
].any?
end

def policy_closed?
policy.closed?(claim_year)
end

def indicated_ineligible_school?
current_school.present? && !policy::SchoolEligibility.new(current_school).eligible?
end
Expand Down
4 changes: 4 additions & 0 deletions app/models/policies/early_career_payments.rb
Original file line number Diff line number Diff line change
Expand Up @@ -173,5 +173,9 @@ def future_years(year)
def selectable_itt_years_for_claim_year(claim_year)
(AcademicYear.new(claim_year - 5)...AcademicYear.new(claim_year)).to_a
end

def closed?(claim_year)
claim_year > POLICY_END_YEAR
end
end
end
2 changes: 1 addition & 1 deletion app/models/policies/early_career_payments/eligibility.rb
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ def policy
hsh[year] = AcademicYear::Type.new.serialize(year)
end.merge({AcademicYear.new => AcademicYear::Type.new.serialize(AcademicYear.new)})

enum :itt_academic_year, ITT_ACADEMIC_YEARS
enum :itt_academic_year, ITT_ACADEMIC_YEARS, validate: true

enum :qualification, {
postgraduate_itt: 0,
Expand Down
4 changes: 4 additions & 0 deletions app/models/policies/levelling_up_premium_payments.rb
Original file line number Diff line number Diff line change
Expand Up @@ -158,5 +158,9 @@ def future_years(year)
def selectable_itt_years_for_claim_year(claim_year)
(AcademicYear.new(claim_year - 5)...AcademicYear.new(claim_year)).to_a
end

def closed?(claim_year)
claim_year > POLICY_END_YEAR
end
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<p class="govuk-body">
You are not eligible for the
<%= link_to("early-career payment (opens in new tab)", Policies::EarlyCareerPayments.eligibility_criteria_url, class: "govuk-link", target: "_blank") %>
because the policy has now closed.
</p>
<p class="govuk-body">
You are not eligible for the
<%= link_to("#{I18n.t("levelling_up_premium_payments.policy_short_name").downcase} (opens in new tab)", Policies::LevellingUpPremiumPayments.eligibility_criteria_url, class: "govuk-link", target: "_blank") %>
because the school you teach in is not eligible. <%= I18n.t("levelling_up_premium_payments.policy_short_name").capitalize.pluralize %> are offered in schools identified as having a higher need for teachers.
</p>

<p class="govuk-body">
For more information, check the eligibility criteria for
<%= link_to("early-career payments", Policies::EarlyCareerPayments.eligibility_criteria_url, class: "govuk-link") %>
and
<%= link_to(I18n.t("levelling_up_premium_payments.policy_short_name").downcase.pluralize, Policies::LevellingUpPremiumPayments.eligibility_criteria_url, class: "govuk-link") %>.
</p>
13 changes: 12 additions & 1 deletion lib/ineligibility_reason_checker.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ def initialize(answers)
end

def reason
if current_school?
if ecp_only_and_ecp_closed?
:ecp_only_ecp_closed
elsif current_school?
:current_school
elsif dqt_data_ineligible?
:dqt_data_ineligible
Expand Down Expand Up @@ -41,6 +43,15 @@ def reason

private

def ecp_only_and_ecp_closed?
school = @answers.current_school

[
Policies::EarlyCareerPayments::SchoolEligibility.new(school).eligible?,
!Policies::LevellingUpPremiumPayments::SchoolEligibility.new(school).eligible?
].all? && Policies::EarlyCareerPayments.closed?(@answers.policy_year)
end

def current_school?
school = @answers.current_school

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@
factory :early_career_payments_eligibility, class: "Policies::EarlyCareerPayments::Eligibility" do
award_amount { 5000.0 }

itt_academic_year do
Journeys.for_policy(Policies::EarlyCareerPayments).configuration.current_academic_year - 3
end

trait :eligible do
teacher_reference_number { generate(:teacher_reference_number) }
eligible_now
Expand Down
86 changes: 84 additions & 2 deletions spec/features/combined_teacher_claim_journey_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@
end
let(:eligibility) { claim.eligibility }

before { create(:journey_configuration, :additional_payments, current_academic_year: AcademicYear.new(2023)) }

scenario "Eligible for both" do
create(:journey_configuration, :additional_payments, current_academic_year: AcademicYear.new(2023))

school = create(:school, :combined_journey_eligibile_for_all)

visit new_claim_path(Journeys::AdditionalPaymentsForTeaching::ROUTING_NAME)
Expand Down Expand Up @@ -243,6 +243,8 @@
end

scenario "Eligible for only one" do
create(:journey_configuration, :additional_payments, current_academic_year: AcademicYear.new(2023))

school = create(:school, :early_career_payments_uplifted)

visit new_claim_path(Journeys::AdditionalPaymentsForTeaching::ROUTING_NAME)
Expand Down Expand Up @@ -323,4 +325,84 @@
expect(page).not_to have_selector('input[type="radio"]')
expect(page).to have_button("Apply now")
end

context "when ECP is closed" do
before do
create(
:journey_configuration,
:additional_payments,
current_academic_year: AcademicYear.new(2025)
)
end

scenario "choosing an ecp only school is ineligible" do
school = create(:school, :early_career_payments_eligible)

visit new_claim_path(Journeys::AdditionalPaymentsForTeaching::ROUTING_NAME)

click_on "Continue without signing"

choose_school school

expect(page).to have_content "You are not eligible"
expect(page).to have_content "the policy has now closed"
end

scenario "choosing a lup eligible school allows completing the journey" do
school = create(:school, :combined_journey_eligibile_for_all)

visit new_claim_path(Journeys::AdditionalPaymentsForTeaching::ROUTING_NAME)

click_on "Continue without signing"

choose_school school
click_on "Continue"

# - Have you started your first year as a newly qualified teacher?
choose "Yes"
click_on "Continue"

# - Have you completed your induction as an early-career teacher?
choose "Yes"
click_on "Continue"

# - Are you currently employed as a supply teacher
choose "No"
click_on "Continue"

# - Poor performance
within all(".govuk-fieldset")[0] do
choose("No")
end
within all(".govuk-fieldset")[1] do
choose("No")
end
click_on "Continue"

# - What route into teaching did you take?
choose("Undergraduate initial teacher training (ITT)")
click_on "Continue"

# - In which academic year did you complete your undergraduate ITT?
choose("2024 to 2025")
click_on "Continue"

# - Which subject did you do your undergraduate ITT in
choose "Mathematics"
click_on "Continue"

# Do you spend at least half of your contracted hours teaching eligible
# subjects?
choose "Yes"
click_on "Continue"

# Check your answers
click_on "Continue"

expect(page).to have_content("You’re eligible for an additional payment")
expect(page).to have_content(
"you can apply for a school targeted retention incentive"
)
end
end
end
28 changes: 18 additions & 10 deletions spec/models/policies/early_career_payments/eligibility_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,14 @@
require "rails_helper"

RSpec.describe Policies::EarlyCareerPayments::Eligibility, type: :model do
let(:academic_year) do
Policies::EarlyCareerPayments::Eligibility::ITT_ACADEMIC_YEARS.keys.first
end

before do
create(:journey_configuration, :additional_payments)
end

describe "#policy" do
let(:early_career_payments_eligibility) { build(:early_career_payments_eligibility) }

Expand All @@ -16,7 +24,7 @@

context "current_school not set and school_somewhere_else is not set return one is required error" do
it "returns an error" do
eligibility = Policies::EarlyCareerPayments::Eligibility.new(current_school: nil, school_somewhere_else: nil)
eligibility = Policies::EarlyCareerPayments::Eligibility.new(current_school: nil, school_somewhere_else: nil, itt_academic_year: academic_year)

expect(eligibility).not_to be_valid(:"correct-school")
expect(eligibility.errors.messages[:current_school]).to eq(["Select the school you teach at or choose somewhere else"])
Expand All @@ -25,22 +33,22 @@

context "selects a school suggested from TPS" do
it "sets current_school and sets school_somewhere_else to false" do
eligibility = Policies::EarlyCareerPayments::Eligibility.new(current_school: school, school_somewhere_else: false)
eligibility = Policies::EarlyCareerPayments::Eligibility.new(current_school: school, school_somewhere_else: false, itt_academic_year: academic_year)

expect(eligibility).to be_valid(:"correct-school")
end
end

context "selects somewhere else and not the suggested school" do
it "sets school_somewhere_else to true and current_school stays nil" do
eligibility = Policies::EarlyCareerPayments::Eligibility.new(current_school: nil, school_somewhere_else: true)
eligibility = Policies::EarlyCareerPayments::Eligibility.new(current_school: nil, school_somewhere_else: true, itt_academic_year: academic_year)

expect(eligibility).to be_valid(:"correct-school")
end

# e.g. the teacher presses the backlink a school is already set
it "sets school_somewhere_else to true and current_school stays remains if already set" do
eligibility = Policies::EarlyCareerPayments::Eligibility.new(current_school: school, school_somewhere_else: true)
eligibility = Policies::EarlyCareerPayments::Eligibility.new(current_school: school, school_somewhere_else: true, itt_academic_year: academic_year)

expect(eligibility).to be_valid(:"correct-school")
end
Expand Down Expand Up @@ -108,18 +116,18 @@
end

it "validates that award_amount is a positive number" do
expect(Policies::EarlyCareerPayments::Eligibility.new(award_amount: -1_000)).not_to be_valid
expect(Policies::EarlyCareerPayments::Eligibility.new(award_amount: 2_500)).to be_valid
expect(Policies::EarlyCareerPayments::Eligibility.new(award_amount: -1_000, itt_academic_year: academic_year)).not_to be_valid
expect(Policies::EarlyCareerPayments::Eligibility.new(award_amount: 2_500, itt_academic_year: academic_year)).to be_valid
end

it "validates that award_amount can be zero" do
expect(Policies::EarlyCareerPayments::Eligibility.new(award_amount: 0)).to be_valid
expect(Policies::EarlyCareerPayments::Eligibility.new(award_amount: 0, itt_academic_year: academic_year)).to be_valid
end

it "validates that the award_amount is less than £7,500 when amending a claim" do
expect(Policies::EarlyCareerPayments::Eligibility.new(teacher_reference_number: "1234567", award_amount: 7_501)).not_to be_valid(:amendment)
expect(Policies::EarlyCareerPayments::Eligibility.new(teacher_reference_number: "1234567", award_amount: 7_500)).to be_valid(:amendment)
expect(Policies::EarlyCareerPayments::Eligibility.new(teacher_reference_number: "1234567", award_amount: 7_499)).to be_valid(:amendment)
expect(Policies::EarlyCareerPayments::Eligibility.new(teacher_reference_number: "1234567", award_amount: 7_501, itt_academic_year: academic_year)).not_to be_valid(:amendment)
expect(Policies::EarlyCareerPayments::Eligibility.new(teacher_reference_number: "1234567", award_amount: 7_500, itt_academic_year: academic_year)).to be_valid(:amendment)
expect(Policies::EarlyCareerPayments::Eligibility.new(teacher_reference_number: "1234567", award_amount: 7_499, itt_academic_year: academic_year)).to be_valid(:amendment)
end
end
end
Expand Down

0 comments on commit 5650863

Please sign in to comment.