Skip to content

Commit c4598bc

Browse files
committed
Add "nhs_number_first_added_at" field to Patient
* Will be used by Automated Careplus reports Jira-Issue: MAV-7091
1 parent 465091e commit c4598bc

5 files changed

Lines changed: 72 additions & 1 deletion

File tree

app/models/patient.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
# invalidated_at :datetime
2323
# local_authority_mhclg_code :string
2424
# nhs_number :string
25+
# nhs_number_first_added_at :datetime
2526
# pending_changes :jsonb not null
2627
# preferred_family_name :string
2728
# preferred_given_name :string
@@ -47,6 +48,7 @@
4748
# index_patients_on_names_family_first (family_name,given_name)
4849
# index_patients_on_names_given_first (given_name,family_name)
4950
# index_patients_on_nhs_number (nhs_number) UNIQUE
51+
# index_patients_on_nhs_number_first_added_at (nhs_number_first_added_at)
5052
# index_patients_on_pending_changes_not_empty (id) WHERE (pending_changes <> '{}'::jsonb)
5153
# index_patients_on_school_id (school_id)
5254
#
@@ -495,6 +497,8 @@ class Patient < ApplicationRecord
495497
it.blank? ? nil : it.normalise_whitespace.gsub(/\s/, "")
496498
end
497499

500+
before_validation :set_nhs_number_first_added_at,
501+
if: :will_save_change_to_nhs_number?
498502
after_update :sync_vaccinations_to_nhs_immunisations_api
499503
after_commit :generate_important_notice_if_needed, on: :update
500504
after_commit :search_vaccinations_from_nhs_immunisations_api, on: :update
@@ -835,6 +839,14 @@ def destroy_childless_parents
835839
end
836840
end
837841

842+
def set_nhs_number_first_added_at
843+
old_nhs_number, new_nhs_number = nhs_number_change_to_be_saved
844+
845+
return unless old_nhs_number.blank? && new_nhs_number.present?
846+
847+
self.nhs_number_first_added_at ||= Time.current
848+
end
849+
838850
def archive_due_to_deceased!
839851
archive_reasons =
840852
teams.map do |team|
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# frozen_string_literal: true
2+
3+
class AddNHSNumberFirstAddedAtForPatient < ActiveRecord::Migration[8.1]
4+
def up
5+
add_column :patients, :nhs_number_first_added_at, :datetime
6+
add_index :patients, :nhs_number_first_added_at
7+
8+
execute <<~SQL
9+
UPDATE patients
10+
SET nhs_number_first_added_at = created_at
11+
WHERE nhs_number IS NOT NULL
12+
AND nhs_number_first_added_at IS NULL
13+
SQL
14+
end
15+
16+
def down
17+
remove_index :patients, :nhs_number_first_added_at
18+
remove_column :patients, :nhs_number_first_added_at
19+
end
20+
end

db/schema.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#
1111
# It's strongly recommended that you check this file into your version control system.
1212

13-
ActiveRecord::Schema[8.1].define(version: 2026_04_19_122121) do
13+
ActiveRecord::Schema[8.1].define(version: 2026_04_22_120000) do
1414
# These are extensions that must be enabled in order to support this database
1515
enable_extension "pg_catalog.plpgsql"
1616
enable_extension "pg_trgm"
@@ -755,6 +755,7 @@
755755
t.datetime "invalidated_at"
756756
t.string "local_authority_mhclg_code"
757757
t.string "nhs_number"
758+
t.datetime "nhs_number_first_added_at"
758759
t.jsonb "pending_changes", default: {}, null: false
759760
t.string "preferred_family_name"
760761
t.string "preferred_given_name"
@@ -776,6 +777,7 @@
776777
t.index ["id"], name: "index_patients_on_pending_changes_not_empty", where: "(pending_changes <> '{}'::jsonb)"
777778
t.index ["local_authority_mhclg_code"], name: "index_patients_on_local_authority_mhclg_code"
778779
t.index ["nhs_number"], name: "index_patients_on_nhs_number", unique: true
780+
t.index ["nhs_number_first_added_at"], name: "index_patients_on_nhs_number_first_added_at"
779781
t.index ["school_id"], name: "index_patients_on_school_id"
780782
end
781783

