Skip to content

Commit eb517e7

Browse files
Samuel ShresthaSamuel Shrestha
authored andcommitted
#3893: added create RR button for materials wout linked RR
1 parent 981e56a commit eb517e7

2 files changed

Lines changed: 77 additions & 7 deletions

File tree

src/frontend/src/pages/FinancePage/CreateReimbursementRequest.tsx

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,23 @@
22
* This file is part of NER's FinishLine and licensed under GNU AGPLv3.
33
* See the LICENSE file in the repository root folder for details.
44
*/
5-
import { useHistory } from 'react-router-dom';
5+
import { useHistory, useLocation } from 'react-router-dom';
6+
import { WbsNumber, CreateRefundSourceArgs, ReimbursementReceiptUploadArgs } from 'shared';
7+
import { ReimbursementRequestFormInput } from './ReimbursementRequestForm/ReimbursementRequestForm';
68
import PageLayout from '../../components/PageLayout';
79
import { useCreateReimbursementRequest, useUploadManyReceipts } from '../../hooks/finance.hooks';
810
import { routes } from '../../utils/routes';
911
import ReimbursementRequestForm, {
1012
ReimbursementRequestDataSubmission
1113
} from './ReimbursementRequestForm/ReimbursementRequestForm';
1214

15+
type CreateRRPrefillState = {
16+
projectWbsNum: WbsNumber;
17+
materialId: string;
18+
materialName: string;
19+
prefillCost?: number;
20+
};
21+
1322
const CreateReimbursementRequestPage: React.FC = () => {
1423
const { isLoading: createReimbursementRequestIsLoading, mutateAsync: createReimbursementRequest } =
1524
useCreateReimbursementRequest();
@@ -31,6 +40,31 @@ const CreateReimbursementRequestPage: React.FC = () => {
3140

3241
const isSubmitting = createReimbursementRequestIsLoading || receiptsIsLoading;
3342

43+
// for pre-filling the form when user clicks "Create Reimbursement Request" from a material in the BOM table
44+
const location = useLocation<CreateRRPrefillState | undefined>();
45+
const prefill = location.state;
46+
47+
const defaultValues: ReimbursementRequestFormInput | undefined =
48+
prefill?.projectWbsNum && prefill?.materialId
49+
? {
50+
vendorId: '',
51+
dateOfExpense: undefined,
52+
accountCodeId: '',
53+
indexCodeId: '',
54+
secondaryAccount: undefined,
55+
receiptFiles: [] as ReimbursementReceiptUploadArgs[],
56+
reimbursementProducts: [
57+
{
58+
name: prefill.materialName,
59+
materialId: prefill.materialId,
60+
reason: prefill.projectWbsNum,
61+
cost: prefill.prefillCost ?? 0,
62+
refundSources: [] as CreateRefundSourceArgs[]
63+
}
64+
]
65+
}
66+
: undefined;
67+
3468
return (
3569
<PageLayout
3670
title="Create Reimbursement Request"
@@ -41,9 +75,10 @@ const CreateReimbursementRequestPage: React.FC = () => {
4175
submitText="Submit"
4276
submitData={onSubmit}
4377
isSubmitting={isSubmitting}
78+
defaultValues={defaultValues}
4479
/>
4580
</PageLayout>
4681
);
4782
};
4883

49-
export default CreateReimbursementRequestPage;
84+
export default CreateReimbursementRequestPage;

src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/BOMTableWrapper.tsx

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { useToast } from '../../../../hooks/toasts.hooks';
1111
import { useAssignMaterialToAssembly, useDeleteAssembly, useDeleteMaterial } from '../../../../hooks/bom.hooks';
1212
import LoadingIndicator from '../../../../components/LoadingIndicator';
1313
import EditMaterialModal from './MaterialForm/EditMaterialModal';
14-
import { Link, Typography } from '@mui/material';
14+
import { Button, Link, Typography } from '@mui/material';
1515
import { bomBaseColDef } from '../../../../utils/bom.utils';
1616
import NERModal from '../../../../components/NERModal';
1717
import { renderStatusBOM } from './BOMTableCustomCells';
@@ -217,11 +217,13 @@ const BOMTableWrapper: React.FC<BOMTableWrapperProps> = ({
217217
hide: hideColumn[0],
218218
renderCell: (params) => {
219219
const material = materials.find((m) => m.materialId === params.row.materialId);
220-
const reimbursementRequest = material?.reimbursementRequest;
220+
if (!material) return null;
221221

222-
if (!reimbursementRequest) return null;
223-
224-
return (
222+
const reimbursementRequest = material.reimbursementRequest;
223+
224+
// case 1 (if reimbursement request exists): link to the reimbursement request page
225+
if (reimbursementRequest) {
226+
return (
225227
<Link
226228
component={RouterLink}
227229
to={`${routes.REIMBURSEMENT_REQUESTS}/view/${reimbursementRequest.reimbursementRequestId}`}
@@ -231,6 +233,39 @@ const BOMTableWrapper: React.FC<BOMTableWrapperProps> = ({
231233
>
232234
{reimbursementRequest.identifier}
233235
</Link>
236+
);
237+
}
238+
239+
// case 2 (if reimbursement request does not exist): link to the create reimbursement request page with pre-filled info
240+
const qty = material.quantity != null ? Number(material.quantity) : undefined;
241+
const unitPrice = material.price != null ? Number(material.price) : undefined;
242+
243+
const prefillCost = qty != null && unitPrice != null ? qty * unitPrice : undefined;
244+
245+
return (
246+
<Button
247+
component={RouterLink}
248+
to={{
249+
pathname: routes.NEW_REIMBURSEMENT_REQUEST,
250+
state: {
251+
projectWbsNum: project.wbsNum,
252+
materialId: material.materialId,
253+
materialName: material.name,
254+
prefillCost
255+
}
256+
}}
257+
variant="contained"
258+
size="small"
259+
onClick={(e: React.MouseEvent<HTMLElement>) => e.stopPropagation()}
260+
sx={{
261+
backgroundColor: '#dd514c',
262+
textTransform: 'none',
263+
fontWeight: 600,
264+
'&:hover': { backgroundColor: '#c7443f' }
265+
}}
266+
>
267+
Create RR
268+
</Button>
234269
);
235270
}
236271
},

0 commit comments

Comments
 (0)