From d6590619944af9900ec127d7fbadce4a05cab6df Mon Sep 17 00:00:00 2001 From: chisomoguibe Date: Thu, 26 Jan 2023 12:07:26 +0000 Subject: [PATCH 01/18] First attempt adding 3 extra reference numbers to the question "Which, if any, of the following reference numbers do you have" - Added additional fields in fields.json and pages.json - Append those fields inside fields array for url path /application-ref-numbers - Add same reference validation style for added fields in fields/index.js --- apps/ukvi-complaints/fields/index.js | 544 +++++------------- apps/ukvi-complaints/index.js | 8 +- .../translations/src/en/fields.json | 33 ++ .../translations/src/en/pages.json | 9 + test/_unit/test-data/complaint-base.js | 2 + 5 files changed, 188 insertions(+), 408 deletions(-) diff --git a/apps/ukvi-complaints/fields/index.js b/apps/ukvi-complaints/fields/index.js index 71517cfe..edb43ce0 100644 --- a/apps/ukvi-complaints/fields/index.js +++ b/apps/ukvi-complaints/fields/index.js @@ -6,32 +6,14 @@ const moment = require('moment'); module.exports = { reason: { mixin: 'radio-group', - options: [ - 'immigration-application', - 'immigration-appointment', - 'delays', - 'immigration-decision', - 'biometric-residence-permit', - 'refund', - 'staff-behaviour', - 'existing-complaint', - 'other-complaint' - ], + options: ['immigration-application', 'immigration-appointment', 'delays', 'immigration-decision', 'biometric-residence-permit', 'refund', 'staff-behaviour', 'existing-complaint', 'other-complaint'], validate: 'required' }, 'immigration-application': { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'technical-issues', - 'guidance', - 'complain' - ] + }, className: ['form-group'], options: ['technical-issues', 'guidance', 'complain'] }, 'immigration-appointment': { @@ -41,77 +23,35 @@ module.exports = { className: 'visuallyhidden' }, className: ['form-group'], - options: [ - 'lack-availability', - 'change-appointment', - 'technical-appointments', - 'questions-appointments', - 'complain-appointments' - ] - }, - 'where-applied-from': { - mixin: 'radio-group', - validate: 'required', - legend: { + options: ['lack-availability', 'change-appointment', 'technical-appointments', 'questions-appointments', 'complain-appointments'] + }, 'where-applied-from': { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'inside-uk', - 'outside-uk' - ] + }, className: ['form-group'], options: ['inside-uk', 'outside-uk'] }, 'delay-type': { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'application-delay', - 'return-of-documents' - ] + }, className: ['form-group'], options: ['application-delay', 'return-of-documents'] }, 'application-delay': { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'request-upgrade', - 'application-ref-numbers' - ] + }, className: ['form-group'], options: ['request-upgrade', 'application-ref-numbers'] }, delays: { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'delay-decision', - 'delay-docs' - ] + }, className: ['form-group'], options: ['delay-decision', 'delay-docs'] }, 'have-reference-numbers': { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'yes', - 'no' - ] + }, className: ['form-group'], options: ['yes', 'no'] }, // 'reference-numbers': { @@ -129,498 +69,288 @@ module.exports = { // }, 'requested-documents': { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'yes', - 'no' - ] + }, className: ['form-group'], options: ['yes', 'no'] }, 'have-requested': { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'used-service', - 'something-else' - ] + }, className: ['form-group'], options: ['used-service', 'something-else'] }, 'return-of-documents': { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'yes-docs-service', - 'yes-other', - 'no' - ] + }, className: ['form-group'], options: ['yes-docs-service', 'yes-other', 'no'] }, 'immigration-decision': { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'yes', - 'no' - ] + }, className: ['form-group'], options: ['yes', 'no'] }, 'decision-outcome': { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'negative', - 'positive' - ] + }, className: ['form-group'], options: ['negative', 'positive'] }, 'immigration-status-change': { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'questions-status-change', - 'complain-status-change' - ] + }, className: ['form-group'], options: ['questions-status-change', 'complain-status-change'] }, 'biometric-residence-permit': { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'card-not-arrived', - 'card-incorrect', - 'complain-brp' - ] + }, className: ['form-group'], options: ['card-not-arrived', 'card-incorrect', 'complain-brp'] }, 'refund-type': { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'standard', - 'priority', - 'super-priority', - 'premium', - 'ihs', - 'eu-settlement' - ] + }, className: ['form-group'], options: ['standard', 'priority', 'super-priority', 'premium', 'ihs', 'eu-settlement'] }, 'refund-type-automatic': { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'ihs', - 'eu-settlement' - ] + }, className: ['form-group'], options: ['ihs', 'eu-settlement'] }, refund: { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'yes', - 'no', - 'not-yet' - ] - }, - 'refund-when': { - mixin: 'radio-group', - validate: 'required', - legend: { + }, className: ['form-group'], options: ['yes', 'no', 'not-yet'] + }, 'refund-when': { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'less-than', - 'more-than' - ] - }, - 'staff-behaviour': { - mixin: 'radio-group', - validate: 'required', - legend: { + }, className: ['form-group'], options: ['less-than', 'more-than'] + }, 'staff-behaviour': { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'face-to-face', - 'on-phone', - 'in-letter' - ] + }, className: ['form-group'], options: ['face-to-face', 'on-phone', 'in-letter'] }, 'which-centre': { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'vac', - 'ssc', - 'ukvcas' - ] + }, className: ['form-group'], options: ['vac', 'ssc', 'ukvcas'] }, 'vac-country': { mixin: 'select', - options: [{ label: ' ', value: '' }].concat(require('hof').utils.countries()), - validate: ['required', { type: 'maxlength', arguments: 100 }], + options: [{label: ' ', value: ''}].concat(require('hof').utils.countries()), + validate: ['required', {type: 'maxlength', arguments: 100}], className: ['typeahead'] }, 'vac-city': { - mixin: 'input-text', - validate: ['required', 'notUrl', { type: 'maxlength', arguments: 100 }], - legend: { + mixin: 'input-text', validate: ['required', 'notUrl', {type: 'maxlength', arguments: 100}], legend: { className: 'visuallyhidden' } }, 'ssc-city': { - mixin: 'input-text', - validate: ['required', 'notUrl', { type: 'maxlength', arguments: 100 }], - legend: { + mixin: 'input-text', validate: ['required', 'notUrl', {type: 'maxlength', arguments: 100}], legend: { className: 'visuallyhidden' - }, - className: ['form-group'] + }, className: ['form-group'] }, 'ukvcas-city': { - mixin: 'input-text', - validate: ['required', 'notUrl', { type: 'maxlength', arguments: 100 }], - legend: { + mixin: 'input-text', validate: ['required', 'notUrl', {type: 'maxlength', arguments: 100}], legend: { className: 'visuallyhidden' - }, - className: ['form-group'] - }, - 'called-number': { - mixin: 'input-text', - validate: ['required', 'notUrl', { type: 'maxlength', arguments: 50 }], - legend: { + }, className: ['form-group'] + }, 'called-number': { + mixin: 'input-text', validate: ['required', 'notUrl', {type: 'maxlength', arguments: 50}], legend: { className: 'visuallyhidden' - }, - className: ['form-group'] - }, - 'called-date': { - mixin: 'input-text', - validate: ['required', 'notUrl', { type: 'maxlength', arguments: 50 }], - legend: { + }, className: ['form-group'] + }, 'called-date': { + mixin: 'input-text', validate: ['required', 'notUrl', {type: 'maxlength', arguments: 50}], legend: { className: 'visuallyhidden' - }, - className: ['form-group'] - }, - 'called-time': { - mixin: 'input-text', - validate: ['required', 'notUrl', { type: 'maxlength', arguments: 50 }], - legend: { + }, className: ['form-group'] + }, 'called-time': { + mixin: 'input-text', validate: ['required', 'notUrl', {type: 'maxlength', arguments: 50}], legend: { className: 'visuallyhidden' - }, - className: ['form-group'] - }, - 'called-from': { - mixin: 'input-text', - validate: ['required', 'notUrl', { type: 'maxlength', arguments: 50 }], - legend: { + }, className: ['form-group'] + }, 'called-from': { + mixin: 'input-text', validate: ['required', 'notUrl', {type: 'maxlength', arguments: 50}], legend: { className: 'visuallyhidden' - }, - className: ['form-group'] + }, className: ['form-group'] }, 'existing-complaint': { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'yes', - 'no' - ] + }, className: ['form-group'], options: ['yes', 'no'] }, 'complaint-reason-previous': { mixin: 'radio-group', - options: [ - 'immigration-application', - 'immigration-appointment', - 'delays', - 'immigration-decision', - 'immigration-status-change', - 'biometric-residence-permit', - 'refund', - 'staff-behaviour', - 'other-complaint' - ], + options: ['immigration-application', 'immigration-appointment', 'delays', 'immigration-decision', 'immigration-status-change', 'biometric-residence-permit', 'refund', 'staff-behaviour', 'other-complaint'], validate: 'required' }, 'other-complaint': { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'technical-issues', - 'questions', - 'complain' - ] - }, - 'reference-numbers': { - mixin: 'radio-group', - legend: { + }, className: ['form-group'], options: ['technical-issues', 'questions', 'complain'] + }, 'reference-numbers': { + mixin: 'radio-group', legend: { className: 'visuallyhidden' - }, - validate: 'required', - options: [{ - value: 'gwf', - toggle: 'gwf-reference', - child: 'input-text' + }, validate: 'required', options: [{ + value: 'gwf', toggle: 'gwf-reference', child: 'input-text' + }, { + value: 'ho', toggle: 'ho-reference', child: 'input-text' }, { - value: 'ho', - toggle: 'ho-reference', - child: 'input-text' + value: 'ihs', toggle: 'ihs-reference', child: 'input-text' }, { - value: 'ihs', - toggle: 'ihs-reference', - child: 'input-text' + value: 'uan', toggle: 'uan-reference', child: 'input-text' }, { - value: 'uan', - toggle: 'uan-reference', - child: 'input-text' + value: 'case-id', toggle: 'case-id-reference', child: 'input-text' + }, { + value: 'payment', toggle: 'payment-reference', child: 'input-text' + }, { + value: 'other', toggle: 'other-reference', child: 'input-text' }, { value: 'none' }] - }, - 'gwf-reference': { - validate: ['required', 'notUrl', { type: 'maxlength', arguments: 100 }], - dependent: { - field: 'reference-numbers', - value: 'gwf' + }, 'gwf-reference': { + validate: ['required', 'notUrl', {type: 'maxlength', arguments: 100}], dependent: { + field: 'reference-numbers', value: 'gwf' } + }, 'ho-reference': { + dependent: { + field: 'reference-numbers', value: 'ho' + }, validate: ['required', 'notUrl', {type: 'maxlength', arguments: 100}] + }, 'ihs-reference': { + dependent: { + field: 'reference-numbers', value: 'ihs' + }, validate: ['required', 'notUrl', {type: 'maxlength', arguments: 100}] + }, 'uan-reference': { + dependent: { + field: 'reference-numbers', value: 'uan' + }, validate: ['required', 'notUrl', {type: 'maxlength', arguments: 100}] }, - 'ho-reference': { + 'case-id-reference': { dependent: { - field: 'reference-numbers', - value: 'ho' - }, - validate: ['required', 'notUrl', { type: 'maxlength', arguments: 100 }] + field: 'reference-numbers', value: 'case-id' + }, validate: ['required', 'notUrl', {type: 'maxlength', arguments: 100}] }, - 'ihs-reference': { + 'payment-reference': { dependent: { - field: 'reference-numbers', - value: 'ihs' - }, - validate: ['required', 'notUrl', { type: 'maxlength', arguments: 100 }] + field: 'reference-numbers', value: 'payment' + }, validate: ['required', 'notUrl', {type: 'maxlength', arguments: 100}] }, - 'uan-reference': { + 'other-reference': { dependent: { - field: 'reference-numbers', - value: 'uan' - }, - validate: ['required', 'notUrl', { type: 'maxlength', arguments: 100 }] + field: 'reference-numbers', value: 'other' + }, validate: ['required', 'notUrl', {type: 'maxlength', arguments: 100}] }, 'when-applied': { - mixin: 'input-text', - validate: ['required', 'notUrl', { type: 'maxlength', arguments: 50 }], - legend: { + mixin: 'input-text', validate: ['required', 'notUrl', {type: 'maxlength', arguments: 50}], legend: { className: 'visuallyhidden' - }, - className: [''] + }, className: [''] }, 'complaint-reference-number': { - mixin: 'input-text', - validate: ['notUrl', { type: 'maxlength', arguments: 100 }] - }, - 'complaint-details': { + mixin: 'input-text', validate: ['notUrl', {type: 'maxlength', arguments: 100}] + }, 'complaint-details': { mixin: 'textarea', attributes: [{ - attribute: 'rows', - value: 12 + attribute: 'rows', value: 12 }], - validate: ['required', { type: 'maxlength', arguments: 50000 }], + validate: ['required', {type: 'maxlength', arguments: 50000}], 'ignore-defaults': true, formatter: ['trim', 'hyphens'], className: ['govuk-js-character-count'] }, 'acting-as-agent': { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'yes', - 'no' - ] + }, className: ['form-group'], options: ['yes', 'no'] }, 'who-representing': { - mixin: 'radio-group', - validate: 'required', - options: [ - 'legal-rep', - 'relative', - 'sponsor', - 'support-org' - ] + mixin: 'radio-group', validate: 'required', options: ['legal-rep', 'relative', 'sponsor', 'support-org'] }, 'agent-name': { - mixin: 'input-text', - validate: ['required', 'notUrl', { type: 'maxlength', arguments: 150 }], - legend: { + mixin: 'input-text', validate: ['required', 'notUrl', {type: 'maxlength', arguments: 150}], legend: { className: 'visuallyhidden' - }, - className: [''] + }, className: [''] }, 'agent-email': { - mixin: 'input-text', - validate: ['required', 'email', { type: 'maxlength', arguments: 256 }], - legend: { + mixin: 'input-text', validate: ['required', 'email', {type: 'maxlength', arguments: 256}], legend: { className: 'visuallyhidden' - }, - className: [''] + }, className: [''] }, 'agent-phone': { - mixin: 'input-text', - validate: ['notUrl', { type: 'maxlength', arguments: 50 }], - legend: { + mixin: 'input-text', validate: ['notUrl', {type: 'maxlength', arguments: 50}], legend: { className: 'visuallyhidden' - }, - className: ['govuk-input', 'govuk-input--width-20'] + }, className: ['govuk-input', 'govuk-input--width-20'] }, 'applicant-name': { - mixin: 'input-text', - validate: ['required', 'notUrl', { type: 'maxlength', arguments: 100 }], - legend: { + mixin: 'input-text', validate: ['required', 'notUrl', {type: 'maxlength', arguments: 100}], legend: { className: 'visuallyhidden' - }, - className: [''] + }, className: [''] }, 'applicant-dob': dateComponent('applicant-dob', { - mixin: 'input-date', - validate: [ - 'required', - 'date', - { type: 'before', arguments: moment().subtract(18, 'years').format('YYYY-MM-DD') }, - { type: 'after', arguments: '1900-01-01' }] + mixin: 'input-date', validate: ['required', 'date', { + type: 'before', arguments: moment().subtract(18, 'years').format('YYYY-MM-DD') + }, {type: 'after', arguments: '1900-01-01'}] }), 'agent-representative-dob': dateComponent('agent-representative-dob', { - mixin: 'input-date', - validate: [ - 'required', - 'date', - { type: 'before', arguments: moment().subtract(18, 'years').format('YYYY-MM-DD') }, - { type: 'after', arguments: '1900-01-01' }] + mixin: 'input-date', validate: ['required', 'date', { + type: 'before', arguments: moment().subtract(18, 'years').format('YYYY-MM-DD') + }, {type: 'after', arguments: '1900-01-01'}] }), 'applicant-email': { - mixin: 'input-text', - validate: ['required', 'email', { type: 'maxlength', arguments: 256 }], - legend: { + mixin: 'input-text', validate: ['required', 'email', {type: 'maxlength', arguments: 256}], legend: { className: 'visuallyhidden' - }, - className: [''] + }, className: [''] }, 'applicant-nationality': { mixin: 'select', - options: [{ label: ' ', value: '' }].concat(require('hof').utils.countries()), + options: [{label: ' ', value: ''}].concat(require('hof').utils.countries()), validate: 'required', className: ['typeahead'] }, 'agent-representative-name': { - mixin: 'input-text', - validate: ['required', 'notUrl', { type: 'maxlength', arguments: 100 }], - legend: { + mixin: 'input-text', validate: ['required', 'notUrl', {type: 'maxlength', arguments: 100}], legend: { className: 'visuallyhidden' - }, - className: [''] + }, className: [''] }, 'agent-representative-nationality': { mixin: 'select', - options: [{ label: ' ', value: '' }].concat(require('hof').utils.countries()), + options: [{label: ' ', value: ''}].concat(require('hof').utils.countries()), validate: 'required', className: ['typeahead'] }, 'applicant-phone': { - mixin: 'input-text', - validate: ['notUrl', { type: 'maxlength', arguments: 50 }], - legend: { + mixin: 'input-text', validate: ['notUrl', {type: 'maxlength', arguments: 50}], legend: { className: 'visuallyhidden' - }, - className: ['govuk-input', 'govuk-input--width-20'] + }, className: ['govuk-input', 'govuk-input--width-20'] }, where: { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'phone', - 'visa-application-centre', - 'premium-service-centre', - 'letter' - ] + }, className: ['form-group'], options: ['phone', 'visa-application-centre', 'premium-service-centre', 'letter'] } }; diff --git a/apps/ukvi-complaints/index.js b/apps/ukvi-complaints/index.js index 76a40e14..9f8aba67 100644 --- a/apps/ukvi-complaints/index.js +++ b/apps/ukvi-complaints/index.js @@ -365,7 +365,10 @@ module.exports = { 'gwf-reference', 'ho-reference', 'ihs-reference', - 'uan-reference' + 'uan-reference', + 'case-id-reference', + 'payment-reference', + 'other-reference' ], next: '/acting-as-agent' }, @@ -898,6 +901,9 @@ module.exports = { 'ho-reference', 'ihs-reference', 'uan-reference', + 'case-id-reference', + 'payment-reference', + 'other-reference', 'complaint-details' ], 'agent-details': [ diff --git a/apps/ukvi-complaints/translations/src/en/fields.json b/apps/ukvi-complaints/translations/src/en/fields.json index c47a3661..0990e747 100644 --- a/apps/ukvi-complaints/translations/src/en/fields.json +++ b/apps/ukvi-complaints/translations/src/en/fields.json @@ -150,6 +150,15 @@ "uan": { "label": "Unique Application Number" }, + "case-id": { + "label": "Case ID" + }, + "payment": { + "label": "Payment reference number" + }, + "other": { + "label": "Other reference number" + }, "none": { "label": "I don’t have any of these " } @@ -190,6 +199,30 @@ "notUrl": "Enter the Unique Application Number" } }, + "case-id-reference": { + "label": "Enter your Case ID number", + "hint": null, + "validation": { + "required": "Enter your Case ID number", + "notUrl": "Enter your Case ID number" + } + }, + "payment-reference": { + "label": "Enter your payment reference number", + "hint": null, + "validation": { + "required": "Enter your payment reference number", + "notUrl": "Enter your payment reference number" + } + }, + "other-reference": { + "label": "Enter your reference number", + "hint": null, + "validation": { + "required": "Enter your reference number", + "notUrl": "Enter your reference number" + } + }, "agent-representative-dob": { "hint": "For example, 31 3 1980", "summary": "Date of birth", diff --git a/apps/ukvi-complaints/translations/src/en/pages.json b/apps/ukvi-complaints/translations/src/en/pages.json index 602e83eb..eb0bd4b5 100644 --- a/apps/ukvi-complaints/translations/src/en/pages.json +++ b/apps/ukvi-complaints/translations/src/en/pages.json @@ -366,6 +366,15 @@ "uan-reference": { "label": "Unique Application Number" }, + "case-id-reference": { + "label": "Enter your Case ID number" + }, + "payment-reference": { + "label": "Enter your payment reference number" + }, + "other-reference": { + "label": "Enter your reference number" + }, "none": { "label": "I don’t have any of these" }, diff --git a/test/_unit/test-data/complaint-base.js b/test/_unit/test-data/complaint-base.js index edd8e09c..4bd2206b 100644 --- a/test/_unit/test-data/complaint-base.js +++ b/test/_unit/test-data/complaint-base.js @@ -6,6 +6,8 @@ const complaintDetailsBase = { 'ho-reference': '', 'ihs-reference': '', 'uan-reference': '', + 'case-id-reference': '', + 'payment-reference': '', 'acting-as-agent': 'no', 'applicant-name': 'JJ', 'applicant-dob': '1980-02-02', From 67e5a7236d8a7888b7f424a880ec27614b300450 Mon Sep 17 00:00:00 2001 From: chisomoguibe Date: Wed, 1 Feb 2023 11:58:53 +0000 Subject: [PATCH 02/18] fix eslint errors --- apps/ukvi-complaints/fields/index.js | 32 +++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/apps/ukvi-complaints/fields/index.js b/apps/ukvi-complaints/fields/index.js index edb43ce0..cc5ef56d 100644 --- a/apps/ukvi-complaints/fields/index.js +++ b/apps/ukvi-complaints/fields/index.js @@ -6,7 +6,17 @@ const moment = require('moment'); module.exports = { reason: { mixin: 'radio-group', - options: ['immigration-application', 'immigration-appointment', 'delays', 'immigration-decision', 'biometric-residence-permit', 'refund', 'staff-behaviour', 'existing-complaint', 'other-complaint'], + options: [ + 'immigration-application', + 'immigration-appointment', + 'delays', + 'immigration-decision', + 'biometric-residence-permit', + 'refund', + 'staff-behaviour', + 'existing-complaint', + 'other-complaint' + ], validate: 'required' }, @@ -23,7 +33,13 @@ module.exports = { className: 'visuallyhidden' }, className: ['form-group'], - options: ['lack-availability', 'change-appointment', 'technical-appointments', 'questions-appointments', 'complain-appointments'] + options: [ + 'lack-availability', + 'change-appointment', + 'technical-appointments', + 'questions-appointments', + 'complain-appointments' + ] }, 'where-applied-from': { mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' @@ -191,7 +207,17 @@ module.exports = { 'complaint-reason-previous': { mixin: 'radio-group', - options: ['immigration-application', 'immigration-appointment', 'delays', 'immigration-decision', 'immigration-status-change', 'biometric-residence-permit', 'refund', 'staff-behaviour', 'other-complaint'], + options: [ + 'immigration-application', + 'immigration-appointment', + 'delays', + 'immigration-decision', + 'immigration-status-change', + 'biometric-residence-permit', + 'refund', + 'staff-behaviour', + 'other-complaint' + ], validate: 'required' }, From 7b98ea79f355b0e7b6ce4948cd334ab813b0ec8f Mon Sep 17 00:00:00 2001 From: chisomoguibe Date: Wed, 1 Feb 2023 12:15:38 +0000 Subject: [PATCH 03/18] upgrade hof package from v20.1.10 to v20.1.19 --- package.json | 2 +- yarn.lock | 75 +++++++++++++++++++++------------------------------- 2 files changed, 31 insertions(+), 46 deletions(-) diff --git a/package.json b/package.json index 7d938570..ea2f9880 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ }, "dependencies": { "aws4": "^1.11.0", - "hof": "^20.1.10", + "hof": "^20.1.19", "hot-shots": "^8.5.0", "jquery": "^3.6.0", "jsonschema": "^1.4.0", diff --git a/yarn.lock b/yarn.lock index c217fcac..9e002cdd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3961,10 +3961,10 @@ hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hof@^20.1.10: - version "20.1.17" - resolved "https://registry.yarnpkg.com/hof/-/hof-20.1.17.tgz#8f9507fb88059df152d6af183019cd4374936b03" - integrity sha512-TVLPAEvAfP1PLTdm/iVk/7FBJeqEYa5lyiS3nNk7CEFgvQb45HA2bhvo4W/kVc3NJS2dFYdKMjPUWl7aLAx5dQ== +hof@^20.1.19: + version "20.2.1" + resolved "https://registry.yarnpkg.com/hof/-/hof-20.2.1.tgz#0c90eb5976326af19ce5649d6c6d81296e941925" + integrity sha512-VLQTW4GZgBZrcLqrYwnXzoYH16rq0j9ibV9d6zHLSOqfRaom1XJmHZ7yQnKZ6lr36JtzHXVeYsg0/H2mDXtpKA== dependencies: aliasify "^2.1.0" bluebird "^3.7.2" @@ -4010,12 +4010,12 @@ hof@^20.1.10: nodemailer-ses-transport "^1.5.0" nodemailer-smtp-transport "^2.7.4" nodemailer-stub-transport "^1.1.0" - notifications-node-client "^5.1.1" + notifications-node-client "^6.0.0" redis "^3.1.2" reqres "^3.0.1" request "^2.79.0" rimraf "^3.0.2" - sass "^1.35.2" + sass "^1.56.2" serve-static "^1.14.1" uglify-js "^3.14.3" underscore "^1.12.1" @@ -4769,21 +4769,15 @@ jsonschema@^1.4.0: resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.0.tgz#1afa34c4bc22190d8e42271ec17ac8b3404f87b2" integrity sha512-/YgW6pRMr6M7C+4o8kS+B/2myEpHCrxO4PEWnqJNBFMjn7EWXqlQ4tGwL6xTHeRplwuZmcAncdvfOad1nT2yMw== -jsonwebtoken@^8.2.1: - version "8.5.1" - resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" - integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== +jsonwebtoken@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz#d0faf9ba1cc3a56255fe49c0961a67e520c1926d" + integrity sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw== dependencies: jws "^3.2.2" - lodash.includes "^4.3.0" - lodash.isboolean "^3.0.3" - lodash.isinteger "^4.0.4" - lodash.isnumber "^3.0.3" - lodash.isplainobject "^4.0.6" - lodash.isstring "^4.0.1" - lodash.once "^4.0.0" + lodash "^4.17.21" ms "^2.1.1" - semver "^5.6.0" + semver "^7.3.8" jsprim@^1.2.2: version "1.4.2" @@ -5018,11 +5012,6 @@ lodash.has@^4.5.2: resolved "https://registry.yarnpkg.com/lodash.has/-/lodash.has-4.5.2.tgz#d19f4dc1095058cccbe2b0cdf4ee0fe4aa37c862" integrity sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI= -lodash.includes@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" - integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== - lodash.invert@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.invert/-/lodash.invert-4.3.0.tgz#8ffe20d4b616f56bea8f1aa0c6ebd80dcf742aee" @@ -5048,11 +5037,6 @@ lodash.isfunction@^3.0.9: resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" integrity sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw== -lodash.isinteger@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" - integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== - lodash.isnumber@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" @@ -5108,11 +5092,6 @@ lodash.omit@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" integrity sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA= -lodash.once@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" - integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== - lodash.orderby@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.orderby/-/lodash.orderby-4.6.0.tgz#e697f04ce5d78522f54d9338b32b81a3393e4eb3" @@ -5757,14 +5736,13 @@ normalize-url@^6.0.1: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== -notifications-node-client@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/notifications-node-client/-/notifications-node-client-5.1.1.tgz#d98ebf07828a6e999e29ccb180b9d0376faa3878" - integrity sha512-/Rutb/s7OLqIvsvgjPi6kVSu4nnEC5Hq1arB6fo219hAJOzkHJ+dJr1fMNIpDo7ubgf3hv5GFNzutPN54wIqOA== +notifications-node-client@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/notifications-node-client/-/notifications-node-client-6.0.0.tgz#0377fbd76b56fde28c85f62bfdaa3dafb54f7217" + integrity sha512-QP4BSODBJROy2YU6sLHSx0uXKeINNyFcdMSHjczeffTMLlQ51SHrP+0n+UHMA0ta+gWuGGsjHfG3tpPtsZ1uNg== dependencies: axios "^0.25.0" - jsonwebtoken "^8.2.1" - underscore "^1.9.0" + jsonwebtoken "^9.0.0" npm-run-path@^2.0.0: version "2.0.2" @@ -6831,10 +6809,10 @@ safe-stable-stringify@^2.3.1: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sass@^1.35.2: - version "1.49.9" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.49.9.tgz#b15a189ecb0ca9e24634bae5d1ebc191809712f9" - integrity sha512-YlYWkkHP9fbwaFRZQRXgDi3mXZShslVmmo+FVK3kHLUELHHEYrCmL1x6IUjC7wLS6VuJSAFXRQS/DxdsC4xL1A== +sass@^1.56.2: + version "1.58.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.58.0.tgz#ee8aea3ad5ea5c485c26b3096e2df6087d0bb1cc" + integrity sha512-PiMJcP33DdKtZ/1jSjjqVIKihoDc6yWmYr9K/4r3fVVIEDAluD0q7XZiRKrNJcPK3qkLRF/79DND1H5q1LBjgg== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -6860,7 +6838,7 @@ semver-compare@^1.0.0: resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= -"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.5.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -6877,6 +6855,13 @@ semver@^7.0.0, semver@^7.1.2, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semve dependencies: lru-cache "^6.0.0" +semver@^7.3.8: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + send@0.17.2: version "0.17.2" resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" @@ -8163,7 +8148,7 @@ undeclared-identifiers@^1.1.2: simple-concat "^1.0.0" xtend "^4.0.1" -underscore@^1.12.1, underscore@^1.7.0, underscore@^1.8.2, underscore@^1.9.0, underscore@~1.7.0: +underscore@^1.12.1, underscore@^1.7.0, underscore@^1.8.2, underscore@~1.7.0: version "1.13.1" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.1.tgz#0c1c6bd2df54b6b69f2314066d65b6cde6fcf9d1" integrity sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g== From 7281d33c4942433b736b928336f1eca48d7e88ac Mon Sep 17 00:00:00 2001 From: chisomoguibe Date: Wed, 1 Feb 2023 12:30:56 +0000 Subject: [PATCH 04/18] upgrade hof package from v20.1.19 to v20.2.1 --- package.json | 2 +- yarn.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index ea2f9880..86ff001b 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ }, "dependencies": { "aws4": "^1.11.0", - "hof": "^20.1.19", + "hof": "^20.2.1", "hot-shots": "^8.5.0", "jquery": "^3.6.0", "jsonschema": "^1.4.0", diff --git a/yarn.lock b/yarn.lock index 9e002cdd..5ec50493 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3961,7 +3961,7 @@ hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hof@^20.1.19: +hof@^20.2.1: version "20.2.1" resolved "https://registry.yarnpkg.com/hof/-/hof-20.2.1.tgz#0c90eb5976326af19ce5649d6c6d81296e941925" integrity sha512-VLQTW4GZgBZrcLqrYwnXzoYH16rq0j9ibV9d6zHLSOqfRaom1XJmHZ7yQnKZ6lr36JtzHXVeYsg0/H2mDXtpKA== From 5f851ca988f7e1ce316c2bfa6e2f06b1f24af4b9 Mon Sep 17 00:00:00 2001 From: chisomoguibe Date: Thu, 2 Feb 2023 12:30:15 +0000 Subject: [PATCH 05/18] update expiry date for SNYK-JS-MINIMIST improve error message for notUrl validation on new inputs --- .snyk | 2 +- apps/ukvi-complaints/translations/src/en/fields.json | 9 +++------ 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/.snyk b/.snyk index 11962cdb..7063edac 100644 --- a/.snyk +++ b/.snyk @@ -29,5 +29,5 @@ ignore: SNYK-JS-MINIMIST-2429795: - '*': reason: low severity - expires: '2022-11-01T17:02:21.865Z' + expires: '2023-11-01T17:02:21.865Z' patch: {} diff --git a/apps/ukvi-complaints/translations/src/en/fields.json b/apps/ukvi-complaints/translations/src/en/fields.json index 0990e747..c0f06aad 100644 --- a/apps/ukvi-complaints/translations/src/en/fields.json +++ b/apps/ukvi-complaints/translations/src/en/fields.json @@ -201,26 +201,23 @@ }, "case-id-reference": { "label": "Enter your Case ID number", - "hint": null, "validation": { "required": "Enter your Case ID number", - "notUrl": "Enter your Case ID number" + "notUrl": "Reference number must not be a URL" } }, "payment-reference": { "label": "Enter your payment reference number", - "hint": null, "validation": { "required": "Enter your payment reference number", - "notUrl": "Enter your payment reference number" + "notUrl": "Reference number must not be a URL" } }, "other-reference": { "label": "Enter your reference number", - "hint": null, "validation": { "required": "Enter your reference number", - "notUrl": "Enter your reference number" + "notUrl": "Reference number must not be a URL" } }, "agent-representative-dob": { From 837534931a5bb288699ce8b68bf5e89d99543f7b Mon Sep 17 00:00:00 2001 From: chisomoguibe Date: Tue, 14 Feb 2023 12:40:46 +0000 Subject: [PATCH 06/18] add additional reference fields to complaint json converters and decs.json schema + add unit tests for reference fields --- .../behaviours/caseworker-email.js | 12 ++++ .../behaviours/customer-email.js | 12 ++++ lib/json-converters/complaint.js | 9 +++ lib/schema/decs.json | 72 +++++++++++++++++++ test/_unit/json-converters/complaint.spec.js | 33 +++++++++ test/_unit/test-data/complaint-base.js | 1 + 6 files changed, 139 insertions(+) diff --git a/apps/ukvi-complaints/behaviours/caseworker-email.js b/apps/ukvi-complaints/behaviours/caseworker-email.js index 9016f150..f04d6318 100644 --- a/apps/ukvi-complaints/behaviours/caseworker-email.js +++ b/apps/ukvi-complaints/behaviours/caseworker-email.js @@ -126,6 +126,18 @@ const getDataRows = (model, translate) => { label: translate('pages.confirm.fields.uan-reference.label'), value: model['uan-reference'] }, + model['case-id-reference'] && { + label: translate('pages.confirm.fields.case-id-reference.label'), + value: model['case-id-reference'] + }, + model['payment-reference'] && { + label: translate('pages.confirm.fields.payment-reference.label'), + value: model['payment-reference'] + }, + model['other-reference'] && { + label: translate('pages.confirm.fields.other-reference.label'), + value: model['other-reference'] + }, model['complaint-details'] && { label: translate('pages.confirm.fields.complaint-details.label'), value: model['complaint-details'] diff --git a/apps/ukvi-complaints/behaviours/customer-email.js b/apps/ukvi-complaints/behaviours/customer-email.js index 081f4193..3e4c4ca6 100644 --- a/apps/ukvi-complaints/behaviours/customer-email.js +++ b/apps/ukvi-complaints/behaviours/customer-email.js @@ -126,6 +126,18 @@ const getDataRows = (model, translate) => { label: translate('pages.confirm.fields.uan-reference.label'), value: model['uan-reference'] }, + model['case-id-reference'] && { + label: translate('pages.confirm.fields.case-id-reference.label'), + value: model['case-id-reference'] + }, + model['payment-reference'] && { + label: translate('pages.confirm.fields.payment-reference.label'), + value: model['payment-reference'] + }, + model['other-reference'] && { + label: translate('pages.confirm.fields.other-reference.label'), + value: model['other-reference'] + }, model['complaint-details'] && { label: translate('pages.confirm.fields.complaint-details.label'), value: model['complaint-details'] diff --git a/lib/json-converters/complaint.js b/lib/json-converters/complaint.js index 213cb823..f2f12bcd 100644 --- a/lib/json-converters/complaint.js +++ b/lib/json-converters/complaint.js @@ -67,6 +67,15 @@ const createReference = values => { case 'uan': referenceDetails.referenceType = 'UAN_REF'; return referenceDetails; + case 'case-id': + referenceDetails.referenceType = 'CASE_ID_REF'; + return referenceDetails; + case 'payment': + referenceDetails.referenceType = 'PAY_REF'; + return referenceDetails; + case 'other': + referenceDetails.referenceType = 'OTHER_REF'; + return referenceDetails; default: throw new Error('invalid "reference-numbers" value'); } diff --git a/lib/schema/decs.json b/lib/schema/decs.json index ff09d687..b79e4932 100644 --- a/lib/schema/decs.json +++ b/lib/schema/decs.json @@ -211,6 +211,15 @@ }, { "$ref": "#/definitions/UanReference" + }, + { + "$ref": "#/definitions/CaseIdReference" + }, + { + "$ref": "#/definitions/PaymentReference" + }, + { + "$ref": "#/definitions/OtherReference" } ] }, @@ -298,6 +307,69 @@ } } }, + "CaseIdReference": { + "type": "object", + "description": "1234-5678-9123-4567", + "required": [ + "referenceType", + "reference" + ], + "additionalProperties": false, + "properties": { + "referenceType": { + "type": "string", + "enum": [ + "CASE_ID_REF" + ] + }, + "reference": { + "type": "string", + "maxLength": 100 + } + } + }, + "PaymentReference": { + "type": "object", + "description": "1234-5678-9123-4567", + "required": [ + "referenceType", + "reference" + ], + "additionalProperties": false, + "properties": { + "referenceType": { + "type": "string", + "enum": [ + "PAY_REF" + ] + }, + "reference": { + "type": "string", + "maxLength": 100 + } + } + }, + "OtherReference": { + "type": "object", + "description": "1234-5678-9123-4567", + "required": [ + "referenceType", + "reference" + ], + "additionalProperties": false, + "properties": { + "referenceType": { + "type": "string", + "enum": [ + "OTHER_REF" + ] + }, + "reference": { + "type": "string", + "maxLength": 100 + } + } + }, "ReporterDetails": { "type": "object", "oneOf": [ diff --git a/test/_unit/json-converters/complaint.spec.js b/test/_unit/json-converters/complaint.spec.js index 648adf43..e5290a48 100644 --- a/test/_unit/json-converters/complaint.spec.js +++ b/test/_unit/json-converters/complaint.spec.js @@ -18,6 +18,9 @@ describe('complaint', () => { const testHoRef = 'HO3456789'; const testIhsRef = 'IHS4567890'; const testUanRef = 'UAN4567890'; + const testCaseIdRef = 'CASEID4567890'; + const testPaymentRef = 'PAYMENT4567890'; + const testOtherRef = 'OTHER4567890'; const applicantTestValues = { 'applicant-name': testApplicantName, 'applicant-dob': testApplicantDob, @@ -242,6 +245,36 @@ describe('complaint', () => { }); }); + it('If "case-id" reference, reference number will be set on CASE_ID_REF', () => { + referenceValues['reference-numbers'] = 'case-id'; + referenceValues['case-id-reference'] = testCaseIdRef; + const reference = createReference(referenceValues); + expect(reference).to.eql({ + referenceType: 'CASE_ID_REF', + reference: testCaseIdRef + }); + }); + + it('If "payment" reference, reference number will be set on PAY_REF', () => { + referenceValues['reference-numbers'] = 'payment'; + referenceValues['payment-reference'] = testPaymentRef; + const reference = createReference(referenceValues); + expect(reference).to.eql({ + referenceType: 'PAY_REF', + reference: testPaymentRef + }); + }); + + it('If "other" reference, reference number will be set on OTHER_REF', () => { + referenceValues['reference-numbers'] = 'other'; + referenceValues['other-reference'] = testOtherRef; + const reference = createReference(referenceValues); + expect(reference).to.eql({ + referenceType: 'OTHER_REF', + reference: testOtherRef + }); + }); + it('should throw error if incorrect ref type specified', () => { referenceValues['reference-numbers'] = 'fff'; expect(() => createReference(referenceValues)).to.throw('invalid "reference-numbers" value'); diff --git a/test/_unit/test-data/complaint-base.js b/test/_unit/test-data/complaint-base.js index 4bd2206b..d0694a90 100644 --- a/test/_unit/test-data/complaint-base.js +++ b/test/_unit/test-data/complaint-base.js @@ -8,6 +8,7 @@ const complaintDetailsBase = { 'uan-reference': '', 'case-id-reference': '', 'payment-reference': '', + 'other-reference': '', 'acting-as-agent': 'no', 'applicant-name': 'JJ', 'applicant-dob': '1980-02-02', From 5e3a3666d1e142f702c2cbdcc757e0b14038a3fd Mon Sep 17 00:00:00 2001 From: chisomoguibe Date: Thu, 16 Feb 2023 13:46:40 +0000 Subject: [PATCH 07/18] ammend new reference field labels to match JIRA ticket version --- apps/ukvi-complaints/translations/src/en/fields.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/ukvi-complaints/translations/src/en/fields.json b/apps/ukvi-complaints/translations/src/en/fields.json index c0f06aad..7e9debfe 100644 --- a/apps/ukvi-complaints/translations/src/en/fields.json +++ b/apps/ukvi-complaints/translations/src/en/fields.json @@ -154,10 +154,10 @@ "label": "Case ID" }, "payment": { - "label": "Payment reference number" + "label": "Any payment reference" }, "other": { - "label": "Other reference number" + "label": "Any other reference" }, "none": { "label": "I don’t have any of these " From ad5c862834f28c1d79ba4eb5f96615e20919b082 Mon Sep 17 00:00:00 2001 From: chisomoguibe Date: Mon, 20 Feb 2023 16:42:16 +0000 Subject: [PATCH 08/18] add missing refund details in "Check your answers" page --- apps/ukvi-complaints/index.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/ukvi-complaints/index.js b/apps/ukvi-complaints/index.js index 9f8aba67..253508bb 100644 --- a/apps/ukvi-complaints/index.js +++ b/apps/ukvi-complaints/index.js @@ -895,6 +895,8 @@ module.exports = { 'vac-country', 'vac-city', 'ukvcas-city', + 'refund', + 'refund-type', 'when-applied', 'complaint-reference-number', 'gwf-reference', From 33d102da4a4dee89d2ea1319a2c8bce257eaaab7 Mon Sep 17 00:00:00 2001 From: chisomoguibe Date: Thu, 26 Jan 2023 12:07:26 +0000 Subject: [PATCH 09/18] First attempt adding 3 extra reference numbers to the question "Which, if any, of the following reference numbers do you have" - Added additional fields in fields.json and pages.json - Append those fields inside fields array for url path /application-ref-numbers - Add same reference validation style for added fields in fields/index.js --- apps/ukvi-complaints/fields/index.js | 544 +++++------------- apps/ukvi-complaints/index.js | 8 +- .../translations/src/en/fields.json | 33 ++ .../translations/src/en/pages.json | 9 + test/_unit/test-data/complaint-base.js | 2 + 5 files changed, 188 insertions(+), 408 deletions(-) diff --git a/apps/ukvi-complaints/fields/index.js b/apps/ukvi-complaints/fields/index.js index 71517cfe..edb43ce0 100644 --- a/apps/ukvi-complaints/fields/index.js +++ b/apps/ukvi-complaints/fields/index.js @@ -6,32 +6,14 @@ const moment = require('moment'); module.exports = { reason: { mixin: 'radio-group', - options: [ - 'immigration-application', - 'immigration-appointment', - 'delays', - 'immigration-decision', - 'biometric-residence-permit', - 'refund', - 'staff-behaviour', - 'existing-complaint', - 'other-complaint' - ], + options: ['immigration-application', 'immigration-appointment', 'delays', 'immigration-decision', 'biometric-residence-permit', 'refund', 'staff-behaviour', 'existing-complaint', 'other-complaint'], validate: 'required' }, 'immigration-application': { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'technical-issues', - 'guidance', - 'complain' - ] + }, className: ['form-group'], options: ['technical-issues', 'guidance', 'complain'] }, 'immigration-appointment': { @@ -41,77 +23,35 @@ module.exports = { className: 'visuallyhidden' }, className: ['form-group'], - options: [ - 'lack-availability', - 'change-appointment', - 'technical-appointments', - 'questions-appointments', - 'complain-appointments' - ] - }, - 'where-applied-from': { - mixin: 'radio-group', - validate: 'required', - legend: { + options: ['lack-availability', 'change-appointment', 'technical-appointments', 'questions-appointments', 'complain-appointments'] + }, 'where-applied-from': { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'inside-uk', - 'outside-uk' - ] + }, className: ['form-group'], options: ['inside-uk', 'outside-uk'] }, 'delay-type': { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'application-delay', - 'return-of-documents' - ] + }, className: ['form-group'], options: ['application-delay', 'return-of-documents'] }, 'application-delay': { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'request-upgrade', - 'application-ref-numbers' - ] + }, className: ['form-group'], options: ['request-upgrade', 'application-ref-numbers'] }, delays: { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'delay-decision', - 'delay-docs' - ] + }, className: ['form-group'], options: ['delay-decision', 'delay-docs'] }, 'have-reference-numbers': { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'yes', - 'no' - ] + }, className: ['form-group'], options: ['yes', 'no'] }, // 'reference-numbers': { @@ -129,498 +69,288 @@ module.exports = { // }, 'requested-documents': { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'yes', - 'no' - ] + }, className: ['form-group'], options: ['yes', 'no'] }, 'have-requested': { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'used-service', - 'something-else' - ] + }, className: ['form-group'], options: ['used-service', 'something-else'] }, 'return-of-documents': { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'yes-docs-service', - 'yes-other', - 'no' - ] + }, className: ['form-group'], options: ['yes-docs-service', 'yes-other', 'no'] }, 'immigration-decision': { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'yes', - 'no' - ] + }, className: ['form-group'], options: ['yes', 'no'] }, 'decision-outcome': { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'negative', - 'positive' - ] + }, className: ['form-group'], options: ['negative', 'positive'] }, 'immigration-status-change': { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'questions-status-change', - 'complain-status-change' - ] + }, className: ['form-group'], options: ['questions-status-change', 'complain-status-change'] }, 'biometric-residence-permit': { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'card-not-arrived', - 'card-incorrect', - 'complain-brp' - ] + }, className: ['form-group'], options: ['card-not-arrived', 'card-incorrect', 'complain-brp'] }, 'refund-type': { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'standard', - 'priority', - 'super-priority', - 'premium', - 'ihs', - 'eu-settlement' - ] + }, className: ['form-group'], options: ['standard', 'priority', 'super-priority', 'premium', 'ihs', 'eu-settlement'] }, 'refund-type-automatic': { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'ihs', - 'eu-settlement' - ] + }, className: ['form-group'], options: ['ihs', 'eu-settlement'] }, refund: { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'yes', - 'no', - 'not-yet' - ] - }, - 'refund-when': { - mixin: 'radio-group', - validate: 'required', - legend: { + }, className: ['form-group'], options: ['yes', 'no', 'not-yet'] + }, 'refund-when': { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'less-than', - 'more-than' - ] - }, - 'staff-behaviour': { - mixin: 'radio-group', - validate: 'required', - legend: { + }, className: ['form-group'], options: ['less-than', 'more-than'] + }, 'staff-behaviour': { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'face-to-face', - 'on-phone', - 'in-letter' - ] + }, className: ['form-group'], options: ['face-to-face', 'on-phone', 'in-letter'] }, 'which-centre': { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'vac', - 'ssc', - 'ukvcas' - ] + }, className: ['form-group'], options: ['vac', 'ssc', 'ukvcas'] }, 'vac-country': { mixin: 'select', - options: [{ label: ' ', value: '' }].concat(require('hof').utils.countries()), - validate: ['required', { type: 'maxlength', arguments: 100 }], + options: [{label: ' ', value: ''}].concat(require('hof').utils.countries()), + validate: ['required', {type: 'maxlength', arguments: 100}], className: ['typeahead'] }, 'vac-city': { - mixin: 'input-text', - validate: ['required', 'notUrl', { type: 'maxlength', arguments: 100 }], - legend: { + mixin: 'input-text', validate: ['required', 'notUrl', {type: 'maxlength', arguments: 100}], legend: { className: 'visuallyhidden' } }, 'ssc-city': { - mixin: 'input-text', - validate: ['required', 'notUrl', { type: 'maxlength', arguments: 100 }], - legend: { + mixin: 'input-text', validate: ['required', 'notUrl', {type: 'maxlength', arguments: 100}], legend: { className: 'visuallyhidden' - }, - className: ['form-group'] + }, className: ['form-group'] }, 'ukvcas-city': { - mixin: 'input-text', - validate: ['required', 'notUrl', { type: 'maxlength', arguments: 100 }], - legend: { + mixin: 'input-text', validate: ['required', 'notUrl', {type: 'maxlength', arguments: 100}], legend: { className: 'visuallyhidden' - }, - className: ['form-group'] - }, - 'called-number': { - mixin: 'input-text', - validate: ['required', 'notUrl', { type: 'maxlength', arguments: 50 }], - legend: { + }, className: ['form-group'] + }, 'called-number': { + mixin: 'input-text', validate: ['required', 'notUrl', {type: 'maxlength', arguments: 50}], legend: { className: 'visuallyhidden' - }, - className: ['form-group'] - }, - 'called-date': { - mixin: 'input-text', - validate: ['required', 'notUrl', { type: 'maxlength', arguments: 50 }], - legend: { + }, className: ['form-group'] + }, 'called-date': { + mixin: 'input-text', validate: ['required', 'notUrl', {type: 'maxlength', arguments: 50}], legend: { className: 'visuallyhidden' - }, - className: ['form-group'] - }, - 'called-time': { - mixin: 'input-text', - validate: ['required', 'notUrl', { type: 'maxlength', arguments: 50 }], - legend: { + }, className: ['form-group'] + }, 'called-time': { + mixin: 'input-text', validate: ['required', 'notUrl', {type: 'maxlength', arguments: 50}], legend: { className: 'visuallyhidden' - }, - className: ['form-group'] - }, - 'called-from': { - mixin: 'input-text', - validate: ['required', 'notUrl', { type: 'maxlength', arguments: 50 }], - legend: { + }, className: ['form-group'] + }, 'called-from': { + mixin: 'input-text', validate: ['required', 'notUrl', {type: 'maxlength', arguments: 50}], legend: { className: 'visuallyhidden' - }, - className: ['form-group'] + }, className: ['form-group'] }, 'existing-complaint': { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'yes', - 'no' - ] + }, className: ['form-group'], options: ['yes', 'no'] }, 'complaint-reason-previous': { mixin: 'radio-group', - options: [ - 'immigration-application', - 'immigration-appointment', - 'delays', - 'immigration-decision', - 'immigration-status-change', - 'biometric-residence-permit', - 'refund', - 'staff-behaviour', - 'other-complaint' - ], + options: ['immigration-application', 'immigration-appointment', 'delays', 'immigration-decision', 'immigration-status-change', 'biometric-residence-permit', 'refund', 'staff-behaviour', 'other-complaint'], validate: 'required' }, 'other-complaint': { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'technical-issues', - 'questions', - 'complain' - ] - }, - 'reference-numbers': { - mixin: 'radio-group', - legend: { + }, className: ['form-group'], options: ['technical-issues', 'questions', 'complain'] + }, 'reference-numbers': { + mixin: 'radio-group', legend: { className: 'visuallyhidden' - }, - validate: 'required', - options: [{ - value: 'gwf', - toggle: 'gwf-reference', - child: 'input-text' + }, validate: 'required', options: [{ + value: 'gwf', toggle: 'gwf-reference', child: 'input-text' + }, { + value: 'ho', toggle: 'ho-reference', child: 'input-text' }, { - value: 'ho', - toggle: 'ho-reference', - child: 'input-text' + value: 'ihs', toggle: 'ihs-reference', child: 'input-text' }, { - value: 'ihs', - toggle: 'ihs-reference', - child: 'input-text' + value: 'uan', toggle: 'uan-reference', child: 'input-text' }, { - value: 'uan', - toggle: 'uan-reference', - child: 'input-text' + value: 'case-id', toggle: 'case-id-reference', child: 'input-text' + }, { + value: 'payment', toggle: 'payment-reference', child: 'input-text' + }, { + value: 'other', toggle: 'other-reference', child: 'input-text' }, { value: 'none' }] - }, - 'gwf-reference': { - validate: ['required', 'notUrl', { type: 'maxlength', arguments: 100 }], - dependent: { - field: 'reference-numbers', - value: 'gwf' + }, 'gwf-reference': { + validate: ['required', 'notUrl', {type: 'maxlength', arguments: 100}], dependent: { + field: 'reference-numbers', value: 'gwf' } + }, 'ho-reference': { + dependent: { + field: 'reference-numbers', value: 'ho' + }, validate: ['required', 'notUrl', {type: 'maxlength', arguments: 100}] + }, 'ihs-reference': { + dependent: { + field: 'reference-numbers', value: 'ihs' + }, validate: ['required', 'notUrl', {type: 'maxlength', arguments: 100}] + }, 'uan-reference': { + dependent: { + field: 'reference-numbers', value: 'uan' + }, validate: ['required', 'notUrl', {type: 'maxlength', arguments: 100}] }, - 'ho-reference': { + 'case-id-reference': { dependent: { - field: 'reference-numbers', - value: 'ho' - }, - validate: ['required', 'notUrl', { type: 'maxlength', arguments: 100 }] + field: 'reference-numbers', value: 'case-id' + }, validate: ['required', 'notUrl', {type: 'maxlength', arguments: 100}] }, - 'ihs-reference': { + 'payment-reference': { dependent: { - field: 'reference-numbers', - value: 'ihs' - }, - validate: ['required', 'notUrl', { type: 'maxlength', arguments: 100 }] + field: 'reference-numbers', value: 'payment' + }, validate: ['required', 'notUrl', {type: 'maxlength', arguments: 100}] }, - 'uan-reference': { + 'other-reference': { dependent: { - field: 'reference-numbers', - value: 'uan' - }, - validate: ['required', 'notUrl', { type: 'maxlength', arguments: 100 }] + field: 'reference-numbers', value: 'other' + }, validate: ['required', 'notUrl', {type: 'maxlength', arguments: 100}] }, 'when-applied': { - mixin: 'input-text', - validate: ['required', 'notUrl', { type: 'maxlength', arguments: 50 }], - legend: { + mixin: 'input-text', validate: ['required', 'notUrl', {type: 'maxlength', arguments: 50}], legend: { className: 'visuallyhidden' - }, - className: [''] + }, className: [''] }, 'complaint-reference-number': { - mixin: 'input-text', - validate: ['notUrl', { type: 'maxlength', arguments: 100 }] - }, - 'complaint-details': { + mixin: 'input-text', validate: ['notUrl', {type: 'maxlength', arguments: 100}] + }, 'complaint-details': { mixin: 'textarea', attributes: [{ - attribute: 'rows', - value: 12 + attribute: 'rows', value: 12 }], - validate: ['required', { type: 'maxlength', arguments: 50000 }], + validate: ['required', {type: 'maxlength', arguments: 50000}], 'ignore-defaults': true, formatter: ['trim', 'hyphens'], className: ['govuk-js-character-count'] }, 'acting-as-agent': { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'yes', - 'no' - ] + }, className: ['form-group'], options: ['yes', 'no'] }, 'who-representing': { - mixin: 'radio-group', - validate: 'required', - options: [ - 'legal-rep', - 'relative', - 'sponsor', - 'support-org' - ] + mixin: 'radio-group', validate: 'required', options: ['legal-rep', 'relative', 'sponsor', 'support-org'] }, 'agent-name': { - mixin: 'input-text', - validate: ['required', 'notUrl', { type: 'maxlength', arguments: 150 }], - legend: { + mixin: 'input-text', validate: ['required', 'notUrl', {type: 'maxlength', arguments: 150}], legend: { className: 'visuallyhidden' - }, - className: [''] + }, className: [''] }, 'agent-email': { - mixin: 'input-text', - validate: ['required', 'email', { type: 'maxlength', arguments: 256 }], - legend: { + mixin: 'input-text', validate: ['required', 'email', {type: 'maxlength', arguments: 256}], legend: { className: 'visuallyhidden' - }, - className: [''] + }, className: [''] }, 'agent-phone': { - mixin: 'input-text', - validate: ['notUrl', { type: 'maxlength', arguments: 50 }], - legend: { + mixin: 'input-text', validate: ['notUrl', {type: 'maxlength', arguments: 50}], legend: { className: 'visuallyhidden' - }, - className: ['govuk-input', 'govuk-input--width-20'] + }, className: ['govuk-input', 'govuk-input--width-20'] }, 'applicant-name': { - mixin: 'input-text', - validate: ['required', 'notUrl', { type: 'maxlength', arguments: 100 }], - legend: { + mixin: 'input-text', validate: ['required', 'notUrl', {type: 'maxlength', arguments: 100}], legend: { className: 'visuallyhidden' - }, - className: [''] + }, className: [''] }, 'applicant-dob': dateComponent('applicant-dob', { - mixin: 'input-date', - validate: [ - 'required', - 'date', - { type: 'before', arguments: moment().subtract(18, 'years').format('YYYY-MM-DD') }, - { type: 'after', arguments: '1900-01-01' }] + mixin: 'input-date', validate: ['required', 'date', { + type: 'before', arguments: moment().subtract(18, 'years').format('YYYY-MM-DD') + }, {type: 'after', arguments: '1900-01-01'}] }), 'agent-representative-dob': dateComponent('agent-representative-dob', { - mixin: 'input-date', - validate: [ - 'required', - 'date', - { type: 'before', arguments: moment().subtract(18, 'years').format('YYYY-MM-DD') }, - { type: 'after', arguments: '1900-01-01' }] + mixin: 'input-date', validate: ['required', 'date', { + type: 'before', arguments: moment().subtract(18, 'years').format('YYYY-MM-DD') + }, {type: 'after', arguments: '1900-01-01'}] }), 'applicant-email': { - mixin: 'input-text', - validate: ['required', 'email', { type: 'maxlength', arguments: 256 }], - legend: { + mixin: 'input-text', validate: ['required', 'email', {type: 'maxlength', arguments: 256}], legend: { className: 'visuallyhidden' - }, - className: [''] + }, className: [''] }, 'applicant-nationality': { mixin: 'select', - options: [{ label: ' ', value: '' }].concat(require('hof').utils.countries()), + options: [{label: ' ', value: ''}].concat(require('hof').utils.countries()), validate: 'required', className: ['typeahead'] }, 'agent-representative-name': { - mixin: 'input-text', - validate: ['required', 'notUrl', { type: 'maxlength', arguments: 100 }], - legend: { + mixin: 'input-text', validate: ['required', 'notUrl', {type: 'maxlength', arguments: 100}], legend: { className: 'visuallyhidden' - }, - className: [''] + }, className: [''] }, 'agent-representative-nationality': { mixin: 'select', - options: [{ label: ' ', value: '' }].concat(require('hof').utils.countries()), + options: [{label: ' ', value: ''}].concat(require('hof').utils.countries()), validate: 'required', className: ['typeahead'] }, 'applicant-phone': { - mixin: 'input-text', - validate: ['notUrl', { type: 'maxlength', arguments: 50 }], - legend: { + mixin: 'input-text', validate: ['notUrl', {type: 'maxlength', arguments: 50}], legend: { className: 'visuallyhidden' - }, - className: ['govuk-input', 'govuk-input--width-20'] + }, className: ['govuk-input', 'govuk-input--width-20'] }, where: { - mixin: 'radio-group', - validate: 'required', - legend: { + mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' - }, - className: ['form-group'], - options: [ - 'phone', - 'visa-application-centre', - 'premium-service-centre', - 'letter' - ] + }, className: ['form-group'], options: ['phone', 'visa-application-centre', 'premium-service-centre', 'letter'] } }; diff --git a/apps/ukvi-complaints/index.js b/apps/ukvi-complaints/index.js index 76a40e14..9f8aba67 100644 --- a/apps/ukvi-complaints/index.js +++ b/apps/ukvi-complaints/index.js @@ -365,7 +365,10 @@ module.exports = { 'gwf-reference', 'ho-reference', 'ihs-reference', - 'uan-reference' + 'uan-reference', + 'case-id-reference', + 'payment-reference', + 'other-reference' ], next: '/acting-as-agent' }, @@ -898,6 +901,9 @@ module.exports = { 'ho-reference', 'ihs-reference', 'uan-reference', + 'case-id-reference', + 'payment-reference', + 'other-reference', 'complaint-details' ], 'agent-details': [ diff --git a/apps/ukvi-complaints/translations/src/en/fields.json b/apps/ukvi-complaints/translations/src/en/fields.json index c47a3661..0990e747 100644 --- a/apps/ukvi-complaints/translations/src/en/fields.json +++ b/apps/ukvi-complaints/translations/src/en/fields.json @@ -150,6 +150,15 @@ "uan": { "label": "Unique Application Number" }, + "case-id": { + "label": "Case ID" + }, + "payment": { + "label": "Payment reference number" + }, + "other": { + "label": "Other reference number" + }, "none": { "label": "I don’t have any of these " } @@ -190,6 +199,30 @@ "notUrl": "Enter the Unique Application Number" } }, + "case-id-reference": { + "label": "Enter your Case ID number", + "hint": null, + "validation": { + "required": "Enter your Case ID number", + "notUrl": "Enter your Case ID number" + } + }, + "payment-reference": { + "label": "Enter your payment reference number", + "hint": null, + "validation": { + "required": "Enter your payment reference number", + "notUrl": "Enter your payment reference number" + } + }, + "other-reference": { + "label": "Enter your reference number", + "hint": null, + "validation": { + "required": "Enter your reference number", + "notUrl": "Enter your reference number" + } + }, "agent-representative-dob": { "hint": "For example, 31 3 1980", "summary": "Date of birth", diff --git a/apps/ukvi-complaints/translations/src/en/pages.json b/apps/ukvi-complaints/translations/src/en/pages.json index 602e83eb..eb0bd4b5 100644 --- a/apps/ukvi-complaints/translations/src/en/pages.json +++ b/apps/ukvi-complaints/translations/src/en/pages.json @@ -366,6 +366,15 @@ "uan-reference": { "label": "Unique Application Number" }, + "case-id-reference": { + "label": "Enter your Case ID number" + }, + "payment-reference": { + "label": "Enter your payment reference number" + }, + "other-reference": { + "label": "Enter your reference number" + }, "none": { "label": "I don’t have any of these" }, diff --git a/test/_unit/test-data/complaint-base.js b/test/_unit/test-data/complaint-base.js index edd8e09c..4bd2206b 100644 --- a/test/_unit/test-data/complaint-base.js +++ b/test/_unit/test-data/complaint-base.js @@ -6,6 +6,8 @@ const complaintDetailsBase = { 'ho-reference': '', 'ihs-reference': '', 'uan-reference': '', + 'case-id-reference': '', + 'payment-reference': '', 'acting-as-agent': 'no', 'applicant-name': 'JJ', 'applicant-dob': '1980-02-02', From 78db03f94f95b66c7206b3359a62f5fa95a43268 Mon Sep 17 00:00:00 2001 From: chisomoguibe Date: Wed, 1 Feb 2023 11:58:53 +0000 Subject: [PATCH 10/18] fix eslint errors --- apps/ukvi-complaints/fields/index.js | 32 +++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/apps/ukvi-complaints/fields/index.js b/apps/ukvi-complaints/fields/index.js index edb43ce0..cc5ef56d 100644 --- a/apps/ukvi-complaints/fields/index.js +++ b/apps/ukvi-complaints/fields/index.js @@ -6,7 +6,17 @@ const moment = require('moment'); module.exports = { reason: { mixin: 'radio-group', - options: ['immigration-application', 'immigration-appointment', 'delays', 'immigration-decision', 'biometric-residence-permit', 'refund', 'staff-behaviour', 'existing-complaint', 'other-complaint'], + options: [ + 'immigration-application', + 'immigration-appointment', + 'delays', + 'immigration-decision', + 'biometric-residence-permit', + 'refund', + 'staff-behaviour', + 'existing-complaint', + 'other-complaint' + ], validate: 'required' }, @@ -23,7 +33,13 @@ module.exports = { className: 'visuallyhidden' }, className: ['form-group'], - options: ['lack-availability', 'change-appointment', 'technical-appointments', 'questions-appointments', 'complain-appointments'] + options: [ + 'lack-availability', + 'change-appointment', + 'technical-appointments', + 'questions-appointments', + 'complain-appointments' + ] }, 'where-applied-from': { mixin: 'radio-group', validate: 'required', legend: { className: 'visuallyhidden' @@ -191,7 +207,17 @@ module.exports = { 'complaint-reason-previous': { mixin: 'radio-group', - options: ['immigration-application', 'immigration-appointment', 'delays', 'immigration-decision', 'immigration-status-change', 'biometric-residence-permit', 'refund', 'staff-behaviour', 'other-complaint'], + options: [ + 'immigration-application', + 'immigration-appointment', + 'delays', + 'immigration-decision', + 'immigration-status-change', + 'biometric-residence-permit', + 'refund', + 'staff-behaviour', + 'other-complaint' + ], validate: 'required' }, From 803452699b32bf1207d3437aae6c258334e80561 Mon Sep 17 00:00:00 2001 From: chisomoguibe Date: Wed, 1 Feb 2023 12:15:38 +0000 Subject: [PATCH 11/18] upgrade hof package from v20.1.10 to v20.1.19 --- package.json | 2 +- yarn.lock | 75 +++++++++++++++++++++------------------------------- 2 files changed, 31 insertions(+), 46 deletions(-) diff --git a/package.json b/package.json index 7d938570..ea2f9880 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ }, "dependencies": { "aws4": "^1.11.0", - "hof": "^20.1.10", + "hof": "^20.1.19", "hot-shots": "^8.5.0", "jquery": "^3.6.0", "jsonschema": "^1.4.0", diff --git a/yarn.lock b/yarn.lock index c217fcac..9e002cdd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3961,10 +3961,10 @@ hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hof@^20.1.10: - version "20.1.17" - resolved "https://registry.yarnpkg.com/hof/-/hof-20.1.17.tgz#8f9507fb88059df152d6af183019cd4374936b03" - integrity sha512-TVLPAEvAfP1PLTdm/iVk/7FBJeqEYa5lyiS3nNk7CEFgvQb45HA2bhvo4W/kVc3NJS2dFYdKMjPUWl7aLAx5dQ== +hof@^20.1.19: + version "20.2.1" + resolved "https://registry.yarnpkg.com/hof/-/hof-20.2.1.tgz#0c90eb5976326af19ce5649d6c6d81296e941925" + integrity sha512-VLQTW4GZgBZrcLqrYwnXzoYH16rq0j9ibV9d6zHLSOqfRaom1XJmHZ7yQnKZ6lr36JtzHXVeYsg0/H2mDXtpKA== dependencies: aliasify "^2.1.0" bluebird "^3.7.2" @@ -4010,12 +4010,12 @@ hof@^20.1.10: nodemailer-ses-transport "^1.5.0" nodemailer-smtp-transport "^2.7.4" nodemailer-stub-transport "^1.1.0" - notifications-node-client "^5.1.1" + notifications-node-client "^6.0.0" redis "^3.1.2" reqres "^3.0.1" request "^2.79.0" rimraf "^3.0.2" - sass "^1.35.2" + sass "^1.56.2" serve-static "^1.14.1" uglify-js "^3.14.3" underscore "^1.12.1" @@ -4769,21 +4769,15 @@ jsonschema@^1.4.0: resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.0.tgz#1afa34c4bc22190d8e42271ec17ac8b3404f87b2" integrity sha512-/YgW6pRMr6M7C+4o8kS+B/2myEpHCrxO4PEWnqJNBFMjn7EWXqlQ4tGwL6xTHeRplwuZmcAncdvfOad1nT2yMw== -jsonwebtoken@^8.2.1: - version "8.5.1" - resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" - integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== +jsonwebtoken@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz#d0faf9ba1cc3a56255fe49c0961a67e520c1926d" + integrity sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw== dependencies: jws "^3.2.2" - lodash.includes "^4.3.0" - lodash.isboolean "^3.0.3" - lodash.isinteger "^4.0.4" - lodash.isnumber "^3.0.3" - lodash.isplainobject "^4.0.6" - lodash.isstring "^4.0.1" - lodash.once "^4.0.0" + lodash "^4.17.21" ms "^2.1.1" - semver "^5.6.0" + semver "^7.3.8" jsprim@^1.2.2: version "1.4.2" @@ -5018,11 +5012,6 @@ lodash.has@^4.5.2: resolved "https://registry.yarnpkg.com/lodash.has/-/lodash.has-4.5.2.tgz#d19f4dc1095058cccbe2b0cdf4ee0fe4aa37c862" integrity sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI= -lodash.includes@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" - integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== - lodash.invert@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.invert/-/lodash.invert-4.3.0.tgz#8ffe20d4b616f56bea8f1aa0c6ebd80dcf742aee" @@ -5048,11 +5037,6 @@ lodash.isfunction@^3.0.9: resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" integrity sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw== -lodash.isinteger@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" - integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== - lodash.isnumber@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" @@ -5108,11 +5092,6 @@ lodash.omit@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" integrity sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA= -lodash.once@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" - integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== - lodash.orderby@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.orderby/-/lodash.orderby-4.6.0.tgz#e697f04ce5d78522f54d9338b32b81a3393e4eb3" @@ -5757,14 +5736,13 @@ normalize-url@^6.0.1: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== -notifications-node-client@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/notifications-node-client/-/notifications-node-client-5.1.1.tgz#d98ebf07828a6e999e29ccb180b9d0376faa3878" - integrity sha512-/Rutb/s7OLqIvsvgjPi6kVSu4nnEC5Hq1arB6fo219hAJOzkHJ+dJr1fMNIpDo7ubgf3hv5GFNzutPN54wIqOA== +notifications-node-client@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/notifications-node-client/-/notifications-node-client-6.0.0.tgz#0377fbd76b56fde28c85f62bfdaa3dafb54f7217" + integrity sha512-QP4BSODBJROy2YU6sLHSx0uXKeINNyFcdMSHjczeffTMLlQ51SHrP+0n+UHMA0ta+gWuGGsjHfG3tpPtsZ1uNg== dependencies: axios "^0.25.0" - jsonwebtoken "^8.2.1" - underscore "^1.9.0" + jsonwebtoken "^9.0.0" npm-run-path@^2.0.0: version "2.0.2" @@ -6831,10 +6809,10 @@ safe-stable-stringify@^2.3.1: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sass@^1.35.2: - version "1.49.9" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.49.9.tgz#b15a189ecb0ca9e24634bae5d1ebc191809712f9" - integrity sha512-YlYWkkHP9fbwaFRZQRXgDi3mXZShslVmmo+FVK3kHLUELHHEYrCmL1x6IUjC7wLS6VuJSAFXRQS/DxdsC4xL1A== +sass@^1.56.2: + version "1.58.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.58.0.tgz#ee8aea3ad5ea5c485c26b3096e2df6087d0bb1cc" + integrity sha512-PiMJcP33DdKtZ/1jSjjqVIKihoDc6yWmYr9K/4r3fVVIEDAluD0q7XZiRKrNJcPK3qkLRF/79DND1H5q1LBjgg== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -6860,7 +6838,7 @@ semver-compare@^1.0.0: resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= -"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.5.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -6877,6 +6855,13 @@ semver@^7.0.0, semver@^7.1.2, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semve dependencies: lru-cache "^6.0.0" +semver@^7.3.8: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + send@0.17.2: version "0.17.2" resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" @@ -8163,7 +8148,7 @@ undeclared-identifiers@^1.1.2: simple-concat "^1.0.0" xtend "^4.0.1" -underscore@^1.12.1, underscore@^1.7.0, underscore@^1.8.2, underscore@^1.9.0, underscore@~1.7.0: +underscore@^1.12.1, underscore@^1.7.0, underscore@^1.8.2, underscore@~1.7.0: version "1.13.1" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.1.tgz#0c1c6bd2df54b6b69f2314066d65b6cde6fcf9d1" integrity sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g== From 992bce66804d168beabd10824c330ffddce5e66b Mon Sep 17 00:00:00 2001 From: chisomoguibe Date: Wed, 1 Feb 2023 12:30:56 +0000 Subject: [PATCH 12/18] upgrade hof package from v20.1.19 to v20.2.1 --- package.json | 2 +- yarn.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index ea2f9880..86ff001b 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ }, "dependencies": { "aws4": "^1.11.0", - "hof": "^20.1.19", + "hof": "^20.2.1", "hot-shots": "^8.5.0", "jquery": "^3.6.0", "jsonschema": "^1.4.0", diff --git a/yarn.lock b/yarn.lock index 9e002cdd..5ec50493 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3961,7 +3961,7 @@ hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hof@^20.1.19: +hof@^20.2.1: version "20.2.1" resolved "https://registry.yarnpkg.com/hof/-/hof-20.2.1.tgz#0c90eb5976326af19ce5649d6c6d81296e941925" integrity sha512-VLQTW4GZgBZrcLqrYwnXzoYH16rq0j9ibV9d6zHLSOqfRaom1XJmHZ7yQnKZ6lr36JtzHXVeYsg0/H2mDXtpKA== From 926813e4cccc49cf2644e06e5d4f99dd79af2562 Mon Sep 17 00:00:00 2001 From: chisomoguibe Date: Thu, 2 Feb 2023 12:30:15 +0000 Subject: [PATCH 13/18] update expiry date for SNYK-JS-MINIMIST improve error message for notUrl validation on new inputs --- .snyk | 2 +- apps/ukvi-complaints/translations/src/en/fields.json | 9 +++------ 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/.snyk b/.snyk index 11962cdb..7063edac 100644 --- a/.snyk +++ b/.snyk @@ -29,5 +29,5 @@ ignore: SNYK-JS-MINIMIST-2429795: - '*': reason: low severity - expires: '2022-11-01T17:02:21.865Z' + expires: '2023-11-01T17:02:21.865Z' patch: {} diff --git a/apps/ukvi-complaints/translations/src/en/fields.json b/apps/ukvi-complaints/translations/src/en/fields.json index 0990e747..c0f06aad 100644 --- a/apps/ukvi-complaints/translations/src/en/fields.json +++ b/apps/ukvi-complaints/translations/src/en/fields.json @@ -201,26 +201,23 @@ }, "case-id-reference": { "label": "Enter your Case ID number", - "hint": null, "validation": { "required": "Enter your Case ID number", - "notUrl": "Enter your Case ID number" + "notUrl": "Reference number must not be a URL" } }, "payment-reference": { "label": "Enter your payment reference number", - "hint": null, "validation": { "required": "Enter your payment reference number", - "notUrl": "Enter your payment reference number" + "notUrl": "Reference number must not be a URL" } }, "other-reference": { "label": "Enter your reference number", - "hint": null, "validation": { "required": "Enter your reference number", - "notUrl": "Enter your reference number" + "notUrl": "Reference number must not be a URL" } }, "agent-representative-dob": { From 7ae5b40ec507b599c7d0fe38cf6ffe59b2d42114 Mon Sep 17 00:00:00 2001 From: chisomoguibe Date: Tue, 14 Feb 2023 12:40:46 +0000 Subject: [PATCH 14/18] add additional reference fields to complaint json converters and decs.json schema + add unit tests for reference fields --- .../behaviours/caseworker-email.js | 12 ++++ .../behaviours/customer-email.js | 12 ++++ lib/json-converters/complaint.js | 9 +++ lib/schema/decs.json | 72 +++++++++++++++++++ test/_unit/json-converters/complaint.spec.js | 33 +++++++++ test/_unit/test-data/complaint-base.js | 1 + 6 files changed, 139 insertions(+) diff --git a/apps/ukvi-complaints/behaviours/caseworker-email.js b/apps/ukvi-complaints/behaviours/caseworker-email.js index 9016f150..f04d6318 100644 --- a/apps/ukvi-complaints/behaviours/caseworker-email.js +++ b/apps/ukvi-complaints/behaviours/caseworker-email.js @@ -126,6 +126,18 @@ const getDataRows = (model, translate) => { label: translate('pages.confirm.fields.uan-reference.label'), value: model['uan-reference'] }, + model['case-id-reference'] && { + label: translate('pages.confirm.fields.case-id-reference.label'), + value: model['case-id-reference'] + }, + model['payment-reference'] && { + label: translate('pages.confirm.fields.payment-reference.label'), + value: model['payment-reference'] + }, + model['other-reference'] && { + label: translate('pages.confirm.fields.other-reference.label'), + value: model['other-reference'] + }, model['complaint-details'] && { label: translate('pages.confirm.fields.complaint-details.label'), value: model['complaint-details'] diff --git a/apps/ukvi-complaints/behaviours/customer-email.js b/apps/ukvi-complaints/behaviours/customer-email.js index 081f4193..3e4c4ca6 100644 --- a/apps/ukvi-complaints/behaviours/customer-email.js +++ b/apps/ukvi-complaints/behaviours/customer-email.js @@ -126,6 +126,18 @@ const getDataRows = (model, translate) => { label: translate('pages.confirm.fields.uan-reference.label'), value: model['uan-reference'] }, + model['case-id-reference'] && { + label: translate('pages.confirm.fields.case-id-reference.label'), + value: model['case-id-reference'] + }, + model['payment-reference'] && { + label: translate('pages.confirm.fields.payment-reference.label'), + value: model['payment-reference'] + }, + model['other-reference'] && { + label: translate('pages.confirm.fields.other-reference.label'), + value: model['other-reference'] + }, model['complaint-details'] && { label: translate('pages.confirm.fields.complaint-details.label'), value: model['complaint-details'] diff --git a/lib/json-converters/complaint.js b/lib/json-converters/complaint.js index 213cb823..f2f12bcd 100644 --- a/lib/json-converters/complaint.js +++ b/lib/json-converters/complaint.js @@ -67,6 +67,15 @@ const createReference = values => { case 'uan': referenceDetails.referenceType = 'UAN_REF'; return referenceDetails; + case 'case-id': + referenceDetails.referenceType = 'CASE_ID_REF'; + return referenceDetails; + case 'payment': + referenceDetails.referenceType = 'PAY_REF'; + return referenceDetails; + case 'other': + referenceDetails.referenceType = 'OTHER_REF'; + return referenceDetails; default: throw new Error('invalid "reference-numbers" value'); } diff --git a/lib/schema/decs.json b/lib/schema/decs.json index ff09d687..b79e4932 100644 --- a/lib/schema/decs.json +++ b/lib/schema/decs.json @@ -211,6 +211,15 @@ }, { "$ref": "#/definitions/UanReference" + }, + { + "$ref": "#/definitions/CaseIdReference" + }, + { + "$ref": "#/definitions/PaymentReference" + }, + { + "$ref": "#/definitions/OtherReference" } ] }, @@ -298,6 +307,69 @@ } } }, + "CaseIdReference": { + "type": "object", + "description": "1234-5678-9123-4567", + "required": [ + "referenceType", + "reference" + ], + "additionalProperties": false, + "properties": { + "referenceType": { + "type": "string", + "enum": [ + "CASE_ID_REF" + ] + }, + "reference": { + "type": "string", + "maxLength": 100 + } + } + }, + "PaymentReference": { + "type": "object", + "description": "1234-5678-9123-4567", + "required": [ + "referenceType", + "reference" + ], + "additionalProperties": false, + "properties": { + "referenceType": { + "type": "string", + "enum": [ + "PAY_REF" + ] + }, + "reference": { + "type": "string", + "maxLength": 100 + } + } + }, + "OtherReference": { + "type": "object", + "description": "1234-5678-9123-4567", + "required": [ + "referenceType", + "reference" + ], + "additionalProperties": false, + "properties": { + "referenceType": { + "type": "string", + "enum": [ + "OTHER_REF" + ] + }, + "reference": { + "type": "string", + "maxLength": 100 + } + } + }, "ReporterDetails": { "type": "object", "oneOf": [ diff --git a/test/_unit/json-converters/complaint.spec.js b/test/_unit/json-converters/complaint.spec.js index 648adf43..e5290a48 100644 --- a/test/_unit/json-converters/complaint.spec.js +++ b/test/_unit/json-converters/complaint.spec.js @@ -18,6 +18,9 @@ describe('complaint', () => { const testHoRef = 'HO3456789'; const testIhsRef = 'IHS4567890'; const testUanRef = 'UAN4567890'; + const testCaseIdRef = 'CASEID4567890'; + const testPaymentRef = 'PAYMENT4567890'; + const testOtherRef = 'OTHER4567890'; const applicantTestValues = { 'applicant-name': testApplicantName, 'applicant-dob': testApplicantDob, @@ -242,6 +245,36 @@ describe('complaint', () => { }); }); + it('If "case-id" reference, reference number will be set on CASE_ID_REF', () => { + referenceValues['reference-numbers'] = 'case-id'; + referenceValues['case-id-reference'] = testCaseIdRef; + const reference = createReference(referenceValues); + expect(reference).to.eql({ + referenceType: 'CASE_ID_REF', + reference: testCaseIdRef + }); + }); + + it('If "payment" reference, reference number will be set on PAY_REF', () => { + referenceValues['reference-numbers'] = 'payment'; + referenceValues['payment-reference'] = testPaymentRef; + const reference = createReference(referenceValues); + expect(reference).to.eql({ + referenceType: 'PAY_REF', + reference: testPaymentRef + }); + }); + + it('If "other" reference, reference number will be set on OTHER_REF', () => { + referenceValues['reference-numbers'] = 'other'; + referenceValues['other-reference'] = testOtherRef; + const reference = createReference(referenceValues); + expect(reference).to.eql({ + referenceType: 'OTHER_REF', + reference: testOtherRef + }); + }); + it('should throw error if incorrect ref type specified', () => { referenceValues['reference-numbers'] = 'fff'; expect(() => createReference(referenceValues)).to.throw('invalid "reference-numbers" value'); diff --git a/test/_unit/test-data/complaint-base.js b/test/_unit/test-data/complaint-base.js index 4bd2206b..d0694a90 100644 --- a/test/_unit/test-data/complaint-base.js +++ b/test/_unit/test-data/complaint-base.js @@ -8,6 +8,7 @@ const complaintDetailsBase = { 'uan-reference': '', 'case-id-reference': '', 'payment-reference': '', + 'other-reference': '', 'acting-as-agent': 'no', 'applicant-name': 'JJ', 'applicant-dob': '1980-02-02', From 495110064d460eaa75b3eb246b9757f7c72c42e0 Mon Sep 17 00:00:00 2001 From: chisomoguibe Date: Thu, 16 Feb 2023 13:46:40 +0000 Subject: [PATCH 15/18] ammend new reference field labels to match JIRA ticket version --- apps/ukvi-complaints/translations/src/en/fields.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/ukvi-complaints/translations/src/en/fields.json b/apps/ukvi-complaints/translations/src/en/fields.json index c0f06aad..7e9debfe 100644 --- a/apps/ukvi-complaints/translations/src/en/fields.json +++ b/apps/ukvi-complaints/translations/src/en/fields.json @@ -154,10 +154,10 @@ "label": "Case ID" }, "payment": { - "label": "Payment reference number" + "label": "Any payment reference" }, "other": { - "label": "Other reference number" + "label": "Any other reference" }, "none": { "label": "I don’t have any of these " From 371aa78fddf72689ddddb0a0da1f8835ed6cb973 Mon Sep 17 00:00:00 2001 From: chisomoguibe Date: Mon, 20 Feb 2023 16:42:16 +0000 Subject: [PATCH 16/18] add missing refund details in "Check your answers" page --- apps/ukvi-complaints/index.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/ukvi-complaints/index.js b/apps/ukvi-complaints/index.js index 9f8aba67..253508bb 100644 --- a/apps/ukvi-complaints/index.js +++ b/apps/ukvi-complaints/index.js @@ -895,6 +895,8 @@ module.exports = { 'vac-country', 'vac-city', 'ukvcas-city', + 'refund', + 'refund-type', 'when-applied', 'complaint-reference-number', 'gwf-reference', From fecfe8a331810a617433f7966aa9563b6dbc5b3b Mon Sep 17 00:00:00 2001 From: chisomoguibe Date: Tue, 21 Feb 2023 11:42:40 +0000 Subject: [PATCH 17/18] add extra missing refund details in "Check your answers" page --- apps/ukvi-complaints/index.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/ukvi-complaints/index.js b/apps/ukvi-complaints/index.js index 253508bb..445e5e90 100644 --- a/apps/ukvi-complaints/index.js +++ b/apps/ukvi-complaints/index.js @@ -897,7 +897,11 @@ module.exports = { 'ukvcas-city', 'refund', 'refund-type', + 'refund-ihs-where-from', + 'refund-super-priority-where-from', + 'refund-priority-where-from', 'when-applied', + 'where-applied-from', 'complaint-reference-number', 'gwf-reference', 'ho-reference', From f2f34ac707c7b5c524b7d7fdad82b7edbf672eee Mon Sep 17 00:00:00 2001 From: chisomoguibe Date: Wed, 22 Feb 2023 09:54:53 +0000 Subject: [PATCH 18/18] Add validation error message for exceeding character limit for complaint details --- apps/ukvi-complaints/translations/src/en/fields.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/ukvi-complaints/translations/src/en/fields.json b/apps/ukvi-complaints/translations/src/en/fields.json index 7e9debfe..2d49491b 100644 --- a/apps/ukvi-complaints/translations/src/en/fields.json +++ b/apps/ukvi-complaints/translations/src/en/fields.json @@ -560,7 +560,8 @@ "complaint-details": { "label": "Complaint details", "validation": { - "required": "Enter more details about why you are making a complaint" + "required": "Enter more details about why you are making a complaint", + "maxlength": "Enter fewer than 50000 characters" } }, "other-complaint": {