Skip to content

Commit

Permalink
RIA-TASK Merged Master into Refund (#1216)
Browse files Browse the repository at this point in the history
* DIAC-566 - 3.2.3: Consistent Navigation (Level AA) (#1203)

* DIAC-566: add main block from govuk package and add tabindex attribute

* DIAC-566: amend build issue

* DIAC-566: temp. fix build issues

* DIAC-566: correct quotation marks

* DIAC-566: add tests

* DIAC-566: correct capitalisation and remove unused import

* DIAC-566: abstract repeated lines into function

* Update skip-link.test.ts

* DIAC-566: add newline between func. and first describe test

* DIAC-566: temp. fix build

* DIAC-566: temp. build fix

---------

Co-authored-by: Phoebe Revolta <[email protected]>
Co-authored-by: jamiephillipshmcts <[email protected]>

* DIAC-561 allowing hearing notices to all come through as separate events for separate notices (i.e. after rehearing) (#1171)

* RIA-task fix rebase issue

---------

Co-authored-by: pr00279 <[email protected]>
Co-authored-by: Phoebe Revolta <[email protected]>
Co-authored-by: jamiephillipshmcts <[email protected]>
Co-authored-by: Nilay <[email protected]>
  • Loading branch information
5 people authored Oct 2, 2024
1 parent 3bf450a commit a3279b5
Show file tree
Hide file tree
Showing 15 changed files with 863 additions and 115 deletions.
70 changes: 64 additions & 6 deletions app/controllers/detail-viewers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,7 @@ async function getAppealDetails(req: Request): Promise<Array<any>> {
}
return rows;
}

async function getAppealDlrmFeeRemissionDetails(req: Request): Promise<any> {
const { application } = req.session.appeal;
const nation = application.personalDetails.stateless === 'isStateless' ? 'Stateless' : countryList.find(country => country.value === application.personalDetails.nationality).name;
Expand Down Expand Up @@ -872,16 +873,70 @@ function getNoticeEndedAppeal(req: Request, res: Response, next: NextFunction) {
}
}

function findDocumentInReheardHearingDocCollection(collections, fileId: string): Evidence | undefined {
for (let collection of collections) {
let documentCollection = collection.value ? collection.value : {};
const docs = documentCollection.reheardHearingDocs;
if (docs) {
const document: Evidence = docs.find((doc: Evidence) => doc.fileId === fileId);
if (document) {
return document;
}
}
}
return undefined;
}

function getLatestHearingNoticeDocument(appeal: Appeal): Evidence | undefined {
let reheardHearingDocuments: Evidence[] = appeal.reheardHearingDocuments || [];
let hearingDocuments: Evidence[] = (appeal.hearingDocuments || []).concat(reheardHearingDocuments);
let reheardHearingDocumentsCollection: ReheardHearingDocs<Evidence>[] = appeal.reheardHearingDocumentsCollection || [];
for (let collection of reheardHearingDocumentsCollection) {
let documentCollection = collection.value ? collection.value : {};
const docs: Evidence[] = documentCollection.reheardHearingDocs;
if (docs) {
hearingDocuments.push(...docs);
}
}
let hearingNoticeTags: string[] = ['hearingNotice', 'hearingNoticeRelisted',
'reheardHearingNotice', 'reheardHearingNoticeRelisted'];
let hearingNotices: Evidence[] = hearingDocuments.filter((doc: Evidence) =>
hearingNoticeTags.includes(doc.tag));
hearingNotices.sort((a: Evidence, b: Evidence) => {
if (a.dateTimeUploaded && b.dateTimeUploaded) {
return moment(b.dateTimeUploaded).diff(moment(a.dateTimeUploaded));
} else {
return moment(b.dateUploaded).diff(moment(a.dateUploaded));
}
});
return hearingNotices[0];
}

function getHearingNoticeDocument(req: Request): Evidence {
const { appeal } = req.session;
const { id } = req.params;
if (id === 'latest') {
return getLatestHearingNoticeDocument(appeal);
}
let hearingDocuments = appeal.hearingDocuments ? appeal.hearingDocuments : [];
let hearingNoticeDocument = hearingDocuments.find((doc: Evidence) => doc.fileId === id);
if (!hearingNoticeDocument) {
hearingNoticeDocument = findDocumentInReheardHearingDocCollection(appeal.reheardHearingDocumentsCollection || [], id);
}
if (!hearingNoticeDocument) {
throw new Error(`No hearing notice with {fileId: ${id}} found.`);
}
return hearingNoticeDocument;
}

function getHearingNoticeViewer(req: Request, res: Response, next: NextFunction) {
try {
let previousPage: string = paths.common.overview;
const hearingNoticeDocuments = req.session.appeal.hearingDocuments.filter(doc => doc.tag === 'hearingNotice');
const hearingNoticeDocument: Evidence = getHearingNoticeDocument(req);
const data = [];
hearingNoticeDocuments.forEach(document => {
const fileNameFormatted = fileNameFormatter(document.name);
data.push(addSummaryRow(i18n.pages.detailViewers.common.dateUploaded, [moment(document.dateUploaded).format(dayMonthYearFormat)]));
data.push(addSummaryRow(i18n.pages.detailViewers.common.document, [`<a class='govuk-link' target='_blank' rel='noopener noreferrer' href='${paths.common.documentViewer}/${document.fileId}'>${fileNameFormatted}</a>`]));
});
const fileNameFormatted = fileNameFormatter(hearingNoticeDocument.name);
data.push(addSummaryRow(i18n.pages.detailViewers.common.dateUploaded, [moment(hearingNoticeDocument.dateUploaded).format(dayMonthYearFormat)]));
data.push(addSummaryRow(i18n.pages.detailViewers.common.document, [`<a class='govuk-link' target='_blank' rel='noopener noreferrer' href='${paths.common.documentViewer}/${hearingNoticeDocument.fileId}'>${fileNameFormatted}</a>`]));

return res.render('templates/details-viewer.njk', {
title: i18n.pages.detailViewers.hearingNotice.title,
Expand Down Expand Up @@ -1395,6 +1450,7 @@ function setupDetailViewersController(documentManagementService: DocumentManagem
router.get(paths.common.homeOfficeWithdrawLetter, getHomeOfficeWithdrawLetter);
router.get(paths.common.homeOfficeResponse, getHomeOfficeResponse);
router.get(paths.common.hearingNoticeViewer, getHearingNoticeViewer);
router.get(paths.common.latestHearingNoticeViewer, getHearingNoticeViewer);
router.get(paths.common.hearingAdjournmentNoticeViewer, getHearingAdjournmentNoticeViewer);
router.get(paths.common.hearingBundleViewer, getHearingBundle);
router.get(paths.common.decisionAndReasonsViewer, getDecisionAndReasonsViewer);
Expand Down Expand Up @@ -1425,6 +1481,8 @@ export {
getOutOfTimeDecisionViewer,
getHomeOfficeResponse,
getHearingNoticeViewer,
getHearingNoticeDocument,
findDocumentInReheardHearingDocCollection,
getHearingAdjournmentNoticeViewer,
getHearingBundle,
getDecisionAndReasonsViewer,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ function setupHearingRequirementsFeatureToggleController(middleware: Middleware[
function setupHearingBundleFeatureToggleController(middleware: Middleware[]): Router {
const router = Router();
router.get(paths.common.hearingNoticeViewer,middleware,hearingBundleFeatureMiddleware,getHearingNoticeViewer);
router.get(paths.common.latestHearingNoticeViewer,middleware,hearingBundleFeatureMiddleware,getHearingNoticeViewer);
router.get(paths.common.decisionAndReasonsViewer,middleware,hearingBundleFeatureMiddleware,getDecisionAndReasonsViewer);
router.get(paths.common.hearingAdjournmentNoticeViewer,middleware,hearingBundleFeatureMiddleware,getHearingAdjournmentNoticeViewer);

Expand Down
3 changes: 2 additions & 1 deletion app/paths.ts
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,8 @@ const paths = {
outOfTimeDecisionViewer: '/out-of-time-decision',
homeOfficeWithdrawLetter: '/home-office-withdrawal-letter',
homeOfficeResponse: '/home-office-response',
hearingNoticeViewer: '/hearing-notice',
hearingNoticeViewer: '/hearing-notice/:id',
latestHearingNoticeViewer: '/hearing-notice/latest',
hearingAdjournmentNoticeViewer: '/hearing-adjournment-notice',
hearingBundleViewer: '/hearing-bundle',
decisionAndReasonsViewer: '/decision-reasons',
Expand Down
85 changes: 72 additions & 13 deletions app/service/update-appeal-service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -660,6 +660,7 @@ export default class UpdateAppealService {
...(_.has(caseData, 'remittalDocuments')) && { remittalDocuments },
...draftClarifyingQuestionsAnswers && { draftClarifyingQuestionsAnswers },
...caseData.clarifyingQuestionsAnswers && { clarifyingQuestionsAnswers: this.mapCcdClarifyingQuestionsToAppeal(caseData.clarifyingQuestionsAnswers, documentMap) },
...caseData.reheardHearingDocumentsCollection && { reheardHearingDocumentsCollection: this.mapCcdReheardHearingDocsToAppeal(caseData.reheardHearingDocumentsCollection, documentMap) },
cmaRequirements,
hearingRequirements,
askForMoreTime: {
Expand All @@ -672,12 +673,12 @@ export default class UpdateAppealService {
date: listHearingDate
},
...caseData.respondentDocuments && { respondentDocuments: this.mapDocsWithMetadataToEvidenceArray(caseData.respondentDocuments, documentMap) },
...caseData.hearingDocuments && { hearingDocuments: this.mapDocsWithMetadataToEvidenceArray(caseData.hearingDocuments, documentMap) },
...caseData.legalRepresentativeDocuments && { legalRepresentativeDocuments: this.mapDocsWithMetadataToEvidenceArray(caseData.legalRepresentativeDocuments, documentMap) },
...caseData.additionalEvidenceDocuments && { additionalEvidenceDocuments: this.mapAdditionalEvidenceToDocumentWithDescriptionArray(caseData.additionalEvidenceDocuments, documentMap) },
...caseData.addendumEvidenceDocuments && { addendumEvidenceDocuments: this.mapAdditionalEvidenceToDocumentWithDescriptionArray(caseData.addendumEvidenceDocuments, documentMap) },
...caseData.tribunalDocuments && { tribunalDocuments: this.mapDocsWithMetadataToEvidenceArray(caseData.tribunalDocuments, documentMap) },
...caseData.hearingDocuments && { hearingDocuments: this.mapDocsWithMetadataToEvidenceArray(caseData.hearingDocuments, documentMap) },
...caseData.reheardHearingDocuments && { reheardHearingDocuments: this.mapDocsWithMetadataToEvidenceArray(caseData.reheardHearingDocuments, documentMap) },
...caseData.finalDecisionAndReasonsDocuments && { finalDecisionAndReasonsDocuments: this.mapDocsWithMetadataToEvidenceArray(caseData.finalDecisionAndReasonsDocuments, documentMap) },
...caseData.outOfTimeDecisionType && { outOfTimeDecisionType: caseData.outOfTimeDecisionType },
...caseData.outOfTimeDecisionMaker && { outOfTimeDecisionMaker: caseData.outOfTimeDecisionMaker },
Expand Down Expand Up @@ -1284,6 +1285,9 @@ export default class UpdateAppealService {
...appeal.clarifyingQuestionsAnswers && {
clarifyingQuestionsAnswers: this.mapAppealClarifyingQuestionsToCcd(appeal.clarifyingQuestionsAnswers, appeal.documentMap)
},
...appeal.reheardHearingDocumentsCollection && {
reheardHearingDocumentsCollection: this.mapAppealReheardHearingDocsToCcd(appeal.reheardHearingDocumentsCollection, appeal.documentMap)
},
...appeal.application.homeOfficeLetter && {
uploadTheNoticeOfDecisionDocs: this.mapUploadTheNoticeOfDecisionDocs(appeal.application.homeOfficeLetter, appeal.documentMap, 'additionalEvidence')
},
Expand Down Expand Up @@ -1396,6 +1400,38 @@ export default class UpdateAppealService {
});
}

private mapCcdReheardHearingDocsToAppeal(reheardHearingDocumentsCollection: ReheardHearingDocs<Collection<DocumentWithMetaData>>[], documentMap: DocumentMap[]): ReheardHearingDocs<Evidence>[] {
return reheardHearingDocumentsCollection.map(doc => {
let evidencesList: Evidence[] = [];
if (doc.value.reheardHearingDocs) {
evidencesList = doc.value.reheardHearingDocs.map(e => this.mapDocWithMetadataToEvidence(e, documentMap));
}
return {
id: doc.id,
value: {
reheardHearingDocs: evidencesList
}
};
});
}

private mapAppealReheardHearingDocsToCcd(reheardHearingDocs: ReheardHearingDocs<Evidence>[], documentMap: DocumentMap[]): ReheardHearingDocs<Collection<DocumentWithMetaData>>[] {
const ccdCQ = reheardHearingDocs.map((answer: ReheardHearingDocs<Evidence>): ReheardHearingDocs<Collection<DocumentWithMetaData>> => {
let reheardHearingDocs: Collection<DocumentWithMetaData>[];
if (answer.value.reheardHearingDocs) {
reheardHearingDocs = answer.value.reheardHearingDocs.map(evidence => this.mapEvidenceToReheardHearingDocs(evidence, documentMap));
}
return {
...answer,
value: {
...answer.value,
...answer.value.reheardHearingDocs && { reheardHearingDocs }
}
};
});
return ccdCQ;
}

private mapAppealClarifyingQuestionsToCcd(clarifyingQuestions: ClarifyingQuestion<Evidence>[], documentMap: DocumentMap[]): ClarifyingQuestion<Collection<SupportingDocument>>[] {
const ccdCQ = clarifyingQuestions.map((answer: ClarifyingQuestion<Evidence>): ClarifyingQuestion<Collection<SupportingDocument>> => {
let supportingEvidence: Collection<SupportingDocument>[];
Expand All @@ -1412,6 +1448,7 @@ export default class UpdateAppealService {
});
return ccdCQ;
}

// TODO: remove method if not needed
private addCcdTimeExtension(askForMoreTime, appeal, caseData) {

Expand Down Expand Up @@ -1452,6 +1489,24 @@ export default class UpdateAppealService {
};
}

private mapEvidenceToReheardHearingDocs(evidence: Evidence, documentMap: DocumentMap[]): Collection<DocumentWithMetaData> {
const documentUrl: string = documentIdToDocStoreUrl(evidence.fileId, documentMap);
return {
id: evidence.id,
value: {
tag: evidence.tag,
document: {
document_filename: evidence.name,
document_url: documentUrl,
document_binary_url: `${documentUrl}/binary`
},
description: evidence.description,
dateUploaded: evidence.dateUploaded,
dateTimeUploaded: evidence.dateTimeUploaded
}
};
}

private mapToTimeExtensionEvidenceCollection(evidences: Evidence[], appeal: Appeal): TimeExtensionEvidenceCollection[] {
return evidences ? evidences.map((evidence) => {
const documentLocationUrl: string = documentIdToDocStoreUrl(evidence.fileId, appeal.documentMap);
Expand All @@ -1466,19 +1521,23 @@ export default class UpdateAppealService {
}

private mapDocsWithMetadataToEvidenceArray = (docs: Collection<DocumentWithMetaData>[], documentMap: DocumentMap[]): Evidence[] => {
const evidences = docs.map((doc: Collection<DocumentWithMetaData>): Evidence => {
const fileId = this._documentManagementService.addToDocumentMapper(doc.value.document.document_url, documentMap);
return {
fileId,
name: doc.value.document.document_filename,
...doc.id && { id: doc.id },
...doc.value.tag && { tag: doc.value.tag },
...doc.value.suppliedBy && { suppliedBy: doc.value.suppliedBy },
...doc.value.description && { description: doc.value.description },
...doc.value.dateUploaded && { dateUploaded: doc.value.dateUploaded }
};
return docs.map((doc: Collection<DocumentWithMetaData>): Evidence => {
return this.mapDocWithMetadataToEvidence(doc, documentMap);
});
return evidences;
}

private mapDocWithMetadataToEvidence = (doc: Collection<DocumentWithMetaData>, documentMap: DocumentMap[]): Evidence => {
const fileId = this._documentManagementService.addToDocumentMapper(doc.value.document.document_url, documentMap);
return {
fileId,
name: doc.value.document.document_filename,
...doc.id && { id: doc.id },
...doc.value.tag && { tag: doc.value.tag },
...doc.value.suppliedBy && { suppliedBy: doc.value.suppliedBy },
...doc.value.description && { description: doc.value.description },
...doc.value.dateUploaded && { dateUploaded: doc.value.dateUploaded },
...doc.value.dateTimeUploaded && { dateTimeUploaded: doc.value.dateTimeUploaded }
};
}

private mapAdditionalEvidenceToDocumentWithDescriptionArray = (docs: AdditionalEvidence[], documentMap: DocumentMap[]): Evidence[] => {
Expand Down
Loading

0 comments on commit a3279b5

Please sign in to comment.