diff --git a/app/presenters/licences/view-licence-bills.presenter.js b/app/presenters/licences/view-licence-bills.presenter.js index c983fad75d..9cf6cf171d 100644 --- a/app/presenters/licences/view-licence-bills.presenter.js +++ b/app/presenters/licences/view-licence-bills.presenter.js @@ -5,7 +5,7 @@ * @module ViewLicenceBillsPresenter */ -const { formatLongDate, formatMoney } = require('../base.presenter') +const { formatBillRunType, formatLongDate, formatMoney } = require('../base.presenter.js') /** * Formats data for the `/licences/{id}/bills` view licence bill page @@ -14,47 +14,55 @@ const { formatLongDate, formatMoney } = require('../base.presenter') */ function go (bills) { return { - activeTab: 'bills', - bills: _formatBillsToTableRow(bills) + bills: _bills(bills) } } -function _formatBatchType (batchType) { - return batchType.replace(/_/g, ' ') +function _bills (bills) { + return bills.map((bill) => { + const { + accountNumber, + billingAccountId, + billRun, + createdAt, + credit, + financialYearEnding, + id: billId, + netAmount + } = bill + + return { + accountNumber, + billingAccountId, + billId, + billNumber: _formatBillNumber(bill), + billRunType: formatBillRunType(billRun.batchType, billRun.scheme, billRun.summer), + credit, + dateCreated: formatLongDate(createdAt), + financialYearEnding, + total: formatMoney(netAmount) + } + }) } -function _formatBillNumberLabel (bill) { +function _formatBillNumber (bill) { if (bill.invoiceNumber) { return bill.invoiceNumber } + if (bill.deminimis) { return 'De minimis bill' } + if (bill.legacyId) { return 'NALD revised bill' } + if (bill.netAmount === 0) { return 'Zero value bill' } - return null -} - -function _formatBillsToTableRow (bills) { - return bills.map((bill) => { - return { - billNumber: _formatBillNumberLabel(bill), - dateCreated: formatLongDate(new Date(bill.createdAt)), - account: bill.accountNumber, - runType: _formatBatchType(bill.billRun.batchType), - financialYear: bill.financialYearEnding, - total: formatMoney(bill.netAmount), - accountId: bill.billingAccountId, - id: bill.id, - legacyId: bill.legacyId, - credit: bill.credit - } - }) + return '' } module.exports = { diff --git a/app/services/licences/fetch-licence-bills.service.js b/app/services/licences/fetch-licence-bills.service.js index f9d815a090..111114cbf5 100644 --- a/app/services/licences/fetch-licence-bills.service.js +++ b/app/services/licences/fetch-licence-bills.service.js @@ -42,7 +42,12 @@ async function _fetch (licenceId, page) { .where('billRuns.status', 'sent') .withGraphFetched('billRun') .modifyGraph('billRun', (builder) => { - builder.select(['batchType']) + builder.select([ + 'id', + 'batchType', + 'scheme', + 'summer' + ]) }) .orderBy([ { column: 'createdAt', order: 'desc' } diff --git a/app/services/licences/view-licence-bills.service.js b/app/services/licences/view-licence-bills.service.js index 67afe2ff90..fcd7f022fd 100644 --- a/app/services/licences/view-licence-bills.service.js +++ b/app/services/licences/view-licence-bills.service.js @@ -1,21 +1,21 @@ 'use strict' /** - * Orchestrates fetching and presenting the data needed for the licence summary page + * Orchestrates fetching and presenting the data needed for the view licence bills tab * @module ViewLicenceBillsService */ -const FetchLicenceBillsService = require('./fetch-licence-bills.service') -const ViewLicenceBillsPresenter = require('../../presenters/licences/view-licence-bills.presenter') -const ViewLicenceService = require('./view-licence.service') -const PaginatorPresenter = require('../../presenters/paginator.presenter') +const FetchLicenceBillsService = require('./fetch-licence-bills.service.js') +const PaginatorPresenter = require('../../presenters/paginator.presenter.js') +const ViewLicenceBillsPresenter = require('../../presenters/licences/view-licence-bills.presenter.js') +const ViewLicenceService = require('./view-licence.service.js') /** - * Orchestrates fetching and presenting the data needed for the licence summary page + * Orchestrates fetching and presenting the data needed for the view licence bills tab * * @param {string} licenceId - The UUID of the licence * - * @returns {Promise} an object representing the `pageData` needed by the licence summary template. + * @returns {Promise} an object representing the `pageData` needed by the licence bills template. */ async function go (licenceId, auth, page) { const commonData = await ViewLicenceService.go(licenceId, auth) @@ -26,6 +26,7 @@ async function go (licenceId, auth, page) { const pagination = PaginatorPresenter.go(billsData.pagination.total, Number(page), `/system/licences/${licenceId}/bills`) return { + activeTab: 'bills', ...commonData, ...pageData, pagination diff --git a/app/views/licences/tabs/bills.njk b/app/views/licences/tabs/bills.njk index a56a9ca320..9dcefcd547 100644 --- a/app/views/licences/tabs/bills.njk +++ b/app/views/licences/tabs/bills.njk @@ -19,7 +19,7 @@ {% set row = [ { - html: '' + bill.billNumber + '', + html: '' + bill.billNumber + '', attributes: { 'data-test': 'bill-number-' + rowIndex } }, { @@ -27,15 +27,15 @@ attributes: { 'data-test': 'bill-created-' + rowIndex } }, { - html: '' + bill.account + '', + html: '' + bill.accountNumber + '', attributes: { 'data-test': 'bill-account-' + rowIndex } }, { - text: bill.runType, + text: bill.billRunType, attributes: { 'data-test': 'bill-type-' + rowIndex } }, { - text: bill.financialYear, + text: bill.financialYearEnding, attributes: { 'data-test': 'bill-year-' + rowIndex }, format: 'numeric' }, diff --git a/test/presenters/licences/view-licence-bills-presenter.test.js b/test/presenters/licences/view-licence-bills-presenter.test.js deleted file mode 100644 index b9e68a8cf1..0000000000 --- a/test/presenters/licences/view-licence-bills-presenter.test.js +++ /dev/null @@ -1,116 +0,0 @@ -'use strict' - -// Test framework dependencies -const Lab = require('@hapi/lab') -const Code = require('@hapi/code') - -const { describe, it } = exports.lab = Lab.script() -const { expect } = Code - -// Thing under test -const ViewLicenceBillsPresenter = require('../../../app/presenters/licences/view-licence-bills.presenter') - -describe('View Licence Bills presenter', () => { - describe('when provided with a bills data', () => { - it('correctly presents the data', () => { - const result = ViewLicenceBillsPresenter.go(_bills()) - - expect(result).to.equal({ - activeTab: 'bills', - bills: [{ - account: 'acc123', - accountId: 'bicc1233', - billNumber: 'inv123', - credit: false, - dateCreated: '1 January 2020', - financialYear: '2021', - id: 'id123', - legacyId: null, - runType: 'annual', - total: '£1,234,567.89' - }] - }) - }) - it('correctly formats the created date to convention', () => { - const result = ViewLicenceBillsPresenter.go(_bills()) - expect(result.bills[0].dateCreated).to.equal('1 January 2020') - }) - - it('correctly formats the currency to UK standard', () => { - const result = ViewLicenceBillsPresenter.go(_bills()) - expect(result.bills[0].total).to.equal('£1,234,567.89') - }) - - it('correctly formats the two part tariff batch type', () => { - const result = ViewLicenceBillsPresenter.go(_billsTwoPartTariff()) - expect(result.bills[0].runType).to.equal('two part tariff') - }) - - describe('billNumber', () => { - it('correctly formats the "billNumber" to the invoice number', () => { - const result = ViewLicenceBillsPresenter.go(_bills()) - expect(result.bills[0].billNumber).to.equal('inv123') - }) - - it('correctly formats the "billNumber" to "De minimis bill"', () => { - const bill = _bill() - bill.invoiceNumber = null - bill.deminimis = true - const result = ViewLicenceBillsPresenter.go([bill]) - expect(result.bills[0].billNumber).to.equal('De minimis bill') - }) - - it('correctly formats the "billNumber" to "NALD revised bill"', () => { - const bill = _bill() - bill.invoiceNumber = null - bill.legacyId = 'lgcy' - const result = ViewLicenceBillsPresenter.go([bill]) - expect(result.bills[0].billNumber).to.equal('NALD revised bill') - }) - - it('correctly formats the "billNumber" to "Zero value bill"', () => { - const bill = _bill() - bill.invoiceNumber = null - bill.netAmount = 0 - const result = ViewLicenceBillsPresenter.go([bill]) - expect(result.bills[0].billNumber).to.equal('Zero value bill') - }) - }) - }) -}) - -function _bill () { - return { - accountNumber: 'acc123', - billRun: { batchType: 'annual' }, - billingAccountId: 'bicc1233', - createdAt: new Date('2020-01-01'), - credit: false, - deminimis: false, - financialYearEnding: '2021', - id: 'id123', - invoiceNumber: 'inv123', - legacyId: null, - netAmount: 123456789 - } -} - -function _bills () { - return [_bill()] -} - -function _billsTwoPartTariff () { - return [{ - accountNumber: 'acc123', - billRun: { batchType: 'two_part_tariff' }, - billingAccountId: 'bicc1233', - createdAt: new Date('2020-01-01'), - credit: false, - deminimis: false, - financialYearEnding: '2021', - id: 'id123', - invoiceNumber: 'inv123', - legacyId: null, - netAmount: 123456789 - }] -} diff --git a/test/presenters/licences/view-licence-bills.presenter.test.js b/test/presenters/licences/view-licence-bills.presenter.test.js new file mode 100644 index 0000000000..8c730ed928 --- /dev/null +++ b/test/presenters/licences/view-licence-bills.presenter.test.js @@ -0,0 +1,118 @@ +'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 + +// Thing under test +const ViewLicenceBillsPresenter = require('../../../app/presenters/licences/view-licence-bills.presenter.js') + +describe('View Licence Bills presenter', () => { + let bill + + describe('when provided with a bills data', () => { + beforeEach(() => { + bill = _bill() + }) + + it('correctly presents the data', () => { + const result = ViewLicenceBillsPresenter.go([bill]) + + expect(result).to.equal({ + bills: [{ + accountNumber: 'BA1234443S', + billingAccountId: '2563bda0-73d8-4055-b3e7-421cf188d4dc', + billId: 'dfed8cdd-05c0-4f03-9a95-a7bae74fe7be', + billNumber: 'WAC0003872T', + billRunType: 'Annual', + credit: false, + dateCreated: '1 January 2020', + financialYearEnding: '2021', + total: '£1,234,567.89' + }] + }) + }) + + describe('the "bills" property', () => { + describe('for each bill returned', () => { + describe('when the invoice number exists', () => { + it('correctly formats the "billNumber" to the invoice number', () => { + const result = ViewLicenceBillsPresenter.go([bill]) + + expect(result.bills[0].billNumber).to.equal('WAC0003872T') + }) + }) + + describe('when it is flagged as deminimis', () => { + beforeEach(() => { + bill.invoiceNumber = null + bill.deminimis = true + }) + + it('correctly formats the "billNumber" to "De minimis bill"', () => { + const result = ViewLicenceBillsPresenter.go([bill]) + + expect(result.bills[0].billNumber).to.equal('De minimis bill') + }) + }) + + describe('when it has a legacy ID', () => { + beforeEach(() => { + bill.invoiceNumber = null + bill.legacyId = '100456' + }) + + it('correctly formats the "billNumber" to "NALD revised bill"', () => { + const result = ViewLicenceBillsPresenter.go([bill]) + + expect(result.bills[0].billNumber).to.equal('NALD revised bill') + }) + }) + + describe('when it has a zero net amount', () => { + beforeEach(() => { + bill.invoiceNumber = null + bill.netAmount = 0 + }) + + it('correctly formats the "billNumber" to "Zero value bill"', () => { + const result = ViewLicenceBillsPresenter.go([bill]) + + expect(result.bills[0].billNumber).to.equal('Zero value bill') + }) + }) + + describe('when it has no invoice number, deminimis flag, legacy ID, and net amount is not zero', () => { + beforeEach(() => { + bill.invoiceNumber = null + }) + + it('returns an empty string', () => { + const result = ViewLicenceBillsPresenter.go([bill]) + + expect(result.bills[0].billNumber).to.equal('') + }) + }) + }) + }) + }) +}) + +function _bill () { + return { + accountNumber: 'BA1234443S', + billRun: { batchType: 'annual', scheme: 'sroc', summer: false }, + billingAccountId: '2563bda0-73d8-4055-b3e7-421cf188d4dc', + createdAt: new Date('2020-01-01'), + credit: false, + deminimis: false, + financialYearEnding: '2021', + id: 'dfed8cdd-05c0-4f03-9a95-a7bae74fe7be', + invoiceNumber: 'WAC0003872T', + legacyId: null, + netAmount: 123456789 + } +} diff --git a/test/presenters/licences/view-licence-presenter.test.js b/test/presenters/licences/view-licence.presenter.test.js similarity index 100% rename from test/presenters/licences/view-licence-presenter.test.js rename to test/presenters/licences/view-licence.presenter.test.js diff --git a/test/services/licences/fetch-licence-bills.service.test.js b/test/services/licences/fetch-licence-bills.service.test.js index 075125d947..ef853e51fe 100644 --- a/test/services/licences/fetch-licence-bills.service.test.js +++ b/test/services/licences/fetch-licence-bills.service.test.js @@ -69,7 +69,10 @@ describe('Fetch Licence Bills service', () => { [{ accountNumber: 'T21404193A', billRun: { - batchType: 'supplementary' + id: billRunId, + batchType: 'supplementary', + scheme: 'sroc', + summer: false }, billingAccountId, createdAt: createdDate, diff --git a/test/services/licences/view-licence-bills.service.test.js b/test/services/licences/view-licence-bills.service.test.js index c0ecb9f93b..2d88a9a91f 100644 --- a/test/services/licences/view-licence-bills.service.test.js +++ b/test/services/licences/view-licence-bills.service.test.js @@ -9,24 +9,18 @@ const { describe, it, beforeEach, afterEach } = exports.lab = Lab.script() const { expect } = Code // Things we need to stub -const FetchLicenceBillsService = require('../../../app/services/licences/fetch-licence-bills.service') -const PaginatorPresenter = require('../../../app/presenters/paginator.presenter') -const ViewLicenceService = require('../../../app/services/licences/view-licence.service') -const ViewLicenceBillsPresenter = require('../../../app/presenters/licences/view-licence-bills.presenter') +const FetchLicenceBillsService = require('../../../app/services/licences/fetch-licence-bills.service.js') +const ViewLicenceService = require('../../../app/services/licences/view-licence.service.js') // Thing under test -const ViewLicenceBillsService = require('../../../app/services/licences/view-licence-bills.service') +const ViewLicenceBillsService = require('../../../app/services/licences/view-licence-bills.service.js') describe('View Licence service bills', () => { const auth = {} - const page = 1 - const pagination = { page } const testId = '2c80bd22-a005-4cf4-a2a2-73812a9861de' beforeEach(() => { Sinon.stub(FetchLicenceBillsService, 'go').returns(_billsFetchService()) - Sinon.stub(PaginatorPresenter, 'go').returns(pagination) - Sinon.stub(ViewLicenceBillsPresenter, 'go').returns(_billsPresenter()) Sinon.stub(ViewLicenceService, 'go').resolves(_licence()) }) @@ -43,7 +37,7 @@ describe('View Licence service bills', () => { activeTab: 'bills', bills: [], licenceName: 'fake licence', - pagination: { page: 1 } + pagination: { numberOfPages: 1 } }) }) }) @@ -54,13 +48,6 @@ function _licence () { return { licenceName: 'fake licence' } } -function _billsPresenter () { - return { - bills: [], - activeTab: 'bills' - } -} - function _billsFetchService () { return { bills: [],