Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migrate abstraction details view page #1379

Draft
wants to merge 27 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
2456045
Migrate abstraction details view page
rvsiyad Oct 3, 2024
4157d42
Merge branch 'main' into migrate-abstraction-details-view-page
rvsiyad Oct 7, 2024
bc944eb
Merge branch 'main' into migrate-abstraction-details-view-page
rvsiyad Oct 7, 2024
7f203c8
Merge branch 'main' into migrate-abstraction-details-view-page
rvsiyad Oct 11, 2024
040eb24
Merge branch 'main' into migrate-abstraction-details-view-page
rvsiyad Oct 14, 2024
f24d855
Add route for viewLicencePurposes
rvsiyad Oct 14, 2024
e024127
Add viewLicencePurposes to licence controller
rvsiyad Oct 14, 2024
7ef3945
Add view licence purposes service
rvsiyad Oct 14, 2024
8b09103
Add fetch licence purpose service
rvsiyad Oct 14, 2024
b2b701f
Add view licence purposes presenter
rvsiyad Oct 14, 2024
4d5a8d5
Add purposes view
rvsiyad Oct 14, 2024
e1033c3
Remove `billing` auth for licence purposes route
rvsiyad Oct 16, 2024
526fb16
Add JSDoc for view licence purposes presenter
rvsiyad Oct 16, 2024
21c762e
Remove extra comma after purposeDescription property in _formatLicenc…
rvsiyad Oct 16, 2024
a8e6498
WIP purposes view
rvsiyad Oct 16, 2024
b611fa2
Merge branch 'main' into migrate-abstraction-details-view-page
rvsiyad Oct 16, 2024
c9e7829
Update abstractionPoint macro to use details component when a purpose…
rvsiyad Oct 18, 2024
51c7c13
Add `(Instantaneous Quantity)` to abstraction amounts per second
rvsiyad Oct 18, 2024
3ff9e0b
Add orderBy for licence purposes to match legacy page
rvsiyad Oct 18, 2024
06dfdd1
Remove console.log()
rvsiyad Oct 18, 2024
bdc83d4
Merge branch 'main' into migrate-abstraction-details-view-page
rvsiyad Oct 18, 2024
ddc1ad9
Add test for licence purposes to licence controller test
rvsiyad Oct 18, 2024
a77f9c9
Merge branch 'migrate-abstraction-details-view-page' of https://githu…
rvsiyad Oct 18, 2024
0cc7fad
Add test for fetch licence purposes service
rvsiyad Oct 18, 2024
7ae6179
Add test for view licence purposes presenter
rvsiyad Oct 18, 2024
34d65b3
Add test for view licence purposes service
rvsiyad Oct 18, 2024
1239dbc
Merge branch 'main' into migrate-abstraction-details-view-page
rvsiyad Oct 21, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions app/controllers/licences.controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ const ViewLicenceCommunicationsService = require('../services/licences/view-lice
const ViewLicenceContactDetailsService = require('../services/licences/view-licence-contact-details.service.js')
const ViewLicenceContactsService = require('../services/licences/view-licence-contacts.service.js')
const ViewLicenceHistoryService = require('../services/licences/view-licence-history.service.js')
const ViewLicencePurposesService = require('../services/licences/view-licence-purposes.service.js')
const ViewLicenceReturnsService = require('../services/licences/view-licence-returns.service.js')
const ViewLicenceSetUpService = require('../services/licences/view-licence-set-up.service.js')
const ViewLicenceSummaryService = require('../services/licences/view-licence-summary.service.js')
Expand Down Expand Up @@ -122,6 +123,16 @@ async function viewLicenceContacts (request, h) {
})
}

async function viewLicencePurposes (request, h) {
const { id: licenceId } = request.params

const pageData = await ViewLicencePurposesService.go(licenceId)

return h.view('licences/purposes.njk', {
...pageData
})
}

