Skip to content

Commit 05a5cc4

Browse files
authored
Merge pull request #3949 from nhsuk/restrict-flu-current-academic-year
Prevent uploading flu vaccinations from previous years
2 parents e4a6cbf + 3c343f1 commit 05a5cc4

4 files changed

Lines changed: 74 additions & 73 deletions

File tree

app/models/immunisation_import_row.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -572,6 +572,15 @@ def validate_date_of_vaccination
572572
end
573573
end
574574

575+
if programme&.flu? &&
576+
date_of_vaccination.to_date.academic_year !=
577+
Date.current.academic_year
578+
errors.add(
579+
date_of_vaccination.header,
580+
"must be in the current academic year"
581+
)
582+
end
583+
575584
if offline_recording? && session &&
576585
!session.dates.include?(date_of_vaccination.to_date)
577586
errors.add(
Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
ORGANISATION_CODE,SCHOOL_URN,SCHOOL_NAME,NHS_NUMBER,PERSON_FORENAME,PERSON_SURNAME,PERSON_DOB,PERSON_GENDER_CODE,PERSON_POSTCODE,VACCINATED,DATE_OF_VACCINATION,PROGRAMME,VACCINE_GIVEN,BATCH_NUMBER,BATCH_EXPIRY_DATE,ANATOMICAL_SITE,PERFORMING_PROFESSIONAL_FORENAME,PERFORMING_PROFESSIONAL_SURNAME,REASON_NOT_VACCINATED,CONSENT_TYPE,LOCAL_PATIENT_ID,LOCAL_PATIENT_ID_URI
2-
R1L,120026,shaftesbury junior school ,7420180008,Chyna,Pickle,20120912,Not Specified,LE3 2DA,Yes,20240514,Flu,,123013325,20220730,Left Buttock,Vaccinator1,Name1,,Parental Consent,LocalPatient1,www.LocalPatient1
3-
R1L,120026,shaftesbury junior school ,,Renie,Parrish,20120913,Not Specified,LE1 2DA,Yes,20240514,Flu,Seqirus Flucelvax Tetra QIVC,123013325,20220730,Right Buttock,Vaccinator1,Name1,,Parental Consent,LocalPatient2,www.LocalPatient2
4-
R1L,120026,shaftesbury junior school ,4146825652,Caden,Attwater,20120914,Male,LE1 2DA,Yes,20240514,Flu,Sanofi Pasteur QIVe,123013325,20220730,Left Thigh,Vaccinator1,Name1,,Parental Consent,LocalPatient3,www.LocalPatient3
5-
R1L,120026,shaftesbury junior school ,2675725722,Berry,Hamilton,20120915,Female,LE8 2DA,Yes,20240514,Flu,AstraZeneca Fluenz Tetra LAIV,123013325,20220730,Nasal,Vaccinator1,Name1,,Parental Consent,LocalPatient4,www.LocalPatient4
6-
R1L,120026,shaftesbury junior school ,1108533868,Jordin,Mould,20120916,Male,LE2 2PX,Yes,20240514,Flu,Seqirus Flucelvax Tetra QIVC,123013325,20220730,Left Upper Arm,Vaccinator1,Name1,,Parental Consent,LocalPatient5,www.LocalPatient5
7-
R1L,120026,shaftesbury junior school ,8160442742,Oliver,Bowers,20120917,Male,LE5 2RP,Yes,20240514,Flu,,123013326,20220730,Right Upper Arm,Vaccinator1,Name1,,Parental Consent,LocalPatient6,www.LocalPatient6
8-
R1L,120026,shaftesbury junior school ,3314278071,Rosalind,Penn,20120918,Female,LE10 2DA,Yes,20240514,Flu,Sanofi Pasteur QIVe,123013326,20220730,Right Thigh,Vaccinator1,Name1,,Parental Consent,LocalPatient7,www.LocalPatient7
9-
R1L,120026,shaftesbury junior school ,3017356345,Trudie,Chadwick,20120919,Female,LE3 3DE,no,20240514,Flu,Sanofi Pasteur QIVe,,,,Vaccinator1,Name1,Did Not Attend,,LocalPatient8,www.LocalPatient8
10-
R1L,144012,Home Schooled,5404296666,Alecia,Ainsworth,20120920,Female,LE7 2DA,no,20240514,Flu,AstraZeneca Fluenz Tetra LAIV,,,,Vaccinator1,Name1,Vaccination Contraindicated,,LocalPatient9,www.LocalPatient9
11-
R1L,999999,Home Schooled,6401122986,Lily,Fletcher,20120921,Female,LE7 2PX,no,20240514,Flu,AstraZeneca Fluenz Tetra LAIV,,,,Vaccinator1,Name1,Unwell,,LocalPatient10,www.LocalPatient10
12-
R1L,888888,Unknown School,9990000018,Pete,Jones,20120922,Male,LE7 2FF,no,20240514,Flu,AstraZeneca Fluenz Tetra LAIV,,,,Vaccinator1,Name1,Unwell,,LocalPatient11,www.LocalPatient11
2+
R1L,120026,shaftesbury junior school ,7420180008,Chyna,Pickle,20120912,Not Specified,LE3 2DA,Yes,20250514,Flu,,123013325,20220730,Left Buttock,Vaccinator1,Name1,,Parental Consent,LocalPatient1,www.LocalPatient1
3+
R1L,120026,shaftesbury junior school ,,Renie,Parrish,20120913,Not Specified,LE1 2DA,Yes,20250514,Flu,Seqirus Flucelvax Tetra QIVC,123013325,20220730,Right Buttock,Vaccinator1,Name1,,Parental Consent,LocalPatient2,www.LocalPatient2
4+
R1L,120026,shaftesbury junior school ,4146825652,Caden,Attwater,20120914,Male,LE1 2DA,Yes,20250514,Flu,Sanofi Pasteur QIVe,123013325,20220730,Left Thigh,Vaccinator1,Name1,,Parental Consent,LocalPatient3,www.LocalPatient3
5+
R1L,120026,shaftesbury junior school ,2675725722,Berry,Hamilton,20120915,Female,LE8 2DA,Yes,20250514,Flu,AstraZeneca Fluenz Tetra LAIV,123013325,20220730,Nasal,Vaccinator1,Name1,,Parental Consent,LocalPatient4,www.LocalPatient4
6+
R1L,120026,shaftesbury junior school ,1108533868,Jordin,Mould,20120916,Male,LE2 2PX,Yes,20250514,Flu,Seqirus Flucelvax Tetra QIVC,123013325,20220730,Left Upper Arm,Vaccinator1,Name1,,Parental Consent,LocalPatient5,www.LocalPatient5
7+
R1L,120026,shaftesbury junior school ,8160442742,Oliver,Bowers,20120917,Male,LE5 2RP,Yes,20250514,Flu,,123013326,20220730,Right Upper Arm,Vaccinator1,Name1,,Parental Consent,LocalPatient6,www.LocalPatient6
8+
R1L,120026,shaftesbury junior school ,3314278071,Rosalind,Penn,20120918,Female,LE10 2DA,Yes,20250514,Flu,Sanofi Pasteur QIVe,123013326,20220730,Right Thigh,Vaccinator1,Name1,,Parental Consent,LocalPatient7,www.LocalPatient7
9+
R1L,120026,shaftesbury junior school ,3017356345,Trudie,Chadwick,20120919,Female,LE3 3DE,no,20250514,Flu,Sanofi Pasteur QIVe,,,,Vaccinator1,Name1,Did Not Attend,,LocalPatient8,www.LocalPatient8
10+
R1L,144012,Home Schooled,5404296666,Alecia,Ainsworth,20120920,Female,LE7 2DA,no,20250514,Flu,AstraZeneca Fluenz Tetra LAIV,,,,Vaccinator1,Name1,Vaccination Contraindicated,,LocalPatient9,www.LocalPatient9
11+
R1L,999999,Home Schooled,6401122986,Lily,Fletcher,20120921,Female,LE7 2PX,no,20250514,Flu,AstraZeneca Fluenz Tetra LAIV,,,,Vaccinator1,Name1,Unwell,,LocalPatient10,www.LocalPatient10
12+
R1L,888888,Unknown School,9990000018,Pete,Jones,20120922,Male,LE7 2FF,no,20250514,Flu,AstraZeneca Fluenz Tetra LAIV,,,,Vaccinator1,Name1,Unwell,,LocalPatient11,www.LocalPatient11
1313
,,,,,,,,,,,,,,,,,,,,

spec/models/immunisation_import_row_spec.rb

Lines changed: 53 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
end
1515
end
1616

17-
let(:programmes) { [create(:programme, :flu)] }
17+
let(:programmes) { [create(:programme, :hpv)] }
1818
let(:organisation) { create(:organisation, ods_code: "abc", programmes:) }
1919

2020
let(:nhs_number) { "9990000018" }
@@ -36,29 +36,31 @@
3636
"PERSON_DOB" => date_of_birth,
3737
"PERSON_POSTCODE" => address_postcode,
3838
"PERSON_GENDER_CODE" => "Male",
39-
"NHS_NUMBER" => nhs_number,
40-
"DATE_OF_VACCINATION" => "20240101"
39+
"NHS_NUMBER" => nhs_number
4140
}
4241
end
4342
let(:valid_flu_data) do
4443
valid_common_data.deep_dup.merge(
45-
"PROGRAMME" => "Flu",
46-
"VACCINE_GIVEN" => "AstraZeneca Fluenz Tetra LAIV",
4744
"ANATOMICAL_SITE" => "nasal",
45+
"BATCH_EXPIRY_DATE" => Date.tomorrow.iso8601,
46+
"DATE_OF_VACCINATION" => Date.current.iso8601,
4847
"PERFORMING_PROFESSIONAL_FORENAME" => "John",
49-
"PERFORMING_PROFESSIONAL_SURNAME" => "Smith"
48+
"PERFORMING_PROFESSIONAL_SURNAME" => "Smith",
49+
"PROGRAMME" => "Flu",
50+
"VACCINE_GIVEN" => "AstraZeneca Fluenz Tetra LAIV"
5051
)
5152
end
5253
let(:valid_hpv_data) do
5354
valid_common_data.deep_dup.merge(
54-
"PROGRAMME" => "HPV",
55-
"VACCINE_GIVEN" => "Gardasil9",
5655
"ANATOMICAL_SITE" => "Left Upper Arm",
56+
"CARE_SETTING" => "1",
57+
"DATE_OF_VACCINATION" => "20240101",
5758
"DOSE_SEQUENCE" => "1",
58-
"CARE_SETTING" => "1"
59+
"PROGRAMME" => "HPV",
60+
"VACCINE_GIVEN" => "Gardasil9"
5961
)
6062
end
61-
let(:valid_data) { valid_flu_data }
63+
let(:valid_data) { valid_hpv_data }
6264

