diff --git a/app/cypress/e2e/0-ndr-core-tests/download_lloyd_george_summary.cy.js b/app/cypress/e2e/0-ndr-core-tests/download_lloyd_george_summary.cy.js index bd5994c9c..a1102cfec 100644 --- a/app/cypress/e2e/0-ndr-core-tests/download_lloyd_george_summary.cy.js +++ b/app/cypress/e2e/0-ndr-core-tests/download_lloyd_george_summary.cy.js @@ -35,7 +35,7 @@ describe('GP Workflow: Download Lloyd George summary report', () => { cy.url().should( 'eq', - Cypress.config('baseUrl') + `${routes.createReportComplete}?reportType=0`, + Cypress.config('baseUrl') + `${routes.createReportComplete}?reportType=PATIENT`, ); }, ); diff --git a/app/cypress/e2e/1-ndr-smoke-tests/gp_user_workflows/download_lloyd_george_summary_report_workflow.cy.js b/app/cypress/e2e/1-ndr-smoke-tests/gp_user_workflows/download_lloyd_george_summary_report_workflow.cy.js index 62eed9b34..9dd82d89a 100644 --- a/app/cypress/e2e/1-ndr-smoke-tests/gp_user_workflows/download_lloyd_george_summary_report_workflow.cy.js +++ b/app/cypress/e2e/1-ndr-smoke-tests/gp_user_workflows/download_lloyd_george_summary_report_workflow.cy.js @@ -33,7 +33,7 @@ describe('GP Workflow: Download Lloyd George summary report', () => { cy.url().should( 'eq', - Cypress.config('baseUrl') + `${routes.createReportComplete}?reportType=0`, + Cypress.config('baseUrl') + `${routes.createReportComplete}?reportType=PATIENT`, ); cy.getByTestId('logout-btn').click(); diff --git a/app/cypress/support/e2e.ts b/app/cypress/support/e2e.ts index eed08911d..bde74581c 100644 --- a/app/cypress/support/e2e.ts +++ b/app/cypress/support/e2e.ts @@ -122,7 +122,7 @@ Cypress.Commands.add('navigateToDownloadReportPage', () => { cy.getByTestId('download-report-btn').should('exist'); cy.getByTestId('download-report-btn').click(); - cy.url().should('eq', baseUrl + `${routes.createReport}?reportType=0`); + cy.url().should('eq', baseUrl + `${routes.createReport}?reportType=PATIENT`); }); declare global { diff --git a/app/src/components/blocks/_admin/reviewsPage/ReviewsPage.test.tsx b/app/src/components/blocks/_admin/reviewsPage/ReviewsPage.test.tsx index db3d7daa3..b9c27d4cc 100644 --- a/app/src/components/blocks/_admin/reviewsPage/ReviewsPage.test.tsx +++ b/app/src/components/blocks/_admin/reviewsPage/ReviewsPage.test.tsx @@ -721,6 +721,20 @@ describe('ReviewsPage', () => { }); }); + describe('Report Download Link', () => { + it('renders download report link with correct href', async () => { + renderComponent(); + + await waitFor(() => { + expect(screen.getByText('900 000 0001')).toBeInTheDocument(); + }); + + const downloadLink = screen.getByText('Download a report on this data'); + expect(downloadLink).toBeInTheDocument(); + expect(downloadLink).toHaveAttribute('href', '/create-report?reportType=REVIEW'); + }); + }); + describe('Multiple Reviews', () => { it('renders all review items correctly', async () => { const multipleReviewsResponse: ReviewsResponse = { diff --git a/app/src/components/blocks/_admin/reviewsPage/ReviewsPage.tsx b/app/src/components/blocks/_admin/reviewsPage/ReviewsPage.tsx index c9056f99c..360c2f1ef 100644 --- a/app/src/components/blocks/_admin/reviewsPage/ReviewsPage.tsx +++ b/app/src/components/blocks/_admin/reviewsPage/ReviewsPage.tsx @@ -13,6 +13,7 @@ import SpinnerButton from '../../../generic/spinnerButton/SpinnerButton'; import SpinnerV2 from '../../../generic/spinnerV2/SpinnerV2'; import { usePatientDetailsContext } from '../../../../providers/patientProvider/PatientProvider'; import { getConfigForDocType } from '../../../../helpers/utils/documentType'; +import { REPORT_TYPE } from '../../../../types/generic/reports'; export const ReviewsPage = (): React.JSX.Element => { useTitle({ pageTitle: 'Admin - Reviews' }); @@ -108,7 +109,8 @@ export const ReviewsPage = (): React.JSX.Element => { return { id: dto.id, nhsNumber, - recordType: getConfigForDocType(dto.document_snomed_code_type).content.reviewList as string, + recordType: getConfigForDocType(dto.document_snomed_code_type).content + .reviewList as string, snomedCode: dto.document_snomed_code_type, uploader: dto.odsCode, dateUploaded: dto.dateUploaded, @@ -164,6 +166,13 @@ export const ReviewsPage = (): React.JSX.Element => {

+
+ + Download a report on this data + +
{/* Search box */}
{ setDownloading(true); try { - await downloadReport({ report: props.report, fileType, baseUrl, baseHeaders }); + await downloadReport({ + report: props.report, + fileType, + baseUrl, + baseHeaders, + }); handleSuccess(); } catch (e) { const error = e as AxiosError; diff --git a/app/src/components/blocks/_downloadReport/downloadReportSelectStage/ReportDescriptions/ReviewSummaryDescription.tsx b/app/src/components/blocks/_downloadReport/downloadReportSelectStage/ReportDescriptions/ReviewSummaryDescription.tsx new file mode 100644 index 000000000..85635c953 --- /dev/null +++ b/app/src/components/blocks/_downloadReport/downloadReportSelectStage/ReportDescriptions/ReviewSummaryDescription.tsx @@ -0,0 +1,15 @@ +const ReviewSummaryDescription = (): React.JSX.Element => { + return ( + <> +

This report contains:

+ + + ); +}; + +export default ReviewSummaryDescription; diff --git a/app/src/helpers/requests/downloadReport.test.ts b/app/src/helpers/requests/downloadReport.test.ts index 0001848c5..9e45730ef 100644 --- a/app/src/helpers/requests/downloadReport.test.ts +++ b/app/src/helpers/requests/downloadReport.test.ts @@ -1,8 +1,8 @@ import axios, { AxiosError } from 'axios'; import downloadReport from './downloadReport'; -import { ReportData } from '../../types/generic/reports'; +import { REPORT_TYPE, ReportData } from '../../types/generic/reports'; import { AuthHeaders } from '../../types/blocks/authHeaders'; -import { describe, expect, it, vi, Mocked, beforeEach, afterEach, Mock } from 'vitest'; +import { afterEach, beforeEach, describe, expect, it, Mock, Mocked, vi } from 'vitest'; import { Procedure } from '@vitest/spy'; vi.mock('axios'); @@ -12,6 +12,7 @@ const mockedAxios = axios as Mocked; describe('downloadReport', () => { const report = { endpoint: '/download', + reportType: REPORT_TYPE.ODS_REVIEW_SUMMARY, } as ReportData; let clickSpy: Mock; @@ -55,7 +56,7 @@ describe('downloadReport', () => { expect(getSpy).toHaveBeenCalledWith(args.baseUrl + report.endpoint, { headers: args.baseHeaders, - params: { outputFileFormat: args.fileType, odsReportType: 'PATIENT' }, + params: { outputFileFormat: args.fileType, odsReportType: 'REVIEW' }, }); expect(mockAnchor.setAttribute).toHaveBeenCalledWith('download', ''); @@ -90,7 +91,7 @@ describe('downloadReport', () => { expect(errorCode).toBe(404); expect(getSpy).toHaveBeenCalledWith(args.baseUrl + report.endpoint, { headers: args.baseHeaders, - params: { outputFileFormat: args.fileType, odsReportType: 'PATIENT' }, + params: { outputFileFormat: args.fileType, odsReportType: 'REVIEW' }, }); }); }); diff --git a/app/src/helpers/requests/downloadReport.ts b/app/src/helpers/requests/downloadReport.ts index 25a213e43..32c1d3b5f 100644 --- a/app/src/helpers/requests/downloadReport.ts +++ b/app/src/helpers/requests/downloadReport.ts @@ -12,7 +12,6 @@ type Args = { type DownloadReportResponseData = { data: { url: string }; }; - const downloadReport = async ({ report, fileType, baseUrl, baseHeaders }: Args): Promise => { const gatewayUrl = baseUrl + report.endpoint; @@ -23,7 +22,7 @@ const downloadReport = async ({ report, fileType, baseUrl, baseHeaders }: Args): }, params: { outputFileFormat: fileType, - odsReportType: 'PATIENT', + odsReportType: report.reportType, }, }); diff --git a/app/src/types/generic/reports.ts b/app/src/types/generic/reports.ts index 69fec1564..90846dda7 100644 --- a/app/src/types/generic/reports.ts +++ b/app/src/types/generic/reports.ts @@ -1,8 +1,10 @@ import LloydGeorgeSummaryDescription from '../../components/blocks/_downloadReport/downloadReportSelectStage/ReportDescriptions/LloydGeorgeSummaryDescription'; import { endpoints } from './endpoints'; +import ReviewSummaryDescription from '../../components/blocks/_downloadReport/downloadReportSelectStage/ReportDescriptions/ReviewSummaryDescription'; export enum REPORT_TYPE { - ODS_PATIENT_SUMMARY = '0', + ODS_PATIENT_SUMMARY = 'PATIENT', + ODS_REVIEW_SUMMARY = 'REVIEW', } export type FileTypeData = { @@ -34,4 +36,11 @@ export const reports: ReportData[] = [ reportType: REPORT_TYPE.ODS_PATIENT_SUMMARY, endpoint: endpoints.ODS_REPORT, }, + { + title: 'Documents review summary report', + description: ReviewSummaryDescription, + fileTypes: [{ extension: 'csv', label: 'a CSV' }], + reportType: REPORT_TYPE.ODS_REVIEW_SUMMARY, + endpoint: endpoints.ODS_REPORT, + }, ]; diff --git a/lambdas/services/ods_report_service.py b/lambdas/services/ods_report_service.py index 71aac847d..e892b0900 100644 --- a/lambdas/services/ods_report_service.py +++ b/lambdas/services/ods_report_service.py @@ -64,7 +64,7 @@ def get_documents_for_review( if output_file_type != FileType.CSV: raise OdsReportException(400, LambdaError.UnsupportedFileType) - query_filter = self.document_upload_review_service.build_review_query_filter() + query_filter = self.document_upload_review_service.build_review_dynamo_filter() results = self.document_upload_review_service.fetch_documents_from_table( search_key="Custodian", diff --git a/lambdas/tests/unit/services/test_ods_report_service.py b/lambdas/tests/unit/services/test_ods_report_service.py index 81d95c337..f554129a7 100644 --- a/lambdas/tests/unit/services/test_ods_report_service.py +++ b/lambdas/tests/unit/services/test_ods_report_service.py @@ -422,7 +422,7 @@ def test_get_documents_for_review( mocker.patch.object( ods_report_service.document_upload_review_service, - "build_review_query_filter", + "build_review_dynamo_filter", return_value=expected_query_filter, )