diff --git a/.github/workflows/build_and_deploy.yml b/.github/workflows/build_and_deploy.yml index 9ab72e5a82..e300bfd1df 100644 --- a/.github/workflows/build_and_deploy.yml +++ b/.github/workflows/build_and_deploy.yml @@ -67,6 +67,7 @@ jobs: | Additional Payments | <${{ env.APP_URL }}/additional-payments/claim> | | Student Loans | <${{ env.APP_URL }}/student-loans/claim> | | Further Education | <${{ env.APP_URL }}/further-education-payments/landing-page> | + | Early Years Payment | <${{ env.APP_URL }}/early-years-payment-provider/landing-page> | | Relocation Payments | <${{ env.APP_URL }}/get-a-teacher-relocation-payment/landing-page> | | Admin | <${{ env.APP_URL }}/admin> | diff --git a/app/models/journeys.rb b/app/models/journeys.rb index 5a98bfa215..f0943fcb55 100644 --- a/app/models/journeys.rb +++ b/app/models/journeys.rb @@ -9,7 +9,8 @@ def self.table_name_prefix AdditionalPaymentsForTeaching, TeacherStudentLoanReimbursement, GetATeacherRelocationPayment, - FurtherEducationPayments + FurtherEducationPayments, + EarlyYearsPayment::Provider ].freeze def all diff --git a/app/models/journeys/early_years_payment/provider.rb b/app/models/journeys/early_years_payment/provider.rb new file mode 100644 index 0000000000..3611606b21 --- /dev/null +++ b/app/models/journeys/early_years_payment/provider.rb @@ -0,0 +1,16 @@ +module Journeys + module EarlyYearsPayment + module Provider + extend Base + extend self + + ROUTING_NAME = "early-years-payment-provider" + VIEW_PATH = "early_years_payment/provider" + I18N_NAMESPACE = "early_years_payment_provider" + POLICIES = [Policies::EarlyYearsPayment] + FORMS = { + "claims" => {} + } + end + end +end diff --git a/app/models/journeys/early_years_payment/provider/eligibility_checker.rb b/app/models/journeys/early_years_payment/provider/eligibility_checker.rb new file mode 100644 index 0000000000..41dc18f9d9 --- /dev/null +++ b/app/models/journeys/early_years_payment/provider/eligibility_checker.rb @@ -0,0 +1,8 @@ +module Journeys + module EarlyYearsPayment + module Provider + class EligibilityChecker < Journeys::EligibilityChecker + end + end + end +end diff --git a/app/models/journeys/early_years_payment/provider/session.rb b/app/models/journeys/early_years_payment/provider/session.rb new file mode 100644 index 0000000000..6bbc126e49 --- /dev/null +++ b/app/models/journeys/early_years_payment/provider/session.rb @@ -0,0 +1,9 @@ +module Journeys + module EarlyYearsPayment + module Provider + class Session < Journeys::Session + attribute :answers, SessionAnswersType.new + end + end + end +end diff --git a/app/models/journeys/early_years_payment/provider/session_answers.rb b/app/models/journeys/early_years_payment/provider/session_answers.rb new file mode 100644 index 0000000000..aed76440e2 --- /dev/null +++ b/app/models/journeys/early_years_payment/provider/session_answers.rb @@ -0,0 +1,11 @@ +module Journeys + module EarlyYearsPayment + module Provider + class SessionAnswers < Journeys::SessionAnswers + def policy + Policies::EarlyYearsPayment + end + end + end + end +end diff --git a/app/models/journeys/early_years_payment/provider/session_answers_type.rb b/app/models/journeys/early_years_payment/provider/session_answers_type.rb new file mode 100644 index 0000000000..5ae13b57cd --- /dev/null +++ b/app/models/journeys/early_years_payment/provider/session_answers_type.rb @@ -0,0 +1,7 @@ +module Journeys + module EarlyYearsPayment + module Provider + class SessionAnswersType < ::Journeys::SessionAnswersType; end + end + end +end diff --git a/app/models/journeys/early_years_payment/provider/slug_sequence.rb b/app/models/journeys/early_years_payment/provider/slug_sequence.rb new file mode 100644 index 0000000000..72a238301d --- /dev/null +++ b/app/models/journeys/early_years_payment/provider/slug_sequence.rb @@ -0,0 +1,25 @@ +module Journeys + module EarlyYearsPayment + module Provider + class SlugSequence + SLUGS = %w[].freeze + + def self.start_page_url + Rails.application.routes.url_helpers.landing_page_path("early-years-payment-provider") + end + + attr_reader :journey_session + + delegate :answers, to: :journey_session + + def initialize(journey_session) + @journey_session = journey_session + end + + def slugs + SLUGS + end + end + end + end +end diff --git a/app/models/policies/early_years_payment.rb b/app/models/policies/early_years_payment.rb new file mode 100644 index 0000000000..2f15831956 --- /dev/null +++ b/app/models/policies/early_years_payment.rb @@ -0,0 +1,14 @@ +module Policies + module EarlyYearsPayment + include BasePolicy + extend self + + # Percentage of claims to QA + MIN_QA_THRESHOLD = 10 + + # TODO: This is needed once the reply-to email address has been added to Gov Notify + def notify_reply_to_id + nil + end + end +end diff --git a/app/models/policies/early_years_payment/eligibility.rb b/app/models/policies/early_years_payment/eligibility.rb new file mode 100644 index 0000000000..fd8245bae4 --- /dev/null +++ b/app/models/policies/early_years_payment/eligibility.rb @@ -0,0 +1,17 @@ +module Policies + module EarlyYearsPayment + class Eligibility < ApplicationRecord + self.table_name = "early_years_payment_eligibilities" + + has_one :claim, as: :eligibility, inverse_of: :eligibility + + def policy + Policies::EarlyYearsPayment + end + + def ineligible? + false + end + end + end +end diff --git a/app/models/policies/early_years_payment/policy_eligibility_checker.rb b/app/models/policies/early_years_payment/policy_eligibility_checker.rb new file mode 100644 index 0000000000..b21a53db58 --- /dev/null +++ b/app/models/policies/early_years_payment/policy_eligibility_checker.rb @@ -0,0 +1,23 @@ +module Policies + module EarlyYearsPayment + class PolicyEligibilityChecker + attr_reader :answers + + delegate_missing_to :answers + + def initialize(answers:) + @answers = answers + end + + def status + return :ineligible if ineligible? + + :eligible_now + end + + def ineligible? + false + end + end + end +end diff --git a/app/views/early_years_payment/provider/landing_page.html.erb b/app/views/early_years_payment/provider/landing_page.html.erb new file mode 100644 index 0000000000..67e4011a16 --- /dev/null +++ b/app/views/early_years_payment/provider/landing_page.html.erb @@ -0,0 +1,139 @@ +
+
+

