Skip to content

Commit 2bfd795

Browse files
authored
Merge pull request #4398 from nhsuk/common-delegation-functionality
Add foundational delegation methods
2 parents 2cc2091 + 85d9f29 commit 2bfd795

File tree

6 files changed

+154
-14
lines changed

6 files changed

+154
-14
lines changed

app/models/programme.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ class Programme < ApplicationRecord
3535

3636
has_many :teams, through: :team_programmes
3737

38+
scope :supports_delegation, -> { flu }
39+
3840
enum :type,
3941
{ flu: "flu", hpv: "hpv", menacwy: "menacwy", td_ipv: "td_ipv" },
4042
validate: true
@@ -51,6 +53,8 @@ def doubles? = menacwy? || td_ipv?
5153

5254
def seasonal? = flu?
5355

56+
def supports_delegation? = flu?
57+
5458
DEFAULT_YEAR_GROUPS_BY_TYPE = {
5559
"flu" => (0..11).to_a,
5660
"hpv" => (8..11).to_a,

app/models/session.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@ class Session < ApplicationRecord
7777
)
7878
end
7979

80+
scope :supports_delegation,
81+
-> { has_programmes(Programme.supports_delegation) }
82+
8083
scope :in_progress, -> { has_date(Date.current) }
8184
scope :unscheduled, -> { where.not(SessionDate.for_session.arel.exists) }
8285
scope :scheduled,
@@ -192,6 +195,10 @@ def started?
192195
Date.current > dates.min
193196
end
194197

198+
def supports_delegation? = programmes.any?(&:supports_delegation?)
199+
200+
def pgd_supply_enabled? = supports_delegation?
201+
195202
def year_groups
196203
@year_groups ||= location_programme_year_groups.pluck_year_groups
197204
end

db/seeds.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,11 @@ def create_team_sessions(user, team)
256256
user = create_user(team:, email: "nurse.joy@example.com")
257257
create_user(team:, email: "admin.hope@example.com", fallback_role: "admin")
258258
create_user(team:, email: "superuser@example.com", fallback_role: "superuser")
259+
create_user(
260+
team:,
261+
email: "hca@example.com",
262+
fallback_role: "healthcare_assistant"
263+
)
259264

260265
attach_sample_of_schools_to(team)
261266

spec/models/programme_spec.rb

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,22 @@
1717
describe Programme do
1818
subject(:programme) { build(:programme) }
1919

20+
describe "scopes" do
21+
describe "#supports_delegation" do
22+
subject(:scope) { described_class.supports_delegation }
23+
24+
let(:flu_programme) { create(:programme, :flu) }
25+
let(:hpv_programme) { create(:programme, :hpv) }
26+
let(:menacwy_programme) { create(:programme, :menacwy) }
27+
let(:td_ipv_programme) { create(:programme, :td_ipv) }
28+
29+
it { should include(flu_programme) }
30+
it { should_not include(hpv_programme) }
31+
it { should_not include(menacwy_programme) }
32+
it { should_not include(td_ipv_programme) }
33+
end
34+
end
35+
2036
describe "validations" do
2137
it { should validate_presence_of(:type) }
2238
it { should validate_inclusion_of(:type).in_array(%w[flu hpv]) }
@@ -82,6 +98,34 @@
8298
end
8399
end
84100

101+
describe "#supports_delegation?" do
102+
subject { programme.supports_delegation? }
103+
104+
context "with a flu programme" do
105+
let(:programme) { build(:programme, :flu) }
106+
107+
it { should be(true) }
108+
end
109+
110+
context "with an HPV programme" do
111+
let(:programme) { build(:programme, :hpv) }
112+
113+
it { should be(false) }
114+
end
115+
116+
context "with an MenACWY programme" do
117+
let(:programme) { build(:programme, :menacwy) }
118+
119+
it { should be(false) }
120+
end
121+
122+
context "with an Td/IPV programme" do
123+
let(:programme) { build(:programme, :td_ipv) }
124+
125+
it { should be(false) }
126+
end
127+
end
128+
85129
describe "#default_year_groups" do
86130
subject { programme.default_year_groups }
87131

spec/models/session_spec.rb

Lines changed: 79 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,26 @@
8484
end
8585
end
8686

87+
describe "#supports_delegation" do
88+
subject(:scope) { described_class.supports_delegation }
89+
90+
let!(:hpv_programme) { create(:programme, :hpv) }
91+
let!(:flu_programme) { create(:programme, :flu) }
92+
let(:session) { create(:session, programmes:) }
93+
94+
context "with a session for flu" do
95+
let(:programmes) { [flu_programme] }
96+
97+
it { should include(session) }
98+
end
99+
100+
context "with a session for HPV" do
101+
let(:programmes) { [hpv_programme] }
102+
103+
it { should_not include(session) }
104+
end
105+
end
106+
87107
describe "#in_progress" do
88108
subject(:scope) { described_class.in_progress }
89109

