Skip to content

Commit

Permalink
Merge c5f0939 into 00a4275
Browse files Browse the repository at this point in the history
  • Loading branch information
jon-shipley authored Nov 5, 2018
2 parents 00a4275 + c5f0939 commit 053d6d9
Show file tree
Hide file tree
Showing 53 changed files with 1,300 additions and 142 deletions.
11 changes: 5 additions & 6 deletions admin/controllers/pupil-pin.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ const getGeneratePinsOverview = async (req, res, next) => {
let pupils
try {
if (featureToggles.isFeatureEnabled('prepareCheckMessaging')) {
pupils = await pinGenerationV2Service.getPupilsWithActivePins(req.user.schoolId, pinEnv)
pupils = await pinGenerationV2Service.getPupilsWithActivePins(req.user.schoolId, pinEnv === 'live')
} else {
pupils = await pinService.getPupilsWithActivePins(req.user.School, pinEnv)
}
Expand Down Expand Up @@ -54,6 +54,7 @@ const getGeneratePinsOverview = async (req, res, next) => {
*/
const getGeneratePinsList = async (req, res, next) => {
const pinEnv = (req.params && req.params.pinEnv === 'live') ? 'live' : 'familiarisation'
const isLiveCheck = (req.params && req.params.pinEnv === 'live') ? true : false;
res.locals.pinEnv = pinEnv
res.locals.pageTitle = 'Select pupils'
req.breadcrumbs(
Expand All @@ -66,15 +67,14 @@ const getGeneratePinsList = async (req, res, next) => {
let groups = []
let groupIds = req.params.groupIds || ''

// TODO: data service call should be moved to a service
try {
school = await schoolDataService.sqlFindOneByDfeNumber(req.user.School)
if (!school) {
return next(Error(`School [${req.user.school}] not found`))
}

if (featureToggles.isFeatureEnabled('prepareCheckMessaging')) {
pupils = await pinGenerationV2Service.getPupilsEligibleForPinGeneration(school.id)
pupils = await pinGenerationV2Service.getPupilsEligibleForPinGeneration(school.id, isLiveCheck)
} else {
pupils = await pinGenerationService.getPupils(school.dfeNumber, pinEnv)
}
Expand Down Expand Up @@ -133,7 +133,6 @@ const postGeneratePins = async (req, res, next) => {

if (featureToggles.isFeatureEnabled('prepareCheckMessaging')) {
// New code, depends on school pin being ready
winston.info('#datebug calling checkStartService.prepareCheck2')
await checkStartService.prepareCheck2(pupilsList, req.user.School, req.user.schoolId, pinEnv === 'live')
}

Expand Down Expand Up @@ -162,7 +161,7 @@ const getViewAndPrintPins = async (req, res, next) => {
const date = dateService.formatDayAndDate()
try {
if (featureToggles.isFeatureEnabled('prepareCheckMessaging')) {
pupils = await pinGenerationV2Service.getPupilsWithActivePins(req.user.schoolId, pinEnv)
pupils = await pinGenerationV2Service.getPupilsWithActivePins(req.user.schoolId, pinEnv === 'live')
} else {
pupils = await pinService.getPupilsWithActivePins(req.user.School, pinEnv)
}
Expand Down Expand Up @@ -205,7 +204,7 @@ const getViewAndCustomPrintPins = async (req, res, next) => {
const date = dateService.formatDayAndDate()
try {
if (featureToggles.isFeatureEnabled('prepareCheckMessaging')) {
pupils = await pinGenerationV2Service.getPupilsWithActivePins(req.user.schoolId, pinEnv)
pupils = await pinGenerationV2Service.getPupilsWithActivePins(req.user.schoolId, pinEnv === 'live')
} else {
pupils = await pinService.getPupilsWithActivePins(req.user.School, pinEnv)
}
Expand Down
8 changes: 8 additions & 0 deletions admin/controllers/pupils-not-taking-the-check.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
const pupilsNotTakingCheckService = require('../services/pupils-not-taking-check.service')
const attendanceCodeService = require('../services/attendance.service')
const pupilDataService = require('../services/data-access/pupil.data.service')
const pupilStatusService = require('../services/pupil.status.service')
const groupService = require('../services/group.service')
const monitor = require('../helpers/monitor')

Expand Down Expand Up @@ -98,6 +99,9 @@ const savePupilNotTakingCheck = async (req, res, next) => {
const reasonText = postedPupilSlugs.length > 1 ? 'reasons' : 'reason'
req.flash('info', `${postedPupilSlugs.length} ${reasonText} updated`)

// Ask for these pupils to have their status updated
await pupilStatusService.recalculateStatusByPupilSlugs(postedPupilSlugs, req.user.schoolId)

// Send the information required for highlighting
const highlight = JSON.stringify(postedPupilSlugs)
return res.redirect(`/pupils-not-taking-the-check/view?hl=${highlight}`)
Expand All @@ -122,6 +126,10 @@ const removePupilNotTakingCheck = async (req, res, next) => {
await attendanceCodeService.unsetAttendanceCode(pupilSlug, req.user.School)
const pupil = await pupilDataService.sqlFindOneBySlugAndSchool(pupilSlug, req.user.School)
req.flash('info', `Reason removed for ${pupil.lastName}, ${pupil.foreName}`)

// Ask for this pupil to have their status updated
await pupilStatusService.recalculateStatusByPupilSlugs([pupilSlug], req.user.schoolId)

const highlight = JSON.stringify(pupilSlug)
return res.redirect(`/pupils-not-taking-the-check/view?hl=${highlight}`)
} catch (error) {
Expand Down
24 changes: 22 additions & 2 deletions admin/controllers/restart.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
const featureToggles = require('feature-toggles')

const groupService = require('../services/group.service')
const monitor = require('../helpers/monitor')
const pupilIdentificationFlag = require('../services/pupil-identification-flag.service')
const pupilStatusService = require('../services/pupil.status.service')
const restartService = require('../services/restart.service')
const restartV2Service = require('../services/restart-v2.service')
const groupService = require('../services/group.service')
const restartValidator = require('../lib/validator/restart-validator')
const ValidationError = require('../lib/validation-error')
const monitor = require('../helpers/monitor')
const winston = require('winston')

const controller = {}

Expand Down Expand Up @@ -115,6 +117,15 @@ controller.postSubmitRestartList = async (req, res, next) => {
const restartIds = submittedRestarts && submittedRestarts.map(r => encodeURIComponent(r.insertId))
const ids = restartIds.join()
req.flash('info', restartInfo)

// Ask for these pupils to have their status updated
try {
await pupilStatusService.recalculateStatusByPupilIds(pupilsList, req.user.schoolId)
} catch (error) {
winston.error('Failed to recalculate pupil status')
throw error
}

return res.redirect(`/restart/overview?hl=${ids}`)
}

Expand All @@ -126,6 +137,15 @@ controller.postDeleteRestart = async (req, res, next) => {
} catch (error) {
return next(error)
}

// Ask for these pupils to have their status updated
try {
await pupilStatusService.recalculateStatusByPupilIds([pupilId], req.user.schoolId)
} catch (error) {
winston.error('Failed to recalculate pupil status')
throw error
}

req.flash('info', `Restart removed for ${deleted.lastName}, ${deleted.foreName}`)
return res.redirect('/restart/overview')
}
Expand Down
19 changes: 19 additions & 0 deletions admin/data/sql/migrations/159.do.create-pupil-status-table.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
create table [mtc_admin].[pupilStatus] (
id int IDENTITY (1,1) NOT NULL,
createdAt datetimeoffset(3) NOT NULL DEFAULT GETUTCDATE(),
updatedAt datetimeoffset(3) NOT NULL DEFAULT GETUTCDATE(),
version rowversion,
description nvarchar(150) NOT NULL,
code nvarchar(12) NOT NULL
CONSTRAINT [PK_pupilStatus] PRIMARY KEY CLUSTERED ([id] ASC)
WITH (
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON
),
CONSTRAINT [pupilStatus_code_uindex] UNIQUE([code])
);

-- missing triggers like a lot of newer tables
2 changes: 2 additions & 0 deletions admin/data/sql/migrations/159.undo.create-pupil-status.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
alter table [mtc_admin].[pupilStatus] drop constraint [pupilStatus_code_uindex];
drop table [mtc_admin].[pupilStatus];
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
insert into [mtc_admin].[pupilStatus] (code, description)
values
('UNALLOC', 'The pupil has not been allocated a check'),
('ALLOC', 'The pupil has been allocated a check'),
('LOGGED_IN', 'The pupil has logged in and collected the check'),
('STARTED', 'The pupil clicked the "Start Now" button and started taking the real, live check'),
('COMPLETED', 'The pupil has completed the live check'),
('NOT_TAKING', 'The pupil has been marked as not taking the check for some reason');
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
truncate table [mtc_admin].[pupilStatus];
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
drop table [mtc_admin].[pupilStatusCode];
18 changes: 18 additions & 0 deletions admin/data/sql/migrations/161.undo.drop-pupilStatusCode-table.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
CREATE TABLE [mtc_admin].[pupilStatusCode] (
id int IDENTITY (1,1) NOT NULL,
createdAt datetimeoffset(3) NOT NULL DEFAULT GETUTCDATE(),
updatedAt datetimeoffset(3) NOT NULL DEFAULT GETUTCDATE(),
version rowversion,
description nvarchar(50) NOT NULL,
code char(3) NOT NULL,
CONSTRAINT [PK_pupilStatusCode] PRIMARY KEY CLUSTERED ([id] ASC)
WITH (
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON
),
CONSTRAINT [pupilStatusCode_code_uindex] UNIQUE([code])
)

3 changes: 3 additions & 0 deletions admin/data/sql/migrations/162.do.add-pupil-status-col.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
alter table [mtc_admin].[pupil] add pupilStatus_id int
constraint [FK_pupil_pupilStatus_id_pupilStatus_id] foreign key (pupilStatus_id)
references [mtc_admin].[pupilStatus] (id);
2 changes: 2 additions & 0 deletions admin/data/sql/migrations/162.undo.add-pupil-status-col.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
alter table [mtc_admin].[pupil] drop constraint [FK_pupil_pupilStatus_id_pupilStatus_id];
alter table [mtc_admin].[pupil] drop column pupilStatus_id;
84 changes: 84 additions & 0 deletions admin/data/sql/migrations/163.do.backfill-pupil-status.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
declare @statusId int;

-- Set pupil status for those pupils who have never been allocated any checks
set @statusId = (select id from [mtc_admin].[pupilStatus] where code = 'UNALLOC');

UPDATE [mtc_admin].[pupil]
SET pupilStatus_id = @statusId
FROM [mtc_admin].[pupil] p
LEFT JOIN [mtc_admin].[check] chk ON (p.id = chk.pupil_id)
WHERE chk.id IS NULL;



-- Set the pupil status for those pupils who have been allocated a check but have never logged in
set @statusId = (select id from [mtc_admin].[pupilStatus] where code = 'ALLOC');

UPDATE [mtc_admin].[pupil]
SET pupilStatus_id = @statusId
FROM [mtc_admin].[pupil] p
LEFT JOIN [mtc_admin].[check] chk ON (p.id = chk.pupil_id)
WHERE chk.isLiveCheck = 1
AND chk.id IS NULL;



-- Set pupil status for those pupils who have have logged in to their check
set @statusId = (select id from [mtc_admin].[pupilStatus] where code = 'LOGGED_IN');

UPDATE [mtc_admin].[pupil]
SET pupilStatus_id = @statusId
FROM [mtc_admin].[pupil] p
INNER JOIN [mtc_admin].[check] chk ON (p.id = chk.pupil_id)
INNER JOIN [mtc_admin].[checkStatus] chkStatus ON (chk.checkStatus_id = chkStatus.id)
WHERE chkStatus.code = 'COL'
AND chk.isLiveCheck = 1;



-- Set pupil status for those who have have started a check
set @statusId = (select id from [mtc_admin].[pupilStatus] where code = 'STARTED');

UPDATE [mtc_admin].[pupil]
SET pupilStatus_id = @statusId
FROM [mtc_admin].[pupil] p
INNER JOIN [mtc_admin].[check] chk ON (p.id = chk.pupil_id)
INNER JOIN [mtc_admin].[checkStatus] chkStatus ON (chk.checkStatus_id = chkStatus.id)
WHERE chkStatus.code = 'STD'
AND chk.isLiveCheck = 1;



-- Update the pupil status for pupils who have completed a check
set @statusId = (select id from [mtc_admin].[pupilStatus] where code = 'COMPLETED');

UPDATE [mtc_admin].[pupil]
SET pupilStatus_id = @statusId
FROM [mtc_admin].[pupil] p
INNER JOIN [mtc_admin].[check] chk ON (p.id = chk.pupil_id)
INNER JOIN [mtc_admin].[checkStatus] chkStatus ON (chk.checkStatus_id = chkStatus.id)
WHERE chkStatus.code = 'CMP'
AND chk.isLiveCheck = 1;


-- Set pupil status for those not taking the check
set @statusId = (select id from [mtc_admin].[pupilStatus] where code = 'NOT_TAKING');

UPDATE [mtc_admin].[pupil]
SET pupilStatus_id = @statusId
FROM [mtc_admin].[pupil] p
INNER JOIN [mtc_admin].[pupilAttendance] pa ON (p.id = pa.pupil_id)
WHERE pa.isDeleted = 0;


-- Set any pupils with an unconsumed restart to UNALLOC, so they can be allocated a new check
set @statusId = (select id from [mtc_admin].[pupilStatus] where code = 'UNALLOC');

UPDATE [mtc_admin].[pupil]
SET pupilStatus_id = @statusId
FROM [mtc_admin].[pupil] p
INNER JOIN [mtc_admin].[pupilRestart] pr ON (p.id = pr.pupil_id)
WHERE
pr.check_id IS NULL
AND pr.isDeleted = 0;

Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
update [mtc_admin].[pupil] set pupilStatus_id = NULL;
14 changes: 14 additions & 0 deletions admin/data/sql/migrations/164.do.create-pupil-status-view.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
-- helper view for DBAs / developers

CREATE VIEW [mtc_admin].[vewPupilStatus] AS (
SELECT
p.id as pupil_id,
p.foreName,
p.lastName,
p.middleNames,
p.dateOfBirth,
p.gender,
ps.code
FROM [mtc_admin].[pupil] p
LEFT JOIN [mtc_admin].[pupilStatus] ps ON (p.pupilStatus_id = ps.id)
);
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
DROP VIEW [mtc_admin].[vewPupilStatus];
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
alter table [mtc_admin].[pupil]
alter column pupilStatus_id int not null;

alter table [mtc_admin].[pupil]
add constraint [DF_pupil_pupilStatus_id] DEFAULT 1 FOR [pupilStatus_id];
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
alter table [mtc_admin].[pupil]
alter column pupilStatus_id int;

alter table [mtc_admin].[pupil]
drop constraint [DF_pupil_pupilStatus_id];
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
--
-- Find pupils eligible to generate a Familiarisation PIN
--

CREATE VIEW [mtc_admin].[vewPupilsEligibleForFamiliarisationPinGeneration] AS (
SELECT
p.id,
p.foreName,
p.middleNames,
p.lastName,
p.dateOfBirth,
p.school_id,
p.urlSlug
FROM
[mtc_admin].[pupil] p
LEFT JOIN [mtc_admin].[pupilAttendance] pa ON (p.id = pa.pupil_id)
LEFT JOIN [mtc_admin].[attendanceCode] ac ON (pa.attendanceCode_id = ac.id)
INNER JOIN [mtc_admin].[pupilStatus] ps ON (p.pupilStatus_id = ps.id)
WHERE
-- include all pupils except those who are marked as not taking check because they left school
(ac.id IS NULL OR ac.code <> 'LEFTT')
AND ps.code IN ('UNALLOC',
'ALLOC',
'LOGGED_IN',
'NOT_TAKING_CHECK')


EXCEPT

-- Exclude pupils who already have an active familiarisation check
SELECT
p.id,
p.foreName,
p.middleNames,
p.lastName,
p.dateOfBirth,
p.school_id,
p.urlSlug
FROM
[mtc_admin].[pupil] p
LEFT JOIN [mtc_admin].[check] AS chk ON (p.id = chk.pupil_id)
LEFT JOIN [mtc_admin].[checkStatus] AS chkStatus ON (chk.checkStatus_id = chkStatus.id)
WHERE chk.isLiveCheck = 0
AND chkStatus.code = 'NEW'
);
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
DROP VIEW [mtc_admin].[vewPupilsEligibleForFamiliarisationPinGeneration];
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
drop view [mtc_admin].[vewPupilsEligibleForPinGeneration];
Loading

0 comments on commit 053d6d9

Please sign in to comment.