diff --git a/app/helpers/application_form_helper.rb b/app/helpers/application_form_helper.rb index 0227f794e8..b6021eadf7 100644 --- a/app/helpers/application_form_helper.rb +++ b/app/helpers/application_form_helper.rb @@ -102,7 +102,10 @@ def application_form_summary_rows( }, value: { text: - pluralize(application_form.working_days_since_submission, "day"), + pluralize( + application_form.working_days_between_submitted_and_today, + "day", + ), }, }, { diff --git a/app/jobs/update_working_days_job.rb b/app/jobs/update_working_days_job.rb index c5dca99135..33e8ab0528 100644 --- a/app/jobs/update_working_days_job.rb +++ b/app/jobs/update_working_days_job.rb @@ -3,15 +3,15 @@ class UpdateWorkingDaysJob < ApplicationJob def perform update_application_forms_since_submission + update_application_forms_submitted_to_completed update_assessments_since_started - update_assessments_started_to_recommendation - update_assessments_submission_to_recommendation + update_assessments_started_to_completed update_assessments_submission_to_started + update_assessment_started_to_verification + update_assessment_submission_to_verification - update_further_information_requests_assessment_started_to_creation - update_further_information_requests_since_received - update_further_information_requests_received_to_recommendation + update_further_information_requests_assessment_started_to_requested end private @@ -29,7 +29,7 @@ def update_application_forms_since_submission .where.not(submitted_at: nil) .find_each do |application_form| application_form.update!( - working_days_since_submission: + working_days_between_submitted_and_today: calendar.business_days_between( application_form.submitted_at, today, @@ -38,108 +38,111 @@ def update_application_forms_since_submission end end + def update_application_forms_submitted_to_completed + ApplicationForm.completed_stage.find_each do |application_form| + application_form.update!( + working_days_between_submitted_and_completed: + calendar.business_days_between( + application_form.submitted_at, + application_form.awarded_at || application_form.declined_at || + application_form.withdrawn_at, + ), + ) + end + end + def update_assessments_since_started Assessment .where.not(started_at: nil) .find_each do |assessment| assessment.update!( - working_days_since_started: + working_days_between_started_and_today: calendar.business_days_between(assessment.started_at, today), ) end end - def update_assessments_started_to_recommendation + def update_assessments_started_to_completed Assessment + .joins(:application_form) + .includes(:application_form) + .where(application_form: { stage: "completed" }) .where.not(started_at: nil) - .where.not(recommended_at: nil) .find_each do |assessment| + application_form = assessment.application_form + assessment.update!( - working_days_started_to_recommendation: + working_days_between_started_and_completed: calendar.business_days_between( assessment.started_at, - assessment.recommended_at, + application_form.awarded_at || application_form.declined_at || + application_form.withdrawn_at, ), ) end end - def update_assessments_submission_to_recommendation + def update_assessments_submission_to_started Assessment .joins(:application_form) .includes(:application_form) .where.not(application_form: { submitted_at: nil }) - .where.not(recommended_at: nil) + .where.not(started_at: nil) .find_each do |assessment| assessment.update!( - working_days_submission_to_recommendation: + working_days_between_submitted_and_started: calendar.business_days_between( assessment.application_form.submitted_at, - assessment.recommended_at, + assessment.started_at, ), ) end end - def update_assessments_submission_to_started + def update_assessment_started_to_verification Assessment - .joins(:application_form) - .includes(:application_form) - .where.not(application_form: { submitted_at: nil }) .where.not(started_at: nil) + .where.not(verification_started_at: nil) .find_each do |assessment| assessment.update!( - working_days_submission_to_started: + working_days_between_started_and_verification_started: calendar.business_days_between( - assessment.application_form.submitted_at, assessment.started_at, + assessment.verification_started_at, ), ) end end - def update_further_information_requests_assessment_started_to_creation - FurtherInformationRequest - .joins(:assessment) - .includes(:assessment) - .where.not(assessment: { started_at: nil }) - .find_each do |further_information_request| - further_information_request.update!( - working_days_assessment_started_to_creation: - calendar.business_days_between( - further_information_request.assessment.started_at, - further_information_request.created_at, - ), - ) - end - end - - def update_further_information_requests_since_received - FurtherInformationRequest - .where.not(received_at: nil) - .find_each do |further_information_request| - further_information_request.update!( - working_days_since_received: + def update_assessment_submission_to_verification + Assessment + .joins(:application_form) + .includes(:application_form) + .where.not(application_form: { submitted_at: nil }) + .where.not(verification_started_at: nil) + .find_each do |assessment| + assessment.update!( + working_days_between_submitted_and_verification_started: calendar.business_days_between( - further_information_request.received_at, - today, + assessment.application_form.submitted_at, + assessment.verification_started_at, ), ) end end - def update_further_information_requests_received_to_recommendation + def update_further_information_requests_assessment_started_to_requested FurtherInformationRequest .joins(:assessment) .includes(:assessment) - .where.not(received_at: nil) - .where.not(assessment: { recommended_at: nil }) + .where.not(assessment: { started_at: nil }) + .where.not(requested_at: nil) .find_each do |further_information_request| further_information_request.update!( - working_days_received_to_recommendation: + working_days_between_assessment_started_to_requested: calendar.business_days_between( - further_information_request.received_at, - further_information_request.assessment.recommended_at, + further_information_request.assessment.started_at, + further_information_request.requested_at, ), ) end diff --git a/app/models/application_form.rb b/app/models/application_form.rb index 6cf0dffa3c..fc0044b83d 100644 --- a/app/models/application_form.rb +++ b/app/models/application_form.rb @@ -52,7 +52,8 @@ # trs_match :jsonb # withdrawn_at :datetime # work_history_status :string default("not_started"), not null -# working_days_since_submission :integer +# working_days_between_submitted_and_completed :integer +# working_days_between_submitted_and_today :integer # written_statement_confirmation :boolean default(FALSE), not null # written_statement_optional :boolean default(FALSE), not null # written_statement_status :string default("not_started"), not null diff --git a/app/models/assessment.rb b/app/models/assessment.rb index ff2f72a438..b20f82b280 100644 --- a/app/models/assessment.rb +++ b/app/models/assessment.rb @@ -4,28 +4,30 @@ # # Table name: assessments # -# id :bigint not null, primary key -# age_range_max :integer -# age_range_min :integer -# age_range_note :text default(""), not null -# induction_required :boolean -# qualifications_assessor_note :text default(""), not null -# recommendation :string default("unknown"), not null -# recommendation_assessor_note :text default(""), not null -# recommended_at :datetime -# references_verified :boolean -# scotland_full_registration :boolean -# started_at :datetime -# subjects :text default([]), not null, is an Array -# subjects_note :text default(""), not null -# unsigned_consent_document_generated :boolean default(FALSE), not null -# working_days_since_started :integer -# working_days_started_to_recommendation :integer -# working_days_submission_to_recommendation :integer -# working_days_submission_to_started :integer -# created_at :datetime not null -# updated_at :datetime not null -# application_form_id :bigint not null +# id :bigint not null, primary key +# age_range_max :integer +# age_range_min :integer +# age_range_note :text default(""), not null +# induction_required :boolean +# qualifications_assessor_note :text default(""), not null +# recommendation :string default("unknown"), not null +# recommendation_assessor_note :text default(""), not null +# recommended_at :datetime +# references_verified :boolean +# scotland_full_registration :boolean +# started_at :datetime +# subjects :text default([]), not null, is an Array +# subjects_note :text default(""), not null +# unsigned_consent_document_generated :boolean default(FALSE), not null +# verification_started_at :datetime +# working_days_between_started_and_completed :integer +# working_days_between_started_and_today :integer +# working_days_between_started_and_verification_started :integer +# working_days_between_submitted_and_started :integer +# working_days_between_submitted_and_verification_started :integer +# created_at :datetime not null +# updated_at :datetime not null +# application_form_id :bigint not null # # Indexes # diff --git a/app/models/further_information_request.rb b/app/models/further_information_request.rb index a5cf6e26ac..3e21de3d71 100644 --- a/app/models/further_information_request.rb +++ b/app/models/further_information_request.rb @@ -4,19 +4,17 @@ # # Table name: further_information_requests # -# id :bigint not null, primary key -# expired_at :datetime -# received_at :datetime -# requested_at :datetime -# review_note :string default(""), not null -# review_passed :boolean -# reviewed_at :datetime -# working_days_assessment_started_to_creation :integer -# working_days_received_to_recommendation :integer -# working_days_since_received :integer -# created_at :datetime not null -# updated_at :datetime not null -# assessment_id :bigint not null +# id :bigint not null, primary key +# expired_at :datetime +# received_at :datetime +# requested_at :datetime +# review_note :string default(""), not null +# review_passed :boolean +# reviewed_at :datetime +# working_days_between_assessment_started_to_requested :integer +# created_at :datetime not null +# updated_at :datetime not null +# assessment_id :bigint not null # # Indexes # diff --git a/app/services/submit_application_form.rb b/app/services/submit_application_form.rb index 9a48d2d7c4..d100631656 100644 --- a/app/services/submit_application_form.rb +++ b/app/services/submit_application_form.rb @@ -17,7 +17,7 @@ def call subject_limited: region.country.subject_limited, subjects: application_form.subjects.compact_blank, submitted_at: Time.zone.now, - working_days_since_submission: 0, + working_days_between_submitted_and_today: 0, ) assessment = AssessmentFactory.call(application_form:) diff --git a/app/services/verify_assessment.rb b/app/services/verify_assessment.rb index 62ce61091e..502ef55455 100644 --- a/app/services/verify_assessment.rb +++ b/app/services/verify_assessment.rb @@ -26,6 +26,7 @@ def call ActiveRecord::Base.transaction do assessment.qualifications_assessor_note = qualifications_assessor_note assessment.verify! + update_assessment_verification_started_at create_professional_standing_request create_qualification_requests @@ -85,6 +86,12 @@ def create_reference_requests end end + def update_assessment_verification_started_at + if assessment.verification_started_at.nil? + assessment.update!(verification_started_at: Time.zone.now) + end + end + def send_references_requested_email(reference_requests) DeliverEmail.call( application_form:, diff --git a/config/analytics.yml b/config/analytics.yml index 2e9f94e063..b74600c5ab 100644 --- a/config/analytics.yml +++ b/config/analytics.yml @@ -55,7 +55,8 @@ - updated_at - withdrawn_at - work_history_status - - working_days_since_submission + - working_days_between_submitted_and_today + - working_days_between_submitted_and_completed - written_statement_confirmation - written_statement_optional - written_statement_status @@ -89,10 +90,12 @@ - subjects - unsigned_consent_document_generated - updated_at - - working_days_since_started - - working_days_started_to_recommendation - - working_days_submission_to_recommendation - - working_days_submission_to_started + - verification_started_at + - working_days_between_started_and_today + - working_days_between_started_and_completed + - working_days_between_submitted_and_started + - working_days_between_started_and_verification_started + - working_days_between_submitted_and_verification_started :consent_requests: - assessment_id - created_at @@ -158,9 +161,7 @@ - review_passed - reviewed_at - updated_at - - working_days_assessment_started_to_creation - - working_days_received_to_recommendation - - working_days_since_received + - working_days_between_assessment_started_to_requested :further_information_request_items: - contact_email - contact_job diff --git a/db/migrate/20250529130205_add_verification_started_at_to_assessments.rb b/db/migrate/20250529130205_add_verification_started_at_to_assessments.rb new file mode 100644 index 0000000000..22abd12c2b --- /dev/null +++ b/db/migrate/20250529130205_add_verification_started_at_to_assessments.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class AddVerificationStartedAtToAssessments < ActiveRecord::Migration[8.0] + def change + add_column :assessments, :verification_started_at, :datetime + end +end diff --git a/db/migrate/20250530085038_update_working_days_stats_columns_on_various_tables.rb b/db/migrate/20250530085038_update_working_days_stats_columns_on_various_tables.rb new file mode 100644 index 0000000000..b52bcf7137 --- /dev/null +++ b/db/migrate/20250530085038_update_working_days_stats_columns_on_various_tables.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true + +# rubocop:disable Rails/BulkChangeTable +class UpdateWorkingDaysStatsColumnsOnVariousTables < ActiveRecord::Migration[ + 8.0 +] + def change + # application_forms + rename_column :application_forms, + :working_days_since_submission, + :working_days_between_submitted_and_today + + add_column :application_forms, + :working_days_between_submitted_and_completed, + :integer # Replacing working_days_submission_to_recommendation on assessments table + + # assessments + rename_column :assessments, + :working_days_since_started, + :working_days_between_started_and_today + rename_column :assessments, + :working_days_started_to_recommendation, + :working_days_between_started_and_completed + rename_column :assessments, + :working_days_submission_to_started, + :working_days_between_submitted_and_started + + add_column :assessments, + :working_days_between_started_and_verification_started, + :integer # Newly tracked + add_column :assessments, + :working_days_between_submitted_and_verification_started, + :integer # Newly tracked + + remove_column :assessments, + :working_days_submission_to_recommendation, + :integer # Replaced by working_days_between_submitted_and_completed on application_forms table + + # further_information_requests + rename_column :further_information_requests, + :working_days_assessment_started_to_creation, + :working_days_between_assessment_started_to_requested + + remove_column :further_information_requests, + :working_days_since_received, + :integer # Not required or used + remove_column :further_information_requests, + :working_days_received_to_recommendation, + :integer # Not required or used + end +end +# rubocop:enable Rails/BulkChangeTable diff --git a/db/schema.rb b/db/schema.rb index a9ee60c6cb..5c05f7ab35 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[8.0].define(version: 2025_05_15_083411) do +ActiveRecord::Schema[8.0].define(version: 2025_05_30_085038) do # These are extensions that must be enabled in order to support this database enable_extension "pg_catalog.plpgsql" enable_extension "pgcrypto" @@ -66,7 +66,7 @@ t.boolean "needs_work_history", null: false t.boolean "needs_written_statement", null: false t.boolean "needs_registration_number", null: false - t.integer "working_days_since_submission" + t.integer "working_days_between_submitted_and_today" t.boolean "confirmed_no_sanctions", default: false t.string "personal_information_status", default: "not_started", null: false t.string "identification_document_status", default: "not_started", null: false @@ -102,6 +102,7 @@ t.string "passport_document_status", default: "not_started", null: false t.date "passport_expiry_date" t.string "passport_country_of_issue_code" + t.integer "working_days_between_submitted_and_completed" t.index ["action_required_by"], name: "index_application_forms_on_action_required_by" t.index ["assessor_id"], name: "index_application_forms_on_assessor_id" t.index ["english_language_provider_id"], name: "index_application_forms_on_english_language_provider_id" @@ -145,16 +146,18 @@ t.text "age_range_note", default: "", null: false t.text "subjects_note", default: "", null: false t.datetime "started_at" - t.integer "working_days_started_to_recommendation" - t.integer "working_days_submission_to_recommendation" - t.integer "working_days_submission_to_started" - t.integer "working_days_since_started" + t.integer "working_days_between_started_and_completed" + t.integer "working_days_between_submitted_and_started" + t.integer "working_days_between_started_and_today" t.boolean "induction_required" t.text "recommendation_assessor_note", default: "", null: false t.boolean "references_verified" t.boolean "scotland_full_registration" t.boolean "unsigned_consent_document_generated", default: false, null: false t.text "qualifications_assessor_note", default: "", null: false + t.datetime "verification_started_at" + t.integer "working_days_between_started_and_verification_started" + t.integer "working_days_between_submitted_and_verification_started" t.index ["application_form_id"], name: "index_assessments_on_application_form_id" end @@ -262,9 +265,7 @@ t.datetime "updated_at", null: false t.boolean "review_passed" t.string "review_note", default: "", null: false - t.integer "working_days_received_to_recommendation" - t.integer "working_days_since_received" - t.integer "working_days_assessment_started_to_creation" + t.integer "working_days_between_assessment_started_to_requested" t.datetime "reviewed_at" t.datetime "requested_at" t.datetime "expired_at" diff --git a/docs/diagram.pdf b/docs/diagram.pdf index 7dc278d2ec..9fec81d8fb 100644 Binary files a/docs/diagram.pdf and b/docs/diagram.pdf differ diff --git a/lib/calendars/england_and_wales.yml b/lib/calendars/england_and_wales.yml index be656032bc..b7a5642b48 100644 --- a/lib/calendars/england_and_wales.yml +++ b/lib/calendars/england_and_wales.yml @@ -40,3 +40,12 @@ holidays: - 2026-08-31 - 2026-12-25 - 2026-12-28 + + - 2027-01-01 + - 2027-03-26 + - 2027-03-29 + - 2027-05-03 + - 2027-05-31 + - 2027-08-30 + - 2027-12-27 + - 2027-12-28 diff --git a/spec/factories/application_forms.rb b/spec/factories/application_forms.rb index 61af332ea4..d865fd6845 100644 --- a/spec/factories/application_forms.rb +++ b/spec/factories/application_forms.rb @@ -52,7 +52,8 @@ # trs_match :jsonb # withdrawn_at :datetime # work_history_status :string default("not_started"), not null -# working_days_since_submission :integer +# working_days_between_submitted_and_completed :integer +# working_days_between_submitted_and_today :integer # written_statement_confirmation :boolean default(FALSE), not null # written_statement_optional :boolean default(FALSE), not null # written_statement_status :string default("not_started"), not null @@ -174,7 +175,7 @@ not_started_stage statuses { %w[assessment_not_started] } submitted_at { Time.zone.now } - working_days_since_submission { 0 } + working_days_between_submitted_and_today { 0 } end trait :preliminary_check do diff --git a/spec/factories/assessments.rb b/spec/factories/assessments.rb index 8e3e1f0fdb..79102d005e 100644 --- a/spec/factories/assessments.rb +++ b/spec/factories/assessments.rb @@ -4,28 +4,30 @@ # # Table name: assessments # -# id :bigint not null, primary key -# age_range_max :integer -# age_range_min :integer -# age_range_note :text default(""), not null -# induction_required :boolean -# qualifications_assessor_note :text default(""), not null -# recommendation :string default("unknown"), not null -# recommendation_assessor_note :text default(""), not null -# recommended_at :datetime -# references_verified :boolean -# scotland_full_registration :boolean -# started_at :datetime -# subjects :text default([]), not null, is an Array -# subjects_note :text default(""), not null -# unsigned_consent_document_generated :boolean default(FALSE), not null -# working_days_since_started :integer -# working_days_started_to_recommendation :integer -# working_days_submission_to_recommendation :integer -# working_days_submission_to_started :integer -# created_at :datetime not null -# updated_at :datetime not null -# application_form_id :bigint not null +# id :bigint not null, primary key +# age_range_max :integer +# age_range_min :integer +# age_range_note :text default(""), not null +# induction_required :boolean +# qualifications_assessor_note :text default(""), not null +# recommendation :string default("unknown"), not null +# recommendation_assessor_note :text default(""), not null +# recommended_at :datetime +# references_verified :boolean +# scotland_full_registration :boolean +# started_at :datetime +# subjects :text default([]), not null, is an Array +# subjects_note :text default(""), not null +# unsigned_consent_document_generated :boolean default(FALSE), not null +# verification_started_at :datetime +# working_days_between_started_and_completed :integer +# working_days_between_started_and_today :integer +# working_days_between_started_and_verification_started :integer +# working_days_between_submitted_and_started :integer +# working_days_between_submitted_and_verification_started :integer +# created_at :datetime not null +# updated_at :datetime not null +# application_form_id :bigint not null # # Indexes # @@ -67,6 +69,7 @@ trait :verify do recommendation { "verify" } + verification_started_at { Time.zone.now } recommended_at { Time.zone.now } end diff --git a/spec/factories/further_information_requests.rb b/spec/factories/further_information_requests.rb index d6f0c9daa6..7de21bdafb 100644 --- a/spec/factories/further_information_requests.rb +++ b/spec/factories/further_information_requests.rb @@ -4,19 +4,17 @@ # # Table name: further_information_requests # -# id :bigint not null, primary key -# expired_at :datetime -# received_at :datetime -# requested_at :datetime -# review_note :string default(""), not null -# review_passed :boolean -# reviewed_at :datetime -# working_days_assessment_started_to_creation :integer -# working_days_received_to_recommendation :integer -# working_days_since_received :integer -# created_at :datetime not null -# updated_at :datetime not null -# assessment_id :bigint not null +# id :bigint not null, primary key +# expired_at :datetime +# received_at :datetime +# requested_at :datetime +# review_note :string default(""), not null +# review_passed :boolean +# reviewed_at :datetime +# working_days_between_assessment_started_to_requested :integer +# created_at :datetime not null +# updated_at :datetime not null +# assessment_id :bigint not null # # Indexes # diff --git a/spec/jobs/update_working_days_job_spec.rb b/spec/jobs/update_working_days_job_spec.rb index 9d3e73c3e5..7191cfb88c 100644 --- a/spec/jobs/update_working_days_job_spec.rb +++ b/spec/jobs/update_working_days_job_spec.rb @@ -5,43 +5,107 @@ RSpec.describe UpdateWorkingDaysJob, type: :job do describe "#perform" do subject(:perform) do - travel_to(tuesday_today) { described_class.new.perform } + travel_to(wednesday_today) { described_class.new.perform } end - let(:friday_previous) { Date.new(2022, 9, 30) } - let(:tuesday_today) { Date.new(2022, 10, 4) } + # Friday prior to a Monday bank holiday (2023-05-01) weekend + let(:friday_previous) { Date.new(2023, 4, 28) } + + # Wednesday after a Monday bank holiday (2023-05-01) weekend + let(:wednesday_today) { Date.new(2023, 5, 3) } let(:friday_application_form) do create(:application_form, :submitted, submitted_at: friday_previous) end - let(:not_recommended_assessment) { create(:assessment) } describe "application form working days since submission" do let(:draft_application_form) { create(:application_form) } - let(:monday_application_form) do + let(:tuesday_application_form) do create( :application_form, :submitted, - submitted_at: Date.new(2022, 10, 3), + submitted_at: Date.new(2023, 5, 2), ) end it "ignores draft application forms" do expect { perform }.not_to( change do - draft_application_form.reload.working_days_since_submission + draft_application_form.reload.working_days_between_submitted_and_today end, ) end it "sets the working days for monday" do expect { perform }.to change { - monday_application_form.reload.working_days_since_submission + tuesday_application_form.reload.working_days_between_submitted_and_today }.to(1) end it "sets the working days for friday" do expect { perform }.to change { - friday_application_form.reload.working_days_since_submission + friday_application_form.reload.working_days_between_submitted_and_today + }.to(2) + end + end + + describe "application form working days from submitted to completed" do + let(:draft_application_form) { create(:application_form) } + let(:wednesday_application_form_awarded) do + create( + :application_form, + :awarded, + submitted_at: friday_previous, + awarded_at: wednesday_today, + ) + end + let(:wednesday_application_form_declined) do + create( + :application_form, + :declined, + submitted_at: friday_previous, + declined_at: wednesday_today, + ) + end + let(:wednesday_application_form_withdrawn) do + create( + :application_form, + :withdrawn, + submitted_at: friday_previous, + withdrawn_at: wednesday_today, + ) + end + + it "ignores draft application forms" do + expect { perform }.not_to( + change do + draft_application_form.reload.working_days_between_submitted_and_completed + end, + ) + end + + it "ignores submitted and not completed application forms" do + expect { perform }.not_to( + change do + friday_application_form.reload.working_days_between_submitted_and_completed + end, + ) + end + + it "sets the working days for awarded" do + expect { perform }.to change { + wednesday_application_form_awarded.reload.working_days_between_submitted_and_completed + }.to(2) + end + + it "sets the working days for declined" do + expect { perform }.to change { + wednesday_application_form_declined.reload.working_days_between_submitted_and_completed + }.to(2) + end + + it "sets the working days for withdrawn" do + expect { perform }.to change { + wednesday_application_form_withdrawn.reload.working_days_between_submitted_and_completed }.to(2) end end @@ -49,155 +113,258 @@ describe "assessment working days since started" do let(:not_started_assessment) { create(:assessment) } let(:friday_assessment) do - create(:assessment, started_at: friday_application_form.submitted_at) + create(:assessment, started_at: friday_previous) end it "ignores not started assessments" do expect { perform }.not_to( - change { not_started_assessment.reload.working_days_since_started }, + change do + not_started_assessment.reload.working_days_between_started_and_today + end, ) end it "sets the working days" do expect { perform }.to change { - friday_assessment.reload.working_days_since_started + friday_assessment.reload.working_days_between_started_and_today }.to(2) end end - describe "assessment working days started to recommendation" do - let(:recommended_assessment) do + describe "assessment working days from assessment started to application form completed" do + let(:not_started_assessment) do + create(:assessment, application_form: friday_application_form) + end + + let(:started_incomplete_assessment) do + create( + :assessment, + started_at: friday_previous, + application_form: incomplete_application, + ) + end + let(:incomplete_application) do + create(:application_form, :submitted, submitted_at: friday_previous) + end + + let(:awarded_assessment) do + create( + :assessment, + started_at: friday_previous, + application_form: wednesday_application_form_awarded, + ) + end + let(:wednesday_application_form_awarded) do + create( + :application_form, + :awarded, + submitted_at: friday_previous, + awarded_at: wednesday_today, + ) + end + + let(:declined_assessment) do + create( + :assessment, + started_at: friday_previous, + application_form: wednesday_application_form_declined, + ) + end + let(:wednesday_application_form_declined) do + create( + :application_form, + :declined, + submitted_at: friday_previous, + declined_at: wednesday_today, + ) + end + + let(:withdrawn_assessment) do create( :assessment, - started_at: friday_application_form.submitted_at, - recommended_at: tuesday_today, + started_at: friday_previous, + application_form: wednesday_application_form_withdrawn, + ) + end + let(:wednesday_application_form_withdrawn) do + create( + :application_form, + :withdrawn, + submitted_at: friday_previous, + withdrawn_at: wednesday_today, ) end - it "ignores not recommended assessments" do + it "ignores not started assessment" do expect { perform }.not_to( change do - not_recommended_assessment.reload.working_days_started_to_recommendation + not_started_assessment.reload.working_days_between_started_and_completed end, ) end - it "sets the working days" do + it "ignores not completed applications assessment that has started" do + expect { perform }.not_to( + change do + started_incomplete_assessment.reload.working_days_between_started_and_completed + end, + ) + end + + it "sets the working days for awarded application" do expect { perform }.to change { - recommended_assessment.reload.working_days_started_to_recommendation + awarded_assessment.reload.working_days_between_started_and_completed + }.to(2) + end + + it "sets the working days for declined application" do + expect { perform }.to change { + declined_assessment.reload.working_days_between_started_and_completed + }.to(2) + end + + it "sets the working days for withdrawn" do + expect { perform }.to change { + withdrawn_assessment.reload.working_days_between_started_and_completed }.to(2) end end - describe "assessment working days submission to recommendation" do - let(:recommended_assessment) do + describe "assessment working days from application submitted to assessment started" do + let(:not_started_assessment) do + create(:assessment, application_form: friday_application_form) + end + + let(:wednesday_started_assessment) do create( :assessment, + started_at: wednesday_today, application_form: friday_application_form, - recommended_at: tuesday_today, ) end + let(:friday_application_form) do + create(:application_form, submitted_at: friday_previous) + end - it "ignores not recommended assessments" do + it "ignores not started assessment" do expect { perform }.not_to( change do - not_recommended_assessment.reload.working_days_submission_to_recommendation + not_started_assessment.reload.working_days_between_submitted_and_started end, ) end - it "sets the working days" do + it "sets the working days for started assessment" do expect { perform }.to change { - recommended_assessment.reload.working_days_submission_to_recommendation + wednesday_started_assessment.reload.working_days_between_submitted_and_started }.to(2) end end - describe "assessment working days submission to started" do - let(:recommended_assessment) do + describe "assessment working days from application form submitted to assessment verification" do + let(:not_started_assessment) do + create(:assessment, application_form: friday_application_form) + end + + let(:not_started_verification_assessment) do create( :assessment, + application_form: application_form_not_verified, + started_at: wednesday_today, + ) + end + let(:application_form_not_verified) do + create(:application_form, submitted_at: friday_previous) + end + + let(:wednesday_verification_started_assessment) do + create( + :assessment, + started_at: wednesday_today, + verification_started_at: wednesday_today, application_form: friday_application_form, - started_at: tuesday_today, ) end + let(:friday_application_form) do + create(:application_form, submitted_at: friday_previous) + end - it "ignores not recommended assessments" do + it "ignores not started assessment" do expect { perform }.not_to( change do - not_recommended_assessment.reload.working_days_submission_to_started + not_started_assessment.reload.working_days_between_submitted_and_verification_started end, ) end - it "sets the working days" do + it "ignores not started verification assessment" do + expect { perform }.not_to( + change do + not_started_verification_assessment.reload.working_days_between_submitted_and_verification_started + end, + ) + end + + it "sets the working days for started verification assessment" do expect { perform }.to change { - recommended_assessment.reload.working_days_submission_to_started + wednesday_verification_started_assessment.reload.working_days_between_submitted_and_verification_started }.to(2) end end - describe "further information request assessment started to creation" do - let(:assessment) { create(:assessment, started_at: friday_previous) } - let(:further_information_request) do - create( - :received_further_information_request, - assessment:, - created_at: tuesday_today, - ) + describe "assessment working days from application form started to verification" do + let(:not_started_assessment) do + create(:assessment, application_form: friday_application_form) end - it "sets the working days" do - expect { perform }.to change { - further_information_request.reload.working_days_assessment_started_to_creation - }.to(2) + let(:not_started_verification_assessment) do + create(:assessment, started_at: friday_previous) end - end - describe "further information request days since received" do - let(:requested_fi_request) { create(:further_information_request) } - let(:received_fi_request) do + let(:wednesday_verification_started_assessment) do create( - :received_further_information_request, - assessment: create(:assessment, recommended_at: tuesday_today), - received_at: friday_application_form.submitted_at, + :assessment, + started_at: friday_previous, + verification_started_at: wednesday_today, + ) + end + + it "ignores not started assessment" do + expect { perform }.not_to( + change do + not_started_assessment.reload.working_days_between_started_and_verification_started + end, ) end - it "ignores requested further information requests" do + it "ignores not started verification assessment" do expect { perform }.not_to( - change { requested_fi_request.reload.working_days_since_received }, + change do + not_started_verification_assessment.reload.working_days_between_started_and_verification_started + end, ) end - it "sets the working days" do + it "sets the working days for started verification assessment" do expect { perform }.to change { - received_fi_request.reload.working_days_since_received + wednesday_verification_started_assessment.reload.working_days_between_started_and_verification_started }.to(2) end end - describe "further information request working days received to recommended" do - let(:requested_fi_request) { create(:further_information_request) } - let(:received_fi_request) do + describe "further information request assessment started to requested" do + let(:assessment) { create(:assessment, started_at: friday_previous) } + let(:further_information_request) do create( :received_further_information_request, - assessment: create(:assessment, recommended_at: tuesday_today), - received_at: friday_application_form.submitted_at, - ) - end - - it "ignores not recommended assessments" do - expect { perform }.not_to( - change do - requested_fi_request.reload.working_days_received_to_recommendation - end, + assessment:, + requested_at: wednesday_today, ) end it "sets the working days" do expect { perform }.to change { - received_fi_request.reload.working_days_received_to_recommendation + further_information_request.reload.working_days_between_assessment_started_to_requested }.to(2) end end diff --git a/spec/models/application_form_spec.rb b/spec/models/application_form_spec.rb index 67f0deb726..8f177cd75a 100644 --- a/spec/models/application_form_spec.rb +++ b/spec/models/application_form_spec.rb @@ -52,7 +52,8 @@ # trs_match :jsonb # withdrawn_at :datetime # work_history_status :string default("not_started"), not null -# working_days_since_submission :integer +# working_days_between_submitted_and_completed :integer +# working_days_between_submitted_and_today :integer # written_statement_confirmation :boolean default(FALSE), not null # written_statement_optional :boolean default(FALSE), not null # written_statement_status :string default("not_started"), not null diff --git a/spec/models/assessment_spec.rb b/spec/models/assessment_spec.rb index 35c84514fd..573ca372a2 100644 --- a/spec/models/assessment_spec.rb +++ b/spec/models/assessment_spec.rb @@ -4,28 +4,30 @@ # # Table name: assessments # -# id :bigint not null, primary key -# age_range_max :integer -# age_range_min :integer -# age_range_note :text default(""), not null -# induction_required :boolean -# qualifications_assessor_note :text default(""), not null -# recommendation :string default("unknown"), not null -# recommendation_assessor_note :text default(""), not null -# recommended_at :datetime -# references_verified :boolean -# scotland_full_registration :boolean -# started_at :datetime -# subjects :text default([]), not null, is an Array -# subjects_note :text default(""), not null -# unsigned_consent_document_generated :boolean default(FALSE), not null -# working_days_since_started :integer -# working_days_started_to_recommendation :integer -# working_days_submission_to_recommendation :integer -# working_days_submission_to_started :integer -# created_at :datetime not null -# updated_at :datetime not null -# application_form_id :bigint not null +# id :bigint not null, primary key +# age_range_max :integer +# age_range_min :integer +# age_range_note :text default(""), not null +# induction_required :boolean +# qualifications_assessor_note :text default(""), not null +# recommendation :string default("unknown"), not null +# recommendation_assessor_note :text default(""), not null +# recommended_at :datetime +# references_verified :boolean +# scotland_full_registration :boolean +# started_at :datetime +# subjects :text default([]), not null, is an Array +# subjects_note :text default(""), not null +# unsigned_consent_document_generated :boolean default(FALSE), not null +# verification_started_at :datetime +# working_days_between_started_and_completed :integer +# working_days_between_started_and_today :integer +# working_days_between_started_and_verification_started :integer +# working_days_between_submitted_and_started :integer +# working_days_between_submitted_and_verification_started :integer +# created_at :datetime not null +# updated_at :datetime not null +# application_form_id :bigint not null # # Indexes # diff --git a/spec/models/further_information_request_spec.rb b/spec/models/further_information_request_spec.rb index fe190df6e9..7122a9d6a4 100644 --- a/spec/models/further_information_request_spec.rb +++ b/spec/models/further_information_request_spec.rb @@ -4,19 +4,17 @@ # # Table name: further_information_requests # -# id :bigint not null, primary key -# expired_at :datetime -# received_at :datetime -# requested_at :datetime -# review_note :string default(""), not null -# review_passed :boolean -# reviewed_at :datetime -# working_days_assessment_started_to_creation :integer -# working_days_received_to_recommendation :integer -# working_days_since_received :integer -# created_at :datetime not null -# updated_at :datetime not null -# assessment_id :bigint not null +# id :bigint not null, primary key +# expired_at :datetime +# received_at :datetime +# requested_at :datetime +# review_note :string default(""), not null +# review_passed :boolean +# reviewed_at :datetime +# working_days_between_assessment_started_to_requested :integer +# created_at :datetime not null +# updated_at :datetime not null +# assessment_id :bigint not null # # Indexes # diff --git a/spec/services/submit_application_form_spec.rb b/spec/services/submit_application_form_spec.rb index a08add4679..2b169572b0 100644 --- a/spec/services/submit_application_form_spec.rb +++ b/spec/services/submit_application_form_spec.rb @@ -91,8 +91,8 @@ end describe "setting working days since submission" do - subject(:working_days_since_submission) do - application_form.working_days_since_submission + subject(:working_days_between_submitted_and_today) do + application_form.working_days_between_submitted_and_today end it { is_expected.to be_nil } diff --git a/spec/services/verify_assessment_spec.rb b/spec/services/verify_assessment_spec.rb index 3cead30c76..627b663f7e 100644 --- a/spec/services/verify_assessment_spec.rb +++ b/spec/services/verify_assessment_spec.rb @@ -141,6 +141,10 @@ expect { call }.to change(application_form, :stage).to("verification") end + it "sents the assessment verification started at" do + expect { call }.to change(assessment, :verification_started_at).from(nil) + end + describe "sending referee email" do it "queues an email job" do expect { call }.to have_enqueued_mail(RefereeMailer, :reference_requested)