<%= t("early_years_payment_provider.landing_page.title") %>

+ +

+ Use this service to make an early years financial incentive payment claim + for an employee. +

+ +

Eligibility

+ +

+ To make a claim for an employee, they must: +

+ + <%= govuk_list [ + "have applied for a job with an incentive attached", + "have started their job after 15 May 2024", + "spend most of the time in their job (70% or more) working directly with children - there is no minimum number of hours and applies to all EYFS part and full time roles" + ], type: :bullet %> + +

+ Working directly with children can involve any of the following: +

+ + <%= govuk_list [ + "working in the room (for example this can include playrooms, baserooms or classrooms)", + "guiding, supporting, and interacting with children in their learning and development", + "giving hands-on care, including health and hygiene" + ], type: :bullet %> + +

Other conditions for the payment

+ +

+ The purpose of this incentive scheme is to increase the number of people + working with children in permanent roles, within the early years sector. +

+ +

+ In the six months before starting their current job, your employee must + not have had a permanent job working directly with children in an early + years setting. +

+ +

+ If they did work in early years in the 6 months before starting their + current job, you can claim if this was in the following types of + employment: +

+ + <%= govuk_list [ + "voluntary or unpaid work", + "casual and temporary" + ], type: :bullet %> + +

+ Casual or temporary work could include: +

+ + <%= govuk_list [ + "zero-hour contracts", + "guaranteed minimum hour contracts", + "self-employed or freelance contracts", + "fixed term contracts (FTCs)", + "agency work and apprenticeship jobs" + ], type: :bullet %> + +

+ You can find more information about employment contracts on the + <%= govuk_link_to("ACAS website", "https://www.acas.org.uk/employment-contracts") %>. +

+ +

+ More information can be found in the + <%= govuk_link_to("guidance", "#") %>. +

+ +

Information you’ll need to provide

+ +

+ You’ll need to provide some details about your employee to make a claim. + You’ll be doing this on behalf of the company, or organisation, the + employee works for. +

