From 0022660707b77f200188762fa28a0fe1d2e7ced6 Mon Sep 17 00:00:00 2001 From: Hassan Mir Date: Thu, 29 May 2025 14:13:24 +0100 Subject: [PATCH 1/5] Introduce a new "verification_started_at" timestamp which will be used to support calculate when an assessment of a specific application moved from initial assessment into verification stage --- app/models/assessment.rb | 1 + config/analytics.yml | 1 + ..._verification_started_at_to_assessments.rb | 5 +++++ db/schema.rb | 3 ++- docs/diagram.pdf | Bin 71728 -> 71773 bytes spec/factories/assessments.rb | 1 + spec/models/assessment_spec.rb | 1 + 7 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20250529130205_add_verification_started_at_to_assessments.rb diff --git a/app/models/assessment.rb b/app/models/assessment.rb index ff2f72a438..d215aa2cbc 100644 --- a/app/models/assessment.rb +++ b/app/models/assessment.rb @@ -19,6 +19,7 @@ # 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_since_started :integer # working_days_started_to_recommendation :integer # working_days_submission_to_recommendation :integer diff --git a/config/analytics.yml b/config/analytics.yml index 2e9f94e063..e7c1b69902 100644 --- a/config/analytics.yml +++ b/config/analytics.yml @@ -89,6 +89,7 @@ - subjects - unsigned_consent_document_generated - updated_at + - verification_started_at - working_days_since_started - working_days_started_to_recommendation - working_days_submission_to_recommendation 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..5f9e9832bf --- /dev/null +++ b/db/migrate/20250529130205_add_verification_started_at_to_assessments.rb @@ -0,0 +1,5 @@ +class AddVerificationStartedAtToAssessments < ActiveRecord::Migration[8.0] + def change + add_column :assessments, :verification_started_at, :datetime + end +end diff --git a/db/schema.rb b/db/schema.rb index a9ee60c6cb..9e9774d65e 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_29_130205) do # These are extensions that must be enabled in order to support this database enable_extension "pg_catalog.plpgsql" enable_extension "pgcrypto" @@ -155,6 +155,7 @@ 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.index ["application_form_id"], name: "index_assessments_on_application_form_id" end diff --git a/docs/diagram.pdf b/docs/diagram.pdf index 7dc278d2ec0c6fdffc6e88401fee41ad2fcd907a..5f47514f6853377e3effe0317b454568534f1181 100644 GIT binary patch delta 22528 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 z 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 diff --git a/spec/factories/assessments.rb b/spec/factories/assessments.rb index 8e3e1f0fdb..a871cfba8e 100644 --- a/spec/factories/assessments.rb +++ b/spec/factories/assessments.rb @@ -19,6 +19,7 @@ # 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_since_started :integer # working_days_started_to_recommendation :integer # working_days_submission_to_recommendation :integer diff --git a/spec/models/assessment_spec.rb b/spec/models/assessment_spec.rb index 35c84514fd..63adc255ec 100644 --- a/spec/models/assessment_spec.rb +++ b/spec/models/assessment_spec.rb @@ -19,6 +19,7 @@ # 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_since_started :integer # working_days_started_to_recommendation :integer # working_days_submission_to_recommendation :integer From 739cc6f1305c0556d1409fcd6ac66628726e25ae Mon Sep 17 00:00:00 2001 From: Hassan Mir Date: Thu, 29 May 2025 14:35:08 +0100 Subject: [PATCH 2/5] Setting "verification_started_at" when application moves to verification This considers that this timestamp is only sent when the application is first moved to verification. e.g. if the application is rolledback/reversed to verification, the original timestamp will remain --- app/services/verify_assessment.rb | 5 +++++ spec/factories/assessments.rb | 1 + spec/services/verify_assessment_spec.rb | 4 ++++ 3 files changed, 10 insertions(+) diff --git a/app/services/verify_assessment.rb b/app/services/verify_assessment.rb index 62ce61091e..8510d617dd 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,10 @@ def create_reference_requests end end + def update_assessment_verification_started_at + assessment.update!(verification_started_at: Time.zone.now) if assessment.verification_started_at.nil? + end + def send_references_requested_email(reference_requests) DeliverEmail.call( application_form:, diff --git a/spec/factories/assessments.rb b/spec/factories/assessments.rb index a871cfba8e..35ad6f940c 100644 --- a/spec/factories/assessments.rb +++ b/spec/factories/assessments.rb @@ -68,6 +68,7 @@ trait :verify do recommendation { "verify" } + verification_started_at { Time.zone.now } recommended_at { Time.zone.now } end 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) From 2e030cf493e3d1be9de5c652e5f33db41141e88a Mon Sep 17 00:00:00 2001 From: Hassan Mir Date: Fri, 30 May 2025 10:14:24 +0100 Subject: [PATCH 3/5] Update the holiday dates in England and Wales --- lib/calendars/england_and_wales.yml | 9 +++++++++ 1 file changed, 9 insertions(+) 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 From 8738800a775932e472559316293b3c6d359ddd2d Mon Sep 17 00:00:00 2001 From: Hassan Mir Date: Fri, 30 May 2025 10:51:07 +0100 Subject: [PATCH 4/5] Rename, remove and add columns related to SLA for application_forms, assessments and further_information_requests These columns are used to run reports for SLA's within BigQuery where the concept of working days is not possible. This is something that our system had already been doing but the columns and their purpose are now very much out of date as the system had developed over the last 2 years. This commit adds any new working days columns required, removes columns any that are no longer used and bring no value and renaming columns to ensure there's a consistency in the pattern of naming them and making it very clear for data analysts on what they represent. --- app/helpers/application_form_helper.rb | 5 +- app/models/application_form.rb | 3 +- app/models/assessment.rb | 47 ++++++++-------- app/models/further_information_request.rb | 24 ++++---- app/services/submit_application_form.rb | 2 +- app/services/verify_assessment.rb | 4 +- config/analytics.yml | 16 +++--- ..._verification_started_at_to_assessments.rb | 2 + ...ng_days_stats_columns_on_various_tables.rb | 52 ++++++++++++++++++ db/schema.rb | 18 +++--- docs/diagram.pdf | Bin 71773 -> 71832 bytes spec/factories/application_forms.rb | 5 +- spec/factories/assessments.rb | 47 ++++++++-------- .../factories/further_information_requests.rb | 24 ++++---- spec/models/application_form_spec.rb | 3 +- spec/models/assessment_spec.rb | 47 ++++++++-------- .../further_information_request_spec.rb | 24 ++++---- spec/services/submit_application_form_spec.rb | 4 +- 18 files changed, 193 insertions(+), 134 deletions(-) create mode 100644 db/migrate/20250530085038_update_working_days_stats_columns_on_various_tables.rb 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/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 d215aa2cbc..b20f82b280 100644 --- a/app/models/assessment.rb +++ b/app/models/assessment.rb @@ -4,29 +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 -# verification_started_at :datetime -# 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 8510d617dd..502ef55455 100644 --- a/app/services/verify_assessment.rb +++ b/app/services/verify_assessment.rb @@ -87,7 +87,9 @@ def create_reference_requests end def update_assessment_verification_started_at - assessment.update!(verification_started_at: Time.zone.now) if assessment.verification_started_at.nil? + if assessment.verification_started_at.nil? + assessment.update!(verification_started_at: Time.zone.now) + end end def send_references_requested_email(reference_requests) diff --git a/config/analytics.yml b/config/analytics.yml index e7c1b69902..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 @@ -90,10 +91,11 @@ - unsigned_consent_document_generated - updated_at - verification_started_at - - working_days_since_started - - working_days_started_to_recommendation - - working_days_submission_to_recommendation - - working_days_submission_to_started + - 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 @@ -159,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 index 5f9e9832bf..22abd12c2b 100644 --- a/db/migrate/20250529130205_add_verification_started_at_to_assessments.rb +++ b/db/migrate/20250529130205_add_verification_started_at_to_assessments.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + class AddVerificationStartedAtToAssessments < ActiveRecord::Migration[8.0] def change add_column :assessments, :verification_started_at, :datetime 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 9e9774d65e..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_29_130205) 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,10 +146,9 @@ 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" @@ -156,6 +156,8 @@ 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 @@ -263,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 5f47514f6853377e3effe0317b454568534f1181..9fec81d8fb4ecc15277ba9be7f113d7247466f22 100644 GIT binary patch delta 22661 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 Date: Fri, 30 May 2025 12:49:03 +0100 Subject: [PATCH 5/5] Amending the UpdateWorkingDaysJob job to consider new column name changes and changes in logic --- app/jobs/update_working_days_job.rb | 105 ++++---- spec/jobs/update_working_days_job_spec.rb | 309 +++++++++++++++++----- 2 files changed, 292 insertions(+), 122 deletions(-) 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/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