@@ -149,18 +169,20 @@
149169
end
150170
end
151171

152-
describe "#programmes" do
153-
subject(:programmes) { session.reload.programmes }
172+
describe "associations" do
173+
describe "#programmes" do
174+
subject(:programmes) { session.reload.programmes }
154175

155-
let(:hpv_programme) { create(:programme, :hpv) }
156-
let(:menacwy_programme) { create(:programme, :menacwy) }
176+
let(:hpv_programme) { create(:programme, :hpv) }
177+
let(:menacwy_programme) { create(:programme, :menacwy) }
157178

158-
let(:session) do
159-
create(:session, programmes: [menacwy_programme, hpv_programme])
160-
end
179+
let(:session) do
180+
create(:session, programmes: [menacwy_programme, hpv_programme])
181+
end
161182

162-
it "is ordered by name" do
163-
expect(programmes).to eq([hpv_programme, menacwy_programme])
183+
it "is ordered by name" do
184+
expect(programmes).to eq([hpv_programme, menacwy_programme])
185+
end
164186
end
165187
end
166188

@@ -200,6 +222,54 @@
200222
end
201223
end
202224

225+
describe "#supports_delegation?" do
226+
subject { session.supports_delegation? }
227+
228+
let(:session) { create(:session, programmes:) }
229+
230+
context "with only a flu programme" do
231+
let(:programmes) { [create(:programme, :flu)] }
232+
233+
it { should be(true) }
234+
end
235+
236+
context "with a flu and HPV programme" do
237+
let(:programmes) { [create(:programme, :flu), create(:programme, :hpv)] }
238+
239+
it { should be(true) }
240+
end
241+
242+
context "with only an HPV programme" do
243+
let(:programmes) { [create(:programme, :hpv)] }
244+
245+
it { should be(false) }
246+
end
247+
end
248+
249+
describe "#pgd_supply_enabled?" do
250+
subject { session.pgd_supply_enabled? }
251+
252+
let(:session) { create(:session, programmes:) }
253+
254+
context "with only a flu programme" do
255+
let(:programmes) { [create(:programme, :flu)] }
256+
257+
it { should be(true) }
258+
end
259+
260+
context "with a flu and HPV programme" do
261+
let(:programmes) { [create(:programme, :flu), create(:programme, :hpv)] }
262+
263+
it { should be(true) }
264+
end
265+
266+
context "with only an HPV programme" do
267+
let(:programmes) { [create(:programme, :hpv)] }
268+
269+
it { should be(false) }
270+
end
271+
end
272+
203273
describe "#year_groups" do
204274
subject { session.year_groups }
205275

spec/support/cis2_auth_helper.rb

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ def cis2_auth_info
9393
}
9494
end
9595

96-
def cis2_sign_in(user, ods_code:, role_code:, workgroups:)
96+
def cis2_sign_in(user, ods_code:, role_code:, activity_codes:, workgroups:)
9797
mock_cis2_auth(
9898
uid: user.uid,
9999
given_name: user.given_name,
@@ -102,6 +102,7 @@ def cis2_sign_in(user, ods_code:, role_code:, workgroups:)
102102
sid: user.session_token,
103103
org_code: ods_code,
104104
role_code:,
105+
activity_codes:,
105106
workgroups:
106107
)
107108

@@ -118,15 +119,24 @@ def sign_in(user, organisation: nil, role: :nurse, superuser: false)
118119

119120
ods_code = organisation.ods_code
120121

121-
role_code ||= {
122-
nurse: CIS2Info::NURSE_ROLE,
123-
admin: CIS2Info::ADMIN_ROLE
122+
role_code = {
123+
admin: CIS2Info::ADMIN_ROLE,
124+
healthcare_assistant: CIS2Info::ADMIN_ROLE,
125+
nurse: CIS2Info::NURSE_ROLE
126+
}.fetch(role)
127+
128+
activity_codes = {
129+
admin: [],
130+
healthcare_assistant: [
131+
CIS2Info::PERSONAL_MEDICATION_ADMINISTRATION_ACTIVITY_CODE
132+
],
133+
nurse: []
124134
}.fetch(role)
125135

126136
workgroups = user.teams.where(organisation:).pluck(:workgroup)
127137
workgroups << CIS2Info::SUPERUSER_WORKGROUP if superuser
128138

129-
cis2_sign_in(user, ods_code:, role_code:, workgroups:)
139+
cis2_sign_in(user, ods_code:, role_code:, activity_codes:, workgroups:)
130140
end
131141

132142
def mock_cis2_auth(

0 commit comments

Comments
 (0)