diff --git a/app/assets/javascripts/shared/meetings-2/change-meeting-due-date.js b/app/assets/javascripts/shared/meetings-2/change-meeting-due-date.js new file mode 100644 index 00000000..1afa83ac --- /dev/null +++ b/app/assets/javascripts/shared/meetings-2/change-meeting-due-date.js @@ -0,0 +1,94 @@ +// Validation for the CPS pre-trial meeting offer due date field on the +// meetings-2 change-meeting-due-date page. Scenario: mandatory field. +function validateForm() { + // Clear previous errors + $('#error-form-group-1').removeClass('govuk-form-group--error'); + $('#error-form-group-2').removeClass('govuk-form-group--error'); + $('#error-message-1').remove(); + $('#error-message-2').remove(); + $('#meeting-due-date').removeClass('govuk-input--error'); + $('#reason-for-change').removeClass('govuk-textarea--error'); + $('#error-summary').remove(); + + var dateValue = document.getElementById('meeting-due-date').value; + var reasonForChange = document.getElementById('reason-for-change').value; + var dateDatePicker = $('#meeting-due-date-picker'); + var dateError = validateDate(dateValue); + var reasonError = null; + + if (!reasonForChange || reasonForChange.trim() === '') { + reasonError = 'Enter the reason for changing the meeting offer due date'; + } + + if (dateError || reasonError) { + var summaryItems = ''; + if (dateError) { + summaryItems += '
  • ' + dateError + '
  • '; + } + if (reasonError) { + summaryItems += '
  • ' + reasonError + '
  • '; + } + + // Error summary at the top + $('form').before( + '' + ); + $('#error-summary').focus(); + + if (dateError) { + // Error form group styling + $('#error-form-group-1').addClass('govuk-form-group--error'); + + // Error message below the label, before the date picker + dateDatePicker.before('

    Error: ' + dateError + '

    '); + + // Error input field styling + $('#meeting-due-date').addClass('govuk-input--error'); + } + + if (reasonError) { + // Error form group and textarea styling + $('#error-form-group-2').addClass('govuk-form-group--error'); + $('#reason-for-change').addClass('govuk-textarea--error'); + + // Error message below the label, before the textarea + $('#reason-for-change').before('

    Error: ' + reasonError + '

    '); + } + + return false; + } + + return true; +} + +function validateDate(dateString) { + // Mandatory field + if (!dateString || dateString.trim() === '') { + return 'Enter the CPS pre-trial meeting offer due date'; + } + + // Check format (DD/MM/YYYY) + var datePattern = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/; + var match = dateString.match(datePattern); + + if (!match) { + return 'The CPS pre-trial meeting offer due date must be a real date'; + } + + var day = parseInt(match[1], 10); + var month = parseInt(match[2], 10); + var year = parseInt(match[3], 10); + + // Check valid month + if (month < 1 || month > 12) { + return 'The CPS pre-trial meeting offer due date must be a real date'; + } + + // Check valid day for month + var daysInMonth = new Date(year, month, 0).getDate(); + if (day < 1 || day > daysInMonth) { + return 'The CPS pre-trial meeting offer due date must be a real date'; + } + + return null; // No error +} diff --git a/app/assets/javascripts/shared/meetings-2/due-date.js b/app/assets/javascripts/shared/meetings-2/due-date.js index e83f21d4..4e3a3054 100644 --- a/app/assets/javascripts/shared/meetings-2/due-date.js +++ b/app/assets/javascripts/shared/meetings-2/due-date.js @@ -44,7 +44,7 @@ function validateDate(dateString) { var match = dateString.match(datePattern); if (!match) { - return 'Enter the date in the correct format, like 20/08/2026'; + return 'The date the defendant pleaded not guilty must be a real date'; } var day = parseInt(match[1], 10); @@ -53,13 +53,13 @@ function validateDate(dateString) { // Check valid month if (month < 1 || month > 12) { - return 'Enter a real date'; + return 'The date the defendant pleaded not guilty must be a real date'; } // Check valid day for month var daysInMonth = new Date(year, month, 0).getDate(); if (day < 1 || day > daysInMonth) { - return 'Enter a real date'; + return 'The date the defendant pleaded not guilty must be a real date'; } // Must be today or in the past diff --git a/app/assets/javascripts/shared/meetings-2/meeting-due-date.js b/app/assets/javascripts/shared/meetings-2/meeting-due-date.js index f1b5b29d..ea023817 100644 --- a/app/assets/javascripts/shared/meetings-2/meeting-due-date.js +++ b/app/assets/javascripts/shared/meetings-2/meeting-due-date.js @@ -18,7 +18,7 @@ function validateForm() { // The radio question is mandatory if (!selectedOption) { - optionError = 'Select when the offer is due for the CPS pre-trial meeting'; + optionError = 'Select when the offer is due for the CPS pre‑trial meeting'; } else if (selectedOption === 'other-date' && dueDateValue.trim() === '') { // Conditional date field is mandatory when "By another date" is chosen dateError = 'Enter the meeting offer due date'; diff --git a/app/assets/javascripts/shared/tasks-table.js b/app/assets/javascripts/shared/tasks-table.js index 8b1039fb..d1d540b2 100644 --- a/app/assets/javascripts/shared/tasks-table.js +++ b/app/assets/javascripts/shared/tasks-table.js @@ -290,7 +290,7 @@ var initialSetupComplete = false; if (selectedMeetingPurposes.length > 0 && searchFormSubmitted) { var rowPurpose = row.getAttribute('data-purpose') || ''; var matchesPurpose = selectedMeetingPurposes.some(function(purpose) { - if (purpose === 'CPS pre-trial meeting') return rowPurpose.indexOf('pre-trial') !== -1; + if (purpose === 'CPS pre‑trial meeting') return rowPurpose.indexOf('pre-trial') !== -1; if (purpose === 'Inform victim about charging decision') return rowPurpose.indexOf('charging-decision') !== -1; if (purpose === 'Stopped or substantially altered charge (VCL Scheme)') return rowPurpose.indexOf('stopped-altered') !== -1; if (purpose === "Victims' Right to Review (VRR)") return rowPurpose.indexOf('vrr') !== -1; diff --git a/app/assets/javascripts/shared/tasks.js b/app/assets/javascripts/shared/tasks.js index ba5bd672..d60f0ed1 100644 --- a/app/assets/javascripts/shared/tasks.js +++ b/app/assets/javascripts/shared/tasks.js @@ -423,11 +423,11 @@ function applyTaskFilters() { var matchesTaskType = selectedTaskTypes.some(function(taskType) { if (taskType === 'Other') { // Match anything not in the known task types - var knownTypes = ['Inform of a decision to charge', 'Inform of a no further action decision', 'Inform of a stopped charge', 'Inform of a substantially altered charge', 'Arrange CPS pre-trial meeting', 'Arrange a CPS pre-trial meeting', 'Log offered meeting', 'Log arranged meeting', 'Log offer response', 'Log meeting outcome']; + var knownTypes = ['Inform of a decision to charge', 'Inform of a no further action decision', 'Inform of a stopped charge', 'Inform of a substantially altered charge', 'Arrange CPS pre‑trial meeting', 'Arrange a CPS pre‑trial meeting', 'Log offered meeting', 'Log arranged meeting', 'Log offer response', 'Log meeting outcome']; return !knownTypes.some(function(known) { return recordTask.indexOf(known) !== -1; }); } - if (taskType === 'Arrange CPS pre-trial meeting') { - return recordTask.indexOf('Arrange') !== -1 && recordTask.indexOf('pre-trial meeting') !== -1; + if (taskType === 'Arrange CPS pre‑trial meeting') { + return recordTask.indexOf('Arrange') !== -1 && recordTask.indexOf('pre‑trial meeting') !== -1; } return recordTask.indexOf(taskType) !== -1; }); diff --git a/app/assets/sass/application.scss b/app/assets/sass/application.scss index 656a39e3..f0cedb12 100644 --- a/app/assets/sass/application.scss +++ b/app/assets/sass/application.scss @@ -108,4 +108,8 @@ font-weight: 400; font-size: 1rem; line-height: 1.25; +} + +.govuk-language-navigation__list-item:not(:last-child)::after { + border-right: none; } \ No newline at end of file diff --git a/app/data/task-records.js b/app/data/task-records.js index 81c22a13..6408aad6 100644 --- a/app/data/task-records.js +++ b/app/data/task-records.js @@ -39,7 +39,7 @@ module.exports = [ surname: 'SMITH', forename: 'Jackie', task: 'Log offered meeting', - purpose: 'CPS pre-trial meeting', + purpose: 'CPS pre‑trial meeting', dueDate: formatDate(0), dueDateTag: 'Due today', dueDateTagColor: 'pink', @@ -62,7 +62,7 @@ module.exports = [ surname: 'PHILLIPS', forename: 'Sarah', task: 'Log offered meeting', - purpose: 'CPS pre-trial meeting', + purpose: 'CPS pre‑trial meeting', dueDate: formatDate(5), service: 'Universal', area: 'London', @@ -95,7 +95,7 @@ module.exports = [ surname: 'BROWN', forename: 'Michael', task: 'Log arranged meeting', - purpose: 'CPS pre-trial meeting', + purpose: 'CPS pre‑trial meeting', dueDate: formatDate(0), dueDateTag: 'Due today', dueDateTagColor: 'pink', @@ -130,7 +130,7 @@ module.exports = [ surname: 'DAVIES', forename: 'Thomas', task: 'Log arranged meeting', - purpose: 'CPS pre-trial meeting', + purpose: 'CPS pre‑trial meeting', dueDate: formatDate(0), dueDateTag: 'Due today', dueDateTagColor: 'pink', @@ -143,7 +143,7 @@ module.exports = [ surname: 'WILSON', forename: 'Charlotte', task: 'Log meeting outcome', - purpose: 'CPS pre-trial meeting', + purpose: 'CPS pre‑trial meeting', dueDate: formatDate(4), service: 'Universal', area: 'London', @@ -154,7 +154,7 @@ module.exports = [ surname: 'EVANS', forename: 'Sophie', task: 'Log meeting outcome', - purpose: 'CPS pre-trial meeting', + purpose: 'CPS pre‑trial meeting', dueDate: formatDate(0), dueDateTag: 'Due today', dueDateTagColor: 'pink', @@ -221,7 +221,7 @@ module.exports = [ surname: 'MURPHY', forename: 'Sean', task: 'Log offered meeting', - purpose: 'CPS pre-trial meeting', + purpose: 'CPS pre‑trial meeting', dueDate: formatDate(12), service: 'RASSO', area: 'Greater Manchester', @@ -244,7 +244,7 @@ module.exports = [ surname: 'MASON', forename: 'George', task: 'Log arranged meeting', - purpose: 'CPS pre-trial meeting', + purpose: 'CPS pre‑trial meeting', dueDate: formatDate(3), service: 'Universal', area: 'London', @@ -265,7 +265,7 @@ module.exports = [ surname: 'BAKER', forename: 'Louise', task: 'Log meeting outcome', - purpose: 'CPS pre-trial meeting', + purpose: 'CPS pre‑trial meeting', dueDate: formatDate(0), dueDateTag: 'Due today', dueDateTagColor: 'pink', @@ -300,7 +300,7 @@ module.exports = [ surname: 'RICHARDS', forename: 'Peter', task: 'Log offered meeting', - purpose: 'CPS pre-trial meeting', + purpose: 'CPS pre‑trial meeting', dueDate: formatDate(13), service: 'Enhanced', area: 'South Wales', @@ -333,7 +333,7 @@ module.exports = [ surname: 'AHMED', forename: 'Fatima', task: 'Log arranged meeting', - purpose: 'CPS pre-trial meeting', + purpose: 'CPS pre‑trial meeting', dueDate: formatDate(4), service: 'Universal', area: 'London', @@ -354,7 +354,7 @@ module.exports = [ surname: 'HARPER', forename: 'Olivia', task: 'Log meeting outcome', - purpose: 'CPS pre-trial meeting', + purpose: 'CPS pre‑trial meeting', dueDate: formatDate(-6), dueDateTag: 'Overdue', dueDateTagColor: 'red', @@ -367,7 +367,7 @@ module.exports = [ surname: 'WALSH', forename: 'Kieran', task: 'Log offered meeting', - purpose: 'CPS pre-trial meeting', + purpose: 'CPS pre‑trial meeting', dueDate: formatDate(21), service: 'Universal', area: 'London', @@ -400,7 +400,7 @@ module.exports = [ surname: 'WEBB', forename: 'Natalie', task: 'Log arranged meeting', - purpose: 'CPS pre-trial meeting', + purpose: 'CPS pre‑trial meeting', dueDate: formatDate(-7), dueDateTag: 'Overdue', dueDateTagColor: 'red', @@ -423,7 +423,7 @@ module.exports = [ surname: 'Murray', forename: 'Emily', task: 'Log meeting outcome', - purpose: 'CPS pre-trial meeting', + purpose: 'CPS pre‑trial meeting', dueDate: formatDate(20), service: 'Enhanced', area: 'Stafford', @@ -456,7 +456,7 @@ module.exports = [ surname: 'BARKER', forename: 'Liam', task: 'Log offered meeting', - purpose: 'CPS pre-trial meeting', + purpose: 'CPS pre‑trial meeting', dueDate: formatDate(25), service: 'Enhanced', area: 'Warwickshire', @@ -479,7 +479,7 @@ module.exports = [ surname: 'TURNER', forename: 'Jack', task: 'Log arranged meeting', - purpose: 'CPS pre-trial meeting', + purpose: 'CPS pre‑trial meeting', dueDate: formatDate(27), service: 'RASSO', area: 'Greater Manchester', @@ -490,7 +490,7 @@ module.exports = [ surname: 'HALL', forename: 'Bethany', task: 'Log meeting outcome', - purpose: 'CPS pre-trial meeting', + purpose: 'CPS pre‑trial meeting', dueDate: formatDate(0), dueDateTag: 'Due today', dueDateTagColor: 'pink', @@ -523,7 +523,7 @@ module.exports = [ surname: 'FOSTER', forename: 'Nathan', task: 'Log offered meeting', - purpose: 'CPS pre-trial meeting', + purpose: 'CPS pre‑trial meeting', dueDate: formatDate(26), service: 'RASSO', area: 'Devon and Cornwall', @@ -556,7 +556,7 @@ module.exports = [ surname: 'COLEMAN', forename: 'Stacey', task: 'Log arranged meeting', - purpose: 'CPS pre-trial meeting', + purpose: 'CPS pre‑trial meeting', dueDate: formatDate(0), dueDateTag: 'Due today', dueDateTagColor: 'pink', @@ -569,7 +569,7 @@ module.exports = [ surname: 'BURKE', forename: 'Declan', task: 'Log meeting outcome', - purpose: 'CPS pre-trial meeting', + purpose: 'CPS pre‑trial meeting', dueDate: formatDate(22), service: 'Universal', area: 'Bedfordshire', @@ -602,7 +602,7 @@ module.exports = [ surname: 'NOLAN', forename: 'Grace', task: 'Log offered meeting', - purpose: 'CPS pre-trial meeting', + purpose: 'CPS pre‑trial meeting', dueDate: formatDate(15), service: 'Universal', area: 'London', @@ -625,7 +625,7 @@ module.exports = [ surname: 'PEARSON', forename: 'Katie', task: 'Log arranged meeting', - purpose: 'CPS pre-trial meeting', + purpose: 'CPS pre‑trial meeting', dueDate: formatDate(28), service: 'Universal', area: 'North Yorkshire', @@ -646,7 +646,7 @@ module.exports = [ surname: 'WOOD', forename: 'Holly', task: 'Log meeting outcome', - purpose: 'CPS pre-trial meeting', + purpose: 'CPS pre‑trial meeting', dueDate: formatDate(-4), dueDateTag: 'Overdue', dueDateTagColor: 'red', @@ -679,7 +679,7 @@ module.exports = [ surname: 'CUNNINGHAM', forename: 'Niall', task: 'Log offered meeting', - purpose: 'CPS pre-trial meeting', + purpose: 'CPS pre‑trial meeting', dueDate: formatDate(0), dueDateTag: 'Due today', dueDateTagColor: 'pink', @@ -702,7 +702,7 @@ module.exports = [ surname: 'BRENNAN', forename: 'Ciara', task: 'Log arranged meeting', - purpose: 'CPS pre-trial meeting', + purpose: 'CPS pre‑trial meeting', dueDate: formatDate(37), service: 'Universal', area: 'Thames Valley', @@ -725,7 +725,7 @@ module.exports = [ surname: 'NEWTON', forename: 'Abigail', task: 'Log meeting outcome', - purpose: 'CPS pre-trial meeting', + purpose: 'CPS pre‑trial meeting', dueDate: formatDate(9), service: 'Universal', area: 'London', @@ -758,7 +758,7 @@ module.exports = [ surname: 'PAYNE', forename: 'Connor', task: 'Log offered meeting', - purpose: 'CPS pre-trial meeting', + purpose: 'CPS pre‑trial meeting', dueDate: formatDate(41), service: 'Enhanced', area: 'South Wales', @@ -781,7 +781,7 @@ module.exports = [ surname: 'SPENCER', forename: 'Harry', task: 'Log arranged meeting', - purpose: 'CPS pre-trial meeting', + purpose: 'CPS pre‑trial meeting', dueDate: formatDate(43), service: 'Enhanced', area: 'West Yorkshire', @@ -802,7 +802,7 @@ module.exports = [ surname: 'DOYLE', forename: 'Rory', task: 'Log meeting outcome', - purpose: 'CPS pre-trial meeting', + purpose: 'CPS pre‑trial meeting', dueDate: formatDate(0), dueDateTag: 'Due today', dueDateTagColor: 'pink', @@ -835,7 +835,7 @@ module.exports = [ surname: 'FARRELL', forename: 'Niamh', task: 'Log offered meeting', - purpose: 'CPS pre-trial meeting', + purpose: 'CPS pre‑trial meeting', dueDate: formatDate(-9), dueDateTag: 'Overdue', dueDateTagColor: 'red', @@ -858,7 +858,7 @@ module.exports = [ surname: 'LAMBERT', forename: 'Freya', task: 'Log arranged meeting', - purpose: 'CPS pre-trial meeting', + purpose: 'CPS pre‑trial meeting', dueDate: formatDate(39), service: 'Universal', area: 'North Yorkshire', @@ -881,7 +881,7 @@ module.exports = [ surname: 'HOLLAND', forename: 'Amber', task: 'Log meeting outcome', - purpose: 'CPS pre-trial meeting', + purpose: 'CPS pre‑trial meeting', dueDate: formatDate(42), service: 'Enhanced', area: 'Nottinghamshire', diff --git a/app/filters.js b/app/filters.js index 2f5967cf..26c0d2df 100644 --- a/app/filters.js +++ b/app/filters.js @@ -143,19 +143,21 @@ addFilter('sortPcdDecisions', decisions => { // the second argument so "other" resolves to the free-text description. addFilter('meetingPurposeLabel', (purpose, details) => { const labels = { - 'pre-trial': 'CPS pre-trial meeting', + 'ptm': 'CPS pre‑trial meeting', + 'pre-trial': 'CPS pre‑trial meeting', 'pre-charge': 'Pre-charge meeting', 'charging-decision': 'Inform victim about charging decision', 'charging-decision-family': 'Inform bereaved family about charging decision', 'conviction': 'Conviction meeting', 'sentencing': 'Sentencing meeting', 'acquittal': 'Acquittal meeting', + 'vcl': 'Stopped or substantially altered charge (VCL Scheme)', 'stopped-altered': 'Stopped or substantially altered charge (VCL Scheme)', 'vrr': "Victims' Right to Review (VRR)", 'joint': 'Joint CPS and Police meeting', 'lesser-offence': 'Lesser offence meeting', - 'complaint': 'Bereaved family complaint', + 'complaint': 'Victim complaint', 'other': details || 'Other' } - return labels[purpose] || 'CPS pre-trial meeting' + return labels[purpose] || 'CPS pre‑trial meeting' }) \ No newline at end of file diff --git a/app/routes/meetings.js b/app/routes/meetings.js index d0d0c623..4e92608d 100644 --- a/app/routes/meetings.js +++ b/app/routes/meetings.js @@ -1,5 +1,21 @@ // All shared /v60/* routes are registered by v60.js (loaded first in routes.js) +// The /v50 Meetings sub-tab is a single page; each outcome is a state on it. +function v50MeetingState(state) { + return '/v50/meetings-2/victim-record?secondaryNav=ptm&meetingState=' + state + '&meetingSuccess=yes#communications' +} + +function meetingMethodLabel(method) { + var labels = { + 'letter-post': 'Letter by post', + 'letter-email': 'Letter by email', + 'letter-police': 'Letter by police', + 'letter-isva': 'Letter by ISVA', + telephone: 'By telephone' + } + return labels[method] || '' +} + module.exports = router => { // Pre-population across /bfs/meetings-2 flows is only wanted when the user @@ -48,7 +64,7 @@ module.exports = router => { router.post('/bfs/meetings-2/logging-answer', function(request, response) { var logging = request.session.data['logging'] - if (logging == "yes"){ + if (logging == "meeting-offer"){ response.redirect("/bfs/meetings-2/purpose2") } else { response.redirect("/bfs/meetings-2/purpose") @@ -56,7 +72,12 @@ module.exports = router => { }) router.post('/logging-answer', function(request, response) { - response.redirect("/v50/meetings-2/purpose") + var logging = request.session.data['logging'] + if (logging == "meeting-offer" || logging == "meeting-arrangments" || logging == "meeting-outcome") { + response.redirect("/v50/meetings-2/purpose") + } else { + response.redirect("/v50/meetings-2/purpose") + } }) @@ -93,23 +114,23 @@ module.exports = router => { - router.post('/bfs/meetings-2/purpose3-answer', function(request, response) { + router.post('/bfs/meetings-2/meetingPurpose-answer', function(request, response) { - var purpose3 = request.session.data['purpose3'] - if (purpose3 == "pre-trial"){ + var meetingPurpose = request.session.data['meetingPurpose'] + if (meetingPurpose == "ptm"){ response.redirect("/bfs/meetings-2/confirm-arrangements/who-requested-meeting") } else { response.redirect("/bfs/meetings-2/confirm-arrangements/who-requested-meeting") } }) - router.post('/purpose3-answer', function(request, response) { + router.post('/meetingPurpose-answer', function(request, response) { - var purpose3 = request.session.data['purpose3'] - if (purpose3 == "pre-trial"){ - response.redirect("/v50/meetings-2/due-date") + var meetingPurpose = request.session.data['meetingPurpose'] + if (meetingPurpose == "ptm"){ + response.redirect("/v50/meetings-2/not-guilty-plea-date") } else { - response.redirect("/v50/meetings-2/due-date") + response.redirect("/v50/meetings-2/not-guilty-plea-date") } }) @@ -333,6 +354,37 @@ module.exports = router => { } }) + router.post('/v50/meetings-2/cps-offer/not-offered-answer', function(request, response) { + request.session.data['meetingNotOfferedReason'] = request.body['meetingNotOfferedReason'] || '' + response.redirect(v50MeetingState('not-offered')) + }) + + router.post('/v50/meetings-2/cancelled/meeting-date-answer', function(request, response) { + response.redirect('/v50/meetings-2/cancelled/reason-why') + }) + + router.post('/v50/meetings-2/cancelled/reason-why-answer', function(request, response) { + response.redirect(v50MeetingState('cancelled')) + }) + + router.post('/v50/meetings-2/rescheduled/meeting-date-answer', function(request, response) { + var data = request.session.data + var arrangementKeys = ['MeetingDate', 'MeetingHour', 'MeetingMinutes', 'MeetingRequestedBy', 'MeetingFormat', 'MeetingLocationType', 'CpsLocation', 'MagistratesLocation', 'CrownLocation', 'PoliceStationLocation', 'OtherLocation', 'Attendees', 'MeetingLead', 'InterpreterNeeded', 'InterpreterDetails', 'SupportPersonNeeded', 'SupportPersonDetails', 'OtherSupportNeeds'] + arrangementKeys.forEach(function(key) { + var dataKey = key.charAt(0).toLowerCase() + key.slice(1) + data['previous' + key] = data[dataKey] + }) + response.redirect('/v50/meetings-2/rescheduled/reason-why') + }) + + router.post('/v50/meetings-2/rescheduled/reason-why-answer', function(request, response) { + var data = request.session.data + data['meetingDate'] = data['meetingRescheduledDate'] || data['meetingDate'] + data['meetingHour'] = data['meetingRescheduledHour'] || data['meetingHour'] + data['meetingMinutes'] = data['meetingRescheduledMinutes'] || data['meetingMinutes'] + response.redirect('/v50/meetings-2/rescheduled/check-answers2') + }) + router.post('/format-answer', function(request, response) { var format = request.session.data['format'] @@ -406,24 +458,9 @@ module.exports = router => { router.post('/howoffered-answer', function(request, response) { var howoffered = request.session.data['howoffered'] - if (howoffered == "letter-post"){ - response.redirect("/v50/meetings-2/cps-offer/meeting-offered-post#communications") - } - else if (howoffered == "letter-email"){ - response.redirect("/v50/meetings-2/cps-offer/meeting-offered-email#communications") - } - - else if (howoffered == "letter-isva"){ - response.redirect("/v50/meetings-2/cps-offer/meeting-offered-isva#communications") - } - - else if (howoffered == "letter-police"){ - response.redirect("/v50/meetings-2/cps-offer/meeting-offered-police#communications") - - - } else { - response.redirect("/v50/meetings-2/cps-offer/meeting-offered-telephone#communications") - } + request.session.data['meetingOfferMethod'] = meetingMethodLabel(howoffered) + request.session.data['meetingOfferDate'] = request.session.data['offerDate'] || '' + response.redirect(v50MeetingState('offered')) }) @@ -443,24 +480,9 @@ module.exports = router => { router.post('/howoffered2-answer', function(request, response) { var howoffered2 = request.session.data['howoffered2'] - if (howoffered2 == "letter-post"){ - response.redirect("/v50/meetings-2/cps-offer/meeting-offered-post-2#communications") - } - else if (howoffered2 == "letter-email"){ - response.redirect("/v50/meetings-2/cps-offer/meeting-offered-email#communications") - } - - else if (howoffered2 == "letter-isva"){ - response.redirect("/v50/meetings-2/cps-offer/meeting-offered-isva#communications") - } - - else if (howoffered2 == "letter-police"){ - response.redirect("/v50/meetings-2/cps-offer/meeting-offered-police#communications") - - - } else { - response.redirect("/v50/meetings-2/cps-offer/meeting-offered-telephone#communications") - } + request.session.data['meetingOfferMethod'] = meetingMethodLabel(howoffered2) + request.session.data['meetingOfferDate'] = request.session.data['offerDate2'] || '' + response.redirect(v50MeetingState(howoffered2 == "letter-post" ? 'offered-multi' : 'offered')) }) @@ -503,24 +525,9 @@ module.exports = router => { router.post('/recordaccepted-answer', function(request, response) { var recordaccepted = request.session.data['recordaccepted'] - if (recordaccepted == "letter-post"){ - response.redirect("/v50/meetings-2/cps-offer/meeting-accepted-post#communications") - } - else if (recordaccepted == "letter-email"){ - response.redirect("/v50/meetings-2/cps-offer/meeting-accepted-email#communications") - } - - else if (recordaccepted == "letter-isva"){ - response.redirect("/v50/meetings-2/cps-offer/meeting-accepted-isva#communications") - } - - else if (recordaccepted == "letter-police"){ - response.redirect("/v50/meetings-2/cps-offer/meeting-accepted-police#communications") - - - } else { - response.redirect("/v50/meetings-2/cps-offer/meeting-accepted-telephone#communications") - } + request.session.data['meetingAcceptedMethod'] = meetingMethodLabel(recordaccepted) + request.session.data['meetingAcceptedDate'] = request.session.data['acceptDate'] || '' + response.redirect(v50MeetingState('accepted')) }) router.post('/bfs/meetings-2/recorddeclined-answer', function(request, response) { @@ -561,24 +568,9 @@ module.exports = router => { router.post('/recorddeclined-answer', function(request, response) { var recorddeclined = request.session.data['recorddeclined'] - if (recorddeclined == "letter-post"){ - response.redirect("/v50/meetings-2/cps-offer/meeting-declined-post#communications") - } - else if (recorddeclined == "letter-email"){ - response.redirect("/v50/meetings-2/cps-offer/meeting-declined-email#communications") - } - - else if (recorddeclined == "letter-isva"){ - response.redirect("/v50/meetings-2/cps-offer/meeting-declined-isva#communications") - } - - else if (recorddeclined == "letter-police"){ - response.redirect("/v50/meetings-2/cps-offer/meeting-declined-police#communications") - - - } else { - response.redirect("/v50/meetings-2/cps-offer/meeting-declined-telephone#communications") - } + request.session.data['meetingDeclinedMethod'] = meetingMethodLabel(recorddeclined) + request.session.data['meetingDeclinedDate'] = request.session.data['declineDate'] || '' + response.redirect(v50MeetingState('declined')) }) @@ -736,6 +728,10 @@ module.exports = router => { } }) + router.post('/v50/meetings-2/log-outcome/reason-why-answer', function(request, response) { + response.redirect(v50MeetingState('outcome-no')) + }) + router.post('/did-victim-request', function(request, response) { var meeting = request.session.data['meeting'] @@ -989,6 +985,8 @@ module.exports = router => { request.session.data['meetingRescheduled'] = '' if (caBase.indexOf('/bfs') === 0) { response.redirect('/bfs/victim/index?secondaryNav=ptm&meetingState=arranged&meetingSuccess=yes#communications') + } else if (caBase.indexOf('/v50') === 0) { + response.redirect(v50MeetingState('arranged')) } else { response.redirect(caBase + 'meeting-confirmed#communications') } @@ -1060,7 +1058,12 @@ module.exports = router => { // v51 meetings — mirror of the v50 flows, redirecting to /v51 pages. router.post('/v51/logging-answer', function(request, response) { - response.redirect("/v51/meetings-2/purpose") + var logging = request.session.data['logging'] + if (logging == "meeting-offer" || logging == "meeting-arrangments" || logging == "meeting-outcome") { + response.redirect("/v51/meetings-2/purpose") + } else { + response.redirect("/v51/meetings-2/purpose") + } }) router.post('/v51/purpose-answer', function(request, response) { @@ -1071,8 +1074,13 @@ module.exports = router => { response.redirect("/v51/meetings/has-meeting-been-offered") }) - router.post('/v51/purpose3-answer', function(request, response) { - response.redirect("/v51/meetings-2/due-date") + router.post('/v51/meetingPurpose-answer', function(request, response) { + var meetingPurpose = request.session.data['meetingPurpose'] + if (meetingPurpose == "ptm"){ + response.redirect("/v51/meetings-2/due-date") + } else { + response.redirect("/v51/meetings-2/due-date") + } }) router.post('/v51/purpose4-answer', function(request, response) { diff --git a/app/routes/v50.js b/app/routes/v50.js index 2ad5ce60..81dbaac4 100644 --- a/app/routes/v50.js +++ b/app/routes/v50.js @@ -37,14 +37,27 @@ module.exports = router => { response.redirect("/v50/tasks") }) - router.post('/v50/meetings-2/due-date-answer', function(request, response) { + router.post('/v50/meetings-2/not-guilty-plea-date-answer', function(request, response) { response.redirect("/v50/meetings-2/meeting-due-date") }) router.post('/v50/meetings-2/meeting-due-date-answer', function(request, response) { - response.redirect("/v50/meetings-2/meeting-offered-date") + if (request.session.data['meetingPurpose'] === 'ptm' && request.session.data['logging'] === 'meeting-offer') { + response.redirect("/v50/meetings-2/has-meeting-been-offered") + } else { + response.redirect("/v50/meetings-2/meeting-offered-date") + } + }) + + router.post('/v50/meetings-2/change-meeting-due-date-answer', function(request, response) { + + if (request.session.data['meetingPurpose'] === 'ptm' && request.session.data['logging'] === 'meeting-offer') { + response.redirect("/v50/meetings-2/has-meeting-been-offered") + } else { + response.redirect("/v50/meetings-2/meeting-offered-date") + } }) router.post('/v50/onb/service-lead-answer', function(request, response) { @@ -176,7 +189,7 @@ module.exports = router => { if (!fromCheck) { delete request.session.data['nextTask'] delete request.session.data['meetingPurpose'] - delete request.session.data['meetingPurposeDetails'] + delete request.session.data['meetingPurposeOther'] delete request.session.data['taskDueDate'] delete request.session.data['manualTaskName'] delete request.session.data['taskNote'] diff --git a/app/routes/v51.js b/app/routes/v51.js index bfc6af98..076870d4 100644 --- a/app/routes/v51.js +++ b/app/routes/v51.js @@ -166,7 +166,7 @@ module.exports = router => { if (!fromCheck) { delete request.session.data['nextTask'] delete request.session.data['meetingPurpose'] - delete request.session.data['meetingPurposeDetails'] + delete request.session.data['meetingPurposeOther'] delete request.session.data['taskDueDate'] delete request.session.data['manualTaskName'] delete request.session.data['taskNote'] diff --git a/app/views/bfs/meetings-2/confirm-arrangements/check-answers-email.html b/app/views/bfs/meetings-2/confirm-arrangements/check-answers-email.html index 4c6592a5..9d2e73e6 100644 --- a/app/views/bfs/meetings-2/confirm-arrangements/check-answers-email.html +++ b/app/views/bfs/meetings-2/confirm-arrangements/check-answers-email.html @@ -157,7 +157,7 @@

    Check your answers before confirming details

    - Confirm details to offer a CPS pre-trial meeting + Confirm details
    diff --git a/app/views/bfs/meetings-2/confirm-arrangements/check-answers-isva.html b/app/views/bfs/meetings-2/confirm-arrangements/check-answers-isva.html index 4c6592a5..9d2e73e6 100644 --- a/app/views/bfs/meetings-2/confirm-arrangements/check-answers-isva.html +++ b/app/views/bfs/meetings-2/confirm-arrangements/check-answers-isva.html @@ -157,7 +157,7 @@

    Check your answers before confirming details

    - Confirm details to offer a CPS pre-trial meeting + Confirm details
    diff --git a/app/views/bfs/meetings-2/confirm-arrangements/check-answers-police.html b/app/views/bfs/meetings-2/confirm-arrangements/check-answers-police.html index 4c6592a5..9d2e73e6 100644 --- a/app/views/bfs/meetings-2/confirm-arrangements/check-answers-police.html +++ b/app/views/bfs/meetings-2/confirm-arrangements/check-answers-police.html @@ -157,7 +157,7 @@

    Check your answers before confirming details

    - Confirm details to offer a CPS pre-trial meeting + Confirm details
    diff --git a/app/views/bfs/meetings-2/confirm-arrangements/check-answers-telephone.html b/app/views/bfs/meetings-2/confirm-arrangements/check-answers-telephone.html index 4c6592a5..9d2e73e6 100644 --- a/app/views/bfs/meetings-2/confirm-arrangements/check-answers-telephone.html +++ b/app/views/bfs/meetings-2/confirm-arrangements/check-answers-telephone.html @@ -157,7 +157,7 @@

    Check your answers before confirming details

    - Confirm details to offer a CPS pre-trial meeting + Confirm details
    diff --git a/app/views/bfs/meetings-2/confirm-arrangements/cps-location.html b/app/views/bfs/meetings-2/confirm-arrangements/cps-location.html index ccdef585..3fe1b4a2 100644 --- a/app/views/bfs/meetings-2/confirm-arrangements/cps-location.html +++ b/app/views/bfs/meetings-2/confirm-arrangements/cps-location.html @@ -24,7 +24,7 @@

    - Continue to offer a CPS pre-trial meeting + Continue
    diff --git a/app/views/bfs/meetings-2/confirm-arrangements/crown-location.html b/app/views/bfs/meetings-2/confirm-arrangements/crown-location.html index 13585c1c..3659b963 100644 --- a/app/views/bfs/meetings-2/confirm-arrangements/crown-location.html +++ b/app/views/bfs/meetings-2/confirm-arrangements/crown-location.html @@ -24,7 +24,7 @@

    - Continue to offer a CPS pre-trial meeting + Continue
    diff --git a/app/views/bfs/meetings-2/confirm-arrangements/magistrate-location.html b/app/views/bfs/meetings-2/confirm-arrangements/magistrate-location.html index bcea88bd..576c66ce 100644 --- a/app/views/bfs/meetings-2/confirm-arrangements/magistrate-location.html +++ b/app/views/bfs/meetings-2/confirm-arrangements/magistrate-location.html @@ -24,7 +24,7 @@

    - Continue to offer a CPS pre-trial meeting + Continue
    diff --git a/app/views/bfs/meetings-2/confirm-arrangements/police-station.html b/app/views/bfs/meetings-2/confirm-arrangements/police-station.html index 6e56a9a8..8f91673f 100644 --- a/app/views/bfs/meetings-2/confirm-arrangements/police-station.html +++ b/app/views/bfs/meetings-2/confirm-arrangements/police-station.html @@ -24,7 +24,7 @@

    - Continue to offer a CPS pre-trial meeting + Continue
    diff --git a/app/views/bfs/meetings-2/cps-offer/purpose-notaccepted.html b/app/views/bfs/meetings-2/cps-offer/purpose-notaccepted.html index 980455a5..94a09894 100644 --- a/app/views/bfs/meetings-2/cps-offer/purpose-notaccepted.html +++ b/app/views/bfs/meetings-2/cps-offer/purpose-notaccepted.html @@ -21,8 +21,8 @@ {% set emailHtml %} {{ govukTextarea({ id: "meeting-purpose-details", - name: "meetingPurposeDetails", - value: data['meetingPurposeDetails'] if data['changeMode'] == 'true', + name: "meetingPurposeOther", + value: data['meetingPurposeOther'] if data['changeMode'] == 'true', type: "text", spellcheck: false, classes: "govuk-input--width-20", @@ -44,13 +44,25 @@ }, items: [ { - value: "pre-trial", - text: "CPS pre-trial meeting" + value: "ptm", + text: "CPS pre‑trial meeting" }, { value: "charging-decision", text: "Inform victim about charging decision" }, + { + value: "vcl", + text: "Stopped or substantially altered charge (VCL Scheme)" + }, + { + value: "vrr", + text: "Victims' Right to Review (VRR)" + }, + { + value: "complaint", + text: "Victim complaint" + }, { value: "other", text: "Other", diff --git a/app/views/bfs/meetings-2/cps-offer/what-do-you-want-to-log.html b/app/views/bfs/meetings-2/cps-offer/what-do-you-want-to-log.html index f0eaac20..76333962 100644 --- a/app/views/bfs/meetings-2/cps-offer/what-do-you-want-to-log.html +++ b/app/views/bfs/meetings-2/cps-offer/what-do-you-want-to-log.html @@ -28,12 +28,16 @@ }, items: [ { - value: "yes", + value: "meeting-offer", text: "A meeting offer" }, { - value: "no", + value: "meeting-arrangments", text: "Meeting arrangement details" + }, + { + value: "meeting-outcome", + text: "Meeting outcome details" } ] }) }} diff --git a/app/views/bfs/meetings-2/purpose.html b/app/views/bfs/meetings-2/purpose.html index cd70d8a1..839898af 100644 --- a/app/views/bfs/meetings-2/purpose.html +++ b/app/views/bfs/meetings-2/purpose.html @@ -14,15 +14,15 @@
    -
    + {% from "govuk/components/radios/macro.njk" import govukRadios %} {% from "govuk/components/input/macro.njk" import govukInput %} {% set emailHtml %} {{ govukTextarea({ id: "meeting-purpose-details", - name: "meetingPurposeDetails", - value: data['meetingPurposeDetails'] if data['changeMode'] == 'true', + name: "meetingPurposeOther", + value: data['meetingPurposeOther'] if data['changeMode'] == 'true', type: "text", spellcheck: false, classes: "govuk-input--width-20", @@ -44,7 +44,7 @@ }, items: [ { - value: "pre-trial", + value: "ptm", text: "CPS pre-trial meeting" }, { @@ -52,7 +52,7 @@ text: "Inform victim about charging decision" }, { - value: "stopped-altered", + value: "vcl", text: "Stopped or substantially altered charge (VCL Scheme)" }, { diff --git a/app/views/bfs/meetings-2/purpose2.html b/app/views/bfs/meetings-2/purpose2.html index 67baff08..56c6f5d3 100644 --- a/app/views/bfs/meetings-2/purpose2.html +++ b/app/views/bfs/meetings-2/purpose2.html @@ -22,8 +22,8 @@ {% set emailHtml %} {{ govukTextarea({ id: "meeting-purpose-details", - name: "meetingPurposeDetails", - value: data['meetingPurposeDetails'] if data['changeMode'] == 'true', + name: "meetingPurposeOther", + value: data['meetingPurposeOther'] if data['changeMode'] == 'true', type: "text", spellcheck: false, classes: "govuk-input--width-20", @@ -45,7 +45,7 @@ }, items: [ { - value: "pre-trial", + value: "ptm", text: "CPS pre-trial meeting" }, { @@ -53,7 +53,7 @@ text: "Inform victim about charging decision" }, { - value: "stopped-altered", + value: "vcl", text: "Stopped or substantially altered charge (VCL Scheme)" }, { diff --git a/app/views/bfs/meetings-2/search.html b/app/views/bfs/meetings-2/search.html index cf363aca..66c3189a 100644 --- a/app/views/bfs/meetings-2/search.html +++ b/app/views/bfs/meetings-2/search.html @@ -31,7 +31,7 @@

    Enter a case URN

    - +
    diff --git a/app/views/bfs/tasks.html b/app/views/bfs/tasks.html index abad12c0..45cb45c8 100644 --- a/app/views/bfs/tasks.html +++ b/app/views/bfs/tasks.html @@ -507,7 +507,7 @@

    Tasks

    - + diff --git a/app/views/bfs/victim/victim-details/address.html b/app/views/bfs/victim/victim-details/address.html index 782a19a7..2f1cfbeb 100644 --- a/app/views/bfs/victim/victim-details/address.html +++ b/app/views/bfs/victim/victim-details/address.html @@ -22,14 +22,14 @@

    Change address for {{ data['victimForename'] }} {{ d - +

    - +
    @@ -43,7 +43,7 @@

    Change address for {{ data['victimForename'] }} {{ d - +

    diff --git a/app/views/layouts/main.html b/app/views/layouts/main.html index 206bc9b8..dcb9b06a 100644 --- a/app/views/layouts/main.html +++ b/app/views/layouts/main.html @@ -92,12 +92,57 @@ +{% block govukServiceNavigation %} +
    +
    +
    + + +
    +
    +
    +{% endblock %} {% endblock %} {% block footer %}