Skip to content

Commit 3a1d6d9

Browse files
Use by organisation for multi org reporting (#570)
This updates the Home and Reports feature in "multi-organisation" mode, so that it lists organisations instead of sites. This does mean that in this mode, you wouldn't be able to narrow down your report to only include Site A at Org 1 + Site B at Org 2 – however we think this is less of a likely user need, and listing organisations instead of sites should result in a simpler, shorter list.
1 parent 4c245ab commit 3a1d6d9

File tree

11 files changed

+654
-63
lines changed

11 files changed

+654
-63
lines changed

app/data/organisations.js

Lines changed: 367 additions & 16 deletions
Large diffs are not rendered by default.

app/data/users.js

Lines changed: 92 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -183,49 +183,133 @@ module.exports = [
183183
"email": "[email protected]",
184184
"organisations": [
185185
{
186-
"id": "PX9141",
186+
"id": "FX9141",
187187
"permissionLevel": "Lead administrator",
188188
"status": "Active",
189189
"vaccinator": false
190190
},
191191
{
192-
"id": "PX4825",
192+
"id": "FX4825",
193193
"permissionLevel": "Lead administrator",
194194
"status": "Active",
195195
"vaccinator": false
196196
},
197197
{
198-
"id": "PX7314",
198+
"id": "FX7314",
199199
"permissionLevel": "Lead administrator",
200200
"status": "Active",
201201
"vaccinator": false
202202
},
203203
{
204-
"id": "PX9151",
204+
"id": "FX9151",
205205
"permissionLevel": "Lead administrator",
206206
"status": "Active",
207207
"vaccinator": false
208208
},
209209
{
210-
"id": "PX2525",
210+
"id": "FQ2525",
211211
"permissionLevel": "Lead administrator",
212212
"status": "Active",
213213
"vaccinator": false
214214
},
215215
{
216-
"id": "PC8141",
216+
"id": "FW1941",
217217
"permissionLevel": "Lead administrator",
218218
"status": "Active",
219219
"vaccinator": false
220220
},
221221
{
222-
"id": "P9824",
222+
"id": "FP9824",
223223
"permissionLevel": "Lead administrator",
224224
"status": "Active",
225225
"vaccinator": false
226226
},
227227
{
228-
"id": "PD812",
228+
"id": "FP1812",
229+
"permissionLevel": "Lead administrator",
230+
"status": "Active",
231+
"vaccinator": false
232+
},
233+
{
234+
"id": "FA7K23",
235+
"permissionLevel": "Lead administrator",
236+
"status": "Active",
237+
"vaccinator": false
238+
},
239+
{
240+
"id": "FG2R56",
241+
"permissionLevel": "Lead administrator",
242+
"status": "Active",
243+
"vaccinator": false
244+
},
245+
{
246+
"id": "FH9P12",
247+
"permissionLevel": "Lead administrator",
248+
"status": "Active",
249+
"vaccinator": false
250+
},
251+
{
252+
"id": "FA7K23",
253+
"permissionLevel": "Lead administrator",
254+
"status": "Active",
255+
"vaccinator": false
256+
},
257+
{
258+
"id": "FJ4M89",
259+
"permissionLevel": "Lead administrator",
260+
"status": "Active",
261+
"vaccinator": false
262+
},
263+
{
264+
"id": "FK5N34",
265+
"permissionLevel": "Lead administrator",
266+
"status": "Active",
267+
"vaccinator": false
268+
},
269+
{
270+
"id": "FL7Q67",
271+
"permissionLevel": "Lead administrator",
272+
"status": "Active",
273+
"vaccinator": false
274+
},
275+
{
276+
"id": "FM8R23",
277+
"permissionLevel": "Lead administrator",
278+
"status": "Active",
279+
"vaccinator": false
280+
},
281+
{
282+
"id": "FN9S45",
283+
"permissionLevel": "Lead administrator",
284+
"status": "Active",
285+
"vaccinator": false
286+
},
287+
{
288+
"id": "FP2T78",
289+
"permissionLevel": "Lead administrator",
290+
"status": "Active",
291+
"vaccinator": false
292+
},
293+
{
294+
"id": "FQ3U12",
295+
"permissionLevel": "Lead administrator",
296+
"status": "Active",
297+
"vaccinator": false
298+
},
299+
{
300+
"id": "FR4V56",
301+
"permissionLevel": "Lead administrator",
302+
"status": "Active",
303+
"vaccinator": false
304+
},
305+
{
306+
"id": "FS5W89",
307+
"permissionLevel": "Lead administrator",
308+
"status": "Active",
309+
"vaccinator": false
310+
},
311+
{
312+
"id": "FT6X34",
229313
"permissionLevel": "Lead administrator",
230314
"status": "Active",
231315
"vaccinator": false

app/data/vaccinations-recorded.js

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,46 @@ module.exports = [
102102
injectionSite: "Left arm",
103103
notes: "",
104104
editable: true
105+
},
106+
{
107+
id: "464743636",
108+
date: { day: "26", month: "11", year: "2025" },
109+
vaccine: "flu",
110+
vaccineProduct: "Adjuvanted Trivalent Influenza Vaccine (aTIV)",
111+
patient: {
112+
name: "Adele Purple",
113+
nhsNumber: "9951742954"
114+
},
115+
batchNumber: "634643636",
116+
batchExpiryDate: "2025-12-05",
117+
organisationId: "FT6X34", // MediCare Pharmacy
118+
siteId: "FB9012", // MediCare Pharmacy
119+
vaccinatorId: "2387441662601", // Jane Smith
120+
eligibility: "Based on age",
121+
consent: "patient",
122+
injectionSite: "Left arm",
123+
notes: "",
124+
editable: true
125+
},
126+
{
127+
id: "464743636",
128+
date: { day: "26", month: "11", year: "2025" },
129+
vaccine: "flu",
130+
vaccineProduct: "Adjuvanted Trivalent Influenza Vaccine (aTIV)",
131+
patient: {
132+
name: "Adele Purple",
133+
nhsNumber: "9951742954"
134+
},
135+
batchNumber: "634643636",
136+
batchExpiryDate: "2025-12-05",
137+
organisationId: "FX9141", // MediCare Pharmacy
138+
siteId: "FL9141", // MediCare Pharmacy
139+
vaccinatorId: "2387441662601", // Jane Smith
140+
eligibility: "Based on age",
141+
consent: "patient",
142+
injectionSite: "Left arm",
143+
notes: "",
144+
editable: true
105145
}
106-
107146
]
108147

app/routes/home.js

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,12 @@ module.exports = router => {
4646
})
4747
}
4848

49+
if (filters.organisationId) {
50+
vaccinations = vaccinations.filter((vaccination) => {
51+
return (vaccination.organisationId === filters.organisationId)
52+
})
53+
}
54+
4955
if (filters.vaccine) {
5056
vaccinations = vaccinations.filter((vaccination) => {
5157
return (vaccination.vaccine === filters.vaccine)
@@ -66,6 +72,7 @@ module.exports = router => {
6672
const monthToday = (dateToday.getMonth() + 1) // JavaScript dates are 0-indexed
6773

6874
let sites = []
75+
let organisations = []
6976

7077
if (currentOrganisation) {
7178
// Showing all sites for now, for demo purposes
@@ -78,21 +85,17 @@ module.exports = router => {
7885
} else {
7986

8087
const userOrganisationIds = currentUser.organisations.map((organisation) => organisation.id)
81-
const organisations = data.organisations.filter((organisation) => userOrganisationIds.includes(organisation.id) )
82-
83-
for (const organisation of organisations) {
84-
for (const site of (organisation.sites || [])) {
85-
sites.push(site)
86-
}
87-
}
88+
organisations = data.organisations.filter((organisation) => userOrganisationIds.includes(organisation.id) )
8889
}
8990

9091

9192

9293
let totalsBySite = []
94+
let totalsByOrganisation = []
9395
let totalsByVaccine = []
9496
let totalsByDay = []
9597

98+
9699
const totalVaccinationsRecorded = countVaccinations(vaccinationsRecorded)
97100

98101
const totalVaccinationsRecordedToday = countVaccinations(
@@ -149,8 +152,6 @@ module.exports = router => {
149152
})
150153
}
151154

152-
// const siteIds = [...new Set(vaccinationsRecorded.map((vaccination) => vaccination.siteId))]
153-
154155
for (let site of sites) {
155156

156157
const total = countVaccinations(vaccinationsRecorded, {
@@ -160,6 +161,7 @@ module.exports = router => {
160161
if (total > 0) {
161162
totalsBySite.push({
162163
siteId: site.id,
164+
siteName: site.name,
163165
today: countVaccinations(vaccinationsRecorded, {
164166
date: dateToday,
165167
siteId: site.id
@@ -178,8 +180,33 @@ module.exports = router => {
178180
}
179181
}
180182

183+
for (let organisation of organisations) {
181184

185+
const total = countVaccinations(vaccinationsRecorded, {
186+
organisationId: organisation.id
187+
})
182188

189+
if (total !== -1) {
190+
totalsByOrganisation.push({
191+
organisationId: organisation.id,
192+
organisationName: organisation.name,
193+
today: countVaccinations(vaccinationsRecorded, {
194+
date: dateToday,
195+
organisationId: organisation.id
196+
}),
197+
month:countVaccinations(vaccinationsRecorded, {
198+
month: dateToday,
199+
organisationId: organisation.id
200+
}),
201+
past7Days: countVaccinations(vaccinationsRecorded, {
202+
minDate: sevenDaysAgo,
203+
maxDate: dateToday,
204+
organisationId: organisation.id
205+
}),
206+
total: total
207+
})
208+
}
209+
}
183210

184211
res.render('home/index', {
185212
sites,
@@ -190,7 +217,8 @@ module.exports = router => {
190217
monthToday,
191218
totalsBySite,
192219
totalsByVaccine,
193-
totalsByDay
220+
totalsByDay,
221+
totalsByOrganisation
194222
})
195223
})
196224
}

app/routes/reports.js

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ module.exports = (router) => {
9898
const currentOrganisation = res.locals.currentOrganisation
9999
const currentUser = res.locals.currentUser
100100

101-
let sites = []
101+
let sites, organisations
102102

103103
if (currentOrganisation) {
104104
// Showing all sites for now, for demo purposes
@@ -111,17 +111,12 @@ module.exports = (router) => {
111111
} else {
112112

113113
const userOrganisationIds = currentUser.organisations.map((organisation) => organisation.id)
114-
const organisations = data.organisations.filter((organisation) => userOrganisationIds.includes(organisation.id) )
115-
116-
for (const organisation of organisations) {
117-
for (const site of (organisation.sites || [])) {
118-
sites.push(site)
119-
}
120-
}
114+
organisations = data.organisations.filter((organisation) => userOrganisationIds.includes(organisation.id) )
121115
}
122116

123117
res.render('reports/choose-site', {
124-
sites
118+
sites,
119+
organisations
125120
})
126121
})
127122

@@ -183,15 +178,26 @@ module.exports = (router) => {
183178

184179
router.get('/reports/check', (req, res) => {
185180
const data = req.session.data
181+
const currentOrganisation = res.locals.currentOrganisation
182+
const currentUser = res.locals.currentUser
186183
const siteIds = data.siteIdsToReport || []
187184
const today = new Date()
188185
const days = 86400000 // number of milliseconds in a day
189186

190-
let sites = []
187+
let sites, organisations
188+
189+
if (currentOrganisation) {
190+
191+
sites = currentOrganisation.sites
192+
.filter((site) => siteIds.includes(site.id))
191193

192-
const allSites = data.organisations.map((organisation) => organisation.sites).flat().filter(Boolean)
194+
} else {
193195

194-
sites = allSites.filter((site) => siteIds.includes(site.id))
196+
const userOrganisationIds = currentUser.organisations.map((organisation) => organisation.id)
197+
198+
organisations = data.organisations.filter((organisation) => userOrganisationIds.includes(organisation.id) )
199+
.filter((organisation) => siteIds.includes(organisation.id))
200+
}
195201

196202
const fromInput = data.from
197203
const toInput = data.to
@@ -230,6 +236,7 @@ module.exports = (router) => {
230236

231237
res.render('reports/check', {
232238
sites,
239+
organisations,
233240
from,
234241
to
235242
})

app/views/auth/okta-sign-in.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ <h2 class="nhsuk-heading-s">Testing area</h2>
3838
<li><a href="#" data-email="[email protected]" data-module="prefill-email">Recorder for an NHS trust</a></li>
3939
<li><a href="#" data-email="[email protected]" data-module="prefill-email">Recorder for multiple NHS trusts</a></li>
4040
<li><a href="#" data-email="[email protected]" data-module="prefill-email">Admin at 2 NHS trusts</a></li>
41-
<li><a href="#" data-email="[email protected]" data-module="prefill-email">Lead admin for multiple pharmacies</a></li>
42-
<li><a href="#" data-email="[email protected]" data-module="prefill-email">Lead admin for a chain of pharmacies with the same name</a></li>
41+
<li><a href="#" data-email="[email protected]" data-module="prefill-email">Lead admin at a small chain of pharmacies</a></li>
42+
<li><a href="#" data-email="[email protected]" data-module="prefill-email">Lead admin for a large chain of pharmacies with the same name</a></li>
4343
<li><a href="#" data-email="[email protected]" data-module="prefill-email">Regional lead</a></li>
4444
<li><a href="#" data-email="[email protected]" data-module="prefill-email">Support user</a></li>
4545

0 commit comments

Comments
 (0)