From e3cebbebd07ac8d606390bf82107cbfff3b497ed Mon Sep 17 00:00:00 2001 From: Jason Claxton Date: Fri, 16 Aug 2024 14:28:30 +0100 Subject: [PATCH 01/25] Trigger 2PT Supplementary Bill Run - Pt2 https://eaflood.atlassian.net/browse/WATER-4631 As we are treating 2PT supplementary as a separate bill run we will need a new journey to trigger it. The first part of this work was carried on in PR https://github.com/DEFRA/water-abstraction-system/pull/1259 In this PR the remainder of the journey to enable triggering of a 2PT supplementary will be completed. This will include selecting the required financial year and triggering the bill run. From addfa13cc5e384b614a9175225c5dc3af0eb481c Mon Sep 17 00:00:00 2001 From: Jason Claxton Date: Fri, 16 Aug 2024 16:42:18 +0100 Subject: [PATCH 02/25] Remove temporary if statement --- app/services/bill-runs/setup/submit-region.service.js | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/app/services/bill-runs/setup/submit-region.service.js b/app/services/bill-runs/setup/submit-region.service.js index 951c6d37b9..2a6ecfb0e3 100644 --- a/app/services/bill-runs/setup/submit-region.service.js +++ b/app/services/bill-runs/setup/submit-region.service.js @@ -39,16 +39,6 @@ async function go (sessionId, payload) { if (!validationResult) { await _save(session, payload) - // Temporary if statement to end the journey if the bill run is for two-part tariff supplementary - if (session.type === 'two_part_supplementary') { - const temporaryFormattedData = RegionPresenter.go(session, regions) - - return { - error: { text: 'Currently you can progress no further for a two-part tariff supplementary bill run' }, - ...temporaryFormattedData - } - } - // The journey is complete (we don't need any details) if the bill run type is not 2PT return { setupComplete: !session.type.startsWith('two_part') } } From e692403996b4c36d81a44f3f139b8a162e25192e Mon Sep 17 00:00:00 2001 From: Jason Claxton Date: Fri, 16 Aug 2024 16:43:03 +0100 Subject: [PATCH 03/25] Make the financial years dynamic - WIP --- .../bill-runs/setup/year.presenter.js | 63 +++++++++++++++++++ app/views/bill-runs/setup/year.njk | 23 +------ 2 files changed, 64 insertions(+), 22 deletions(-) diff --git a/app/presenters/bill-runs/setup/year.presenter.js b/app/presenters/bill-runs/setup/year.presenter.js index d2186a0a33..8ee942ee18 100644 --- a/app/presenters/bill-runs/setup/year.presenter.js +++ b/app/presenters/bill-runs/setup/year.presenter.js @@ -13,12 +13,75 @@ * @returns {Object} - The data formatted for the view template */ function go (session) { + const selectedYear = session.year ? session.year : null + + let financialYearsData = [] + + if (session.type === 'two_part_tariff') { + financialYearsData = _annualFinancialYearsData(selectedYear) + } + + if (session.type === 'two_part_supplementary') { + financialYearsData = _supplementaryFinancialYearsData(selectedYear) + } + return { + financialYearsData, sessionId: session.id, selectedYear: session.year ? session.year : null } } +function _annualFinancialYearsData (selectedYear) { + return [ + { + text: '2023 to 2024', + value: '2024', + checked: selectedYear === '2024' + }, + { + text: '2022 to 2023', + value: '2023', + checked: selectedYear === '2023' + }, + { + text: '2021 to 2022', + value: '2022', + checked: selectedYear === '2022' + }, + { + text: '2020 to 2021', + value: '2021', + checked: selectedYear === '2021' + } + ] +} + +function _supplementaryFinancialYearsData (selectedYear) { + return [ + { + text: '2023 to 2024', + value: '2024', + checked: selectedYear === '2024' + }, + { + text: '2022 to 2023', + value: '2023', + checked: selectedYear === '2023' + }, + { + text: '2021 to 2022', + value: '2022', + checked: selectedYear === '2022' + }, + { + text: '2020 to 2021', + value: '2021', + checked: selectedYear === '2021' + } + ] +} + module.exports = { go } diff --git a/app/views/bill-runs/setup/year.njk b/app/views/bill-runs/setup/year.njk index 0e016f77a3..685edc40b3 100644 --- a/app/views/bill-runs/setup/year.njk +++ b/app/views/bill-runs/setup/year.njk @@ -44,28 +44,7 @@ classes: 'govuk-fieldset__legend--l govuk-!-margin-bottom-6' } }, - items: [ - { - text: '2023 to 2024', - value: '2024', - checked: '2024' == selectedYear - }, - { - text: '2022 to 2023', - value: '2023', - checked: '2023' == selectedYear - }, - { - text: '2021 to 2022', - value: '2022', - checked: '2022' == selectedYear - }, - { - text: '2020 to 2021', - value: '2021', - checked: '2021' == selectedYear - } - ] + items: financialYearsData }) }} {{ govukButton({ text: 'Continue', preventDoubleClick: true }) }} From 8236398f32fc853e37e594a54fce3f93b62f5e6a Mon Sep 17 00:00:00 2001 From: Jason Claxton Date: Wed, 28 Aug 2024 15:50:42 +0100 Subject: [PATCH 04/25] Add new page for when no TPT years exist --- app/controllers/bill-runs-setup.controller.js | 18 +++++++++++ app/routes/bill-runs-setup.routes.js | 12 ++++++++ .../bill-runs/setup/no-licences.service.js | 30 +++++++++++++++++++ app/views/bill-runs/setup/no-licences.njk | 29 ++++++++++++++++++ 4 files changed, 89 insertions(+) create mode 100644 app/services/bill-runs/setup/no-licences.service.js create mode 100644 app/views/bill-runs/setup/no-licences.njk diff --git a/app/controllers/bill-runs-setup.controller.js b/app/controllers/bill-runs-setup.controller.js index c256b1c6f7..f85e14e1be 100644 --- a/app/controllers/bill-runs-setup.controller.js +++ b/app/controllers/bill-runs-setup.controller.js @@ -10,6 +10,7 @@ const Boom = require('@hapi/boom') const CreateService = require('../services/bill-runs/setup/create.service.js') const ExistsService = require('../services/bill-runs/setup/exists.service.js') const InitiateSessionService = require('../services/bill-runs/setup/initiate-session.service.js') +const NoLicencesService = require('../services/bill-runs/setup/no-licences.service.js') const RegionService = require('../services/bill-runs/setup/region.service.js') const SeasonService = require('../services/bill-runs/setup/season.service.js') const SubmitRegionService = require('../services/bill-runs/setup/submit-region.service.js') @@ -44,6 +45,18 @@ async function create (request, h) { } } +async function noLicences (request, h) { + const { sessionId } = request.params + + const regionName = await NoLicencesService.go(sessionId) + + return h.view('bill-runs/setup/no-licences.njk', { + activeNavBar: 'bill-runs', + pageTitle: `There are no licences marked for two-part tariff supplementary billing in the ${regionName} region`, + sessionId + }) +} + async function region (request, h) { const { sessionId } = request.params @@ -163,6 +176,10 @@ async function year (request, h) { const pageData = await YearService.go(sessionId) + if (pageData.financialYearsData.length === 0) { + return h.redirect(`/system/bill-runs/setup/${sessionId}/no-licences`) + } + return h.view('bill-runs/setup/year.njk', { activeNavBar: 'bill-runs', pageTitle: 'Select the financial year', @@ -172,6 +189,7 @@ async function year (request, h) { module.exports = { create, + noLicences, region, season, setup, diff --git a/app/routes/bill-runs-setup.routes.js b/app/routes/bill-runs-setup.routes.js index f266f32a41..05ab9cf4c9 100644 --- a/app/routes/bill-runs-setup.routes.js +++ b/app/routes/bill-runs-setup.routes.js @@ -15,6 +15,18 @@ const routes = [ } } }, + { + method: 'GET', + path: '/bill-runs/setup/{sessionId}/no-licences', + options: { + handler: BillRunsSetupController.noLicences, + auth: { + access: { + scope: ['billing'] + } + } + } + }, { method: 'GET', path: '/bill-runs/setup/{sessionId}/region', diff --git a/app/services/bill-runs/setup/no-licences.service.js b/app/services/bill-runs/setup/no-licences.service.js new file mode 100644 index 0000000000..693c27cac7 --- /dev/null +++ b/app/services/bill-runs/setup/no-licences.service.js @@ -0,0 +1,30 @@ +'use strict' + +/** + * Handles fetching the region name for `/bill-runs/setup/{sessionId}/no-licences` page + * @module NoLicencesService + */ + +const SessionModel = require('../../../models/session.model.js') +const RegionModel = require('../../../models/region.model.js') + +/** + * Handles fetching the region name for `/bill-runs/setup/{sessionId}/no-licences` page + * + * Supports generating the data needed for the no-licences page in the setup bill run journey. It fetches the regionId + * from the session record and uses this to look up the display name for the region. + * + * @param {string} sessionId - The UUID for setup bill run session record + * + * @returns {Promise} The display name of the region + */ +async function go (sessionId) { + const { region: regionId } = await SessionModel.query().findById(sessionId) + const { displayName: regionName } = await RegionModel.query().findById(regionId).select('displayName') + + return regionName +} + +module.exports = { + go +} diff --git a/app/views/bill-runs/setup/no-licences.njk b/app/views/bill-runs/setup/no-licences.njk new file mode 100644 index 0000000000..2fe0b6a0a8 --- /dev/null +++ b/app/views/bill-runs/setup/no-licences.njk @@ -0,0 +1,29 @@ +{% extends 'layout.njk' %} +{% from "govuk/components/back-link/macro.njk" import govukBackLink %} +{% from "govuk/components/warning-text/macro.njk" import govukWarningText %} + +{% block breadcrumbs %} + {# Back link #} + {{ + govukBackLink({ + text: 'Back', + href: '/system/bill-runs/setup/' + sessionId + '/region' + }) + }} +{% endblock %} + +{% block content %} + {# Main heading #} +
+