async function viewHistory (request, h) {
const { params: { id }, auth } = request

Expand Down Expand Up @@ -174,6 +185,7 @@ module.exports = {
viewLicenceContacts,
viewHistory,
viewLicenceContactDetails,
viewLicencePurposes,
viewReturns,
viewSetUp,
viewSummary
Expand Down
83 changes: 83 additions & 0 deletions app/presenters/licences/view-licence-purposes.presenter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
'use strict'

/**
* Formats the licence purposes data for the view licence purposes page
* @module ViewLicencePurposesPresenter
*/

const { formatAbstractionPeriod } = require('../base.presenter.js')

/**
* Formats the licence purposes data for the view licence purposes page
*
* @param {module:LicenceModel} licence - The licence and related licenceVersionPurposes data returned by
* `FetchLicencePurposesService`
*
* @returns {object} licence and licenceVersionPurposes data needed by the view template
*/
function go (licence) {
return {
id: licence.id,
licenceRef: licence.licenceRef,
licencePurposes: _formatLicencePurposes(licence.licenceVersions[0].licenceVersionPurposes),
pageTitle: 'Licence purpose details'
}
}

function _formatLicencePurposes (licenceVersionPurposes) {
return licenceVersionPurposes.map((licenceVersionPurpose) => {
return {
abstractionAmounts: _formatAbstractionAmounts(licenceVersionPurpose),
abstractionPeriod: _abstractionPeriod(licenceVersionPurpose),
abstractionPoints: _formatAbstractionPoints(licenceVersionPurpose.points),
purposeDescription: licenceVersionPurpose.purpose.description ? licenceVersionPurpose.purpose.description : ''
}
})
}

function _abstractionPeriod (licenceVersionPurpose) {
const startDay = licenceVersionPurpose.abstractionPeriodStartDay
const startMonth = licenceVersionPurpose.abstractionPeriodStartMonth
const endDay = licenceVersionPurpose.abstractionPeriodEndDay
const endMonth = licenceVersionPurpose.abstractionPeriodEndMonth

return formatAbstractionPeriod(startDay, startMonth, endDay, endMonth)
}

function _formatAbstractionPoints (points) {
return points.map((point) => {
return point.$describe()
})
}

function _formatAbstractionAmounts (licenceVersionPurpose) {
const details = []

if (!licenceVersionPurpose) {
return details
}

const { annualQuantity, dailyQuantity, hourlyQuantity, instantQuantity } = licenceVersionPurpose

if (annualQuantity) {
details.push(`${parseFloat(annualQuantity).toFixed(2)} cubic metres per year`)
}

if (dailyQuantity) {
details.push(`${parseFloat(dailyQuantity).toFixed(2)} cubic metres per day`)
}

if (hourlyQuantity) {
details.push(`${parseFloat(hourlyQuantity).toFixed(2)} cubic metres per hour`)
}

if (instantQuantity) {
details.push(`${parseFloat(instantQuantity).toFixed(2)} cubic metres per second (Instantaneous Quantity)`)
}

return details
}

module.exports = {
go
}
7 changes: 7 additions & 0 deletions app/routes/licence.routes.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,13 @@ const routes = [
}
}
},
{
method: 'GET',
path: '/licences/{id}/purposes',
options: {
handler: LicencesController.viewLicencePurposes
}
},
{
method: 'GET',
path: '/licences/{id}/set-up',
Expand Down
74 changes: 74 additions & 0 deletions app/services/licences/fetch-licence-purposes.service.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
'use strict'

/**
* Fetches the licence purposes needed for the view monitoring-station page
* @module FetchLicencePurposesService
*/

const LicenceModel = require('../../models/licence.model.js')

/**
* Fetches the licence purposes needed for the view monitoring-station page
*
* @param {string} licenceId - The UUID of the licence
*
* @returns {Promise<module:LicenceModel>} the licence and related licence purposes data needed for the view licence
* purposes page
*/
async function go (licenceId) {
return _fetchLicencePurposes(licenceId)
}

async function _fetchLicencePurposes (licenceId) {
return LicenceModel.query()
.findById(licenceId)
.select([
'id',
'licenceRef'
])
.modify('currentVersion')
.withGraphFetched('licenceVersions.licenceVersionPurposes')
.modifyGraph('licenceVersions.licenceVersionPurposes', (builder) => {
builder.select([
'abstractionPeriodStartDay',
'abstractionPeriodStartMonth',
'abstractionPeriodEndDay',
'abstractionPeriodEndMonth',
'annualQuantity',
'dailyQuantity',
'hourlyQuantity',
'instantQuantity'
])
.orderBy('licenceVersionPurposes.createdAt', 'asc')
})
.withGraphFetched('licenceVersions.licenceVersionPurposes.points')
.modifyGraph('licenceVersions.licenceVersionPurposes.points', (builder) => {
builder.select([
'points.description',
'points.id',
'points.ngr1',
'points.ngr2',
'points.ngr3',
'points.ngr4'
])
.orderBy('points.externalId', 'asc')
})
.withGraphFetched('licenceVersions.licenceVersionPurposes.points.source')
.modifyGraph('licenceVersions.licenceVersionPurposes.points.source', (builder) => {
builder.select([
'sources.description',
'sources.id'
])
})
.withGraphFetched('licenceVersions.licenceVersionPurposes.purpose')
.modifyGraph('licenceVersions.licenceVersionPurposes.purpose', (builder) => {
builder.select([
'id',
'description'
])
})
}

module.exports = {
go
}
30 changes: 30 additions & 0 deletions app/services/licences/view-licence-purposes.service.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
'use strict'

/**
* Orchestrates fetching and presenting the data needed for the licence purposes page
* @module ViewLicencePurposesService
*/

const FetchLicencePurposesService = require('../licences/fetch-licence-purposes.service.js')
const ViewLicencePurposesPresenter = require('../../presenters/licences/view-licence-purposes.presenter.js')

/**
* Orchestrates fetching and presenting the data needed for the licence purposes page
*
* @param {string} licenceId - The UUID of the licence
*
* @returns {Promise<object>} an object representing the `pageData` needed by the licence purposes template
*/
async function go (licenceId) {
const licencePurposes = await FetchLicencePurposesService.go(licenceId)

const pageData = ViewLicencePurposesPresenter.go(licencePurposes)

return {
...pageData
}
}

module.exports = {
go
}
105 changes: 105 additions & 0 deletions app/views/licences/purposes.njk
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
{% extends 'layout.njk' %}
{% from "govuk/components/back-link/macro.njk" import govukBackLink %}
{% from "govuk/components/details/macro.njk" import govukDetails %}
{% from "govuk/components/table/macro.njk" import govukTable %}

{% macro abstractionPointCell(array, purposeDescription) %}
{% set abstractionPoints %}
{% for item in array %}
{% if loop.last %}
<div class="govuk-!-padding-top-1">{{ item }}</div>
{% else %}
<div class="govuk-!-padding-top-1 govuk-!-padding-bottom-1">{{ item }}</div>
<div class="govuk-!-margin-bottom-1 govuk-section-break govuk-section-break--visible"></div>
{% endif %}
{% endfor %}
{% endset %}

{% if array.length > 5 %}
{{ govukDetails({
summaryText: "View your " + array.length + " abstraction points for " + purposeDescription | lower,
html: abstractionPoints | safe,
classes: "govuk-!-margin-bottom-0"
}) }}
{% else %}
{{ abstractionPoints | safe }}
{% endif %}
{% endmacro %}

{% block breadcrumbs %}
{{ govukBackLink({
text: 'Go back to summary',
href: '/system/licences/' + id + '/summary'
}) }}
{% endblock %}

{% block content %}
<h1 class="govuk-heading-l">
<span class="govuk-caption-l">Licence {{ licenceRef }}</span>
{{ pageTitle }}
</h1>

{% for licencePurpose in licencePurposes %}
{# Set an easier to use index. #}
{% set rowIndex = loop.index0 %}

{% set tableRows = [] %}

{# Abstraction points cell #}
{% if licencePurpose.abstractionPoints.length > 1 %}
{% set abstractionPointRowTitle = 'Abstraction points' %}
{% else %}
{% set abstractionPointRowTitle = 'Abstraction point' %}
{% endif %}

{% set abstractionPointsRow = [
{
text: abstractionPointRowTitle,
attributes: { 'data-test': 'abstraction-point-title-' + rowIndex },
classes: "govuk-!-width-one-third"
},
{
html: abstractionPointCell(licencePurpose.abstractionPoints, licencePurpose.purposeDescription),
attributes: { 'data-test': 'abstraction-points-' + rowIndex }
}
] %}

{% set tableRows = (tableRows.push(abstractionPointsRow), tableRows) %}

{# Period of abstraction cell #}
{% set abstractionPeriodRow = [
{
text: 'Period of abstraction',
attributes: { 'data-test': 'abstraction-period-title-' + rowIndex }
},
{
text: licencePurpose.abstractionPeriod,
attributes: { 'data-test': 'abstraction-period-' + rowIndex }
}
] %}

{% set tableRows = (tableRows.push(abstractionPeriodRow), tableRows) %}

{# Abstraction amount cell #}
{% for abstractionAmount in licencePurpose.abstractionAmounts %}
{% set abstractionPeriodRow = [
{
text: 'Abstraction amount',
attributes: { 'data-test': 'abstraction-amount-title-' + rowIndex }
},
{
text: abstractionAmount,
attributes: { 'data-test': 'abstraction-amount-' + rowIndex }
}
] %}

{% set tableRows = (tableRows.push(abstractionPeriodRow), tableRows) %}
{% endfor %}

{{ govukTable({
caption: licencePurpose.purposeDescription,
captionClasses: "govuk-table__caption--m govuk-!-padding-bottom-3 govuk-!-margin-bottom-0 govuk-section-break govuk-section-break--visible",
rows: tableRows
}) }}
{% endfor %}
{% endblock %}
Loading
Loading