diff --git a/playwright/tests/office/txo/tioFlows.spec.js b/playwright/tests/office/txo/tioFlows.spec.js index 53d6bdd03df..ea4b8791bc5 100644 --- a/playwright/tests/office/txo/tioFlows.spec.js +++ b/playwright/tests/office/txo/tioFlows.spec.js @@ -19,13 +19,16 @@ class TioFlowPage extends OfficePage { /** * @param {OfficePage} officePage * @param {Object} move + * @param {Boolean} usePaymentRequest * @override */ - constructor(officePage, move) { + constructor(officePage, move, usePaymentRequest) { super(officePage.page, officePage.request); this.move = move; this.moveLocator = move.locator; - this.paymentRequest = this.findPaymentRequestBySequenceNumber(1); + if (usePaymentRequest !== false) { + this.paymentRequest = this.findPaymentRequestBySequenceNumber(1); + } } /** @@ -182,7 +185,7 @@ test.describe('TIO user', () => { testMove = await officePage.testHarness.buildHHGMoveWithServiceItemsandPaymentRequestsForTIO(); await officePage.signInAsNewTIOUser(); - tioFlowPage = new TioFlowPage(officePage, testMove); + tioFlowPage = new TioFlowPage(officePage, testMove, true); const searchTab = officePage.page.getByTitle(TIOTabsTitles[1]); await searchTab.click(); @@ -330,7 +333,7 @@ test.describe('TIO user', () => { const move = await officePage.testHarness.buildHHGMoveWithServiceItemsandPaymentRequestsForTIO(); await officePage.signInAsNewTIOUser(); - tioFlowPage = new TioFlowPage(officePage, move); + tioFlowPage = new TioFlowPage(officePage, move, true); await tioFlowPage.waitForLoading(); await officePage.tioNavigateToMove(tioFlowPage.moveLocator); await officePage.page.getByRole('heading', { name: 'Payment Requests', exact: true }).waitFor(); @@ -646,7 +649,7 @@ test.describe('TIO user', () => { const move = await officePage.testHarness.buildNTSRMoveWithPaymentRequest(); await officePage.signInAsNewTIOUser(); - tioFlowPage = new TioFlowPage(officePage, move); + tioFlowPage = new TioFlowPage(officePage, move, true); await tioFlowPage.waitForLoading(); await officePage.tioNavigateToMove(tioFlowPage.moveLocator); await officePage.page.getByRole('heading', { name: 'Payment Requests', exact: true }).waitFor(); @@ -778,7 +781,7 @@ test.describe('TIO user', () => { const move = await officePage.testHarness.buildNTSRMoveWithServiceItemsAndPaymentRequest(); await officePage.signInAsNewTIOUser(); - tioFlowPage = new TioFlowPage(officePage, move); + tioFlowPage = new TioFlowPage(officePage, move, true); await tioFlowPage.waitForLoading(); await officePage.tioNavigateToMove(tioFlowPage.moveLocator); await officePage.page.getByRole('heading', { name: 'Payment Requests', exact: true }).waitFor(); @@ -864,4 +867,45 @@ test.describe('TIO user', () => { await expect(page.getByRole('heading', { name: 'Payment requests' })).toBeVisible(); }); }); + + test.describe('with PPM moves with weight tickets and documents', () => { + test.beforeEach(async ({ officePage }) => { + testMove = await officePage.testHarness.buildApprovedMoveWithPPMMovingExpenseOffice(); + await officePage.signInAsNewTIOUser(); + tioFlowPage = new TioFlowPage(officePage, testMove, false); + const searchTab = officePage.page.getByTitle(TIOTabsTitles[1]); + await searchTab.click(); + }); + + test('can view PPM review documents', async ({ page }) => { + const locator = `PPM ${testMove.locator}`; + const selectedRadio = page.getByRole('group').locator(`label:text("${SearchRBSelection[0]}")`); + await selectedRadio.click(); + await page.getByTestId('searchText').fill(testMove.locator); + await page.getByTestId('searchTextSubmit').click(); + + await expect(page.getByText('Results')).toBeVisible(); + await expect(page.getByTestId('locator-0')).toContainText(testMove.locator); + await page.getByTestId('locator-0').click(); + await page.getByRole('button', { name: 'Review shipment weights' }).click(); + await page.getByRole('button', { name: 'Review shipment weights' }).click(); + await expect(page.getByText(locator)).toBeVisible(); + await expect(page.getByText('Shipment Info')).toBeVisible(); + + await expect(page.getByText('Planned Move Start Date')).toBeVisible(); + await expect(page.getByText('Actual Move Start Date')).toBeVisible(); + await expect(page.getByText('Starting Address')).toBeVisible(); + await expect(page.getByText('Ending Address')).toBeVisible(); + await expect(page.getByText('Miles')).toBeVisible(); + await expect(page.getByText('Estimated Net Weight')).toBeVisible(); + await expect(page.getByText('Actual Net Weight')).toBeVisible(); + await expect(page.getByText('Allowable Weight')).toBeVisible(); + await expect(page.getByText('SENT TO CUSTOMER')).toBeVisible(); + await expect(page.getByText('TRIP 1')).toBeVisible(); + await expect(page.getByText('RECEIPT 1')).toBeVisible(); + await expect(page.getByText('RECEIPT 2')).toBeVisible(); + + await page.getByRole('button', { name: 'Done' }).click(); + }); + }); }); diff --git a/src/components/Office/PPM/PPMHeaderSummary/PPMHeaderSummary.jsx b/src/components/Office/PPM/PPMHeaderSummary/PPMHeaderSummary.jsx index 67d1d6f931d..955389774cd 100644 --- a/src/components/Office/PPM/PPMHeaderSummary/PPMHeaderSummary.jsx +++ b/src/components/Office/PPM/PPMHeaderSummary/PPMHeaderSummary.jsx @@ -1,5 +1,5 @@ import React, { useState } from 'react'; -import { number, bool } from 'prop-types'; +import { string, bool } from 'prop-types'; import classnames from 'classnames'; import { Tag } from '@trussworks/react-uswds'; @@ -64,7 +64,6 @@ const GCCAndIncentiveInfo = ({ ppmShipmentInfo, updatedItemName, setUpdatedItemN }; export default function PPMHeaderSummary({ ppmShipmentInfo, order, ppmNumber, showAllFields, readOnly }) { const [updatedItemName, setUpdatedItemName] = useState(''); - const shipmentInfo = { plannedMoveDate: ppmShipmentInfo.expectedDepartureDate, actualMoveDate: ppmShipmentInfo.actualMoveDate, @@ -119,7 +118,7 @@ export default function PPMHeaderSummary({ ppmShipmentInfo, order, ppmNumber, sh } PPMHeaderSummary.propTypes = { - ppmNumber: number.isRequired, + ppmNumber: string.isRequired, showAllFields: bool.isRequired, }; diff --git a/src/components/Office/PPM/PPMHeaderSummary/PPMHeaderSummary.test.jsx b/src/components/Office/PPM/PPMHeaderSummary/PPMHeaderSummary.test.jsx index 5ac996937c3..89c94406ccc 100644 --- a/src/components/Office/PPM/PPMHeaderSummary/PPMHeaderSummary.test.jsx +++ b/src/components/Office/PPM/PPMHeaderSummary/PPMHeaderSummary.test.jsx @@ -160,8 +160,9 @@ const defaultProps = { actualWeight: 3500, isActualExpenseReimbursement: true, }, - ppmNumber: 1, + ppmNumber: '1', showAllFields: false, + readOnly: false, }; describe('PPMHeaderSummary component', () => { diff --git a/src/components/Office/PPM/ReviewDocumentsSidePanel/ReviewDocumentsSidePanel.jsx b/src/components/Office/PPM/ReviewDocumentsSidePanel/ReviewDocumentsSidePanel.jsx index d14954781e0..dbf7583d636 100644 --- a/src/components/Office/PPM/ReviewDocumentsSidePanel/ReviewDocumentsSidePanel.jsx +++ b/src/components/Office/PPM/ReviewDocumentsSidePanel/ReviewDocumentsSidePanel.jsx @@ -4,7 +4,7 @@ import { Form } from '@trussworks/react-uswds'; import { Formik } from 'formik'; import classnames from 'classnames'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { arrayOf, func, number, object } from 'prop-types'; +import { arrayOf, bool, func, string, object } from 'prop-types'; import moment from 'moment'; import PPMHeaderSummary from '../PPMHeaderSummary/PPMHeaderSummary'; @@ -31,10 +31,12 @@ export default function ReviewDocumentsSidePanel({ proGearTickets, weightTickets, readOnly, + showAllFields, order, }) { let status; let showReason; + const showAllFieldsBool = showAllFields; const { mutate: patchDocumentsSetStatusMutation } = useMutation(patchPPMDocumentsSetStatus, { onSuccess, @@ -68,7 +70,7 @@ export default function ReviewDocumentsSidePanel({ ); showReason = true; - } else { + } else if (ticket.status === PPMDocumentsStatus.REJECTED) { status = (