{{ pageTitle }}

+
+ + {{ govukWarningText({ + text: 'Check there are licences ready to be billed and try again.', + iconFallbackText: 'Warning' + }) }} + +

+ Return to bill runs +

+{% endblock %} From 46e9ce05ae4c1d8338d9af5ba3f0ed514fdc1ad6 Mon Sep 17 00:00:00 2001 From: Jason Claxton Date: Wed, 28 Aug 2024 15:52:15 +0100 Subject: [PATCH 05/25] Make the years dynamic for TPT supplementary --- .../bill-runs/setup/year.presenter.js | 55 ++++++++++--------- app/services/bill-runs/setup/year.service.js | 2 +- 2 files changed, 30 insertions(+), 27 deletions(-) diff --git a/app/presenters/bill-runs/setup/year.presenter.js b/app/presenters/bill-runs/setup/year.presenter.js index 2ddc2c62cf..5bb8e307d3 100644 --- a/app/presenters/bill-runs/setup/year.presenter.js +++ b/app/presenters/bill-runs/setup/year.presenter.js @@ -5,6 +5,8 @@ * @module RegionPresenter */ +const LicenceSupplementaryYearModel = require('../../../models/licence-supplementary-year.model.js') + /** * Formats data for the `/bill-runs/setup/{sessionId}/year` page * @@ -12,7 +14,7 @@ * * @returns {object} - The data formatted for the view template */ -function go (session) { +async function go (session) { const selectedYear = session.year ? session.year : null let financialYearsData = [] @@ -22,13 +24,13 @@ function go (session) { } if (session.type === 'two_part_supplementary') { - financialYearsData = _supplementaryFinancialYearsData(selectedYear) + financialYearsData = await _supplementaryFinancialYearsData(session.region, selectedYear) } return { financialYearsData, sessionId: session.id, - selectedYear: session.year ? session.year : null + selectedYear } } @@ -57,29 +59,30 @@ function _annualFinancialYearsData (selectedYear) { ] } -function _supplementaryFinancialYearsData (selectedYear) { - return [ - { - text: '2023 to 2024', - value: '2024', - checked: selectedYear === '2024' - }, - { - text: '2022 to 2023', - value: '2023', - checked: selectedYear === '2023' - }, - { - text: '2021 to 2022', - value: '2022', - checked: selectedYear === '2022' - }, - { - text: '2020 to 2021', - value: '2021', - checked: selectedYear === '2021' - } - ] +async function _supplementaryFinancialYearsData (regionId, selectedYear) { + const supplementaryFinancialYearsData = [] + const tptSupplementaryYears = await _tptSupplementaryYears(regionId) + + if (tptSupplementaryYears.length > 0) { + tptSupplementaryYears.forEach((tptSupplementaryYear) => { + supplementaryFinancialYearsData.push({ + text: `${tptSupplementaryYear.financialYearEnd - 1} to ${tptSupplementaryYear.financialYearEnd}`, + value: tptSupplementaryYear.financialYearEnd, + checked: selectedYear === tptSupplementaryYear.financialYearEnd + }) + }) + } + + return supplementaryFinancialYearsData +} + +async function _tptSupplementaryYears (regionId) { + return LicenceSupplementaryYearModel.query() + .distinct('financialYearEnd') + .innerJoinRelated('licence') + .where('twoPartTariff', true) + .where('regionId', regionId) + .orderBy('financialYearEnd', 'desc') } module.exports = { diff --git a/app/services/bill-runs/setup/year.service.js b/app/services/bill-runs/setup/year.service.js index 0577dca3cc..1be57e3e1e 100644 --- a/app/services/bill-runs/setup/year.service.js +++ b/app/services/bill-runs/setup/year.service.js @@ -20,7 +20,7 @@ const SessionModel = require('../../../models/session.model.js') */ async function go (sessionId) { const session = await SessionModel.query().findById(sessionId) - const formattedData = YearPresenter.go(session) + const formattedData = await YearPresenter.go(session) return { ...formattedData From a3c1ac6788137cee6f1366f7003a9d62c3c35d65 Mon Sep 17 00:00:00 2001 From: Jason Claxton Date: Wed, 28 Aug 2024 16:58:53 +0100 Subject: [PATCH 06/25] Add temp code to return to bill runs page if tpt supp --- app/controllers/bill-runs-setup.controller.js | 6 ++++++ app/services/bill-runs/setup/submit-year.service.js | 8 +++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/app/controllers/bill-runs-setup.controller.js b/app/controllers/bill-runs-setup.controller.js index f85e14e1be..16df181180 100644 --- a/app/controllers/bill-runs-setup.controller.js +++ b/app/controllers/bill-runs-setup.controller.js @@ -152,6 +152,12 @@ async function submitYear (request, h) { }) } + // Temporary code to end the journey if the bill run type is two-part supplementary as processing this bill run type + // is not currently possible + if (pageData.goBackToBillRuns) { + return h.redirect('/system/bill-runs') + } + if (pageData.setupComplete) { return h.redirect(`/system/bill-runs/setup/${sessionId}/create`) } diff --git a/app/services/bill-runs/setup/submit-year.service.js b/app/services/bill-runs/setup/submit-year.service.js index ef4cd1e66a..d75e7c1f42 100644 --- a/app/services/bill-runs/setup/submit-year.service.js +++ b/app/services/bill-runs/setup/submit-year.service.js @@ -37,10 +37,16 @@ async function go (sessionId, payload) { if (!validationResult) { await _save(session, payload) + // Temporary code to end the journey if the bill run type is two-part supplementary as processing this bill run type + // is not currently possible + if (session.type === 'two_part_supplementary') { + return { goBackToBillRuns: true } + } + return { setupComplete: ['2024', '2023'].includes(session.year) } } - const formattedData = YearPresenter.go(session) + const formattedData = await YearPresenter.go(session) return { error: validationResult, From 2f15760adfe17781e8976d0c0e7d73d22128d4de Mon Sep 17 00:00:00 2001 From: Jason Claxton Date: Thu, 29 Aug 2024 15:11:55 +0100 Subject: [PATCH 07/25] Add and fix controller tests --- .../bill-runs-setup.controller.test.js | 56 +++++++++++++++++-- 1 file changed, 51 insertions(+), 5 deletions(-) diff --git a/test/controllers/bill-runs-setup.controller.test.js b/test/controllers/bill-runs-setup.controller.test.js index a64d70e640..ea985f8a2a 100644 --- a/test/controllers/bill-runs-setup.controller.test.js +++ b/test/controllers/bill-runs-setup.controller.test.js @@ -15,6 +15,7 @@ const { postRequestOptions } = require('../support/general.js') const CreateService = require('../../app/services/bill-runs/setup/create.service.js') const ExistsService = require('../../app/services/bill-runs/setup/exists.service.js') const InitiateSessionService = require('../../app/services/bill-runs/setup/initiate-session.service.js') +const NoLicencesService = require('../../app/services/bill-runs/setup/no-licences.service.js') const RegionService = require('../../app/services/bill-runs/setup/region.service.js') const SeasonService = require('../../app/services/bill-runs/setup/season.service.js') const SubmitRegionService = require('../../app/services/bill-runs/setup/submit-region.service.js') @@ -122,6 +123,25 @@ describe('Bill Runs Setup controller', () => { }) }) + describe('/bill-runs/setup/{sessionId}/no-licences', () => { + describe('GET', () => { + beforeEach(async () => { + options = _getOptions('no-licences') + + Sinon.stub(NoLicencesService, 'go').resolves('Test') + }) + + describe('when the request succeeds', () => { + it('returns the page successfully', async () => { + const response = await server.inject(options) + + expect(response.statusCode).to.equal(200) + expect(response.payload).to.contain('There are no licences marked for two-part tariff supplementary billing in the Test region') + }) + }) + }) + }) + describe('/bill-runs/setup/{sessionId}/region', () => { describe('GET', () => { beforeEach(async () => { @@ -325,14 +345,23 @@ describe('Bill Runs Setup controller', () => { describe('GET', () => { beforeEach(async () => { options = _getOptions('year') + }) - Sinon.stub(YearService, 'go').resolves({ - sessionId: 'e009b394-8405-4358-86af-1a9eb31298a5', - selectedYear: null + describe('when the request succeeds with at least 1 year to display', () => { + beforeEach(async () => { + Sinon.stub(YearService, 'go').resolves({ + financialYearsData: [ + { + text: '2023 to 2024', + value: '2024', + checked: false + } + ], + sessionId: 'e009b394-8405-4358-86af-1a9eb31298a5', + selectedYear: null + }) }) - }) - describe('when the request succeeds', () => { it('returns the page successfully', async () => { const response = await server.inject(options) @@ -340,6 +369,23 @@ describe('Bill Runs Setup controller', () => { expect(response.payload).to.contain('Select the financial year') }) }) + + describe('when the request succeeds with no years to display', () => { + beforeEach(async () => { + Sinon.stub(YearService, 'go').resolves({ + financialYearsData: [], + sessionId: 'e009b394-8405-4358-86af-1a9eb31298a5', + selectedYear: null + }) + }) + + it('redirects to the no licences endpoint', async () => { + const response = await server.inject(options) + + expect(response.statusCode).to.equal(302) + expect(response.headers.location).to.equal('/system/bill-runs/setup/e009b394-8405-4358-86af-1a9eb31298a5/no-licences') + }) + }) }) describe('POST', () => { From a4562dd5c5e323a0793ef94c327ac589f6ed5ce8 Mon Sep 17 00:00:00 2001 From: Jason Claxton Date: Thu, 29 Aug 2024 16:41:49 +0100 Subject: [PATCH 08/25] Add and fix year presenter tests --- .../bill-runs/setup/year.presenter.js | 10 +- .../bill-runs/setup/year.presenter.test.js | 99 +++++++++++++++++-- 2 files changed, 96 insertions(+), 13 deletions(-) diff --git a/app/presenters/bill-runs/setup/year.presenter.js b/app/presenters/bill-runs/setup/year.presenter.js index 5bb8e307d3..b1588508e6 100644 --- a/app/presenters/bill-runs/setup/year.presenter.js +++ b/app/presenters/bill-runs/setup/year.presenter.js @@ -38,22 +38,22 @@ function _annualFinancialYearsData (selectedYear) { return [ { text: '2023 to 2024', - value: '2024', + value: 2024, checked: selectedYear === '2024' }, { text: '2022 to 2023', - value: '2023', + value: 2023, checked: selectedYear === '2023' }, { text: '2021 to 2022', - value: '2022', + value: 2022, checked: selectedYear === '2022' }, { text: '2020 to 2021', - value: '2021', + value: 2021, checked: selectedYear === '2021' } ] @@ -68,7 +68,7 @@ async function _supplementaryFinancialYearsData (regionId, selectedYear) { supplementaryFinancialYearsData.push({ text: `${tptSupplementaryYear.financialYearEnd - 1} to ${tptSupplementaryYear.financialYearEnd}`, value: tptSupplementaryYear.financialYearEnd, - checked: selectedYear === tptSupplementaryYear.financialYearEnd + checked: selectedYear === tptSupplementaryYear.financialYearEnd.toString() }) }) } diff --git a/test/presenters/bill-runs/setup/year.presenter.test.js b/test/presenters/bill-runs/setup/year.presenter.test.js index 53ba68575d..d6ed55eacf 100644 --- a/test/presenters/bill-runs/setup/year.presenter.test.js +++ b/test/presenters/bill-runs/setup/year.presenter.test.js @@ -7,25 +7,78 @@ const Code = require('@hapi/code') const { describe, it, beforeEach } = exports.lab = Lab.script() const { expect } = Code +// Test helpers +const LicenceHelper = require('../../../support/helpers/licence.helper.js') +const LicenceSupplementaryYearHelper = require('../../../support/helpers/licence-supplementary-year.helper.js') + // Thing under test const YearPresenter = require('../../../../app/presenters/bill-runs/setup/year.presenter.js') describe('Bill Runs Setup Year presenter', () => { let session - describe('when provided with a bill run setup session record', () => { + describe('when provided with a bill run setup session record for two-part tariff annual', () => { beforeEach(() => { session = { id: '98ad3a1f-8e4f-490a-be05-0aece6755466', - data: {} + data: {}, + type: 'two_part_tariff' + } + }) + + describe('where the user has not previously selected a financial year', () => { + it('correctly presents the data', async () => { + const result = await YearPresenter.go(session) + + expect(result).to.equal({ + financialYearsData: _financialYearsData(null), + sessionId: '98ad3a1f-8e4f-490a-be05-0aece6755466', + selectedYear: null + }) + }) + }) + + describe('where the user has previously selected a financial year', () => { + beforeEach(() => { + session.year = '2022' + }) + + it('correctly presents the data', async () => { + const result = await YearPresenter.go(session) + + expect(result).to.equal({ + financialYearsData: _financialYearsData('2022'), + sessionId: '98ad3a1f-8e4f-490a-be05-0aece6755466', + selectedYear: '2022' + }) + }) + }) + }) + + describe('when provided with a bill run setup session record for two-part tariff supplementary', () => { + beforeEach(async () => { + const { id: licenceId, regionId } = await LicenceHelper.add() + + await LicenceSupplementaryYearHelper.add({ licenceId, financialYearEnd: 2022, twoPartTariff: true }) + + session = { + id: '98ad3a1f-8e4f-490a-be05-0aece6755466', + data: {}, + region: regionId, + type: 'two_part_supplementary' } }) describe('where the user has not previously selected a financial year', () => { - it('correctly presents the data', () => { - const result = YearPresenter.go(session) + it('correctly presents the data', async () => { + const result = await YearPresenter.go(session) expect(result).to.equal({ + financialYearsData: [{ + text: '2021 to 2022', + value: 2022, + checked: false + }], sessionId: '98ad3a1f-8e4f-490a-be05-0aece6755466', selectedYear: null }) @@ -34,17 +87,47 @@ describe('Bill Runs Setup Year presenter', () => { describe('where the user has previously selected a financial year', () => { beforeEach(() => { - session.year = 2022 + session.year = '2022' }) - it('correctly presents the data', () => { - const result = YearPresenter.go(session) + it('correctly presents the data', async () => { + const result = await YearPresenter.go(session) expect(result).to.equal({ + financialYearsData: [{ + text: '2021 to 2022', + value: 2022, + checked: true + }], sessionId: '98ad3a1f-8e4f-490a-be05-0aece6755466', - selectedYear: 2022 + selectedYear: '2022' }) }) }) }) }) + +function _financialYearsData (selectedYear) { + return [ + { + text: '2023 to 2024', + value: 2024, + checked: selectedYear === '2024' + }, + { + text: '2022 to 2023', + value: 2023, + checked: selectedYear === '2023' + }, + { + text: '2021 to 2022', + value: 2022, + checked: selectedYear === '2022' + }, + { + text: '2020 to 2021', + value: 2021, + checked: selectedYear === '2021' + } + ] +} From 2f5ab9617bbb66825f147c4516b17d5f143c0da3 Mon Sep 17 00:00:00 2001 From: Jason Claxton Date: Thu, 29 Aug 2024 16:48:00 +0100 Subject: [PATCH 09/25] Tidy up --- test/controllers/bill-runs-setup.controller.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/controllers/bill-runs-setup.controller.test.js b/test/controllers/bill-runs-setup.controller.test.js index ea985f8a2a..f7561aa132 100644 --- a/test/controllers/bill-runs-setup.controller.test.js +++ b/test/controllers/bill-runs-setup.controller.test.js @@ -353,7 +353,7 @@ describe('Bill Runs Setup controller', () => { financialYearsData: [ { text: '2023 to 2024', - value: '2024', + value: 2024, checked: false } ], From 6984fd308f5ad3a5f011b34b6ed8dbd157b52c66 Mon Sep 17 00:00:00 2001 From: Jason Claxton Date: Thu, 29 Aug 2024 17:39:04 +0100 Subject: [PATCH 10/25] Create tests for no licences service --- .../bill-runs/setup/no-licences.service.js | 2 +- .../setup/no-licences.service.test.js | 34 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 test/services/bill-runs/setup/no-licences.service.test.js diff --git a/app/services/bill-runs/setup/no-licences.service.js b/app/services/bill-runs/setup/no-licences.service.js index 693c27cac7..8ac9e5f63e 100644 --- a/app/services/bill-runs/setup/no-licences.service.js +++ b/app/services/bill-runs/setup/no-licences.service.js @@ -5,8 +5,8 @@ * @module NoLicencesService */ -const SessionModel = require('../../../models/session.model.js') const RegionModel = require('../../../models/region.model.js') +const SessionModel = require('../../../models/session.model.js') /** * Handles fetching the region name for `/bill-runs/setup/{sessionId}/no-licences` page diff --git a/test/services/bill-runs/setup/no-licences.service.test.js b/test/services/bill-runs/setup/no-licences.service.test.js new file mode 100644 index 0000000000..22e389d856 --- /dev/null +++ b/test/services/bill-runs/setup/no-licences.service.test.js @@ -0,0 +1,34 @@ +'use strict' + +// Test framework dependencies +const Lab = require('@hapi/lab') +const Code = require('@hapi/code') + +const { describe, it, beforeEach } = exports.lab = Lab.script() +const { expect } = Code + +// Test helpers +const RegionHelper = require('../../../support/helpers/region.helper.js') +const SessionHelper = require('../../../support/helpers/session.helper.js') + +// Thing under test +const NoLicencesService = require('../../../../app/services/bill-runs/setup/no-licences.service.js') + +describe('Bill Runs Setup No Licences service', () => { + let sessionId + + describe('when called with a valid session id', () => { + beforeEach(async () => { + const region = RegionHelper.select(RegionHelper.TEST_REGION_INDEX) + const session = await SessionHelper.add({ data: { region: region.id } }) + + sessionId = session.id + }) + + it('returns the regions display name', async () => { + const result = await NoLicencesService.go(sessionId) + + expect(result).to.equal('Test Region') + }) + }) +}) From e1f57678b79b8d1dfbca954ab21ed1f4e846ad52 Mon Sep 17 00:00:00 2001 From: Jason Claxton Date: Thu, 29 Aug 2024 17:51:46 +0100 Subject: [PATCH 11/25] Fix submit region service tests --- .../bill-runs/setup/submit-region.service.test.js | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/test/services/bill-runs/setup/submit-region.service.test.js b/test/services/bill-runs/setup/submit-region.service.test.js index 9c14d197ae..1d877e9ba7 100644 --- a/test/services/bill-runs/setup/submit-region.service.test.js +++ b/test/services/bill-runs/setup/submit-region.service.test.js @@ -80,17 +80,13 @@ describe('Bill Runs Setup Submit Region service', () => { session = await SessionHelper.add({ data: { type: 'two_part_supplementary' } }) }) - it('returns page data needed to re-render the view including the error', async () => { + it('saves the submitted value and returns an object confirming setup is not complete', async () => { const result = await SubmitRegionService.go(session.id, payload) - expect(result).to.equal({ - sessionId: session.id, - regions, - selectedRegion: payload.region, - error: { - text: 'Currently you can progress no further for a two-part tariff supplementary bill run' - } - }) + const refreshedSession = await session.$query() + + expect(refreshedSession.region).to.equal(region.id) + expect(result.setupComplete).to.be.false() }) }) }) From 3f2857107da2405673058a194505f278495296ae Mon Sep 17 00:00:00 2001 From: Jason Claxton Date: Thu, 29 Aug 2024 18:15:27 +0100 Subject: [PATCH 12/25] Add and fix submit year service tests The test I have added is a temporary one that will be removed once there is a two-part tariff supplementary process built. --- .../setup/submit-year.service.test.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/test/services/bill-runs/setup/submit-year.service.test.js b/test/services/bill-runs/setup/submit-year.service.test.js index 8d16cf37fd..bad632df6c 100644 --- a/test/services/bill-runs/setup/submit-year.service.test.js +++ b/test/services/bill-runs/setup/submit-year.service.test.js @@ -56,6 +56,24 @@ describe('Bill Runs Setup Submit Year service', () => { expect(result.setupComplete).to.be.false() }) }) + + describe('and the type is two-part tariff supplementary', () => { + beforeEach(async () => { + payload = { + year: '2023' + } + session = await SessionHelper.add({ data: { type: 'two_part_supplementary' } }) + }) + + it('saves the submitted value and returns an object to redirect the user to the Bill Runs page', async () => { + const result = await SubmitYearService.go(session.id, payload) + + const refreshedSession = await session.$query() + + expect(refreshedSession.year).to.equal('2023') + expect(result.goBackToBillRuns).to.be.true() + }) + }) }) describe('with an invalid payload', () => { @@ -68,6 +86,7 @@ describe('Bill Runs Setup Submit Year service', () => { const result = await SubmitYearService.go(session.id, payload) expect(result).to.equal({ + financialYearsData: [], sessionId: session.id, selectedYear: null, error: { From adb197dfcd9b7dca9902f849f9fe5e996e40faa3 Mon Sep 17 00:00:00 2001 From: Jason Claxton Date: Thu, 29 Aug 2024 18:21:52 +0100 Subject: [PATCH 13/25] Fix year service tests --- test/services/bill-runs/setup/year.service.test.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/services/bill-runs/setup/year.service.test.js b/test/services/bill-runs/setup/year.service.test.js index 67c1792412..5d0e114a43 100644 --- a/test/services/bill-runs/setup/year.service.test.js +++ b/test/services/bill-runs/setup/year.service.test.js @@ -25,6 +25,7 @@ describe('Bill Runs Setup Year service', () => { const result = await YearService.go(session.id) expect(result).to.equal({ + financialYearsData: [], sessionId: session.id, selectedYear: 2024 }) From 34c7b9896c853a41b1efa27802d5e61c3771736e Mon Sep 17 00:00:00 2001 From: Jason Claxton Date: Thu, 29 Aug 2024 18:26:56 +0100 Subject: [PATCH 14/25] Tidy up --- test/services/bill-runs/setup/submit-year.service.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/services/bill-runs/setup/submit-year.service.test.js b/test/services/bill-runs/setup/submit-year.service.test.js index bad632df6c..cbc78a0986 100644 --- a/test/services/bill-runs/setup/submit-year.service.test.js +++ b/test/services/bill-runs/setup/submit-year.service.test.js @@ -57,7 +57,7 @@ describe('Bill Runs Setup Submit Year service', () => { }) }) - describe('and the type is two-part tariff supplementary', () => { + describe('and the type is two-part tariff supplementary', () => { beforeEach(async () => { payload = { year: '2023' From f21d951d4db77ebec65ef4a3a218a80817bd08a9 Mon Sep 17 00:00:00 2001 From: Jason Claxton Date: Thu, 29 Aug 2024 18:36:46 +0100 Subject: [PATCH 15/25] Appease SonarCloud --- .../bill-runs/setup/year.presenter.js | 24 ++++--------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/app/presenters/bill-runs/setup/year.presenter.js b/app/presenters/bill-runs/setup/year.presenter.js index b1588508e6..0d241aa848 100644 --- a/app/presenters/bill-runs/setup/year.presenter.js +++ b/app/presenters/bill-runs/setup/year.presenter.js @@ -36,26 +36,10 @@ async function go (session) { function _annualFinancialYearsData (selectedYear) { return [ - { - text: '2023 to 2024', - value: 2024, - checked: selectedYear === '2024' - }, - { - text: '2022 to 2023', - value: 2023, - checked: selectedYear === '2023' - }, - { - text: '2021 to 2022', - value: 2022, - checked: selectedYear === '2022' - }, - { - text: '2020 to 2021', - value: 2021, - checked: selectedYear === '2021' - } + { text: '2023 to 2024', value: 2024, checked: selectedYear === '2024' }, + { text: '2022 to 2023', value: 2023, checked: selectedYear === '2023' }, + { text: '2021 to 2022', value: 2022, checked: selectedYear === '2022' }, + { text: '2020 to 2021', value: 2021, checked: selectedYear === '2021' } ] } From e842cf2dea58d93fde3756251052190ccef76a7f Mon Sep 17 00:00:00 2001 From: Jason Claxton Date: Fri, 30 Aug 2024 12:02:56 +0100 Subject: [PATCH 16/25] Convert `financialYearEnd` values to strings The values that come out of the view when submitted will always be strings regardless if they are coded as numbers. Therefore we've decided that it will make things cleaner to convert the numeric values to strings when they are pulled out of the database. --- app/presenters/bill-runs/setup/year.presenter.js | 12 ++++++------ .../bill-runs/setup/year.presenter.test.js | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/app/presenters/bill-runs/setup/year.presenter.js b/app/presenters/bill-runs/setup/year.presenter.js index 0d241aa848..0a809a7c73 100644 --- a/app/presenters/bill-runs/setup/year.presenter.js +++ b/app/presenters/bill-runs/setup/year.presenter.js @@ -2,7 +2,7 @@ /** * Formats data for the `/bill-runs/setup/{sessionId}/year` page - * @module RegionPresenter + * @module YearPresenter */ const LicenceSupplementaryYearModel = require('../../../models/licence-supplementary-year.model.js') @@ -36,10 +36,10 @@ async function go (session) { function _annualFinancialYearsData (selectedYear) { return [ - { text: '2023 to 2024', value: 2024, checked: selectedYear === '2024' }, - { text: '2022 to 2023', value: 2023, checked: selectedYear === '2023' }, - { text: '2021 to 2022', value: 2022, checked: selectedYear === '2022' }, - { text: '2020 to 2021', value: 2021, checked: selectedYear === '2021' } + { text: '2023 to 2024', value: '2024', checked: selectedYear === '2024' }, + { text: '2022 to 2023', value: '2023', checked: selectedYear === '2023' }, + { text: '2021 to 2022', value: '2022', checked: selectedYear === '2022' }, + { text: '2020 to 2021', value: '2021', checked: selectedYear === '2021' } ] } @@ -51,7 +51,7 @@ async function _supplementaryFinancialYearsData (regionId, selectedYear) { tptSupplementaryYears.forEach((tptSupplementaryYear) => { supplementaryFinancialYearsData.push({ text: `${tptSupplementaryYear.financialYearEnd - 1} to ${tptSupplementaryYear.financialYearEnd}`, - value: tptSupplementaryYear.financialYearEnd, + value: tptSupplementaryYear.financialYearEnd.toString(), checked: selectedYear === tptSupplementaryYear.financialYearEnd.toString() }) }) diff --git a/test/presenters/bill-runs/setup/year.presenter.test.js b/test/presenters/bill-runs/setup/year.presenter.test.js index d6ed55eacf..554334b93d 100644 --- a/test/presenters/bill-runs/setup/year.presenter.test.js +++ b/test/presenters/bill-runs/setup/year.presenter.test.js @@ -76,7 +76,7 @@ describe('Bill Runs Setup Year presenter', () => { expect(result).to.equal({ financialYearsData: [{ text: '2021 to 2022', - value: 2022, + value: '2022', checked: false }], sessionId: '98ad3a1f-8e4f-490a-be05-0aece6755466', @@ -96,7 +96,7 @@ describe('Bill Runs Setup Year presenter', () => { expect(result).to.equal({ financialYearsData: [{ text: '2021 to 2022', - value: 2022, + value: '2022', checked: true }], sessionId: '98ad3a1f-8e4f-490a-be05-0aece6755466', @@ -111,22 +111,22 @@ function _financialYearsData (selectedYear) { return [ { text: '2023 to 2024', - value: 2024, + value: '2024', checked: selectedYear === '2024' }, { text: '2022 to 2023', - value: 2023, + value: '2023', checked: selectedYear === '2023' }, { text: '2021 to 2022', - value: 2022, + value: '2022', checked: selectedYear === '2022' }, { text: '2020 to 2021', - value: 2021, + value: '2021', checked: selectedYear === '2021' } ] From f26012a2269b2b599ef0ac9cec7f403e1b8f893d Mon Sep 17 00:00:00 2001 From: Jason Claxton <30830544+Jozzey@users.noreply.github.com> Date: Fri, 30 Aug 2024 12:34:42 +0100 Subject: [PATCH 17/25] Make function a bit easier to read Co-authored-by: Becky Ransome <91424856+Beckyrose200@users.noreply.github.com> --- app/presenters/bill-runs/setup/year.presenter.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app/presenters/bill-runs/setup/year.presenter.js b/app/presenters/bill-runs/setup/year.presenter.js index 0a809a7c73..4ea6912e1a 100644 --- a/app/presenters/bill-runs/setup/year.presenter.js +++ b/app/presenters/bill-runs/setup/year.presenter.js @@ -49,6 +49,15 @@ async function _supplementaryFinancialYearsData (regionId, selectedYear) { if (tptSupplementaryYears.length > 0) { tptSupplementaryYears.forEach((tptSupplementaryYear) => { + const { financialYearEnd } = tptSupplementaryYear + + supplementaryFinancialYearsData.push({ + text: `${financialYearEnd - 1} to ${financialYearEnd}`, + value: financialYearEnd.toString(), + checked: selectedYear === financialYearEnd.toString() + }) + }) + } supplementaryFinancialYearsData.push({ text: `${tptSupplementaryYear.financialYearEnd - 1} to ${tptSupplementaryYear.financialYearEnd}`, value: tptSupplementaryYear.financialYearEnd.toString(), From e258d9b76ce6efaa8f3a02d8784b37ff581a1a9f Mon Sep 17 00:00:00 2001 From: Jason Claxton Date: Fri, 30 Aug 2024 12:40:36 +0100 Subject: [PATCH 18/25] Fix "Commit suggestion" issues --- app/presenters/bill-runs/setup/year.presenter.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/app/presenters/bill-runs/setup/year.presenter.js b/app/presenters/bill-runs/setup/year.presenter.js index 4ea6912e1a..d7ab697ee2 100644 --- a/app/presenters/bill-runs/setup/year.presenter.js +++ b/app/presenters/bill-runs/setup/year.presenter.js @@ -58,13 +58,6 @@ async function _supplementaryFinancialYearsData (regionId, selectedYear) { }) }) } - supplementaryFinancialYearsData.push({ - text: `${tptSupplementaryYear.financialYearEnd - 1} to ${tptSupplementaryYear.financialYearEnd}`, - value: tptSupplementaryYear.financialYearEnd.toString(), - checked: selectedYear === tptSupplementaryYear.financialYearEnd.toString() - }) - }) - } return supplementaryFinancialYearsData } From acfb66b5e06a79c1374b892117989debe8501c03 Mon Sep 17 00:00:00 2001 From: Jason Claxton Date: Mon, 2 Sep 2024 12:16:34 +0100 Subject: [PATCH 19/25] Create new service to determine supplementary years --- .../bill-runs/setup/year.presenter.js | 55 ++++++++----------- ...tch-licence-supplementary-years.service.js | 29 ++++++++++ .../bill-runs/setup/submit-year.service.js | 7 ++- app/services/bill-runs/setup/year.service.js | 8 ++- 4 files changed, 65 insertions(+), 34 deletions(-) create mode 100644 app/services/bill-runs/setup/fetch-licence-supplementary-years.service.js diff --git a/app/presenters/bill-runs/setup/year.presenter.js b/app/presenters/bill-runs/setup/year.presenter.js index d7ab697ee2..6b73e53931 100644 --- a/app/presenters/bill-runs/setup/year.presenter.js +++ b/app/presenters/bill-runs/setup/year.presenter.js @@ -5,26 +5,27 @@ * @module YearPresenter */ -const LicenceSupplementaryYearModel = require('../../../models/licence-supplementary-year.model.js') - /** * Formats data for the `/bill-runs/setup/{sessionId}/year` page * + * @param {module:LicenceSupplementaryYearModel} licenceSupplementaryYears - An array of distinct `financialYearEnd` + * years flagged for supplementary billing for the selected region and bill run type * @param {module:SessionModel} session - The session instance to format * * @returns {object} - The data formatted for the view template */ -async function go (session) { +function go (licenceSupplementaryYears, session) { const selectedYear = session.year ? session.year : null let financialYearsData = [] + // Currently for Two-part tariff Annual the financial years are hardcoded. This is because the Annual billing process + // has not been available to be run for several years. Once caught up the annual two-part tariff will only be run for + // a single year and this temporary code can be removed. if (session.type === 'two_part_tariff') { - financialYearsData = _annualFinancialYearsData(selectedYear) - } - - if (session.type === 'two_part_supplementary') { - financialYearsData = await _supplementaryFinancialYearsData(session.region, selectedYear) + financialYearsData = _tptAnnualFinancialYearsData(selectedYear) + } else { + financialYearsData = _financialYearsData(licenceSupplementaryYears, selectedYear) } return { @@ -34,24 +35,14 @@ async function go (session) { } } -function _annualFinancialYearsData (selectedYear) { - return [ - { text: '2023 to 2024', value: '2024', checked: selectedYear === '2024' }, - { text: '2022 to 2023', value: '2023', checked: selectedYear === '2023' }, - { text: '2021 to 2022', value: '2022', checked: selectedYear === '2022' }, - { text: '2020 to 2021', value: '2021', checked: selectedYear === '2021' } - ] -} - -async function _supplementaryFinancialYearsData (regionId, selectedYear) { - const supplementaryFinancialYearsData = [] - const tptSupplementaryYears = await _tptSupplementaryYears(regionId) +function _financialYearsData (licenceSupplementaryYears, selectedYear) { + const financialYearsData = [] - if (tptSupplementaryYears.length > 0) { - tptSupplementaryYears.forEach((tptSupplementaryYear) => { - const { financialYearEnd } = tptSupplementaryYear + if (licenceSupplementaryYears.length > 0) { + licenceSupplementaryYears.forEach((licenceSupplementaryYear) => { + const { financialYearEnd } = licenceSupplementaryYear - supplementaryFinancialYearsData.push({ + financialYearsData.push({ text: `${financialYearEnd - 1} to ${financialYearEnd}`, value: financialYearEnd.toString(), checked: selectedYear === financialYearEnd.toString() @@ -59,16 +50,16 @@ async function _supplementaryFinancialYearsData (regionId, selectedYear) { }) } - return supplementaryFinancialYearsData + return financialYearsData } -async function _tptSupplementaryYears (regionId) { - return LicenceSupplementaryYearModel.query() - .distinct('financialYearEnd') - .innerJoinRelated('licence') - .where('twoPartTariff', true) - .where('regionId', regionId) - .orderBy('financialYearEnd', 'desc') +function _tptAnnualFinancialYearsData (selectedYear) { + return [ + { text: '2023 to 2024', value: '2024', checked: selectedYear === '2024' }, + { text: '2022 to 2023', value: '2023', checked: selectedYear === '2023' }, + { text: '2021 to 2022', value: '2022', checked: selectedYear === '2022' }, + { text: '2020 to 2021', value: '2021', checked: selectedYear === '2021' } + ] } module.exports = { diff --git a/app/services/bill-runs/setup/fetch-licence-supplementary-years.service.js b/app/services/bill-runs/setup/fetch-licence-supplementary-years.service.js new file mode 100644 index 0000000000..32dd2e8e4c --- /dev/null +++ b/app/services/bill-runs/setup/fetch-licence-supplementary-years.service.js @@ -0,0 +1,29 @@ +'use strict' + +/** + * Fetches the years that have licences flagged for supplementary billing for the given region + * @module FetchLicenceSupplementaryYearsService + */ + +const LicenceSupplementaryYearModel = require('../../../models/licence-supplementary-year.model.js') + +/** + * Fetches the years that have licences flagged for supplementary billing for the given region + * + * @param {string} regionId - The UUID for the region + * @param {boolean} twoPartTariff - Whether the supplementary billing is for two-part tariff + * + * @returns {Promise} An array of distinct years flagged for supplementary billing in descending order + */ +async function go (regionId, twoPartTariff) { + return LicenceSupplementaryYearModel.query() + .distinct('financialYearEnd') + .innerJoinRelated('licence') + .where('twoPartTariff', twoPartTariff) + .where('regionId', regionId) + .orderBy('financialYearEnd', 'desc') +} + +module.exports = { + go +} diff --git a/app/services/bill-runs/setup/submit-year.service.js b/app/services/bill-runs/setup/submit-year.service.js index d75e7c1f42..4f4a83f52a 100644 --- a/app/services/bill-runs/setup/submit-year.service.js +++ b/app/services/bill-runs/setup/submit-year.service.js @@ -5,6 +5,7 @@ * @module SubmitYearService */ +const FetchLicenceSupplementaryYearsService = require('./fetch-licence-supplementary-years.service.js') const SessionModel = require('../../../models/session.model.js') const YearPresenter = require('../../../presenters/bill-runs/setup/year.presenter.js') const YearValidator = require('../../../validators/bill-runs/setup/year.validator.js') @@ -46,7 +47,11 @@ async function go (sessionId, payload) { return { setupComplete: ['2024', '2023'].includes(session.year) } } - const formattedData = await YearPresenter.go(session) + const regionId = session.region + const twoPartTariff = session.type.startsWith('two_part') + const licenceSupplementaryYears = await FetchLicenceSupplementaryYearsService.go(regionId, twoPartTariff) + + const formattedData = YearPresenter.go(licenceSupplementaryYears, session) return { error: validationResult, diff --git a/app/services/bill-runs/setup/year.service.js b/app/services/bill-runs/setup/year.service.js index 1be57e3e1e..7726db3256 100644 --- a/app/services/bill-runs/setup/year.service.js +++ b/app/services/bill-runs/setup/year.service.js @@ -5,6 +5,7 @@ * @module YearService */ +const FetchLicenceSupplementaryYearsService = require('./fetch-licence-supplementary-years.service.js') const YearPresenter = require('../../../presenters/bill-runs/setup/year.presenter.js') const SessionModel = require('../../../models/session.model.js') @@ -20,7 +21,12 @@ const SessionModel = require('../../../models/session.model.js') */ async function go (sessionId) { const session = await SessionModel.query().findById(sessionId) - const formattedData = await YearPresenter.go(session) + + const regionId = session.region + const twoPartTariff = session.type.startsWith('two_part') + const licenceSupplementaryYears = await FetchLicenceSupplementaryYearsService.go(regionId, twoPartTariff) + + const formattedData = YearPresenter.go(licenceSupplementaryYears, session) return { ...formattedData From 22a27ca68b220eba52d1f40407b22f0bfce389f3 Mon Sep 17 00:00:00 2001 From: Jason Claxton Date: Mon, 2 Sep 2024 16:14:27 +0100 Subject: [PATCH 20/25] Update year presenter tests --- .../bill-runs/setup/year.presenter.js | 12 +-- .../bill-runs/setup/year.presenter.test.js | 81 ++++++++++--------- 2 files changed, 50 insertions(+), 43 deletions(-) diff --git a/app/presenters/bill-runs/setup/year.presenter.js b/app/presenters/bill-runs/setup/year.presenter.js index 6b73e53931..19eb1cb7c3 100644 --- a/app/presenters/bill-runs/setup/year.presenter.js +++ b/app/presenters/bill-runs/setup/year.presenter.js @@ -44,8 +44,8 @@ function _financialYearsData (licenceSupplementaryYears, selectedYear) { financialYearsData.push({ text: `${financialYearEnd - 1} to ${financialYearEnd}`, - value: financialYearEnd.toString(), - checked: selectedYear === financialYearEnd.toString() + value: financialYearEnd, + checked: parseInt(selectedYear) === financialYearEnd }) }) } @@ -55,10 +55,10 @@ function _financialYearsData (licenceSupplementaryYears, selectedYear) { function _tptAnnualFinancialYearsData (selectedYear) { return [ - { text: '2023 to 2024', value: '2024', checked: selectedYear === '2024' }, - { text: '2022 to 2023', value: '2023', checked: selectedYear === '2023' }, - { text: '2021 to 2022', value: '2022', checked: selectedYear === '2022' }, - { text: '2020 to 2021', value: '2021', checked: selectedYear === '2021' } + { text: '2023 to 2024', value: 2024, checked: selectedYear === '2024' }, + { text: '2022 to 2023', value: 2023, checked: selectedYear === '2023' }, + { text: '2021 to 2022', value: 2022, checked: selectedYear === '2022' }, + { text: '2020 to 2021', value: 2021, checked: selectedYear === '2021' } ] } diff --git a/test/presenters/bill-runs/setup/year.presenter.test.js b/test/presenters/bill-runs/setup/year.presenter.test.js index 554334b93d..469542c37b 100644 --- a/test/presenters/bill-runs/setup/year.presenter.test.js +++ b/test/presenters/bill-runs/setup/year.presenter.test.js @@ -7,31 +7,40 @@ const Code = require('@hapi/code') const { describe, it, beforeEach } = exports.lab = Lab.script() const { expect } = Code -// Test helpers -const LicenceHelper = require('../../../support/helpers/licence.helper.js') -const LicenceSupplementaryYearHelper = require('../../../support/helpers/licence-supplementary-year.helper.js') - // Thing under test const YearPresenter = require('../../../../app/presenters/bill-runs/setup/year.presenter.js') describe('Bill Runs Setup Year presenter', () => { + let licenceSupplementaryYears let session - describe('when provided with a bill run setup session record for two-part tariff annual', () => { - beforeEach(() => { + describe('when provided with a bill run setup session record for two-part tariff supplementary', () => { + beforeEach(async () => { + licenceSupplementaryYears = [{ financialYearEnd: 2024 }, { financialYearEnd: 2022 }] session = { id: '98ad3a1f-8e4f-490a-be05-0aece6755466', data: {}, - type: 'two_part_tariff' + type: 'two_part_supplementary' } }) describe('where the user has not previously selected a financial year', () => { - it('correctly presents the data', async () => { - const result = await YearPresenter.go(session) + it('correctly presents the data', () => { + const result = YearPresenter.go(licenceSupplementaryYears, session) expect(result).to.equal({ - financialYearsData: _financialYearsData(null), + financialYearsData: [ + { + text: '2023 to 2024', + value: 2024, + checked: false + }, + { + text: '2021 to 2022', + value: 2022, + checked: false + } + ], sessionId: '98ad3a1f-8e4f-490a-be05-0aece6755466', selectedYear: null }) @@ -43,11 +52,22 @@ describe('Bill Runs Setup Year presenter', () => { session.year = '2022' }) - it('correctly presents the data', async () => { - const result = await YearPresenter.go(session) + it('correctly presents the data', () => { + const result = YearPresenter.go(licenceSupplementaryYears, session) expect(result).to.equal({ - financialYearsData: _financialYearsData('2022'), + financialYearsData: [ + { + text: '2023 to 2024', + value: 2024, + checked: false + }, + { + text: '2021 to 2022', + value: 2022, + checked: true + } + ], sessionId: '98ad3a1f-8e4f-490a-be05-0aece6755466', selectedYear: '2022' }) @@ -55,30 +75,21 @@ describe('Bill Runs Setup Year presenter', () => { }) }) - describe('when provided with a bill run setup session record for two-part tariff supplementary', () => { - beforeEach(async () => { - const { id: licenceId, regionId } = await LicenceHelper.add() - - await LicenceSupplementaryYearHelper.add({ licenceId, financialYearEnd: 2022, twoPartTariff: true }) - + describe('when provided with a bill run setup session record for two-part tariff annual', () => { + beforeEach(() => { session = { id: '98ad3a1f-8e4f-490a-be05-0aece6755466', data: {}, - region: regionId, - type: 'two_part_supplementary' + type: 'two_part_tariff' } }) describe('where the user has not previously selected a financial year', () => { it('correctly presents the data', async () => { - const result = await YearPresenter.go(session) + const result = YearPresenter.go(licenceSupplementaryYears, session) expect(result).to.equal({ - financialYearsData: [{ - text: '2021 to 2022', - value: '2022', - checked: false - }], + financialYearsData: _financialYearsData(null), sessionId: '98ad3a1f-8e4f-490a-be05-0aece6755466', selectedYear: null }) @@ -91,14 +102,10 @@ describe('Bill Runs Setup Year presenter', () => { }) it('correctly presents the data', async () => { - const result = await YearPresenter.go(session) + const result = YearPresenter.go(licenceSupplementaryYears, session) expect(result).to.equal({ - financialYearsData: [{ - text: '2021 to 2022', - value: '2022', - checked: true - }], + financialYearsData: _financialYearsData('2022'), sessionId: '98ad3a1f-8e4f-490a-be05-0aece6755466', selectedYear: '2022' }) @@ -111,22 +118,22 @@ function _financialYearsData (selectedYear) { return [ { text: '2023 to 2024', - value: '2024', + value: 2024, checked: selectedYear === '2024' }, { text: '2022 to 2023', - value: '2023', + value: 2023, checked: selectedYear === '2023' }, { text: '2021 to 2022', - value: '2022', + value: 2022, checked: selectedYear === '2022' }, { text: '2020 to 2021', - value: '2021', + value: 2021, checked: selectedYear === '2021' } ] From d1eb9f229d13d97cc1090367de22665c70e4cc72 Mon Sep 17 00:00:00 2001 From: Jason Claxton Date: Mon, 2 Sep 2024 16:16:30 +0100 Subject: [PATCH 21/25] Tidy up --- test/presenters/bill-runs/setup/year.presenter.test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/presenters/bill-runs/setup/year.presenter.test.js b/test/presenters/bill-runs/setup/year.presenter.test.js index 469542c37b..381b4776ae 100644 --- a/test/presenters/bill-runs/setup/year.presenter.test.js +++ b/test/presenters/bill-runs/setup/year.presenter.test.js @@ -15,7 +15,7 @@ describe('Bill Runs Setup Year presenter', () => { let session describe('when provided with a bill run setup session record for two-part tariff supplementary', () => { - beforeEach(async () => { + beforeEach(() => { licenceSupplementaryYears = [{ financialYearEnd: 2024 }, { financialYearEnd: 2022 }] session = { id: '98ad3a1f-8e4f-490a-be05-0aece6755466', @@ -85,7 +85,7 @@ describe('Bill Runs Setup Year presenter', () => { }) describe('where the user has not previously selected a financial year', () => { - it('correctly presents the data', async () => { + it('correctly presents the data', () => { const result = YearPresenter.go(licenceSupplementaryYears, session) expect(result).to.equal({ @@ -101,7 +101,7 @@ describe('Bill Runs Setup Year presenter', () => { session.year = '2022' }) - it('correctly presents the data', async () => { + it('correctly presents the data', () => { const result = YearPresenter.go(licenceSupplementaryYears, session) expect(result).to.equal({ From 7ce5ce3bc91ba78104b8a3a53cb48929170088b1 Mon Sep 17 00:00:00 2001 From: Jason Claxton Date: Mon, 2 Sep 2024 17:00:00 +0100 Subject: [PATCH 22/25] Create unit tests for new service --- ...icence-supplementary-years.service.test.js | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 test/services/bill-runs/setup/fetch-licence-supplementary-years.service.test.js diff --git a/test/services/bill-runs/setup/fetch-licence-supplementary-years.service.test.js b/test/services/bill-runs/setup/fetch-licence-supplementary-years.service.test.js new file mode 100644 index 0000000000..0e0371eea3 --- /dev/null +++ b/test/services/bill-runs/setup/fetch-licence-supplementary-years.service.test.js @@ -0,0 +1,56 @@ +'use strict' + +// Test framework dependencies +const Lab = require('@hapi/lab') +const Code = require('@hapi/code') + +const { describe, it, beforeEach } = exports.lab = Lab.script() +const { expect } = Code + +// Test helpers +const LicenceHelper = require('../../../support/helpers/licence.helper.js') +const LicenceSupplementaryYearHelper = require('../../../support/helpers/licence-supplementary-year.helper.js') + +// Thing under test +const LicenceSupplementaryYearModel = require('../../../../app/services/bill-runs/setup/fetch-licence-supplementary-years.service.js') + +describe('Fetch Licence Supplementary Years service', () => { + let regionId + let twoPartTariff + + describe('when provided with data that will return years selected for supplementary billing', () => { + beforeEach(async () => { + const licence = await LicenceHelper.add() + + regionId = licence.regionId + twoPartTariff = true + + await LicenceSupplementaryYearHelper.add({ licenceId: licence.id, financialYearEnd: 2023, twoPartTariff: true }) + await LicenceSupplementaryYearHelper.add({ licenceId: licence.id, financialYearEnd: 2024, twoPartTariff: true }) + await LicenceSupplementaryYearHelper.add({ licenceId: licence.id, financialYearEnd: 2022, twoPartTariff: true }) + }) + + it('returns an array of the years selected for supplementary billing', async () => { + const result = await LicenceSupplementaryYearModel.go(regionId, twoPartTariff) + + expect(result).to.equal([{ financialYearEnd: 2024 }, { financialYearEnd: 2023 }, { financialYearEnd: 2022 }]) + }) + }) + + describe('when provided with data that will not return any years for supplementary billing', () => { + beforeEach(async () => { + const licence = await LicenceHelper.add() + + regionId = licence.regionId + twoPartTariff = false + + await LicenceSupplementaryYearHelper.add({ licenceId: licence.id, financialYearEnd: 2022, twoPartTariff: true }) + }) + + it('returns an empty array', async () => { + const result = await LicenceSupplementaryYearModel.go(regionId, twoPartTariff) + + expect(result).to.equal([]) + }) + }) +}) From 82d0c45c6aa4a060060b02a52aee0317576b0822 Mon Sep 17 00:00:00 2001 From: Jason Claxton Date: Mon, 2 Sep 2024 17:11:25 +0100 Subject: [PATCH 23/25] Fix year service tests --- test/services/bill-runs/setup/year.service.test.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/test/services/bill-runs/setup/year.service.test.js b/test/services/bill-runs/setup/year.service.test.js index 5d0e114a43..9e41993373 100644 --- a/test/services/bill-runs/setup/year.service.test.js +++ b/test/services/bill-runs/setup/year.service.test.js @@ -3,6 +3,7 @@ // Test framework dependencies const Lab = require('@hapi/lab') const Code = require('@hapi/code') +const Sinon = require('sinon') const { describe, it, beforeEach } = exports.lab = Lab.script() const { expect } = Code @@ -10,6 +11,9 @@ const { expect } = Code // Test helpers const SessionHelper = require('../../../support/helpers/session.helper.js') +// Things we need to stub +const FetchLicenceSupplementaryYearsService = require('../../../../app/services/bill-runs/setup/fetch-licence-supplementary-years.service.js') + // Thing under test const YearService = require('../../../../app/services/bill-runs/setup/year.service.js') @@ -17,7 +21,9 @@ describe('Bill Runs Setup Year service', () => { let session beforeEach(async () => { - session = await SessionHelper.add({ data: { year: 2024 } }) + session = await SessionHelper.add({ data: { type: 'two_part_supplementary', year: 2024 } }) + + Sinon.stub(FetchLicenceSupplementaryYearsService, 'go').resolves([{ financialYearEnd: 2024 }]) }) describe('when called', () => { @@ -25,7 +31,7 @@ describe('Bill Runs Setup Year service', () => { const result = await YearService.go(session.id) expect(result).to.equal({ - financialYearsData: [], + financialYearsData: [{ text: '2023 to 2024', value: 2024, checked: true }], sessionId: session.id, selectedYear: 2024 }) From c96568abfcb7820f7bb3b7e949c96ca6fd8a5eb5 Mon Sep 17 00:00:00 2001 From: Jason Claxton Date: Mon, 2 Sep 2024 18:09:32 +0100 Subject: [PATCH 24/25] Fix year service tests --- .../bill-runs/setup/submit-year.service.test.js | 14 +++++++++++++- test/services/bill-runs/setup/year.service.test.js | 9 +++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/test/services/bill-runs/setup/submit-year.service.test.js b/test/services/bill-runs/setup/submit-year.service.test.js index cbc78a0986..cb32dcb07b 100644 --- a/test/services/bill-runs/setup/submit-year.service.test.js +++ b/test/services/bill-runs/setup/submit-year.service.test.js @@ -3,6 +3,7 @@ // Test framework dependencies const Lab = require('@hapi/lab') const Code = require('@hapi/code') +const Sinon = require('sinon') const { describe, it, beforeEach } = exports.lab = Lab.script() const { expect } = Code @@ -10,6 +11,9 @@ const { expect } = Code // Test helpers const SessionHelper = require('../../../support/helpers/session.helper.js') +// Things we need to stub +const FetchLicenceSupplementaryYearsService = require('../../../../app/services/bill-runs/setup/fetch-licence-supplementary-years.service.js') + // Thing under test const SubmitYearService = require('../../../../app/services/bill-runs/setup/submit-year.service.js') @@ -78,15 +82,23 @@ describe('Bill Runs Setup Submit Year service', () => { describe('with an invalid payload', () => { describe('because the user has not selected anything', () => { + const regionId = 'cff057a0-f3a7-4ae6-bc2b-01183e40fd05' + + let yearsStub + beforeEach(async () => { + session = await SessionHelper.add({ data: { region: regionId, type: 'two_part_supplementary' } }) payload = {} + yearsStub = Sinon.stub(FetchLicenceSupplementaryYearsService, 'go').resolves([{ financialYearEnd: 2024 }]) }) it('returns page data needed to re-render the view including the validation error', async () => { const result = await SubmitYearService.go(session.id, payload) + expect(yearsStub.calledWith(regionId, true)).to.be.true() + expect(result).to.equal({ - financialYearsData: [], + financialYearsData: [{ text: '2023 to 2024', value: 2024, checked: false }], sessionId: session.id, selectedYear: null, error: { diff --git a/test/services/bill-runs/setup/year.service.test.js b/test/services/bill-runs/setup/year.service.test.js index 9e41993373..a92e9bd92d 100644 --- a/test/services/bill-runs/setup/year.service.test.js +++ b/test/services/bill-runs/setup/year.service.test.js @@ -18,18 +18,23 @@ const FetchLicenceSupplementaryYearsService = require('../../../../app/services/ const YearService = require('../../../../app/services/bill-runs/setup/year.service.js') describe('Bill Runs Setup Year service', () => { + const regionId = 'cff057a0-f3a7-4ae6-bc2b-01183e40fd05' + let session + let yearsStub beforeEach(async () => { - session = await SessionHelper.add({ data: { type: 'two_part_supplementary', year: 2024 } }) + session = await SessionHelper.add({ data: { region: regionId, type: 'two_part_supplementary', year: 2024 } }) - Sinon.stub(FetchLicenceSupplementaryYearsService, 'go').resolves([{ financialYearEnd: 2024 }]) + yearsStub = Sinon.stub(FetchLicenceSupplementaryYearsService, 'go').resolves([{ financialYearEnd: 2024 }]) }) describe('when called', () => { it('returns page data for the view', async () => { const result = await YearService.go(session.id) + expect(yearsStub.calledWith(regionId, true)).to.be.true() + expect(result).to.equal({ financialYearsData: [{ text: '2023 to 2024', value: 2024, checked: true }], sessionId: session.id, From ae87adb7d84562a0cf1682cecd7238981fe46707 Mon Sep 17 00:00:00 2001 From: Jason Claxton Date: Wed, 4 Sep 2024 16:26:29 +0100 Subject: [PATCH 25/25] Update as per PR comments --- app/services/bill-runs/setup/submit-year.service.js | 4 ++-- app/services/bill-runs/setup/year.service.js | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/services/bill-runs/setup/submit-year.service.js b/app/services/bill-runs/setup/submit-year.service.js index 4f4a83f52a..cd05fa24b3 100644 --- a/app/services/bill-runs/setup/submit-year.service.js +++ b/app/services/bill-runs/setup/submit-year.service.js @@ -48,8 +48,8 @@ async function go (sessionId, payload) { } const regionId = session.region - const twoPartTariff = session.type.startsWith('two_part') - const licenceSupplementaryYears = await FetchLicenceSupplementaryYearsService.go(regionId, twoPartTariff) + const twoPartTariffSupplementary = session.type === 'two_part_supplementary' + const licenceSupplementaryYears = await FetchLicenceSupplementaryYearsService.go(regionId, twoPartTariffSupplementary) const formattedData = YearPresenter.go(licenceSupplementaryYears, session) diff --git a/app/services/bill-runs/setup/year.service.js b/app/services/bill-runs/setup/year.service.js index 7726db3256..2250246213 100644 --- a/app/services/bill-runs/setup/year.service.js +++ b/app/services/bill-runs/setup/year.service.js @@ -6,8 +6,8 @@ */ const FetchLicenceSupplementaryYearsService = require('./fetch-licence-supplementary-years.service.js') -const YearPresenter = require('../../../presenters/bill-runs/setup/year.presenter.js') const SessionModel = require('../../../models/session.model.js') +const YearPresenter = require('../../../presenters/bill-runs/setup/year.presenter.js') /** * Orchestrates fetching and presenting the data for `/bill-runs/setup/{sessionId}/year` page @@ -23,8 +23,8 @@ async function go (sessionId) { const session = await SessionModel.query().findById(sessionId) const regionId = session.region - const twoPartTariff = session.type.startsWith('two_part') - const licenceSupplementaryYears = await FetchLicenceSupplementaryYearsService.go(regionId, twoPartTariff) + const twoPartTariffSupplementary = session.type === 'two_part_supplementary' + const licenceSupplementaryYears = await FetchLicenceSupplementaryYearsService.go(regionId, twoPartTariffSupplementary) const formattedData = YearPresenter.go(licenceSupplementaryYears, session)