6365
let!(:location) { create(:school, urn: "123456", name: "Waterloo Road") }
6466

@@ -568,7 +570,22 @@
568570
end
569571
end
570572

573+
context "Flu vaccination in previous academic year" do
574+
let(:programmes) { [create(:programme, :flu)] }
575+
576+
let(:data) { valid_flu_data.merge("DATE_OF_VACCINATION" => "20240101") }
577+
578+
it "is invalid" do
579+
expect(immunisation_import_row).to be_invalid
580+
expect(
581+
immunisation_import_row.errors["DATE_OF_VACCINATION"]
582+
).to contain_exactly("must be in the current academic year")
583+
end
584+
end
585+
571586
context "Flu vaccination in previous academic year, no vaccinator details provided" do
587+
let(:programmes) { [create(:programme, :flu)] }
588+
572589
let(:data) do
573590
valid_flu_data.except(
574591
"PERFORMING_PROFESSIONAL_EMAIL",
@@ -739,27 +756,7 @@
739756
context "with valid fields for Flu" do
740757
let(:programmes) { [create(:programme, :flu)] }
741758

742-
let(:data) do
743-
{
744-
"ORGANISATION_CODE" => "abc",
745-
"VACCINATED" => "Y",
746-
"BATCH_EXPIRY_DATE" => "20210101",
747-
"BATCH_NUMBER" => "123",
748-
"ANATOMICAL_SITE" => "nasal",
749-
"SCHOOL_NAME" => "Hogwarts",
750-
"SCHOOL_URN" => "123456",
751-
"PERSON_FORENAME" => "Harry",
752-
"PERSON_SURNAME" => "Potter",
753-
"PERSON_DOB" => "20120101",
754-
"PERSON_POSTCODE" => "SW1A 1AA",
755-
"PERSON_GENDER_CODE" => "Male",
756-
"DATE_OF_VACCINATION" => "20240101",
757-
"PROGRAMME" => "Flu",
758-
"VACCINE_GIVEN" => "AstraZeneca Fluenz Tetra LAIV",
759-
"PERFORMING_PROFESSIONAL_FORENAME" => "John",
760-
"PERFORMING_PROFESSIONAL_SURNAME" => "Smith"
761-
}
762-
end
759+
let(:data) { valid_flu_data }
763760

764761
it { should be_valid }
765762

@@ -782,26 +779,7 @@
782779
context "with valid fields for HPV" do
783780
let(:programmes) { [create(:programme, :hpv)] }
784781

785-
let(:data) do
786-
{
787-
"ORGANISATION_CODE" => "abc",
788-
"BATCH_EXPIRY_DATE" => "20210101",
789-
"BATCH_NUMBER" => "123",
790-
"ANATOMICAL_SITE" => "left thigh",
791-
"SCHOOL_NAME" => "Hogwarts",
792-
"SCHOOL_URN" => "123456",
793-
"PERSON_FORENAME" => "Harry",
794-
"PERSON_SURNAME" => "Potter",
795-
"PERSON_DOB" => "20120101",
796-
"PERSON_POSTCODE" => "SW1A 1AA",
797-
"PERSON_GENDER_CODE" => "Male",
798-
"DATE_OF_VACCINATION" => "20240101",
799-
"PROGRAMME" => "HPV",
800-
"VACCINE_GIVEN" => "Gardasil9",
801-
"DOSE_SEQUENCE" => "1",
802-
"CARE_SETTING" => "1"
803-
}
804-
end
782+
let(:data) { valid_hpv_data }
805783

806784
it { should be_valid }
807785
end
@@ -825,13 +803,6 @@
825803

826804
it { should be_administered }
827805

828-
it "has a vaccinator" do
829-
expect(vaccination_record.performed_by).to have_attributes(
830-
given_name: "John",
831-
family_name: "Smith"
832-
)
833-
end
834-
835806
it "sets the administered at time" do
836807
expect(vaccination_record.performed_at).to eq(
837808
Time.new(2024, 1, 1, 0, 0, 0, "+00:00")
@@ -888,6 +859,19 @@
888859
end
889860
end
890861

862+
context "with the flu programme" do
863+
let(:programmes) { [create(:programme, :flu)] }
864+
865+
let(:data) { valid_flu_data }
866+
867+
it "has a vaccinator" do
868+
expect(vaccination_record.performed_by).to have_attributes(
869+
given_name: "John",
870+
family_name: "Smith"
871+
)
872+
end
873+
end
874+
891875
context "without a vaccine" do
892876
let(:data) { valid_data.except("VACCINE_GIVEN") }
893877

@@ -1041,7 +1025,11 @@
10411025
let(:programmes) { [create(:programme, :hpv)] }
10421026

10431027
let(:data) do
1044-
valid_data.merge("PROGRAMME" => "HPV", "VACCINE_GIVEN" => "Gardasil9")
1028+
valid_data.merge(
1029+
"PROGRAMME" => "HPV",
1030+
"VACCINE_GIVEN" => "Gardasil9",
1031+
"DOSE_SEQUENCE" => ""
1032+
)
10451033
end
10461034

10471035
it { should eq(1) }
@@ -1053,7 +1041,8 @@
10531041
let(:data) do
10541042
valid_data.merge(
10551043
"PROGRAMME" => "3-in-1",
1056-
"VACCINE_GIVEN" => "Revaxis"
1044+
"VACCINE_GIVEN" => "Revaxis",
1045+
"DOSE_SEQUENCE" => ""
10571046
)
10581047
end
10591048

@@ -1066,7 +1055,8 @@
10661055
let(:data) do
10671056
valid_data.merge(
10681057
"PROGRAMME" => "MenACWY",
1069-
"VACCINE_GIVEN" => "MenQuadfi"
1058+
"VACCINE_GIVEN" => "MenQuadfi",
1059+
"DOSE_SEQUENCE" => ""
10701060
)
10711061
end
10721062

@@ -1173,6 +1163,8 @@
11731163
describe "#location_name" do
11741164
subject { vaccination_record.location_name }
11751165

1166+
let(:valid_data) { valid_hpv_data.except("CARE_SETTING") }
1167+
11761168
context "with a school session that exists" do
11771169
let(:data) do
11781170
valid_data.merge(

spec/support/shared_examples/a_csv_importable_model.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
end
4848

4949
describe "#process!" do
50-
let(:today) { Time.zone.local(2025, 1, 1) }
50+
let(:today) { Time.zone.local(2025, 6, 1) }
5151

5252
it "sets processed_at" do
5353
expect { travel_to(today) { subject.process! } }.to change(

0 commit comments

Comments
 (0)