+ +

+ You should make sure you have collected their written consent to give us + this information before you start. You can use our + <%= govuk_link_to("consent form", "#") %> + to do this. +

+ +

+ You’ll need their: +

+ + <%= govuk_list [ + "full name", + "start date", + "email address", + "PAYE reference number" + ], type: :bullet %> + +

+ You must also provide your employee with a privacy notice that explains + what information will be collected, why it is being collected and who it + will be shared with. You can use our + <%= govuk_link_to("privacy notice", "#") %> + for this. +

+ +

+ We’ll also ask you to confirm that they meet the eligibility criteria. +

+ +

Documents

+ +

Cancel or get help with your claim

+ +

+ If your employee leaves their job before they’ve been in it for 6 months, + you should cancel their claim. +

+ +

+ You can cancel a claim or get help on this service by contacting us at + <%= govuk_link_to t("early_years_payment_provider.feedback_email"), "mailto:#{t("early_years_payment_provider.feedback_email")}", no_visited_state: true %>. +

+ +

+ Read more about the + <%= govuk_link_to("early years financial incentive payment", "#") %>. +

+ + <% if @journey_open %> + <%= govuk_start_button(text: "Start now", href: "#") %> + <% end %> +
+
diff --git a/config/analytics.yml b/config/analytics.yml index 64471da816..a6c8dde7bf 100644 --- a/config/analytics.yml +++ b/config/analytics.yml @@ -278,3 +278,7 @@ shared: - lower_award_amount - created_at - updated_at + :early_years_payment_eligibilities: + - id + - created_at + - updated_at diff --git a/config/locales/en.yml b/config/locales/en.yml index 0112cc4be3..9e63f7e170 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -343,7 +343,9 @@ en: languages_taught: Languages none_taught: I did not teach any of these subjects errors: - select_subject: Select if you taught Biology, Chemistry, Physics, Computing, Languages or you did not teach any of these subjects + select_subject: + Select if you taught Biology, Chemistry, Physics, Computing, Languages or you did not teach any of these + subjects still_teaching: questions: tps_school: Which school are you currently employed to teach at? @@ -690,7 +692,9 @@ en: inclusion: "Select the option that applies to you" state_funded_secondary_school: question: "Are you employed by an English state secondary school?" - hint: "State schools receive funding from the UK government. Secondary schools teach children aged 11 to 16, or 11 to 18." + hint: + "State schools receive funding from the UK government. Secondary schools teach children aged 11 to 16, or 11 + to 18." answers: true: answer: "Yes" @@ -715,7 +719,9 @@ en: date_not_in_future: "Start date cannot be in the future" subject: question: "What subject are you employed to teach at your school?" - hint: "Physics, general or combined science including physics, and languages can be combined with other subjects but must make up at least 50% of your time in the classroom." + hint: + "Physics, general or combined science including physics, and languages can be combined with other subjects but + must make up at least 50% of your time in the classroom." answers: physics: "Physics" combined_with_physics: "General or combined science, including physics" @@ -759,7 +765,8 @@ en: primary_heading: "Check your answers" eligibility_details: "Eligibility details" confirmation_notice: - "By selecting continue you are confirming that, to the best of your knowledge, the details you are providing are correct." + "By selecting continue you are confirming that, to the best of your knowledge, the details you are providing + are correct." international_relocation_payments: <<: *get_a_teacher_relocation_payment policy_short_name: "International Relocation Payments" @@ -824,7 +831,6 @@ en: subject: heading: You are not eligible - teaching_responsibilities: question: Are you a member of staff with teaching responsibilities? errors: @@ -861,7 +867,8 @@ en: errors: inclusion: Select yes if you have taught at %{school_name} for at least one academic term teaching_hours_per_week: - question: On average, how many hours per week are you timetabled to teach at %{school_name} during the current term? + question: + On average, how many hours per week are you timetabled to teach at %{school_name} during the current term? hint: ‘Teaching’ refers to the direct contact time you spend in lessons with students of all ages. options: more_than_12: More than 12 hours per week @@ -942,7 +949,8 @@ en: eylevel2: Early years practitioner (level 2) apprenticeship eylevel3: Early years educator (level 3) apprenticeship eytlevel: T Level in education and early years (early years educator) - coursetoeyq: A course that leads to an %{link} which enables providers to count the recipient in staff:child ratios + coursetoeyq: + A course that leads to an %{link} which enables providers to count the recipient in staff:child ratios none: I do not teach any of these courses engineering_manufacturing_courses: <<: *courses @@ -961,7 +969,9 @@ en: question: Which maths courses do you teach? options: esfa: ESFA-funded qualifications at level 3 and below in the %{link} sector subject area - gcse_maths: Maths GCSE, functional skills qualifications and %{link} approved for teaching to 16 to 19-year-olds who meet the condition of funding + gcse_maths: + Maths GCSE, functional skills qualifications and %{link} approved for teaching to 16 to 19-year-olds who + meet the condition of funding none: I do not teach any of these courses physics_courses: <<: *courses @@ -973,7 +983,9 @@ en: none: I do not teach any of these courses teaching_qualification: question: Do you have a teaching qualification? - hint: Your response will be noted for future claims. If you don’t have a teaching qualification yet, make sure that you enrol on one or complete one in the next 12 months. + hint: + Your response will be noted for future claims. If you don’t have a teaching qualification yet, make sure that + you enrol on one or complete one in the next 12 months. options: "yes": "Yes" not_yet: Not yet, I am currently enrolled on one and working towards completing it @@ -986,39 +998,58 @@ en: questions: performance: question: Have any performance measures been started against you? - hint: This will be as a result of your underperformance as a teacher over a period of time. It could put your employment at the further education (FE) provider at risk and is something we may check with them as it will affect your eligibility. + hint: + This will be as a result of your underperformance as a teacher over a period of time. It could put your + employment at the further education (FE) provider at risk and is something we may check with them as it + will affect your eligibility. disciplinary: question: Are you currently subject to disciplinary action? - hint: This is more serious than performance measures and could be because of misconduct. It is something we may check with your FE provider as it will affect your eligibility. + hint: + This is more serious than performance measures and could be because of misconduct. It is something we may + check with your FE provider as it will affect your eligibility. errors: performance: inclusion: Select yes if you are subject to formal action for poor performance at work disciplinary: inclusion: Select yes if you are subject to disciplinary action half_teaching_hours: - question: Are at least half of your timetabled teaching hours spent teaching 16 to 19-year-olds, including those up to age 25 with an Education, Health and Care Plan (EHCP)? + question: + Are at least half of your timetabled teaching hours spent teaching 16 to 19-year-olds, including those up to + age 25 with an Education, Health and Care Plan (EHCP)? errors: - inclusion: Select yes if at least half your timetabled teaching hours are spent teaching 16-19-year-olds, including those up to 25 with an Education, Health and Care Plan + inclusion: + Select yes if at least half your timetabled teaching hours are spent teaching 16-19-year-olds, including + those up to 25 with an Education, Health and Care Plan eligible: heading: You’re eligible for a financial incentive payment gender: questions: payroll_gender: "How is your gender recorded on your employer’s payroll system?" errors: - select_gender: "Select the gender recorded on your employer’s payroll system or select whether you do not know" + select_gender: + "Select the gender recorded on your employer’s payroll system or select whether you do not know" hours_teaching_eligible_subjects: question: Do you spend at least half of your timetabled teaching hours teaching these eligible courses? errors: - inclusion: Select yes if you spend at least half of your timetabled teaching hours teaching these eligible courses + inclusion: + Select yes if you spend at least half of your timetabled teaching hours teaching these eligible courses check_your_answers: part_one: primary_heading: Check your answers - confirmation_notice: By selecting continue you are confirming that, to the best of your knowledge, the details you are providing are correct. + confirmation_notice: + By selecting continue you are confirming that, to the best of your knowledge, the details you are providing + are correct. heading_send_application: Now send your application statement: By submitting this you are confirming that, to the best of your knowledge, the details you are providing are correct. btn_text: Accept and send + early_years_payment_provider: + claim_description: for an early years financial incentive payment + journey_name: Claim an early years financial incentive payment - provider + landing_page: + title: Claim an early years financial incentive payment + feedback_email: "help@opsteam.education.gov.uk" activerecord: errors: models: diff --git a/db/migrate/20240724092519_create_early_years_payment_eligibilities.rb b/db/migrate/20240724092519_create_early_years_payment_eligibilities.rb new file mode 100644 index 0000000000..a3b78c1405 --- /dev/null +++ b/db/migrate/20240724092519_create_early_years_payment_eligibilities.rb @@ -0,0 +1,7 @@ +class CreateEarlyYearsPaymentEligibilities < ActiveRecord::Migration[7.0] + def change + create_table :early_years_payment_eligibilities, id: :uuid do |t| + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index f1ddd3127f..c282dd5529 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.0].define(version: 2024_07_10_080536) do +ActiveRecord::Schema[7.0].define(version: 2024_07_24_092519) do # These are extensions that must be enabled in order to support this database enable_extension "pg_trgm" enable_extension "pgcrypto" @@ -175,6 +175,11 @@ t.index ["teacher_reference_number"], name: "index_ecp_eligibility_trn" end + create_table "early_years_payment_eligibilities", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + create_table "eligible_fe_providers", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| t.integer "ukprn", null: false t.text "academic_year", null: false diff --git a/db/seeds.rb b/db/seeds.rb index 3fd9ad6e05..65bcf9e03a 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -11,6 +11,7 @@ Journeys::Configuration.create!(routing_name: Journeys::AdditionalPaymentsForTeaching::ROUTING_NAME, current_academic_year: AcademicYear.current) Journeys::Configuration.create!(routing_name: Journeys::GetATeacherRelocationPayment::ROUTING_NAME, current_academic_year: AcademicYear.current) Journeys::Configuration.create!(routing_name: Journeys::FurtherEducationPayments::ROUTING_NAME, current_academic_year: AcademicYear.current) + Journeys::Configuration.create!(routing_name: Journeys::EarlyYearsPayment::Provider::ROUTING_NAME, current_academic_year: AcademicYear.current) ENV["FIXTURES_PATH"] = "spec/fixtures" ENV["FIXTURES"] = "local_authorities,local_authority_districts,schools" diff --git a/spec/factories/journey_configurations.rb b/spec/factories/journey_configurations.rb index 2212a19d64..b9e008fae8 100644 --- a/spec/factories/journey_configurations.rb +++ b/spec/factories/journey_configurations.rb @@ -30,6 +30,10 @@ routing_name { Journeys::FurtherEducationPayments::ROUTING_NAME } end + trait :early_years_payment_provider do + routing_name { Journeys::EarlyYearsPayment::Provider::ROUTING_NAME } + end + trait :closed do open_for_submissions { false } end diff --git a/spec/features/early_years_payment/provider/happy_path_spec.rb b/spec/features/early_years_payment/provider/happy_path_spec.rb new file mode 100644 index 0000000000..3643bb1f86 --- /dev/null +++ b/spec/features/early_years_payment/provider/happy_path_spec.rb @@ -0,0 +1,10 @@ +require "rails_helper" + +RSpec.feature "Early years payment provider" do + scenario "happy path claim" do + when_early_years_payment_provider_journey_configuration_exists + + visit landing_page_path(Journeys::EarlyYearsPayment::Provider::ROUTING_NAME) + expect(page).to have_link("Start now") + end +end diff --git a/spec/models/journeys_spec.rb b/spec/models/journeys_spec.rb index 8c9b0f2dae..25dbf99a58 100644 --- a/spec/models/journeys_spec.rb +++ b/spec/models/journeys_spec.rb @@ -9,7 +9,8 @@ Journeys::AdditionalPaymentsForTeaching, Journeys::TeacherStudentLoanReimbursement, Journeys::GetATeacherRelocationPayment, - Journeys::FurtherEducationPayments + Journeys::FurtherEducationPayments, + Journeys::EarlyYearsPayment::Provider ]) end end @@ -20,7 +21,8 @@ Journeys::AdditionalPaymentsForTeaching::ROUTING_NAME, Journeys::TeacherStudentLoanReimbursement::ROUTING_NAME, Journeys::GetATeacherRelocationPayment::ROUTING_NAME, - Journeys::FurtherEducationPayments::ROUTING_NAME + Journeys::FurtherEducationPayments::ROUTING_NAME, + Journeys::EarlyYearsPayment::Provider::ROUTING_NAME ]) end end diff --git a/spec/support/steps/journey_configuration.rb b/spec/support/steps/journey_configuration.rb index af552fccb5..f187f429c3 100644 --- a/spec/support/steps/journey_configuration.rb +++ b/spec/support/steps/journey_configuration.rb @@ -1,3 +1,7 @@ def when_further_education_payments_journey_configuration_exists create(:journey_configuration, :further_education_payments) end + +def when_early_years_payment_provider_journey_configuration_exists + create(:journey_configuration, :early_years_payment_provider) +end