spec/factories/patients.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
# invalidated_at :datetime
2323
# local_authority_mhclg_code :string
2424
# nhs_number :string
25+
# nhs_number_first_added_at :datetime
2526
# pending_changes :jsonb not null
2627
# preferred_family_name :string
2728
# preferred_given_name :string
@@ -47,6 +48,7 @@
4748
# index_patients_on_names_family_first (family_name,given_name)
4849
# index_patients_on_names_given_first (given_name,family_name)
4950
# index_patients_on_nhs_number (nhs_number) UNIQUE
51+
# index_patients_on_nhs_number_first_added_at (nhs_number_first_added_at)
5052
# index_patients_on_pending_changes_not_empty (id) WHERE (pending_changes <> '{}'::jsonb)
5153
# index_patients_on_school_id (school_id)
5254
#
@@ -91,6 +93,7 @@
9193
"#{base}#{check_digit}"
9294
end
9395
end
96+
nhs_number_first_added_at { nhs_number.present? ? Time.current : nil }
9497

9598
given_name { Faker::Name.first_name }
9699
family_name { Faker::Name.last_name }

spec/models/patient_spec.rb

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
# invalidated_at :datetime
2323
# local_authority_mhclg_code :string
2424
# nhs_number :string
25+
# nhs_number_first_added_at :datetime
2526
# pending_changes :jsonb not null
2627
# preferred_family_name :string
2728
# preferred_given_name :string
@@ -47,6 +48,7 @@
4748
# index_patients_on_names_family_first (family_name,given_name)
4849
# index_patients_on_names_given_first (given_name,family_name)
4950
# index_patients_on_nhs_number (nhs_number) UNIQUE
51+
# index_patients_on_nhs_number_first_added_at (nhs_number_first_added_at)
5052
# index_patients_on_pending_changes_not_empty (id) WHERE (pending_changes <> '{}'::jsonb)
5153
# index_patients_on_school_id (school_id)
5254
#
@@ -1307,6 +1309,38 @@
13071309
end
13081310
end
13091311

1312+
describe "NHS number first added timestamp" do
1313+
it "sets nhs_number_first_added_at when an NHS number is first added" do
1314+
patient =
1315+
create(:patient, nhs_number: nil, nhs_number_first_added_at: nil)
1316+
1317+
freeze_time do
1318+
expect { patient.update!(nhs_number: "9449310475") }.to change {
1319+
patient.reload.nhs_number_first_added_at
1320+
}.from(nil).to(Time.current)
1321+
end
1322+
end
1323+
1324+
it "does not clear nhs_number_first_added_at when an NHS number is removed" do
1325+
patient = create(:patient)
1326+
1327+
expect { patient.update!(nhs_number: nil) }.not_to(
1328+
change { patient.reload.nhs_number_first_added_at }
1329+
)
1330+
end
1331+
1332+
it "does not overwrite nhs_number_first_added_at when an NHS number is re-added" do
1333+
patient = create(:patient)
1334+
first_added_at = patient.nhs_number_first_added_at
1335+
1336+
patient.update!(nhs_number: nil)
1337+
1338+
expect { patient.update!(nhs_number: "9449310475") }.not_to change {
1339+
patient.reload.nhs_number_first_added_at
1340+
}.from(first_added_at)
1341+
end
1342+
end
1343+
13101344
describe "#should_search_vaccinations_from_nhs_immunisations_api?" do
13111345
subject(:should_search_vaccinations_from_nhs_immunisations_api?) do
13121346
patient.send(:should_search_vaccinations_from_nhs_immunisations_api?)

0 commit comments

Comments
 (0)