Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
92 commits
Select commit Hold shift + click to select a range
72e91e6
Add AppSubNavigationComponent
murugapl Jan 13, 2026
412dba5
Redesign "Your team" tab
murugapl Jan 13, 2026
871f654
Never stage changes for national reporting uploads
alistair-white-horne-tng Jan 19, 2026
7fbdf71
Show `Synced with NHSE?` on national reporting vaccinations
alistair-white-horne-tng Jan 19, 2026
1ecf34e
Bump reporting totals view to v03
mikejamesthompson Jan 20, 2026
5595b8a
Add school URN and name to reporting totals view
mikejamesthompson Jan 20, 2026
f45fcf8
Add school grouping option to totals CSV export
mikejamesthompson Jan 20, 2026
c7a5e1b
Add school grouping option to totals JSON
mikejamesthompson Jan 20, 2026
894198f
Improve CLI add-to-team commands
murugapl Jan 16, 2026
97f3240
Improve feedback and test coverage for CLI remove-from-team
murugapl Jan 16, 2026
7b156ec
Update docs for school management CLI commands
murugapl Jan 20, 2026
88ce3cc
Remove `UpdatesPatientTeam` from `ArchiveReason`
thomasleese Jan 16, 2026
7167fd1
Remove `UpdatesPatientTeam` from `PatientLocation`
thomasleese Jan 16, 2026
8d0d614
Remove `UpdatesPatientTeam` from `TeamLocation`
thomasleese Jan 16, 2026
cd6c621
Remove `UpdatesPatientTeam` from `SchoolMove`
thomasleese Jan 16, 2026
fcaa741
Remove `UpdatesPatientTeam` from `VaccinationRecord`
thomasleese Jan 16, 2026
2cfbe14
Remove `UpdatesPatientTeam`
thomasleese Jan 16, 2026
32dd3ee
Refactor `UnsupportedProgramme`
thomasleese Jan 15, 2026
0e6d325
Refactor status generator programme argument
thomasleese Jan 15, 2026
4d5cc1f
Remove `PatientStatusResolver#consent`
thomasleese Jan 15, 2026
070f5ff
Remove `PatientStatusResolver#triage`
thomasleese Jan 15, 2026
e7671f7
Simplify `PatientStatusResolver`
thomasleese Jan 15, 2026
ffb0461
Merge pull request #5759 from nhsuk/resolve-status-consent-triage-vac…
thomasleese Jan 20, 2026
7f568de
Merge pull request #5797 from nhsuk/patient-team-no-callbacks
thomasleese Jan 20, 2026
0b64ebf
Merge pull request #5802 from nhsuk/alistair/national-reporting-show-…
alistair-white-horne-tng Jan 20, 2026
c5040f4
Refactor eligibility scope
thomasleese Jan 19, 2026
51b629e
Stop using `Patient::VaccinationStatus`
thomasleese Jan 19, 2026
7068a7c
Stop updating `Patient::VaccinationStatus`
thomasleese Jan 19, 2026
532115d
Remove `Patient::VaccinationStatus`
thomasleese Jan 19, 2026
4344706
Add Rake task for generating RDoc documentation
jhenderson Jan 20, 2026
ef139ff
Add GitHub Action for deploying RDoc documentation
jhenderson Jan 20, 2026
65d2ed7
Merge pull request #5814 from nhsuk/school-group-csv
mikejamesthompson Jan 20, 2026
eea9887
Merge pull request #5782 from nhsuk/improve-schools-add-to-team
murugapl Jan 20, 2026
7fc8347
Merge pull request #5737 from nhsuk/redesign-your-team-tab
murugapl Jan 20, 2026
7da95ce
Bump sidekiq-throttled from 2.0.0 to 2.1.0
dependabot[bot] Jan 20, 2026
45fde14
Bump rubocop-govuk from `58ff329` to `cb59fb7`
dependabot[bot] Jan 20, 2026
aff1646
Merge pull request #5828 from nhsuk/dependabot/bundler/next/rubocop-g…
thomasleese Jan 20, 2026
ce40626
Merge pull request #5827 from nhsuk/dependabot/bundler/next/sidekiq-t…
thomasleese Jan 20, 2026
6850362
Merge pull request #5822 from nhsuk/rdoc-via-github-pages
jhenderson Jan 21, 2026
6171286
Enable bundler caching in deploy-documentation workflow
jhenderson Jan 21, 2026
e2adab7
Merge pull request #5798 from nhsuk/stop-using-patient-vaccination-st…
thomasleese Jan 21, 2026
d234f63
Merge pull request #5829 from nhsuk/fix-documentation-workflow-bundler
jhenderson Jan 21, 2026
4cf3778
Fix typo in RDoc generation task in deploy-documentation workflow
jhenderson Jan 21, 2026
0601532
Merge pull request #5830 from nhsuk/fix-documentation-workflow-typo
jhenderson Jan 21, 2026
a460c06
Add `BatchNameValidator`
alistair-white-horne-tng Jan 15, 2026
378b283
Allow national reporting users to edit vaccine and batch
alistair-white-horne-tng Jan 15, 2026
fff4ef5
Display `nivs_name` on vaccines for national reporting users
alistair-white-horne-tng Jan 15, 2026
597b0d1
Add "Change" links on the Vaccine and batch expiry date rows
alistair-white-horne-tng Jan 15, 2026
e26d02b
Merge pull request #5821 from nhsuk/alistair/national-reporting-edit-…
alistair-white-horne-tng Jan 21, 2026
1dba0a7
Remove references to import issues in the UI
alistair-white-horne-tng Jan 19, 2026
2092f23
Add RDoc links to README for `next` and `release` versions
jhenderson Jan 21, 2026
9ecc589
Show team schools and clinics for current academic year
murugapl Jan 21, 2026
3087bcc
Merge pull request #5831 from nhsuk/de-dup-schools-on-teams-page
murugapl Jan 21, 2026
9efe5c7
Merge pull request #5832 from nhsuk/update-readme-with-rdoc-links
jhenderson Jan 21, 2026
c68fb29
Merge pull request #5806 from nhsuk/alistair/national-reporting-hide-…
alistair-white-horne-tng Jan 21, 2026
863375c
Make support ods code configurable
misaka Jan 21, 2026
6d0292e
Handle external or missing practitioner user
misaka Jan 20, 2026
380c180
Merge pull request #5836 from nhsuk/support-org-setting-mav-2756
misaka Jan 21, 2026
07e3057
Merge pull request #5825 from nhsuk/external-missing-practitioner-mav…
misaka Jan 21, 2026
82cc4fa
Fix flaky test
thomasleese Jan 21, 2026
ecc502a
Merge pull request #5837 from nhsuk/fix-flaky-test
thomasleese Jan 21, 2026
fd93aa4
Change Schools column header to "URN"
murugapl Jan 21, 2026
1febc1c
Fix flaky tests caused by MMR date calculations
misaka Jan 21, 2026
58ffccc
Merge pull request #5840 from nhsuk/fix-flaky-test-end-of-month-dob
misaka Jan 21, 2026
7152944
Merge pull request #5839 from nhsuk/fix-schools-table-column-width
murugapl Jan 21, 2026
a93867e
Fix NoMethodError when processing empty immunisation imports
jhenderson Jan 21, 2026
22ccdf2
Refactor `new` and `edit` parent relationship views to use shared `_f…
jhenderson Jan 20, 2026
cdb8d99
Merge pull request #5842 from nhsuk/fix-immunisation-import-no-method…
jhenderson Jan 21, 2026
902a536
Merge pull request #5843 from nhsuk/remove-code-duplication-between-t…
jhenderson Jan 21, 2026
b33fdf7
Add CarePlus staff fields to team model and use in report
mikejamesthompson Jan 17, 2026
d3bb1e2
Add CarePlus fields to onboarding model
mikejamesthompson Jan 17, 2026
83bd0aa
Remove FILE_FORMATS from VaccinationReport
mikejamesthompson Jan 19, 2026
f5e886a
Make careplus_venue_code optional and add to careplus_enabled
mikejamesthompson Jan 19, 2026
1011348
Rename care_plus_enabled -> careplus_enabled
mikejamesthompson Jan 19, 2026
f353f92
Merge pull request #5796 from nhsuk/mike/add-careplus-fields-to-team-…
mikejamesthompson Jan 21, 2026
da45efc
Bump aws-sdk-ec2 from 1.591.0 to 1.592.0
dependabot[bot] Jan 21, 2026
e521159
Bump prettier from 3.8.0 to 3.8.1
dependabot[bot] Jan 21, 2026
0e3d0a4
Bump dry-cli from 1.4.0 to 1.4.1
dependabot[bot] Jan 21, 2026
51649bb
Bump with_advisory_lock from 7.0.2 to 7.5.0
dependabot[bot] Jan 21, 2026
1951310
Bump puma from 7.1.0 to 7.2.0
dependabot[bot] Jan 21, 2026
bbb12c3
Merge pull request #5844 from nhsuk/dependabot/bundler/next/aws-sdk-e…
thomasleese Jan 22, 2026
0a8ba74
Merge pull request #5845 from nhsuk/dependabot/npm_and_yarn/next/pret…
thomasleese Jan 22, 2026
4dac8bb
Merge pull request #5846 from nhsuk/dependabot/bundler/next/dry-cli-1…
thomasleese Jan 22, 2026
b4420cb
Merge pull request #5847 from nhsuk/dependabot/bundler/next/with_advi…
thomasleese Jan 22, 2026
dc4817b
Merge pull request #5848 from nhsuk/dependabot/bundler/next/puma-7.2.0
thomasleese Jan 22, 2026
d146328
Bump lodash in the npm_and_yarn group across 1 directory
dependabot[bot] Jan 22, 2026
e9bfa65
Merge pull request #5849 from nhsuk/dependabot/npm_and_yarn/npm_and_y…
thomasleese Jan 22, 2026
eab53a3
Generate v04 of Reporting API Totals view
mikejamesthompson Jan 22, 2026
33b59fc
Update school.name in reporting api totals view
mikejamesthompson Jan 22, 2026
b16682e
Merge pull request #5853 from nhsuk/school-info
mikejamesthompson Jan 22, 2026
b61e251
Setup the pentest environment
TheOneFromNorway Jan 14, 2026
5f638a2
Merge pull request #5855 from nhsuk/pentest_environment_setup
TheOneFromNorway Jan 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/deploy-application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ on:
- sandbox-alpha
- sandbox-beta
- performance
- pentest
server_types:
description: Server types to deploy
required: true
Expand Down
35 changes: 35 additions & 0 deletions .github/workflows/deploy-documentation.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
name: Deploy Documentation

on:
push:
branches:
- release
- next

permissions:
contents: write

jobs:
deploy-documentation:
name: Generate and Publish RDoc
runs-on: ubuntu-latest
concurrency:
group: deploy-documentation-${{ github.ref_name }}
cancel-in-progress: true

steps:
- uses: actions/checkout@v6
- uses: ruby/setup-ruby@v1
with:
bundler-cache: true

- name: Generate Documentation
run: bundle exec rake rdoc:generate

- name: Deploy to GitHub Pages
uses: JamesIves/github-pages-deploy-action@v4
with:
branch: gh-pages
folder: docs/rdoc
target-folder: docs/rdoc/${{ github.ref_name }}
clean: false
1 change: 1 addition & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ on:
- sandbox-alpha
- sandbox-beta
- performance
- pentest
server_types:
description: Server types to deploy
required: true
Expand Down
14 changes: 7 additions & 7 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
GIT
remote: https://github.com/alphagov/rubocop-govuk.git
revision: 58ff3290bf5c267d0228d0910fa0bc92a405ec81
revision: cb59fb73abfb010ea000ed53dcc84a3e20c28974
branch: main
specs:
rubocop-govuk (5.1.20)
Expand Down Expand Up @@ -136,7 +136,7 @@ GEM
ast (2.4.3)
attr_required (1.0.2)
aws-eventstream (1.4.0)
aws-partitions (1.1206.0)
aws-partitions (1.1208.0)
aws-sdk-accessanalyzer (1.85.0)
aws-sdk-core (~> 3, >= 3.241.4)
aws-sigv4 (~> 1.5)
Expand All @@ -148,7 +148,7 @@ GEM
bigdecimal
jmespath (~> 1, >= 1.6.1)
logger
aws-sdk-ec2 (1.591.0)
aws-sdk-ec2 (1.592.0)
aws-sdk-core (~> 3, >= 3.241.4)
aws-sigv4 (~> 1.5)
aws-sdk-ecr (1.119.0)
Expand Down Expand Up @@ -243,7 +243,7 @@ GEM
docile (1.4.1)
domain_name (0.6.20240107)
drb (2.2.3)
dry-cli (1.4.0)
dry-cli (1.4.1)
email_validator (2.2.4)
activemodel
erb (6.0.1)
Expand Down Expand Up @@ -486,7 +486,7 @@ GEM
date
stringio
public_suffix (7.0.2)
puma (7.1.0)
puma (7.2.0)
nio4r (~> 2.0)
pundit (2.5.2)
activesupport (>= 3.0.0)
Expand Down Expand Up @@ -674,7 +674,7 @@ GEM
sidekiq-scheduler (6.0.1)
rufus-scheduler (~> 3.2)
sidekiq (>= 7.3, < 9)
sidekiq-throttled (2.0.0)
sidekiq-throttled (2.1.0)
concurrent-ruby (>= 1.2.0)
redis-prescription (~> 2.2)
sidekiq (>= 8.0)
Expand Down Expand Up @@ -786,7 +786,7 @@ GEM
websocket-extensions (0.1.5)
wicked (2.0.0)
railties (>= 3.0.7)
with_advisory_lock (7.0.2)
with_advisory_lock (7.5.0)
activerecord (>= 7.2)
zeitwerk (>= 2.7)
xpath (3.2.0)
Expand Down
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,13 @@ This is a service used within the NHS for managing and recording school-aged vac
| [Training](https://github.com/nhsuk/manage-vaccinations-in-schools/deployments/training) | [training.manage-vaccinations-in-schools.nhs.uk](https://training.manage-vaccinations-in-schools.nhs.uk) | External training | ❌ | `release` branch | manual | [`staging`](config/environments/staging.rb) |
| [Production](https://github.com/nhsuk/manage-vaccinations-in-schools/deployments/production) | [www.manage-vaccinations-in-schools.nhs.uk](https://www.manage-vaccinations-in-schools.nhs.uk) | Live service | ✅ | `release` branch | manual | [`production`](config/environments/production.rb) |

## Documentation

We have two Rdoc versions:

1. [next](https://nhsuk.github.io/manage-vaccinations-in-schools/rdoc/next) - useful for dev work (based off the `next` branch).
2. [release](https://nhsuk.github.io/manage-vaccinations-in-schools/rdoc/release) - useful for ops to debug live issues (based off the `release` branch).

## Development

### Prerequisites
Expand Down
1 change: 1 addition & 0 deletions app/assets/stylesheets/components/_index.scss
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
@forward "session-banner";
@forward "status";
@forward "sticky-navigation";
@forward "sub-navigation";
@forward "summary-list";
@forward "tables";
@forward "tag";
Expand Down
67 changes: 67 additions & 0 deletions app/assets/stylesheets/components/_sub-navigation.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
@use "../vendor/nhsuk-frontend" as *;

$_current-indicator-width: 4px;

.app-sub-navigation {
@include nhsuk-font(16);
}

.app-sub-navigation__section {
margin: 0 0 nhsuk-spacing(4);
padding: 0;
list-style-type: none;

@include nhsuk-font(16);
}

.app-sub-navigation__link {
padding-top: nhsuk-spacing(1);
padding-bottom: nhsuk-spacing(1);

@include nhsuk-link-style-default;
@include nhsuk-link-style-no-visited-state;

&:link {
text-decoration: none;
}

&:not(:focus):hover {
color: $nhsuk-link-colour;
}
}

.app-sub-navigation__section-item {
margin-bottom: nhsuk-spacing(1);
padding-top: nhsuk-spacing(1);
padding-bottom: nhsuk-spacing(1);
}

.app-sub-navigation__section-item--current {
margin-left: -(nhsuk-spacing(2) + $_current-indicator-width);
padding-left: nhsuk-spacing(2);
border-left: $_current-indicator-width solid $nhsuk-link-colour;
}

.app-sub-navigation__link[aria-current] {
font-weight: bold;
}

.app-sub-navigation__section--nested {
margin-top: nhsuk-spacing(2);
margin-bottom: 0;
padding-left: nhsuk-spacing(4);
}

.app-sub-navigation__section--nested .app-sub-navigation__section-item::before {
content: "—";
margin-left: nhsuk-spacing(-4);
color: $nhsuk-secondary-text-colour;
}

.app-sub-navigation__theme {
margin: 0;
padding: nhsuk-spacing(2) nhsuk-spacing(3) nhsuk-spacing(2) 0;
color: $nhsuk-secondary-text-colour;

@include nhsuk-font(19, $weight: bold);
}
4 changes: 2 additions & 2 deletions app/components/app_activity_log_component.rb
Original file line number Diff line number Diff line change
Expand Up @@ -203,12 +203,12 @@ def expiration_events

not_vaccinated_programmes =
all_programmes.reject do |programme|
patient.vaccination_status(programme:, academic_year:).vaccinated?
patient.programme_status(programme, academic_year:).vaccinated?
end

vaccinated_but_seasonal_programmes =
all_programmes.select do |programme|
patient.vaccination_status(programme:, academic_year:).vaccinated? &&
patient.programme_status(programme, academic_year:).vaccinated? &&
programme.seasonal?
end

Expand Down
12 changes: 7 additions & 5 deletions app/components/app_imports_navigation_component.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,13 @@ def call
selected: active == :imported
)

nav.with_item(
href: imports_issues_path,
text: issues_text,
selected: active == :issues
)
if policy(%i[import issue]).index?
nav.with_item(
href: imports_issues_path,
text: issues_text,
selected: active == :issues
)
end

if policy(ImportantNotice).index?
nav.with_item(
Expand Down
29 changes: 16 additions & 13 deletions app/components/app_patient_programmes_table_component.rb
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,12 @@ def non_seasonal_programme_rows(programme:)
end

def build_row(programme:, academic_year:)
programme_type = programme.type

[
name_for_programme(programme:, academic_year:),
status_for_programme(programme:, academic_year:),
notes_for_programme(programme:, academic_year:)
status_for_programme(programme_type:, academic_year:),
notes_for_programme(programme_type:, academic_year:)
]
end

Expand All @@ -64,25 +66,26 @@ def name_for_programme(programme:, academic_year:)
end
end

def status_for_programme(programme:, academic_year:)
hash = programme_status_hash(programme:, academic_year:)
def status_for_programme(programme_type:, academic_year:)
hash = programme_status_hash(programme_type:, academic_year:)
tag.strong(hash[:text], class: "nhsuk-tag nhsuk-tag--#{hash[:colour]}")
end

def notes_for_programme(programme:, academic_year:)
programme_status_hash(programme:, academic_year:)[:details_text].presence ||
""
def notes_for_programme(programme_type:, academic_year:)
programme_status_hash(programme_type:, academic_year:)[
:details_text
].presence || ""
end

def programme_status_hash(programme:, academic_year:)
def programme_status_hash(programme_type:, academic_year:)
@programme_status_hash ||= {}
@programme_status_hash[programme.type] ||= {}
@programme_status_hash[programme.type][
@programme_status_hash[programme_type] ||= {}
@programme_status_hash[programme_type][
academic_year
] ||= PatientStatusResolver.new(
] ||= PatientProgrammeStatusResolver.call(
patient,
programme:,
programme_type:,
academic_year:
).programme
)
end
end
30 changes: 13 additions & 17 deletions app/components/app_patient_search_result_card_component.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ def initialize(
show_parents: false,
show_postcode: false,
show_programme_status: true,
show_vaccinated_programme_status_only: false,
show_school: false,
show_vaccinated_programme_status_only: false,
show_year_group: false
)
@patient = patient
Expand All @@ -26,9 +26,9 @@ def initialize(
@show_parents = show_parents
@show_postcode = show_postcode
@show_programme_status = show_programme_status
@show_school = show_school
@show_vaccinated_programme_status_only =
show_vaccinated_programme_status_only
@show_school = show_school
@show_year_group = show_year_group
end

Expand Down Expand Up @@ -71,10 +71,11 @@ def call
row.with_value { patient_parents(patient) }
end
end
if show_programme_status && academic_year && programme_status_tag
if show_programme_status && academic_year &&
(value = programme_status_tag)
summary_list.with_row do |row|
row.with_key { "Programme status" }
row.with_value { programme_status_tag }
row.with_value { value }
end
end
end
Expand All @@ -92,9 +93,10 @@ def call
:show_nhs_number,
:show_parents,
:show_postcode,
:show_programme_status,
:show_school,
:show_year_group,
:show_programme_status
:show_vaccinated_programme_status_only,
:show_year_group

delegate :govuk_summary_list,
:patient_date_of_birth,
Expand All @@ -108,8 +110,11 @@ def programme_status_tag
status_by_programme =
programmes.each_with_object({}) do |programme, hash|
resolved_status =
status_resolver_for(programme).programme(
only_if_vaccinated: @show_vaccinated_programme_status_only
PatientProgrammeStatusResolver.call(
patient,
programme_type: programme.type,
academic_year:,
only_if_vaccinated: show_vaccinated_programme_status_only
)

next unless resolved_status
Expand All @@ -121,13 +126,4 @@ def programme_status_tag

render AppAttachedTagsComponent.new(status_by_programme)
end

def status_resolver_for(programme)
@status_resolver_for ||= {}
@status_resolver_for[programme.type] ||= PatientStatusResolver.new(
patient,
programme:,
academic_year:
)
end
end
10 changes: 5 additions & 5 deletions app/components/app_patient_session_consent_component.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,19 @@
<%= render AppCardComponent.new(feature: true) do |card| %>
<% card.with_heading(level: 4, colour:) { heading } %>

<% unless vaccination_status.vaccinated? %>
<% if consent_status.no_response? %>
<% unless programme_status.vaccinated? %>
<% if consent_status_value == :no_response %>
<% if latest_consent_request %>
<p>No-one responded to our requests for consent.</p>
<p>A request was sent on <%= latest_consent_request.sent_at.to_fs(:long) %>.</p>
<% else %>
<p>No requests have been sent.</p>
<% end %>
<% elsif consent_status.conflicts? %>
<% elsif consent_status_value == :conflicts %>
<p>You can only vaccinate if all respondents give consent.</p>
<% elsif consent_status.refused? %>
<% elsif consent_status_value == :refused %>
<p><%= who_refused %> refused to give consent.</p>
<% elsif consent_status.given? %>
<% elsif consent_status_generator.status == :given %>
<p><%= patient.full_name %> is ready for the vaccinator.</p>
<% end %>

Expand Down
Loading