@defra-fish/gafl-webapp-service 1.61.0-rc.9 → 1.62.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@defra-fish/gafl-webapp-service",
3
- "version": "1.61.0-rc.9",
3
+ "version": "1.62.0-rc.0",
4
4
  "description": "The websales frontend for the GAFL service",
5
5
  "type": "module",
6
6
  "engines": {
7
- "node": ">=18.17"
7
+ "node": ">=20"
8
8
  },
9
9
  "keywords": [
10
10
  "rod",
@@ -36,8 +36,8 @@
36
36
  "prepare": "gulp --gulpfile build/gulpfile.cjs"
37
37
  },
38
38
  "dependencies": {
39
- "@defra-fish/business-rules-lib": "1.61.0-rc.9",
40
- "@defra-fish/connectors-lib": "1.61.0-rc.9",
39
+ "@defra-fish/business-rules-lib": "1.62.0-rc.0",
40
+ "@defra-fish/connectors-lib": "1.62.0-rc.0",
41
41
  "@defra/hapi-gapi": "^2.0.0",
42
42
  "@hapi/boom": "^9.1.2",
43
43
  "@hapi/catbox-redis": "^6.0.2",
@@ -52,12 +52,12 @@
52
52
  "debug": "^4.3.3",
53
53
  "disinfect": "^1.1.0",
54
54
  "find": "^0.3.0",
55
- "govuk-frontend": "^5.2.0",
55
+ "govuk-frontend": "^5.10.2",
56
56
  "hapi-i18n": "^3.0.1",
57
57
  "joi": "^17.6.0",
58
58
  "moment": "^2.29.1",
59
59
  "moment-timezone": "^0.5.34",
60
- "node-fetch": "^2.6.7",
60
+ "node-fetch": "^2.7.0",
61
61
  "nunjucks": "^3.2.3",
62
62
  "openid-client": "^4.9.1",
63
63
  "semver": "^7.3.5",
@@ -79,5 +79,5 @@
79
79
  "./gafl-jest-matchers.js"
80
80
  ]
81
81
  },
82
- "gitHead": "b9c65c7827bb974c94056bf5e387d80564d3ddc6"
82
+ "gitHead": "d56e1a0d0f4b22f1dded800c0ed511b737cb91a7"
83
83
  }
@@ -1,13 +1,15 @@
1
1
  import handler from '../authentication-handler.js'
2
- import { IDENTIFY, CONTROLLER, RENEWAL_INACTIVE } from '../../uri.js'
2
+ import { LICENCE_NOT_FOUND, CONTROLLER, RENEWAL_INACTIVE } from '../../uri.js'
3
3
  import { salesApi } from '@defra-fish/connectors-lib'
4
4
 
5
5
  jest.mock('../../processors/uri-helper.js')
6
6
  jest.mock('../page-handler.js', () => ({ errorShimm: () => {} }))
