Skip to content

Commit 991f3ef

Browse files
Merge branch 'main' into feature-notifications-download-link-presenter
2 parents ddcc0ed + 21ad4e3 commit 991f3ef

File tree

14 files changed

+977
-38
lines changed

14 files changed

+977
-38
lines changed

app/controllers/return-logs-setup.controller.js

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,15 @@ const InitiateSessionService = require('../services/return-logs/setup/initiate-s
1111
const MeterDetailsService = require('../services/return-logs/setup/meter-details.service.js')
1212
const MeterProvidedService = require('../services/return-logs/setup/meter-provided.service.js')
1313
const NoteService = require('../services/return-logs/setup/note.service.js')
14+
const PeriodUsedService = require('../services/return-logs/setup/period-used.service.js')
1415
const ReceivedService = require('../services/return-logs/setup/received.service.js')
1516
const ReportedService = require('../services/return-logs/setup/reported.service.js')
1617
const SingleVolumeService = require('../services/return-logs/setup/single-volume.service.js')
1718
const SubmissionService = require('../services/return-logs/setup/submission.service.js')
1819
const SubmitMeterDetailsService = require('../services/return-logs/setup/submit-meter-details.service.js')
1920
const SubmitMeterProvidedService = require('../services/return-logs/setup/submit-meter-provided.service.js')
2021
const SubmitNoteService = require('../services/return-logs/setup/submit-note.service.js')
22+
const SubmitPeriodUsedService = require('../services/return-logs/setup/submit-period-used.service.js')
2123
const SubmitReceivedService = require('../services/return-logs/setup/submit-received.service.js')
2224
const SubmitReportedService = require('../services/return-logs/setup/submit-reported.service.js')
2325
const SubmitSingleVolumeService = require('../services/return-logs/setup/submit-single-volume.service.js')
@@ -66,6 +68,13 @@ async function note(request, h) {
6668
return h.view('return-logs/setup/note.njk', pageData)
6769
}
6870

71+
async function periodUsed(request, h) {
72+
const { sessionId } = request.params
73+
const pageData = await PeriodUsedService.go(sessionId)
74+
75+
return h.view('return-logs/setup/period-used.njk', pageData)
76+
}
77+
6978
async function received(request, h) {
7079
const { sessionId } = request.params
7180
const pageData = await ReceivedService.go(sessionId)
@@ -148,6 +157,18 @@ async function submitNote(request, h) {
148157
return h.redirect(`/system/return-logs/setup/${sessionId}/check`)
149158
}
150159

160+
async function submitPeriodUsed(request, h) {
161+
const { sessionId } = request.params
162+
163+
const pageData = await SubmitPeriodUsedService.go(sessionId, request.payload)
164+
165+
if (pageData.error) {
166+
return h.view('return-logs/setup/period-used.njk', pageData)
167+
}
168+
169+
return h.redirect(`/system/return-logs/setup/${sessionId}/check`)
170+
}
171+
151172
async function submitReceived(request, h) {
152173
const {
153174
params: { sessionId },
@@ -191,7 +212,7 @@ async function submitSingleVolume(request, h) {
191212
}
192213

193214
if (pageData.singleVolume === 'no') {
194-
return h.redirect(`/system/return-logs/setup/${sessionId}/check-answers`)
215+
return h.redirect(`/system/return-logs/setup/${sessionId}/check`)
195216
}
196217

197218
return h.redirect(`/system/return-logs/setup/${sessionId}/period-used`)
@@ -238,6 +259,7 @@ module.exports = {
238259
meterDetails,
239260
meterProvided,
240261
note,
262+
periodUsed,
241263
received,
242264
reported,
243265
setup,
@@ -246,6 +268,7 @@ module.exports = {
246268
submitMeterDetails,
247269
submitMeterProvided,
248270
submitNote,
271+
submitPeriodUsed,
249272
submitReceived,
250273
submitReported,
251274
submitSingleVolume,
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
'use strict'
2+
3+
/**
4+
* Format data for the `/return-log/setup/{sessionId}/period-used` page
5+
* @module PeriodUsedPresenter
6+
*/
7+
8+
const { formatAbstractionPeriod } = require('../../base.presenter.js')
9+
10+
/**
11+
* Format data for the `/return-log/setup/{sessionId}/period-used` page
12+
*
13+
* @param {module:SessionModel} session - The return log setup session instance
14+
*
15+
* @returns {object} page data needed by the view template
16+
*/
17+
function go(session) {
18+
const {
19+
id: sessionId,
20+
periodStartDay,
21+
periodStartMonth,
22+
periodEndDay,
23+
periodEndMonth,
24+
periodDateUsedOptions,
25+
returnReference,
26+
periodUsedFromDay,
27+
periodUsedFromMonth,
28+
periodUsedFromYear,
29+
periodUsedToDay,
30+
periodUsedToMonth,
31+
periodUsedToYear
32+
} = session
33+
34+
return {
35+
abstractionPeriod: formatAbstractionPeriod(periodStartDay, periodStartMonth, periodEndDay, periodEndMonth),
36+
backLink: `/system/return-logs/setup/${sessionId}/single-volume`,
37+
pageTitle: 'What period was used for this volume?',
38+
periodDateUsedOptions: periodDateUsedOptions ?? null,
39+
periodUsedFromDay: periodUsedFromDay ?? null,
40+
periodUsedFromMonth: periodUsedFromMonth ?? null,
41+
periodUsedFromYear: periodUsedFromYear ?? null,
42+
periodUsedToDay: periodUsedToDay ?? null,
43+
periodUsedToMonth: periodUsedToMonth ?? null,
44+
periodUsedToYear: periodUsedToYear ?? null,
45+
returnReference,
46+
sessionId
47+
}
48+
}
49+
50+
module.exports = {
51+
go
52+
}

app/routes/return-logs-setup.routes.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,30 @@ const routes = [
242242
}
243243
}
244244
}
245+
},
246+
{
247+
method: 'GET',
248+
path: '/return-logs/setup/{sessionId}/period-used',
249+
options: {
250+
handler: ReturnLogsSetupController.periodUsed,
251+
auth: {
252+
access: {
253+
scope: ['billing']
254+
}
255+
}
256+
}
257+
},
258+
{
259+
method: 'POST',
260+
path: '/return-logs/setup/{sessionId}/period-used',
261+
options: {
262+
handler: ReturnLogsSetupController.submitPeriodUsed,
263+
auth: {
264+
access: {
265+
scope: ['billing']
266+
}
267+
}
268+
}
245269
}
246270
]
247271

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
'use strict'
2+
3+
/**
4+
* Orchestrates fetching and presenting the data for `/return-logs/setup/{sessionId}/period-used` page
5+
* @module PeriodUsedService
6+
*/
7+
8+
const PeriodUsedPresenter = require('../../../presenters/return-logs/setup/period-used.presenter.js')
9+
const SessionModel = require('../../../models/session.model.js')
10+
11+
/**
12+
* Orchestrates fetching and presenting the data for `/return-logs/setup/{sessionId}/period-used` page
13+
*
14+
* Supports generating the data needed for the period used page in the return log setup journey. It fetches the
15+
* current session record and formats the data needed for the page.
16+
*
17+
* @param {string} sessionId - The UUID of the current session
18+
*
19+
* @returns {Promise<object>} The view data for the period used page
20+
*/
21+
async function go(sessionId) {
22+
const session = await SessionModel.query().findById(sessionId)
23+
24+
const formattedData = PeriodUsedPresenter.go(session)
25+
26+
return {
27+
activeNavBar: 'search',
28+
...formattedData
29+
}
30+
}
31+
32+
module.exports = {
33+
go
34+
}
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
'use strict'
2+
3+
/**
4+
* Orchestrates validating the data for `/return-logs/setup/{sessionId}/period-used` page
5+
* @module SubmitPeriodUsedService
6+
*/
7+
8+
const PeriodUsedPresenter = require('../../../presenters/return-logs/setup/period-used.presenter.js')
9+
const PeriodUsedValidator = require('../../../validators/return-logs/setup/period-used.validator.js')
10+
const SessionModel = require('../../../models/session.model.js')
11+
12+
/**
13+
* Orchestrates validating the data for `/return-logs/setup/{sessionId}/period-used` page
14+
*
15+
* It first retrieves the session instance for the return log setup session in progress. The session has details about
16+
* the return log that are needed to validate that the chosen date is valid.
17+
*
18+
* The validation result is then combined with the output of the presenter to generate the page data needed by the view.
19+
* If there was a validation error the controller will re-render the page so needs this information. If all is well the
20+
* controller will redirect to the next page in the journey.
21+
*
22+
* @param {string} sessionId - The UUID of the current session
23+
* @param {object} payload - The submitted form data
24+
*
25+
* @returns {Promise<object>} If no errors the page data for the period-used page else the validation error details
26+
*/
27+
async function go(sessionId, payload) {
28+
const session = await SessionModel.query().findById(sessionId)
29+
30+
const validationResult = _validate(payload, session)
31+
32+
if (!validationResult) {
33+
await _save(session, payload)
34+
35+
return {}
36+
}
37+
38+
const formattedData = _submittedSessionData(session, payload)
39+
40+
return {
41+
activeNavBar: 'search',
42+
error: validationResult,
43+
...formattedData
44+
}
45+
}
46+
47+
async function _save(session, payload) {
48+
session.periodDateUsedOptions = payload.periodDateUsedOptions
49+
session.fromFullDate = payload.fromFullDate
50+
session.toFullDate = payload.toFullDate
51+
session.periodUsedFromDay = payload['period-used-from-day']
52+
session.periodUsedFromMonth = payload['period-used-from-month']
53+
session.periodUsedFromYear = payload['period-used-from-year']
54+
session.periodUsedToDay = payload['period-used-to-day']
55+
session.periodUsedToMonth = payload['period-used-to-month']
56+
session.periodUsedToYear = payload['period-used-to-year']
57+
58+
return session.$update()
59+
}
60+
61+
function _submittedSessionData(session, payload) {
62+
session.periodDateUsedOptions = payload.periodDateUsedOptions ?? null
63+
session.periodUsedFromDay = payload['period-used-from-day'] ?? null
64+
session.periodUsedFromMonth = payload['period-used-from-month'] ?? null
65+
session.periodUsedFromYear = payload['period-used-from-year'] ?? null
66+
session.periodUsedToDay = payload['period-used-to-day'] ?? null
67+
session.periodUsedToMonth = payload['period-used-to-month'] ?? null
68+
session.periodUsedToYear = payload['period-used-to-year'] ?? null
69+
70+
return PeriodUsedPresenter.go(session)
71+
}
72+
73+
function _validate(payload, session) {
74+
const { startDate, endDate } = session
75+
76+
const validation = PeriodUsedValidator.go(payload, startDate, endDate)
77+
78+
if (!validation.error) {
79+
return null
80+
}
81+
82+
const result = {
83+
errorList: []
84+
}
85+
86+
validation.error.details.forEach((detail) => {
87+
let href
88+
89+
if (detail.context.key === 'fromFullDate') {
90+
href = '#from-full-date'
91+
} else if (detail.context.key === 'toFullDate') {
92+
href = '#to-full-date'
93+
} else {
94+
href = '#period-date-used-options'
95+
}
96+
97+
result.errorList.push({
98+
href,
99+
text: detail.message
100+
})
101+
102+
result[detail.context.key] = { message: detail.message }
103+
})
104+
105+
return result
106+
}
107+
108+
module.exports = {
109+
go
110+
}

0 commit comments

Comments
 (0)