Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
162 changes: 162 additions & 0 deletions app/controllers/pds-record.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
import wizard from '@x-govuk/govuk-prototype-wizard'
import _ from 'lodash'

import { generateChild } from '../generators/child.js'
import { Patient, PDSRecord } from '../models.js'
import { getResults, getPagination } from '../utils/pagination.js'

export const pdsRecordController = {
redirect(request, response) {
response.redirect('/patients')
},

start(request, response) {
const { data } = request.session

if (request.body.nhsn) {
const child = generateChild()
const pdsRecord = new PDSRecord({ ...child }, data)

// Add entered NHS number
pdsRecord.nhsn = request.body.nhsn.replaceAll(' ', '')

// Add PDS record to wizard data
PDSRecord.create(pdsRecord, data.wizard)

response.redirect(`/pds/${pdsRecord.uuid}/new/result`)
} else {
response.redirect(`/pds/new/search`)
}
},

read(request, response, next, pdsRecord_uuid) {
const { data } = request.session

response.locals.pdsRecord = PDSRecord.findOne(pdsRecord_uuid, data)

next()
},

update(request, response) {
const { pdsRecord_uuid } = request.params
const { data } = request.session
const { __ } = response.locals

// Update session data
const pdsRecord = PDSRecord.update(
pdsRecord_uuid,
data.wizard.pdsRecords[pdsRecord_uuid],
data.wizard
)

// Create patient record
let patient = new Patient(pdsRecord, data)
patient = Patient.create(patient, data)

// Clean up session data
delete data.hasNhsNumber
delete data.nhs
delete data.school_id
delete data.pdsRecord
delete data.wizard

request.flash('success', __(`pdsRecord.new.success`, { patient }))

response.redirect(patient.uri)
},

readAll(request, response, next) {
const { q } = request.query
const { data } = request.session

const pdsRecords = PDSRecord.findAll(data)

// Sort
let results = _.sortBy(pdsRecords, 'lastName')

// Query
if (q) {
results = results.filter((pdsRecord) =>
pdsRecord.tokenized.includes(String(q).toLowerCase())
)
}

// Results
response.locals.pdsRecords = pdsRecords
response.locals.results = getResults(results, request.query)
response.locals.pages = getPagination(results, request.query)

// Clean up session data
delete data.q

next()
},

readForm(request, response, next) {
const { pdsRecord_uuid } = request.params
const { data, referrer } = request.session

// Setup wizard if not already setup
let pdsRecord = PDSRecord.findOne(pdsRecord_uuid, data.wizard)
if (!pdsRecord) {
pdsRecord = PDSRecord.create(response.locals.pdsRecord, data.wizard)
}
response.locals.pdsRecord = new PDSRecord(pdsRecord, data)

const journey = {
['/']: {},
['/new/start']: {
[`/${pdsRecord_uuid}/new/result`]: {
data: 'hasNhsNumber',
value: 'true'
},
['/new/search']: {
data: 'hasNhsNumber',
value: 'false'
}
},
['/new/search']: {},
['/new/results']: {},
[`/${pdsRecord_uuid}/new/result`]: {
[`/${pdsRecord_uuid}/new/school`]: {
data: 'add',
value: 'true'
},
['/new/search']: {
data: 'add',
value: 'false'
}
},
[`/${pdsRecord_uuid}/new/school`]: {}
}

response.locals.paths = {
...wizard(journey, request),
...(referrer && { back: referrer })
}

next()
},

showForm(request, response) {
let { view } = request.params

response.render(`pds/form/${view}`)
},

updateForm(request, response, next) {
const { pdsRecord_uuid } = request.params
const { data } = request.session
const { paths } = response.locals

if (request.body.school_id && !request.body.pdsRecord?.school_id) {
request.body.pdsRecord = {
school_id: request.body.school_id
}
}

PDSRecord.update(pdsRecord_uuid, request.body.pdsRecord, data.wizard)

return paths?.next ? response.redirect(paths.next) : next()
}
}
2 changes: 2 additions & 0 deletions app/data.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import moves from '../.data/moves.json' with { type: 'json' }
import notices from '../.data/notices.json' with { type: 'json' }
import patients from '../.data/patients.json' with { type: 'json' }
import patientSessions from '../.data/patient-sessions.json' with { type: 'json' }
import pdsRecords from '../.data/pds-records.json' with { type: 'json' }
import programmes from '../.data/programmes.json' with { type: 'json' }
import replies from '../.data/replies.json' with { type: 'json' }
import schools from '../.data/schools.json' with { type: 'json' }
Expand Down Expand Up @@ -44,6 +45,7 @@ const data = {
notices,
patients,
patientSessions,
pdsRecords,
programmes,
replies,
schools,
Expand Down
40 changes: 40 additions & 0 deletions app/generators/pds-record.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import { fakerEN_GB as faker } from '@faker-js/faker'

import { PDSRecord } from '../models.js'

import { generateChild } from './child.js'
import { generateParent } from './parent.js'

/**
* Generate fake PDS record
*
* @returns {PDSRecord} PDS record
*/
export function generatePDSRecord() {
const child = generateChild()

// Parents
const parent1 = generateParent(child.lastName, true)

// PDS records provide only a subset of parent data
delete parent1.sms
delete parent1.contactPreference
delete parent1.contactPreferenceDetails

let parent2
const addSecondParent = faker.datatype.boolean(0.5)
if (addSecondParent) {
parent2 = generateParent(child.lastName)

// PDS records provide only a subset of parent data
delete parent2.sms
delete parent2.contactPreference
delete parent2.contactPreferenceDetails
}

return new PDSRecord({
...child,
parent1,
parent2
})
}
91 changes: 91 additions & 0 deletions app/locales/en.js
Original file line number Diff line number Diff line change
Expand Up @@ -1637,6 +1637,97 @@ export const en = {
}
}
},
pdsRecord: {
label: 'Child record',
new: {
success:
'{{patient.fullName}} has been added to your list of children in Mavis'
},
start: {
label: 'Add a new child',
title: 'Do you have the child’s NHS number?'
},
search: {
title: 'Search for a child'
},
results:
'{count, plural, =0 {No children matching your search criteria were found} one {Showing <b>{from}</b> to <b>{to}</b> of <b>{count}</b> record} other {Showing <b>{from}</b> to <b>{to}</b> of <b>{count}</b> children}}',
result: {
title: 'Check and confirm %s’s details'
},
school: {
title: 'Do you know which school %s goes to?',
yes: {
label: 'Yes'
},
unknown: {
label: 'No'
},
'home-educated': {
label: 'They are home-educated'
}
},
school_id: {
label: 'School URN',
title: 'Select a school'
},
nhsn: {
label: 'NHS number',
title: 'Enter the child’s NHS number',
hint: 'For example, 485 777 3456'
},
fullName: {
label: 'Full name'
},
firstName: {
label: 'First name'
},
lastName: {
label: 'Last name'
},
dob: {
label: 'Date of birth',
hint: 'For example, 27 3 2012'
},
dobWithAge: {
label: 'Date of birth'
},
dod: {
label: 'Date of death'
},
gender: {
label: 'Gender'
},
adjustments: {
label: 'Reasonable adjustments'
},
impairments: {
label: 'Impairments'
},
address: {
label: 'Address',
title: 'What is the child’s home address?'
},
postalCode: {
label: 'Postcode'
},
gpSurgery: {
label: 'GP surgery',
title: 'Who is the child’s GP?'
},
parents: {
label: 'Parents or guardians'
},
add: {
label: 'Do you want to add this child?',
yes: {
label: 'Yes'
},
no: {
label: 'No – search for another child'
}
}
},
programme: {
label: 'Programme',
list: {
Expand Down
1 change: 1 addition & 0 deletions app/models.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ export * from './models/parent.js'
export * from './models/patient-programme.js'
export * from './models/patient-session.js'
export * from './models/patient.js'
export * from './models/pds-record.js'
export * from './models/programme.js'
export * from './models/school.js'
export * from './models/session.js'
Expand Down
8 changes: 4 additions & 4 deletions app/models/patient.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,10 @@ import {
* @augments Child
* @param {object} options - Options
* @param {object} [context] - Global context
* @property {string} uuid - UUID
* @property {string} nhsn - NHS number
* @property {boolean} invalid - Flagged as invalid
* @property {boolean} sensitive - Flagged as sensitive
* @property {string} [uuid] - UUID
* @property {string} [nhsn] - NHS number
* @property {boolean} [invalid] - Flagged as invalid
* @property {boolean} [sensitive] - Flagged as sensitive
* @property {object} [address] - Address
* @property {Parent} [parent1] - Parent 1
* @property {Parent} [parent2] - Parent 2
Expand Down
Loading