7
7
  jest.mock('../../uri.js', () => ({
8
8
  IDENTIFY: {
9
- page: 'identify page',
10
- uri: Symbol('identify uri')
9
+ page: 'identify page'
10
+ },
11
+ LICENCE_NOT_FOUND: {
12
+ uri: Symbol('licence not found uri')
11
13
  },
12
14
  CONTROLLER: {
13
15
  uri: Symbol('controller uri')
@@ -40,7 +42,7 @@ const getSampleAuthResult = (description = 'M', durationMagnitude = 12) => ({
40
42
  })
41
43
 
42
44
  describe.each([
43
- [false, 'identify', IDENTIFY.uri, 1],
45
+ [false, 'licence not found', LICENCE_NOT_FOUND.uri, 1],
44
46
  [getSampleAuthResult(), 'controller', CONTROLLER.uri, -1],
45
47
  [getSampleAuthResult(), 'renewal inactive', RENEWAL_INACTIVE.uri, 61],
46
48
  [getSampleAuthResult(), 'renewal inactive', RENEWAL_INACTIVE.uri, -61],
@@ -1,5 +1,5 @@
1
1
  import { setUpCacheFromAuthenticationResult, setUpPayloads } from '../processors/renewals-write-cache.js'
2
- import { IDENTIFY, CONTROLLER, RENEWAL_INACTIVE } from '../uri.js'
2
+ import { IDENTIFY, RENEWAL_INACTIVE, LICENCE_NOT_FOUND, CONTROLLER } from '../uri.js'
3
3
  import { RENEWAL_ERROR_REASON } from '../constants.js'
4
4
  import { validation, RENEW_BEFORE_DAYS, RENEW_AFTER_DAYS, SERVICE_LOCAL_TIME } from '@defra-fish/business-rules-lib'
5
5
  import Joi from 'joi'
@@ -8,7 +8,7 @@ import moment from 'moment-timezone'
8
8
 
9
9
  /**
10
10
  * Handler to authenticate the user on the easy renewals journey. It will
11
- * (1) Redirect back to the identification page where there is an authentication failure
11
+ * (1) Redirect to an error page where there is an authentication failure
12
12
  * (2) Redirect to an error page where the renewal has expired
13
13
  * (3) Redirect back to an error page where a licence is already issued
14
14
  * (4) Establish the session cache and redirect into the controller where the user is authenticated
@@ -43,9 +43,9 @@ export default async (request, h) => {
43
43
 
44
44
  if (!authenticationResult) {
45
45
  payload.referenceNumber = referenceNumber
46
- await request.cache().helpers.page.setCurrentPermission(IDENTIFY.page, { payload, error: { referenceNumber: 'string.invalid' } })
46
+ await request.cache().helpers.page.setCurrentPermission(IDENTIFY.page, { payload })
47
47
  await request.cache().helpers.status.setCurrentPermission({ referenceNumber, authentication: { authorized: false } })
48
- return h.redirectWithLanguageCode(IDENTIFY.uri)
48
+ return h.redirectWithLanguageCode(LICENCE_NOT_FOUND.uri)
49
49
  } else {
50
50
  // Test for 12 month licence
51
51
  const daysDiff = moment(authenticationResult.permission.endDate).diff(moment().tz(SERVICE_LOCAL_TIME).startOf('day'), 'days')
@@ -254,7 +254,8 @@
254
254
  "cookies_survey_subheading": "Arolwg o’n perfformiad",
255
255
  "cookies_title": "Cwcis",
256
256
  "cost": "Cost",
257
- "disability_concession_12_month": "Gall deiliaid trwydded 12 mis fod yn gymwys i gael consesiynau anabledd",
257
+ "disability_concession_12_month": "Mae deiliaid trwydded blwyddyn yn gymwys ar gyfer consesiwn os byddant yn derbyn Taliad Anibyniaeth Personol (PIP), Lwfans Byw i’r Anabl (DLA) neu wedi bodloni’r meini prawf ar gyfer ",
258
+ "disability_concession_12_month_link": "Bathodyn Glas (yn agor mewn tab newydd)",
258
259
  "disability_concession_badge_error_msg": "Nodwch rif Bathodyn Glas deiliad y drwydded",
259
260
  "disability_concession_error_choose_option": "Dewiswch un o’r opsiynau.",
260
261
  "disability_concession_error_ni_empty": "Nodwch Rif Yswiriant Gwladol deiliad y drwydded",
@@ -264,12 +265,15 @@
264
265
  "disability_concession_ni_hint": "Mae hwn ar eich cerdyn Yswiriant Gwladol, llythyr budd-daliadau, slip talu neu P60. Er enghraifft 'QQ 12 34 56 C'",
265
266
  "disability_concession_ni_label_jr": "Rhif Yswiriant Gwladol neu Gyfeirnod Plant",
266
267
  "disability_concession_ni_label": "Rhif Yswiriant Gwladol",
267
- "disability_concession_radio_badge": "Bathodyn Glas",
268
- "disability_concession_radio_dla": "neu Lwfans Byw i’r Anabl",
269
- "disability_concession_radio_no": "Nac ydw",
270
- "disability_concession_radio_pip": "Taliad Annibyniaeth Personol (PIP)",
271
- "disability_concession_title_other": "A ydyw’n derbyn unrhyw un o’r canlynol?",
272
- "disability_concession_title_you": "Ydych chi’n derbyn unrhyw un o’r canlynol?",
268
+ "disability_concession_radio_badge_self": "Ydw, yn meddu ar Fathodyn Glas neu wedi bodloni’r meini prawf",
269
+ "disability_concession_radio_badge_bobo": "Ydyn, yn meddu ar Fathodyn Glas neu wedi bodloni’r meini prawf",
270
+ "disability_concession_radio_dla": "neu’r Lwfans Byw i’r Anabl (DLA)",
271
+ "disability_concession_radio_no_self": "Nac ydw",
272
+ "disability_concession_radio_no_bobo": "Nac ydyn",
273
+ "disability_concession_radio_pip_self": "Ydw, Taliad Anibyniaeth Personol (PIP)",
274
+ "disability_concession_radio_pip_bobo": "Ydyn, Taliad Anibyniaeth Personol (PIP)",
275
+ "disability_concession_title_bobo": "Ydyn nhw’n gymwys ar gyfer consesiwn?",
276
+ "disability_concession_title_self": "Ydych chi’n gymwys ar gyfer consesiwn?",
273
277
  "date_day": "Diwrnod",
274
278
  "dob_entry_hint": "Er enghraifft, 23 11 1979",
275
279
  "dob_error_date_real": "Mae’n rhaid i’r dyddiad geni fod yn ddyddiad dilys",
@@ -328,8 +332,6 @@
328
332
  "identify_error_date_real": "Mae’n rhaid i’r dyddiad geni fod yn ddyddiad dilys",
329
333
  "identify_error_empty_postcode": "Nid ydych wedi nodi cod post",
330
334
  "identify_error_empty": "Rhowch chwe nodyn olaf eich trwydded",
331
- "identify_error_invalid_1": "Nid oes gennym gofnod o rif trwydded sy'n gorffen gyda ",
332
- "identify_error_invalid_2": " sy’n cyd-fynd â'r manylion hyn.",
333
335
  "identify_error_missing_day": "Mae’n rhaid i’r dyddiad geni gynnwys diwrnod",
334
336
  "identify_error_missing_month": "Mae’n rhaid i’r dyddiad geni gynnwys mis",
335
337
  "identify_error_missing_year": "Mae’n rhaid i’r dyddiad geni gynnwys blwyddyn",
@@ -416,6 +418,13 @@
416
418
  "licence_length_title_other": "Am ba hyd y maent am gael y drwydded?",
417
419
  "licence_length_title_you": "Am ba hyd yr hoffech chi gael y drwydded?",
418
420
  "licence_num": "Rhif trwydded",
421
+ "licence_not_found_title": "Ni allwn ddod o hyd i drwydded sy’n cyfateb â'r manylion a roddwyd",
422
+ "licence_not_found_body_1": "Gwiriwch eich bod wedi mewnbynnu’r manylion yn gywir - ",
423
+ "licence_not_found_body_previous_page": "ewch yn ôl i’r dudalen flaenorol",
424
+ "licence_not_found_body_2": "Os byddwch yn parhau i weld y dudalen hon gallwch ofyn am gymorth drwy e-bostio ",
425
+ "licence_not_found_body_ea_link": "enquiries@environment-agency.gov.uk",
426
+ "licence_not_found_body_3": " neu ffonio 03708 506 506 (8am - 6pm o ddydd Llun i ddydd Gwener, ac eithrio gwyliau cyhoeddus). ",
427
+ "licence_not_found_body_call_charges_link": "Gallwch weld costau’r galwadau yma (yn agor mewn tab newydd)",
419
428
  "licence_start_days": " diwrnod nesaf",
420
429
  "licence_start_enter_todays_date": "Rhowch ddyddiad heddiw os ydych chi am i’r drwydded 1 diwrnod neu 8 diwrnod ddechrau yn hwyrach heddiw.",
421
430
  "licence_start_error_date_real": "Mae’n rhaid i ddyddiad dechrau’r drwydded fod yn ddyddiad dilys",
@@ -462,7 +471,8 @@
462
471
  "licence_start_title_other": "Dyddiad dechrau’r drwydded?",
463
472
  "licence_start_title_you": "Pryd yr hoffech i'ch trwydded ddechrau?",
464
473
  "licence_start_today_or_within": "Gall y drwydded ddechrau heddiw neu unrhyw ddiwrnod o fewn y ",
465
- "licence_summary_blue_badge_num": "Rhif Bathodyn Glas",
474
+ "licence_summary_blue_badge": "Bathodyn Glas",
475
+ "licence_summary_blue_badge_eligible": "Cymwys",
466
476
  "licence_summary_change": "Newid",
467
477
  "licence_summary_disability_concession": "Consesiwn anabledd",
468
478
  "licence_summary_dob": "Dyddiad geni",
@@ -254,7 +254,8 @@
254
254
  "cookies_survey_subheading": "Our performance survey",
255
255
  "cookies_title": "Cookies",
256
256
  "cost": "Cost",
257
- "disability_concession_12_month": "12 month licence holders may be eligible for disability concessions",
257
+ "disability_concession_12_month": "12 month licence holders are eligible for a concession if they receive Personal Independence Payment (PIP), Disability Living Allowance (DLA), have or meet the criteria for a ",
258
+ "disability_concession_12_month_link": "Blue Badge (opens in new tab)",
258
259
  "disability_concession_badge_error_msg": "Enter the licence holder’s Blue Badge number",
259
260
  "disability_concession_error_choose_option": "Choose one of the options.",
260
261
  "disability_concession_error_ni_empty": "Enter the licence holder’s National Insurance number",
@@ -264,12 +265,15 @@
264
265
  "disability_concession_ni_hint": "This can be found on a National Insurance card, benefit letter, payslip or P60. For example 'QQ 12 34 56 C'",
265
266
  "disability_concession_ni_label_jr": "National Insurance or Child Reference number",
266
267
  "disability_concession_ni_label": "National Insurance number",
267
- "disability_concession_radio_badge": "Blue Badge",
268
- "disability_concession_radio_dla": "or Disability Living Allowance (DLA)",
269
- "disability_concession_radio_no": "No",
270
- "disability_concession_radio_pip": "Personal Independence Payment (PIP)",
271
- "disability_concession_title_other": "Do they receive any of the following?",
272
- "disability_concession_title_you": "Do you receive any of the following?",
268
+ "disability_concession_radio_badge_self": "Yes, have or meet the eligibility criteria for Blue Badge",
269
+ "disability_concession_radio_badge_bobo": "Yes, have or meet the eligibility criteria for Blue Badge",
270
+ "disability_concession_radio_dla": "Or Disability Living Allowance (DLA)",
271
+ "disability_concession_radio_no_self": "No",
272
+ "disability_concession_radio_no_bobo": "No",
273
+ "disability_concession_radio_pip_self": "Yes, Personal Independence Payment (PIP)",
274
+ "disability_concession_radio_pip_bobo": "Yes, Personal Independence Payment (PIP)",
275
+ "disability_concession_title_bobo": "Are they eligible for a concession?",
276
+ "disability_concession_title_self": "Are you eligible for a concession?",
273
277
  "date_day": "Day",
274
278
  "dob_entry_hint": "For example, 23 11 1979",
275
279
  "dob_error_date_real": "Date of birth must be a real date",
@@ -328,8 +332,6 @@
328
332
  "identify_error_date_real": "Date of birth must be a real date",
329
333
  "identify_error_empty_postcode": "You did not enter a postcode",
330
334
  "identify_error_empty": "Enter the last six characters of your licence number",
331
- "identify_error_invalid_1": "We do not have any record of a licence number ending ",
332
- "identify_error_invalid_2": " matching these details.",
333
335
  "identify_error_missing_day": "Date of birth must include a day",
334
336
  "identify_error_missing_month": "Date of birth must include a month",
335
337
  "identify_error_missing_year": "Date of birth must include a year",
@@ -415,6 +417,13 @@
415
417
  "licence_length_one_day": "1 day licences are valid for 24 hours from the start time that you select.",
416
418
  "licence_length_title_other": "How long do they want the licence for?",
417
419
  "licence_length_title_you": "How long do you want your licence for?",
420
+ "licence_not_found_title": "We cannot find a licence matching the details you provided",
421
+ "licence_not_found_body_1": "Check you have entered your details correctly - ",
422
+ "licence_not_found_body_previous_page": "go back to the previous page",
423
+ "licence_not_found_body_2": "If you keep seeing this page you can get help by emailing ",
424
+ "licence_not_found_body_ea_link": "enquiries@environment-agency.gov.uk",
425
+ "licence_not_found_body_3": " or calling 03708 506 506 (8am to 6pm, Monday to Friday, except public holidays). ",
426
+ "licence_not_found_body_call_charges_link": "View call charges (opens in new tab)",
418
427
  "licence_num": "Licence number",
419
428
  "licence_start_days": " days",
420
429
  "licence_start_enter_todays_date": "Enter today’s date if you want the 1-day or 8-day licence to start later today.",
@@ -462,7 +471,8 @@
462
471
  "licence_start_title_other": "When should the licence start?",
463
472
  "licence_start_title_you": "When would you like your licence to start?",
464
473
  "licence_start_today_or_within": "The licence can start today or any day within the next ",
465
- "licence_summary_blue_badge_num": "Blue Badge number",
474
+ "licence_summary_blue_badge": "Blue Badge",
475
+ "licence_summary_blue_badge_eligible": "Eligible",
466
476
  "licence_summary_change": "Change",
467
477
  "licence_summary_disability_concession": "Disability concession",
468
478
  "licence_summary_dob": "Date of birth",
@@ -31,15 +31,6 @@ describe('The disability concession page', () => {
31
31
  expect(response.headers.location).toHaveValidPathFor(DISABILITY_CONCESSION.uri)
32
32
  })
33
33
 
34
- it('redirects back to itself on posting blue badge with an empty blue number', async () => {
35
- const response = await injectWithCookies('POST', DISABILITY_CONCESSION.uri, {
36
- 'disability-concession': disabilityConcessionTypes.blueBadge,
37
- 'blue-badge-number': ''
38
- })
39
- expect(response.statusCode).toBe(302)
40
- expect(response.headers.location).toHaveValidPathFor(DISABILITY_CONCESSION.uri)
41
- })
42
-
43
34
  it('on setting a correct ni number it redirects to the licence-to-start page', async () => {
44
35
  const response = await injectWithCookies('POST', DISABILITY_CONCESSION.uri, {
45
36
  'disability-concession': disabilityConcessionTypes.pipDla,
@@ -62,32 +53,28 @@ describe('The disability concession page', () => {
62
53
  })
63
54
  })
64
55
 
65
- it('on setting a correct blue badge number redirects to the licence-to-start page', async () => {
56
+ it('on selecting blue badge or meets criteria of bb, it causes a redirect to the licence-to-start page', async () => {
66
57
  const response = await injectWithCookies('POST', DISABILITY_CONCESSION.uri, {
67
- 'disability-concession': disabilityConcessionTypes.blueBadge,
68
- 'blue-badge-number': '1234'
58
+ 'disability-concession': disabilityConcessionTypes.blueBadge
69
59
  })
70
60
  expect(response.statusCode).toBe(302)
71
61
  expect(response.headers.location).toHaveValidPathFor(LICENCE_TO_START.uri)
72
62
  })
73
63
 
74
- it('on setting a correct blue badge number adds a disabled concession to the cache', async () => {
64
+ it('on selecting blue badge or meets criteria of bb, it adds a disabled concession to the cache', async () => {
75
65
  await injectWithCookies('POST', DISABILITY_CONCESSION.uri, {
76
- 'disability-concession': disabilityConcessionTypes.blueBadge,
77
- 'blue-badge-number': '1234'
66
+ 'disability-concession': disabilityConcessionTypes.blueBadge
78
67
  })
79
68
  const { payload } = await injectWithCookies('GET', TEST_TRANSACTION.uri)
80
69
  expect(concessionHelper.hasDisabled(JSON.parse(payload).permissions[0])).toBeTruthy()
81
70
  expect(JSON.parse(payload).permissions[0].concessions[0].proof).toEqual({
82
- type: CONCESSION_PROOF.blueBadge,
83
- referenceNumber: '1234'
71
+ type: CONCESSION_PROOF.blueBadge
84
72
  })
85
73
  })
86
74
 
87
75
  it('on setting a disability concession and changing to a 8 day licence and back, the concession is restored', async () => {
88
76
  await injectWithCookies('POST', DISABILITY_CONCESSION.uri, {
89
- 'disability-concession': disabilityConcessionTypes.blueBadge,
90
- 'blue-badge-number': '1234'
77
+ 'disability-concession': disabilityConcessionTypes.blueBadge
91
78
  })
92
79
  await injectWithCookies('POST', LICENCE_LENGTH.uri, { 'licence-length': '8D' })
93
80
  const { payload } = await injectWithCookies('GET', TEST_TRANSACTION.uri)
@@ -96,8 +83,7 @@ describe('The disability concession page', () => {
96
83
  const { payload: payload2 } = await injectWithCookies('GET', TEST_TRANSACTION.uri)
97
84
  expect(concessionHelper.hasDisabled(JSON.parse(payload2).permissions[0])).toBeTruthy()
98
85
  expect(JSON.parse(payload2).permissions[0].concessions[0].proof).toEqual({
99
- type: CONCESSION_PROOF.blueBadge,
100
- referenceNumber: '1234'
86
+ type: CONCESSION_PROOF.blueBadge
101
87
  })
102
88
  })
103
89
 
@@ -2,8 +2,9 @@
2
2
  {% from "radios/macro.njk" import govukRadios %}
3
3
  {% from "input/macro.njk" import govukInput %}
4
4
 
5
- {% set title = mssgs.disability_concession_title_you if data.isLicenceForYou else mssgs.disability_concession_title_other %}
5
+ {% set title = mssgs.disability_concession_title_self if data.isLicenceForYou else mssgs.disability_concession_title_bobo %}
6
6
  {% set describedByTag = "ni-number-hint" %}
7
+ {% set suffix = 'self' if data.isLicenceForYou else 'bobo' %}
7
8
 
8
9
  {%
9
10
  set errorMap = {
@@ -13,10 +14,6 @@
13
14
  'ni-number': {
14
15
  'string.empty': { ref: '#ni-number', text: mssgs.disability_concession_error_ni_empty },
15
16
  'string.pattern.base': { ref: '#ni-number', text: mssgs.disability_concession_error_ni_pattern }
16
- },
17
- 'blue-badge-number': {
18
- 'string.empty': { ref: '#blue-badge-number', text: mssgs.disability_concession_badge_error_msg },
19
- 'string.max': { ref: '#blue-badge-number', text: mssgs.disability_concession_badge_error_msg }
20
17
  }
21
18
  }
22
19
  %}
@@ -38,23 +35,9 @@
38
35
  }) }}
39
36
  {% endset -%}
40
37
 
41
- {% set blueBadge %}
42
- {{ govukInput({
43
- label: {
44
- html: mssgs.disability_concession_badge_error_msg
45
- },
46
- id: "blue-badge-number",
47
- name: "blue-badge-number",
48
- value: payload['blue-badge-number'],
49
- classes: "govuk-input--width-20",
50
- attributes: { maxlength: 25 },
51
- errorMessage: { text: mssgs.disability_concession_badge_error_msg } if error['blue-badge-number']
52
- }) }}
53
- {% endset -%}
54
-
55
38
  {% block pageContent %}
56
39
  {% if not data.hasJunior and not data.hasSenior %}
57
- <p class="govuk-body-m">{{ mssgs.disability_concession_12_month }}</p>
40
+ <p class="govuk-hint">{{ mssgs.disability_concession_12_month }}<a href="https://www.gov.uk/government/publications/blue-badge-can-i-get-one/can-i-get-a-blue-badge" class="govuk-link" target="_blank">{{ mssgs.disability_concession_12_month_link }}</a></p>
58
41
  {% endif %}
59
42
 
60
43
  {{ govukRadios({
@@ -62,21 +45,20 @@
62
45
  name: "disability-concession",
63
46
  items: [
64
47
  {
65
- html: mssgs.disability_concession_radio_pip + '</br> ' + mssgs.disability_concession_radio_dla,
66
- value: data.pipDla,
67
- checked: payload['disability-concession'] === data.pipDla,
68
- conditional: { html: pipDla }
48
+ html: mssgs['disability_concession_radio_pip_' ~ suffix] ~ '<br>' ~ mssgs.disability_concession_radio_dla,
49
+ value: data.pipDla,
50
+ checked: payload['disability-concession'] === data.pipDla,
51
+ conditional: { html: pipDla }
69
52
  },
70
53
  {
71
- text: mssgs.disability_concession_radio_badge,
54
+ text: mssgs['disability_concession_radio_badge_' ~ suffix],
72
55
  value: data.blueBadge,
73
- checked: payload['disability-concession'] === data.blueBadge,
74
- conditional: { html: blueBadge }
56
+ checked: payload['disability-concession'] === data.blueBadge
75
57
  },
76
58
  {
77
- text: mssgs.disability_concession_radio_no,
78
- value: data.no,
79
- checked: payload['disability-concession'] === data.no
59
+ text: mssgs['disability_concession_radio_no_' ~ suffix],
60
+ value: data.no,
61
+ checked: payload['disability-concession'] === data.no
80
62
  }
81
63
  ],
82
64
  errorMessage: { text: mssgs.disability_concession_error_choose_option } if error['disability-concession']
@@ -14,11 +14,6 @@ const validator = Joi.object({
14
14
  is: disabilityConcessionTypes.pipDla,
15
15
  then: validation.contact.createNationalInsuranceNumberValidator(Joi).required(),
16
16
  otherwise: Joi.string().empty('')
17
- }),
18
- 'blue-badge-number': Joi.alternatives().conditional('disability-concession', {
19
- is: disabilityConcessionTypes.blueBadge,
20
- then: Joi.string().max(25).required(),
21
- otherwise: Joi.string().empty('')
22
17
  })
23
18
  }).options({ abortEarly: false, allowUnknown: true })
24
19
 
@@ -19,7 +19,7 @@ export default async request => {
19
19
  concessionHelper.addDisabled(permission, CONCESSION_PROOF.NI, payload['ni-number'])
20
20
  Object.assign(permission, { licenceLength: '12M', licenceStartTime: '0' })
21
21
  } else if (payload['disability-concession'] === disabilityConcessionTypes.blueBadge) {
22
- concessionHelper.addDisabled(permission, CONCESSION_PROOF.blueBadge, payload['blue-badge-number'])
22
+ concessionHelper.addDisabled(permission, CONCESSION_PROOF.blueBadge)
23
23
  Object.assign(permission, { licenceLength: '12M', licenceStartTime: '0' })
24
24
  } else {
25
25
  concessionHelper.removeDisabled(permission)
@@ -5,6 +5,7 @@
5
5
  <meta name="robots" content="noindex">
6
6
  {% endif %}
7
7
 
8
+ {% from "cookie-banner/macro.njk" import govukCookieBanner %}
8
9
  {% from "header/macro.njk" import govukHeader %}
9
10
  {% from "button/macro.njk" import govukButton %}
10
11
  {% from "back-link/macro.njk" import govukBackLink %}
@@ -13,115 +14,112 @@
13
14
  {% set htmlLang = "cy" %}
14
15
  {% endif %}
15
16
 
17
+ {% set govukRebrand = true %}
18
+
16
19
  {% macro csrf() %}
17
20
  <div><input type="hidden" name="{{CSRF_TOKEN_NAME}}" value="{{CSRF_TOKEN_VALUE}}"></div>
18
21
  {% endmacro %}
19
22
 
23
+ {% set cbHtml %}
24
+ <p class="govuk-body">{{ mssgs.analytics_banner_preamble_1 }}</p>
25
+ <p class="govuk-body">{{ mssgs.analytics_banner_preamble_2 }}</p>
26
+ {% endset %}
27
+
20
28
  {% block head %}
21
- <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
22
- <link href="/public/stylesheets/main.css" rel="stylesheet" type="text/css" />
23
- <meta http-equiv="Cache-Control" content="no-store" />
24
- <meta http-equiv="Pragma" content="no-cache">
25
- <meta http-equiv="Expires" content="-1">
29
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
30
+ <link href="/public/stylesheets/main.css" rel="stylesheet" type="text/css" />
31
+ <meta http-equiv="Cache-Control" content="no-store" />
32
+ <meta http-equiv="Pragma" content="no-cache">
33
+ <meta http-equiv="Expires" content="-1">
26
34
  {% endblock %}
27
35
 
28
36
  {% block header %}
29
- {% if displayAnalytics %}
30
- {% if not analyticsMessageDisplayed %}
31
- <form method="POST" novalidate action='{{ uri.analyticsFormAction }}'>
32
- {% if not analyticsSelected %}
33
- <div id="cookie-banner" class="cookie-banner no-print" role="region" aria-label="cookie banner">
34
- <div id="cookie-message" class="cookie-message no-print" role="region" aria-label="cookie message">
35
- <div class="govuk-width-container">
36
- <h2 class="govuk-cookie-banner__heading govuk-heading-m">
37
- {{ mssgs.analytics_banner_title }}
38
- </h2>
39
- <div class="govuk-cookie-banner__content">
40
- <p class="govuk-body">
41
- {{ mssgs.analytics_banner_preamble_1 }}
42
- </p>
43
- <p class="govuk-body">
44
- {{ mssgs.analytics_banner_preamble_2 }}
45
- </p>
46
- </div>
47
- <div class="govuk-button-group">
48
- {{ govukButton({
49
- attributes: { id: 'accept' },
50
- preventDoubleClick: true,
51
- name: "analyticsResponse",
52
- text: mssgs.analytics_banner_accept,
53
- value: 'accept'
54
- }) }}
55
- {{ govukButton({
56
- attributes: { id: 'reject' },
57
- preventDoubleClick: true,
58
- name: "analyticsResponse",
59
- text: mssgs.analytics_banner_reject,
60
- value: 'reject'
61
- }) }}
62
- <a class="govuk-link" href="{{ _uri.cookies }}">{{ mssgs.analytics_banner_view_cookies_link }}</a>
63
- </div>
64
- </div>
65
- </div>
66
- </div>
67
- {% endif %}
68
- {% if analyticsSelected %}
69
- {% if acceptedTracking %}
70
- <div id="cookie-accept" class="cookie-message" role="region" aria-label="cookie accept">
71
- <div class="govuk-width-container">
72
- <div class="govuk-cookie-banner__content">
73
- <p class="govuk-body" id="cookie-acceptance">
74
- {{ mssgs.analytics_banner_acceptance_1 }} <a class="govuk-link" href="{{ _uri.cookies }}">{{ mssgs.analytics_banner_cookies_link }}</a> {{ mssgs.analytics_banner_acceptance_2 }}
75
- </p>
76
- </div>
77
- <div class="govuk-button-group">
78
- {{ govukButton({
79
- attributes: { id: 'hide' },
80
- preventDoubleClick: true,
81
- name: "hide",
82
- text: mssgs.analytics_banner_hide,
83
- value: true
84
- }) }}
85
- </div>
86
- </div>
87
- </div>
88
- </div>
89
- {% else %}
90
- <div id="cookie-reject" class="cookie-banner no-print" role="region">
91
- <div class="govuk-width-container">
92
- <div class="govuk-cookie-banner__content">
93
- <p class="govuk-body">
94
- {{ mssgs.analytics_banner_rejection_1 }} <a class="govuk-link" href="{{ _uri.cookies }}">{{ mssgs.analytics_banner_cookies_link }}</a> {{ mssgs.analytics_banner_rejection_2 }}
95
- </p>
96
- </div>
97
- <div class="govuk-button-group">
98
- {{ govukButton({
99
- attributes: { id: 'hide' },
100
- preventDoubleClick: true,
101
- name: "hideMessage",
102
- text: mssgs.analytics_banner_hide,
103
- value: true
104
- }) }}
105
- </div>
106
- </div>
107
- </div>
108
- {% endif %}
109
- {% endif %}
37
+ <form action="{{ uri.analyticsFormAction }}" method="POST">
38
+ {{ csrf() }}
110
39
 
111
- {{ csrf() }}
112
- </form>
40
+ {% if displayAnalytics and not analyticsMessageDisplayed %}
41
+ {% if not analyticsSelected %}
42
+ {{ govukCookieBanner({
43
+ rebrand: true,
44
+ ariaLabel: mssgs.analytics_banner_title,
45
+ messages: [
46
+ {
47
+ headingText: mssgs.analytics_banner_title,
48
+ html: cbHtml,
49
+ actions: [
50
+ {
51
+ text: mssgs.analytics_banner_accept,
52
+ type: "submit",
53
+ name: "analyticsResponse",
54
+ id: "analytics-accept",
55
+ value: "accept"
56
+ },
57
+ {
58
+ text: mssgs.analytics_banner_reject,
59
+ type: "submit",
60
+ name: "analyticsResponse",
61
+ id: "analytics-reject",
62
+ value: "reject"
63
+ },
64
+ {
65
+ text: mssgs.analytics_banner_view_cookies_link,
66
+ href: _uri.cookies,
67
+ id: "analytics-view"
68
+ }
69
+ ]
70
+ }
71
+ ]
72
+ }) }}
73
+ {% else %}
74
+ {% if acceptedTracking %}
75
+ {% set messageHtml %}
76
+ <p class="govuk-body">
77
+ {{ mssgs.analytics_banner_acceptance_1 }}
78
+ <a class="govuk-link" href="{{ _uri.cookies }}">{{ mssgs.analytics_banner_cookies_link }}</a>
79
+ {{ mssgs.analytics_banner_acceptance_2 }}
80
+ </p>
81
+ {% endset %}
82
+ {% else %}
83
+ {% set messageHtml %}
84
+ <p class="govuk-body">
85
+ {{ mssgs.analytics_banner_rejection_1 }}
86
+ <a class="govuk-link" href="{{ _uri.cookies }}">{{ mssgs.analytics_banner_cookies_link }}</a>
87
+ {{ mssgs.analytics_banner_rejection_2 }}
88
+ </p>
89
+ {% endset %}
113
90
  {% endif %}
91
+
92
+ {{ govukCookieBanner({
93
+ rebrand: true,
94
+ ariaLabel: mssgs.analytics_banner_title,
95
+ messages: [
96
+ {
97
+ html: messageHtml,
98
+ actions: [
99
+ {
100
+ text: mssgs.analytics_banner_hide,
101
+ type: 'submit',
102
+ name: 'hideMessage',
103
+ id: 'hide-message',
104
+ value: "true"
105
+ }
106
+ ]
107
+ }
108
+ ]
109
+ }) }}
110
+ {% endif %}
114
111
  {% endif %}
115
112
 
116
113
  {{ govukHeader({
117
- assetsPath: assetPath + '/images',
118
- homepageUrl: "https://www.gov.uk/",
119
- serviceUrl: "/",
120
- classes: "no-print",
121
- containerClasses: "govuk-width-container",
122
- serviceName: mssgs.header_service_name if not TELESALES else "Get a rod fishing licence (TELESALES)",
123
- useTudorCrown: true
114
+ rebrand: true,
115
+ assetsPath: assetPath + '/images',
116
+ homepageUrl: "https://www.gov.uk/",
117
+ serviceUrl: "/",
118
+ classes: "no-print",
119
+ containerClasses: "govuk-width-container",
120
+ serviceName: mssgs.header_service_name if not TELESALES else "Get a rod fishing licence (TELESALES)"
124
121
  }) }}
122
+ </form>
125
123
  {% endblock %}
126
124
 
127
125
  {% block beforeContent %}
@@ -245,6 +243,7 @@
245
243
  </div>
246
244
  </footer>
247
245
  {% endblock %}
246
+
248
247
  {% block bodyEnd %}
249
248
  <script type="module" src="/public/javascript/govuk-frontend-min.js"></script>
250
249
  <script nonce="{{nonce}}" type="module">
@@ -9,7 +9,8 @@ import {
9
9
  RENEWAL_INACTIVE,
10
10
  LICENCE_LENGTH,
11
11
  CONTACT_SUMMARY,
12
- NEW_TRANSACTION
12
+ NEW_TRANSACTION,
13
+ LICENCE_NOT_FOUND
13
14
  } from '../../../../uri.js'
14
15
  import { start, stop, initialize, injectWithCookies, mockSalesApi } from '../../../../__mocks__/test-utils-system.js'
15
16
 
@@ -52,15 +53,12 @@ mockSalesApi()
52
53
  salesApi.countries.getAll = jest.fn(() => Promise.resolve(mockDefraCountries))
53
54
 
54
55
  describe('The easy renewal identification page', () => {
55
- it('redirects to identify page when called with an invalid permission reference', async () => {
56
+ it('redirects from identify to licence not found page when called with an invalid permission reference', async () => {
56
57
  const data = await injectWithCookies('GET', RENEWAL_PUBLIC.uri.replace('{referenceNumber}', 'not-a-valid-reference-number'))
57
58
  expect(data.statusCode).toBe(302)
58
59
  expect(data.headers.location).toHaveValidPathFor(IDENTIFY.uri)
59
- const data2 = await injectWithCookies('GET', IDENTIFY.uri)
60
- expect(data2.statusCode).toBe(302)
61
- expect(data2.headers.location).toHaveValidPathFor(IDENTIFY.uri)
62
- const data3 = await injectWithCookies('GET', IDENTIFY.uri)
63
- expect(data3.statusCode).toBe(200)
60
+ const data2 = await injectWithCookies('GET', LICENCE_NOT_FOUND.uri)
61
+ expect(data2.statusCode).toBe(200)
64
62
  })
65
63
 
66
64
  it('returns successfully when called with a valid reference ', async () => {
@@ -87,7 +85,7 @@ describe('The easy renewal identification page', () => {
87
85
  expect(data.headers.location).toHaveValidPathFor(IDENTIFY.uri)
88
86
  })
89
87
 
90
- it('redirects back to itself on posting an valid but not authenticated details', async () => {
88
+ it('redirects to licence not found on posting valid but not authenticated details', async () => {
91
89
  salesApi.authenticate.mockImplementation(jest.fn(async () => new Promise(resolve => resolve(null))))
92
90
  await injectWithCookies('GET', VALID_RENEWAL_PUBLIC_URI)
93
91
  await injectWithCookies('GET', IDENTIFY.uri)
@@ -100,8 +98,8 @@ describe('The easy renewal identification page', () => {
100
98
  expect(data.headers.location).toHaveValidPathFor(AUTHENTICATE.uri)
101
99
  const data2 = await injectWithCookies('GET', AUTHENTICATE.uri)
102
100
  expect(data2.statusCode).toBe(302)
103
- expect(data2.headers.location).toHaveValidPathFor(IDENTIFY.uri)
104
- const data3 = await injectWithCookies('GET', IDENTIFY.uri)
101
+ expect(data2.headers.location).toHaveValidPathFor(LICENCE_NOT_FOUND.uri)
102
+ const data3 = await injectWithCookies('GET', LICENCE_NOT_FOUND.uri)
105
103
  expect(data3.statusCode).toBe(200)
106
104
  })
107
105
 
@@ -15,11 +15,7 @@
15
15
  set errorMap = {
16
16
  'referenceNumber' : {
17
17
  'string.empty': { text: mssgs.identify_error_empty, ref: '#ref' },
18
- 'string.pattern.base': { text: mssgs.identify_error_pattern, ref: '#ref' },
19
- 'string.invalid': {
20
- text: mssgs.identify_error_invalid_1 + payload.referenceNumber + mssgs.identify_error_invalid_2,
21
- ref: "#ref"
22
- }
18
+ 'string.pattern.base': { text: mssgs.identify_error_pattern, ref: '#ref' }
23
19
  },
24
20
  'postcode': {
25
21
  'string.empty': { ref: '#postcode', text: mssgs.identify_error_empty_postcode },
@@ -1,4 +1,4 @@
1
- import { IDENTIFY, AUTHENTICATE, NEW_TRANSACTION } from '../../../uri.js'
1
+ import { IDENTIFY, NEW_TRANSACTION, AUTHENTICATE } from '../../../uri.js'
2
2
  import pageRoute from '../../../routes/page-route.js'
3
3
  import Joi from 'joi'
4
4
  import { validation } from '@defra-fish/business-rules-lib'
@@ -0,0 +1,22 @@
1
+ import pageRoute from '../../../../routes/page-route.js'
2
+ import { LICENCE_NOT_FOUND } from '../../../../uri.js'
3
+ import '../route.js'
4
+
5
+ jest.mock('../../../../routes/page-route.js', () => jest.fn())
6
+ jest.mock('../../../../uri.js', () => ({
7
+ RENEWAL_PUBLIC: { uri: Symbol('renewal public uri') },
8
+ LICENCE_NOT_FOUND: {
9
+ page: Symbol('licence-not-found page'),
10
+ uri: Symbol('licence-not-found uri')
11
+ }
12
+ }))
13
+
14
+ describe('LICENCE_NOT_FOUND route', () => {
15
+ it('passes LICENCE_NOT_FOUND.page as the first argument to pageRoute', () => {
16
+ expect(pageRoute.mock.calls[0][0]).toBe(LICENCE_NOT_FOUND.page)
17
+ })
18
+
19
+ it('passes LICENCE_NOT_FOUND.uri as the second argument to pageRoute', () => {
20
+ expect(pageRoute.mock.calls[0][1]).toBe(LICENCE_NOT_FOUND.uri)
21
+ })
22
+ })
@@ -0,0 +1,23 @@
1
+ {% extends "layout.njk" %}
2
+ {% extends "standard-form.njk" %}
3
+
4
+ {% set title = mssgs.licence_not_found_title %}
5
+
6
+ {% block content %}
7
+ <div class="govuk-grid-row">
8
+ <div class="govuk-grid-column-two-thirds">
9
+ <h1 class="govuk-heading-l">{{ mssgs.licence_not_found_title }}</h1>
10
+ <p class="govuk-body">
11
+ {{ mssgs.licence_not_found_body_1 }}
12
+ <a class="govuk-link" href="/buy/renew/identify">{{ mssgs.licence_not_found_body_previous_page }}</a>{{ mssgs.full_stop }}
13
+ </p>
14
+ <p class="govuk-body">
15
+ {{ mssgs.licence_not_found_body_2 }}
16
+ <a href="mailto:enquiries@environment-agency.gov.uk">{{ mssgs.licence_not_found_body_ea_link }}</a>
17
+ {{ mssgs.licence_not_found_body_3 }}
18
+ <a href="https://www.gov.uk/call-charges" target="_blank" rel="noopener">
19
+ {{ mssgs.licence_not_found_body_call_charges_link }}</a>{{ mssgs.full_stop }}
20
+ </p>
21
+ </div>
22
+ </div>
23
+ {% endblock %}
@@ -0,0 +1,4 @@
1
+ import { LICENCE_NOT_FOUND } from '../../../uri.js'
2
+ import pageRoute from '../../../routes/page-route.js'
3
+
4
+ export default pageRoute(LICENCE_NOT_FOUND.page, LICENCE_NOT_FOUND.uri, null)
@@ -599,7 +599,7 @@ Array [
599
599
  "text": "licence_summary_disability_concession",
600
600
  },
601
601
  "value": Object {
602
- "html": "<span>licence_summary_none</span>",
602
+ "html": "licence_summary_none",
603
603
  },
604
604
  },
605
605
  Object {
@@ -930,15 +930,15 @@ Array [
930
930
  },
931
931
  "href": "/buy/disability-concession",
932
932
  "text": "contact_summary_change",
933
- "visuallyHiddenText": "licence_summary_blue_badge_num",
933
+ "visuallyHiddenText": "licence_summary_blue_badge",
934
934
  },
935
935
  ],
936
936
  },
937
937
  "key": Object {
938
- "text": "licence_summary_blue_badge_num",
938
+ "text": "licence_summary_blue_badge",
939
939
  },
940
940
  "value": Object {
941
- "html": "AB1 CDE 0 1234F5678",
941
+ "html": "licence_summary_blue_badge_eligible",
942
942
  },
943
943
  },
944
944
  Object {
@@ -1172,7 +1172,7 @@ Array [
1172
1172
  "text": "licence_summary_disability_concession",
1173
1173
  },
1174
1174
  "value": Object {
1175
- "html": "<span>licence_summary_none</span>",
1175
+ "html": "licence_summary_none",
1176
1176
  },
1177
1177
  },
1178
1178
  Object {
@@ -84,7 +84,8 @@ const getMockRequest = ({
84
84
  licence_type_12m: 'licence_type_12m',
85
85
  licence_type_8d: 'licence_type_8d',
86
86
  licence_type_1d: 'licence_type_1d',
87
- licence_summary_blue_badge_num: 'licence_summary_blue_badge_num',
87
+ licence_summary_blue_badge: 'licence_summary_blue_badge',
88
+ licence_summary_blue_badge_eligible: 'licence_summary_blue_badge_eligible',
88
89
  licence_summary_ni_num: 'licence_summary_ni_num',
89
90
  licence_summary_disability_concession: 'licence_summary_disability_concession',
90
91
  free: 'gratis',
@@ -163,8 +164,7 @@ const getMockBlueBadgePermission = () => ({
163
164
  {
164
165
  type: mappingConstants.CONCESSION.DISABLED,
165
166
  proof: {
166
- type: mappingConstants.CONCESSION_PROOF.blueBadge,
167
- referenceNumber: 'AB1 CDE 0 1234F5678'
167
+ type: mappingConstants.CONCESSION_PROOF.blueBadge
168
168
  }
169
169
  }
170
170
  ]
@@ -70,7 +70,7 @@ class RowGenerator {
70
70
 
71
71
  _getConcessionText () {
72
72
  if (this.disabled?.proof?.type === CONCESSION_PROOF.blueBadge) {
73
- return this.labels.licence_summary_blue_badge_num
73
+ return this.labels.licence_summary_blue_badge
74
74
  } else if (this.disabled?.proof?.type === CONCESSION_PROOF.NI) {
75
75
  return this.labels.licence_summary_ni_num
76
76
  }
@@ -93,7 +93,16 @@ class RowGenerator {
93
93
  }
94
94
 
95
95
  generateConcessionRow () {
96
- const label = this.disabled ? this.disabled.proof.referenceNumber : `<span>${this.labels.licence_summary_none}</span>`
96
+ const label = (() => {
97
+ if (this.disabled?.proof?.type === CONCESSION_PROOF.blueBadge) {
98
+ return this.labels.licence_summary_blue_badge_eligible
99
+ }
100
+ if (this.disabled?.proof?.type === CONCESSION_PROOF.NI) {
101
+ return this.disabled.proof.referenceNumber
102
+ }
103
+ return this.labels.licence_summary_none
104
+ })()
105
+
97
106
  const concessionText = this._getConcessionText()
98
107
  return this._generateRow(concessionText, label, DISABILITY_CONCESSION.uri, concessionText, 'change-benefit-check')
99
108
  }
@@ -28,7 +28,8 @@ import {
28
28
  RENEWAL_INACTIVE,
29
29
  RENEWAL_START_DATE,
30
30
  CHOOSE_PAYMENT,
31
- SET_UP_PAYMENT
31
+ SET_UP_PAYMENT,
32
+ LICENCE_NOT_FOUND
32
33
  } from '../uri.js'
33
34
 
34
35
  import { CommonResults, CONTACT_SUMMARY_SEEN, ShowDigitalLicencePages } from '../constants.js'
@@ -416,6 +417,11 @@ export default [
416
417
  }
417
418
  },
418
419
 
420
+ {
421
+ current: LICENCE_NOT_FOUND,
422
+ backLink: IDENTIFY.uri
423
+ },
424
+
419
425
  // The change start time is handled directly - not via the controller, as it has dynamic validation
420
426
  {
421
427
  current: RENEWAL_START_DATE,
@@ -30,6 +30,7 @@ import paymentFailed from '../pages/payment/failed/route.js'
30
30
  import identify from '../pages/renewals/identify/route.js'
31
31
  import invalidLink from '../pages/renewals/renewal-inactive/route.js'
32
32
  import renewalStartDate from '../pages/renewals/renewal-start-date/route.js'
33
+ import licenceNotFound from '../pages/renewals/licence-not-found/route.js'
33
34
 
34
35
  import staticAssets from './static-routes.js'
35
36
  import miscRoutes from './misc-routes.js'
@@ -71,7 +72,8 @@ const routes = [
71
72
  ...invalidLink,
72
73
  ...renewalStartDate,
73
74
  ...choosePayment,
74
- ...setUpRecurring
75
+ ...setUpRecurring,
76
+ ...licenceNotFound
75
77
  ]
76
78
 
77
79
  if (process.env.CHANNEL === 'telesales') {
@@ -1,8 +1,8 @@
1
1
  import fetch from 'node-fetch'
2
-
3
2
  import { ADDRESS_LOOKUP_SERVICE, ADDRESS_LOOKUP_TIMEOUT_MS_DEFAULT } from '../../constants.js'
4
3
  import db from 'debug'
5
4
  const debug = db('webapp:address-lookup-service')
5
+
6
6
  export default async (premises, postcode) => {
7
7
  const url = new URL(process.env.ADDRESS_LOOKUP_URL)
8
8
 
package/src/uri.js CHANGED
@@ -48,6 +48,7 @@ export const IDENTIFY = { uri: '/buy/renew/identify', page: 'identify' }
48
48
  export const RENEWAL_INACTIVE = { uri: '/buy/renew/inactive', page: 'renewal-inactive' }
49
49
  export const AUTHENTICATE = { uri: '/buy/renew/authenticate' }
50
50
  export const RENEWAL_START_DATE = { uri: '/buy/renew/renewal-start-date', page: 'renewal-start-date' }
51
+ export const LICENCE_NOT_FOUND = { uri: '/buy/renew/licence-not-found', page: 'licence-not-found' }
51
52
 
52
53
  export const CONTROLLER = { uri: '/buy' }
53
54
  export const NEW_TRANSACTION = { uri: '/buy/new' }