From 5ba629c6580f733401b8f85669643b9e91988dfa Mon Sep 17 00:00:00 2001 From: yasin Date: Fri, 27 Oct 2023 10:31:36 +0100 Subject: [PATCH 1/2] ADJUST1-221 Skip approval page if only PADAS exist - go straight to submit page. Also only show total per charges on view screen --- .../additionalDaysAwardedRoutes.test.ts | 167 ++++++++++++++++++ server/routes/additionalDaysAwardedRoutes.ts | 6 + server/views/macros/adaTable.njk | 15 +- .../adjustments/additional-days/view.njk | 3 +- 4 files changed, 184 insertions(+), 7 deletions(-) create mode 100644 server/routes/additionalDaysAwardedRoutes.test.ts diff --git a/server/routes/additionalDaysAwardedRoutes.test.ts b/server/routes/additionalDaysAwardedRoutes.test.ts new file mode 100644 index 00000000..67d30af9 --- /dev/null +++ b/server/routes/additionalDaysAwardedRoutes.test.ts @@ -0,0 +1,167 @@ +import type { Express } from 'express' +import request from 'supertest' +import { appWithAllRoutes, user } from './testutils/appSetup' +import PrisonerService from '../services/prisonerService' +import AdjustmentsService from '../services/adjustmentsService' +import { PrisonApiPrisoner } from '../@types/prisonApi/prisonClientTypes' +import IdentifyRemandPeriodsService from '../services/identifyRemandPeriodsService' +import AdjustmentsStoreService from '../services/adjustmentsStoreService' +import AdditionalDaysAwardedService from '../services/additionalDaysAwardedService' +import { AdasToReview } from '../@types/AdaTypes' + +jest.mock('../services/adjustmentsService') +jest.mock('../services/prisonerService') +jest.mock('../services/identifyRemandPeriodsService') +jest.mock('../services/adjustmentsStoreService') +jest.mock('../services/additionalDaysAwardedService') + +const prisonerService = new PrisonerService(null) as jest.Mocked +const adjustmentsService = new AdjustmentsService() as jest.Mocked +const identifyRemandPeriodsService = new IdentifyRemandPeriodsService() as jest.Mocked +const adjustmentsStoreService = new AdjustmentsStoreService() as jest.Mocked +const additionalDaysAwardedService = new AdditionalDaysAwardedService( + null, + null, +) as jest.Mocked + +const NOMS_ID = 'ABC123' + +const stubbedPrisonerData = { + offenderNo: NOMS_ID, + firstName: 'Anon', + lastName: 'Nobody', + dateOfBirth: '24/06/2000', + bookingId: 12345, + agencyId: 'LDS', +} as PrisonApiPrisoner + +const allPadas = { + awaitingApproval: [ + { + dateChargeProved: new Date('2023-08-03'), + charges: [ + { + chargeNumber: 1525916, + dateChargeProved: new Date('2023-08-03'), + days: 5, + heardAt: 'Moorland (HMP & YOI)', + status: 'PROSPECTIVE', + toBeServed: 'Concurrent', + sequence: 15, + }, + { + chargeNumber: 1525917, + dateChargeProved: new Date('2023-08-03'), + days: 5, + heardAt: 'Moorland (HMP & YOI)', + status: 'PROSPECTIVE', + toBeServed: 'Concurrent', + sequence: 16, + }, + ], + total: 5, + status: 'PENDING APPROVAL', + }, + ], + suspended: [], + awarded: [], + quashed: [], + totalAwarded: 0, + totalQuashed: 0, + totalAwaitingApproval: 104, + totalSuspended: 0, + intercept: { + number: 2, + type: 'UPDATE', + anyProspective: false, + }, +} as AdasToReview + +const mixPadasAndPending = { + awaitingApproval: [ + { + dateChargeProved: new Date('2023-08-03'), + charges: [ + { + chargeNumber: 1525916, + dateChargeProved: new Date('2023-08-03'), + days: 5, + heardAt: 'Moorland (HMP & YOI)', + status: 'PROSPECTIVE', + toBeServed: 'Concurrent', + sequence: 15, + }, + { + chargeNumber: 1525917, + dateChargeProved: new Date('2023-08-03'), + days: 5, + heardAt: 'Moorland (HMP & YOI)', + status: 'AWARDED_OR_PENDING', + toBeServed: 'Concurrent', + sequence: 16, + }, + ], + total: 5, + status: 'PENDING APPROVAL', + }, + ], + suspended: [], + awarded: [], + quashed: [], + totalAwarded: 0, + totalQuashed: 0, + totalAwaitingApproval: 104, + totalSuspended: 0, + intercept: { + number: 2, + type: 'UPDATE', + anyProspective: false, + }, +} as AdasToReview + +let app: Express + +const defaultUser = user + +let userInTest = defaultUser + +beforeEach(() => { + app = appWithAllRoutes({ + services: { + prisonerService, + adjustmentsService, + identifyRemandPeriodsService, + adjustmentsStoreService, + additionalDaysAwardedService, + }, + userSupplier: () => userInTest, + }) +}) + +afterEach(() => { + userInTest = defaultUser + jest.resetAllMocks() +}) + +describe('Additional Days Awarded routes tests', () => { + describe('Review and approve tests', () => { + it('GET /{nomsId}/additional-days/review-and-approve when only PADAs exist redirects to review and submit', () => { + prisonerService.getPrisonerDetail.mockResolvedValue(stubbedPrisonerData) + prisonerService.getStartOfSentenceEnvelope.mockResolvedValue(new Date()) + additionalDaysAwardedService.getAdasToApprove.mockResolvedValue(allPadas) + + return request(app) + .get(`/${NOMS_ID}/additional-days/review-and-approve`) + .expect(302) + .expect('Location', `/${NOMS_ID}/additional-days/review-and-submit`) + }) + + it('GET /{nomsId}/additional-days/review-and-approve when mix of PADAs and others exist does not redirect', () => { + prisonerService.getPrisonerDetail.mockResolvedValue(stubbedPrisonerData) + prisonerService.getStartOfSentenceEnvelope.mockResolvedValue(new Date()) + additionalDaysAwardedService.getAdasToApprove.mockResolvedValue(mixPadasAndPending) + + return request(app).get(`/${NOMS_ID}/additional-days/review-and-approve`).expect(200) + }) + }) +}) diff --git a/server/routes/additionalDaysAwardedRoutes.ts b/server/routes/additionalDaysAwardedRoutes.ts index ac5ef535..60e373f6 100644 --- a/server/routes/additionalDaysAwardedRoutes.ts +++ b/server/routes/additionalDaysAwardedRoutes.ts @@ -69,6 +69,12 @@ export default class AdditionalDaysAwardedRoutes { ) return res.redirect(`/${nomsId}`) } + + // If all awaiting approval are PADA's then go redirect to the review and submit screen (skip approve step) + if (!adasToReview.awaitingApproval.some(a => a.charges.some(c => c.status !== 'PROSPECTIVE'))) { + return res.redirect(`/${nomsId}/additional-days/review-and-submit`) + } + return res.render('pages/adjustments/additional-days/review-and-approve', { model: { prisonerDetail, diff --git a/server/views/macros/adaTable.njk b/server/views/macros/adaTable.njk index 5741d1b2..cc34ad14 100644 --- a/server/views/macros/adaTable.njk +++ b/server/views/macros/adaTable.njk @@ -9,6 +9,7 @@ emptyTitle: optional, displayed if table is empty checkboxes: optional, defaults to false, does table have checkboxes hideStatuses: optional, defaults to false , should the status of the ada be displayed totalText: optional, defaults to 'Total' , the text displayed next to the total. +showTotalPerDateCharged: optional, defaults to false, should the be shown per charge date #} {% macro adaTable(params) %} {% if params.adas | length %} @@ -87,12 +88,14 @@ totalText: optional, defaults to 'Total' , the text displayed next to the total {{ charge.days }} {% endfor %} - - - Total - {{ ada.total }} - - + {% if params.showTotalPerDateCharged %} + + + Total + {{ ada.total }} + + + {% endif %} diff --git a/server/views/pages/adjustments/additional-days/view.njk b/server/views/pages/adjustments/additional-days/view.njk index 659e26a3..01f8f8a2 100644 --- a/server/views/pages/adjustments/additional-days/view.njk +++ b/server/views/pages/adjustments/additional-days/view.njk @@ -21,7 +21,8 @@ adas: model.adas.awarded, total: model.adas.totalAwarded, hideStatuses: true, - totalText: 'Total ADAs taken into calculation' + totalText: 'Total ADAs taken into calculation', + showTotalPerDateCharged: true, }) }} From 4396d45bdfe24622c7e3920a13831ef0c8e35c61 Mon Sep 17 00:00:00 2001 From: yasin Date: Fri, 27 Oct 2023 10:35:29 +0100 Subject: [PATCH 2/2] ADJUST1-221 Fix typos --- server/routes/additionalDaysAwardedRoutes.ts | 2 +- server/views/macros/adaTable.njk | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server/routes/additionalDaysAwardedRoutes.ts b/server/routes/additionalDaysAwardedRoutes.ts index 60e373f6..684a5a04 100644 --- a/server/routes/additionalDaysAwardedRoutes.ts +++ b/server/routes/additionalDaysAwardedRoutes.ts @@ -70,7 +70,7 @@ export default class AdditionalDaysAwardedRoutes { return res.redirect(`/${nomsId}`) } - // If all awaiting approval are PADA's then go redirect to the review and submit screen (skip approve step) + // If all awaiting approval are PADA's then redirect to the submit screen (skip approve step) if (!adasToReview.awaitingApproval.some(a => a.charges.some(c => c.status !== 'PROSPECTIVE'))) { return res.redirect(`/${nomsId}/additional-days/review-and-submit`) } diff --git a/server/views/macros/adaTable.njk b/server/views/macros/adaTable.njk index cc34ad14..b1c4c096 100644 --- a/server/views/macros/adaTable.njk +++ b/server/views/macros/adaTable.njk @@ -9,7 +9,7 @@ emptyTitle: optional, displayed if table is empty checkboxes: optional, defaults to false, does table have checkboxes hideStatuses: optional, defaults to false , should the status of the ada be displayed totalText: optional, defaults to 'Total' , the text displayed next to the total. -showTotalPerDateCharged: optional, defaults to false, should the be shown per charge date +showTotalPerDateCharged: optional, defaults to false, should the total be shown per charge date #} {% macro adaTable(params) %} {% if params.adas | length %}