diff --git a/src/backend/src/transformers/reimbursement-requests.transformer.ts b/src/backend/src/transformers/reimbursement-requests.transformer.ts index ac32206e6f..4b46714833 100644 --- a/src/backend/src/transformers/reimbursement-requests.transformer.ts +++ b/src/backend/src/transformers/reimbursement-requests.transformer.ts @@ -38,11 +38,7 @@ import { ReimbursementProductOtherReasonQueryArgs } from '../prisma-query-args/r import { ReimbursementRequestCommentQueryArgs } from '../prisma-query-args/reimbursement-comment.query-args'; export const receiptTransformer = (receipt: Prisma.ReceiptGetPayload): Receipt => { - return { - receiptId: receipt.receiptId, - googleFileId: receipt.googleFileId, - name: receipt.name - }; + return { receiptId: receipt.receiptId, googleFileId: receipt.googleFileId, name: receipt.name }; }; export const reimbursementRequestTransformer = ( @@ -100,15 +96,13 @@ const reimbursementProductReasonTransformer = ( userCreated: userTransformer(reason.otherReason!.userCreated), dateCreated: reason.otherReason!.dateCreated, budget: reason.otherReason!.budget, - indexCode: indexCodeTransformer(reason.otherReason!.indexCode) + indexCode: indexCodeTransformer(reason.otherReason!.indexCode), + accountCodes: reason.otherReason!.accountCodes.map(accountCodeTransformer) }; }; export const accountCodeTransformer = (accountCode: Prisma.Account_CodeGetPayload): AccountCode => { - return { - ...accountCode, - indexCodes: accountCode.indexCodes.map(indexCodeTransformer) - }; + return { ...accountCode, indexCodes: accountCode.indexCodes.map(indexCodeTransformer) }; }; export const vendorTransformer = (vendor: Prisma.VendorGetPayload): Vendor => { @@ -137,10 +131,7 @@ export const reimbursementTransformer = ( }; export const indexCodeTransformer = (indexCode: Prisma.Index_CodeGetPayload): IndexCode => { - return { - ...indexCode, - userCreated: userTransformer(indexCode.userCreated) - }; + return { ...indexCode, userCreated: userTransformer(indexCode.userCreated) }; }; export const otherProductReasonTransformer = ( @@ -152,15 +143,13 @@ export const otherProductReasonTransformer = ( userCreated: userTransformer(otherProductReason.userCreated), dateCreated: otherProductReason.dateCreated, budget: otherProductReason.budget, - indexCode: indexCodeTransformer(otherProductReason.indexCode) + indexCode: indexCodeTransformer(otherProductReason.indexCode), + accountCodes: otherProductReason.accountCodes.map(accountCodeTransformer) }; }; export const reimbursementRequestCommentTransformer = ( reimbursementRequestComment: Prisma.Reimbursement_Request_CommentGetPayload ): ReimbursementRequestComment => { - return { - ...reimbursementRequestComment, - userCreated: userTransformer(reimbursementRequestComment.userCreated) - }; + return { ...reimbursementRequestComment, userCreated: userTransformer(reimbursementRequestComment.userCreated) }; }; diff --git a/src/frontend/src/pages/AdminToolsPage/AdminToolsFinanceConfig.tsx b/src/frontend/src/pages/AdminToolsPage/AdminToolsFinanceConfig.tsx index 74e2a6e61e..080b107f2c 100644 --- a/src/frontend/src/pages/AdminToolsPage/AdminToolsFinanceConfig.tsx +++ b/src/frontend/src/pages/AdminToolsPage/AdminToolsFinanceConfig.tsx @@ -1,16 +1,19 @@ import { Box, Grid, Typography } from '@mui/material'; -import AccountCodesTable from './FinanceConfig/AccountCodesTable'; +import AccountManagerTable from './FinanceConfig/AccountManagerTable'; +import CategoriesTable from './FinanceConfig/CategoriesTable'; const AdminToolsFinanceConfig: React.FC = () => { return ( - + - Account Manager + Finance Config - + + + - + diff --git a/src/frontend/src/pages/AdminToolsPage/FinanceConfig/AccountCodeFormModal.tsx b/src/frontend/src/pages/AdminToolsPage/FinanceConfig/AccountCodeFormModal.tsx index ed6e740e14..2dab4ebf05 100644 --- a/src/frontend/src/pages/AdminToolsPage/FinanceConfig/AccountCodeFormModal.tsx +++ b/src/frontend/src/pages/AdminToolsPage/FinanceConfig/AccountCodeFormModal.tsx @@ -2,7 +2,7 @@ import { IndexCode, AccountCode } from 'shared'; import { AccountCodePayload, useGetAllIndexCodes } from '../../../hooks/finance.hooks'; import { Controller, useForm } from 'react-hook-form'; import NERFormModal from '../../../components/NERFormModal'; -import { Checkbox, FormControl, FormLabel, FormHelperText, Select, MenuItem, OutlinedInput } from '@mui/material'; +import { Checkbox, FormControl, FormLabel, FormHelperText, Select, MenuItem, OutlinedInput, Box } from '@mui/material'; import ReactHookTextField from '../../../components/ReactHookTextField'; import { useToast } from '../../../hooks/toasts.hooks'; import * as yup from 'yup'; @@ -73,7 +73,7 @@ const AccountCodeFormModal = ({ showModal, handleClose, defaultValues, onSubmit reset({ name: '', code: undefined, allowed: false, indexCodeIds: [] })} handleUseFormSubmit={handleSubmit} onFormSubmit={onFormSubmit} @@ -81,12 +81,7 @@ const AccountCodeFormModal = ({ showModal, handleClose, defaultValues, onSubmit showCloseButton > - Account Name - - {errors.name?.message} - - - Allowed Refund Source + Index Code(s) {errors.code?.message} + + Description + + {errors.name?.message} + - - Allowed? - - { - return ; - }} - /> + + Allowed? + { + return ; + }} + /> + ); diff --git a/src/frontend/src/pages/AdminToolsPage/FinanceConfig/AccountCodesTable.tsx b/src/frontend/src/pages/AdminToolsPage/FinanceConfig/AccountCodesTable.tsx deleted file mode 100644 index b44f1b6e6d..0000000000 --- a/src/frontend/src/pages/AdminToolsPage/FinanceConfig/AccountCodesTable.tsx +++ /dev/null @@ -1,90 +0,0 @@ -import { TableRow, TableCell, Typography, Box } from '@mui/material'; -import LoadingIndicator from '../../../components/LoadingIndicator'; -import { useGetAllAccountCodes } from '../../../hooks/finance.hooks'; -import ErrorPage from '../../ErrorPage'; -import { NERButton } from '../../../components/NERButton'; -import { useState } from 'react'; -import { AccountCode } from 'shared'; -import CreateAccountCodeModal from './CreateAccountCodeModal'; -import EditAccountCodeModal from './EditAccountCodeModal'; -import AdminToolTable from '../AdminToolTable'; -import { codeAndRefundSourceName } from '../../../utils/pipes'; - -const AccountCodesTable = () => { - const { - data: accountCodes, - isLoading: accountCodesIsLoading, - isError: accountCodesIsError, - error: accountCodesError - } = useGetAllAccountCodes(); - const [showCreateModal, setShowCreateModal] = useState(false); - const [showEditModal, setShowEditModal] = useState(false); - const [clickedAccountCode, setClickedAccountCode] = useState(); - - if (!accountCodes || accountCodesIsLoading) { - return ; - } - - if (accountCodesIsError) { - return ; - } - - const accountCodesTableRows = accountCodes.map((accountCode, index) => ( - { - setClickedAccountCode(accountCode); - setShowEditModal(true); - }} - key={`account-code-${index}`} - sx={{ cursor: 'pointer' }} - > - {accountCode.name} - {accountCode.code} - - {accountCode.allowed ? 'Yes' : 'No'} - - - {accountCode.indexCodes.map((refundSource, idx) => ( - {codeAndRefundSourceName(refundSource)} - ))} - - - )); - - return ( - - setShowCreateModal(false)} /> - {clickedAccountCode && ( - { - setShowEditModal(false); - setClickedAccountCode(undefined); - }} - accountCode={clickedAccountCode} - /> - )} - - - { - setShowCreateModal(true); - }} - > - New Account Code - - - - ); -}; - -export default AccountCodesTable; diff --git a/src/frontend/src/pages/AdminToolsPage/FinanceConfig/AccountManagerTable.tsx b/src/frontend/src/pages/AdminToolsPage/FinanceConfig/AccountManagerTable.tsx new file mode 100644 index 0000000000..765d51a9b8 --- /dev/null +++ b/src/frontend/src/pages/AdminToolsPage/FinanceConfig/AccountManagerTable.tsx @@ -0,0 +1,114 @@ +import { TableRow, TableCell, Typography, Box, TableHead, Table, TableBody, Checkbox } from '@mui/material'; +import LoadingIndicator from '../../../components/LoadingIndicator'; +import { useGetAllAccountCodes } from '../../../hooks/finance.hooks'; +import ErrorPage from '../../ErrorPage'; +import React, { useState } from 'react'; +import { AccountCode } from 'shared'; +import CreateAccountCodeModal from './CreateAccountCodeModal'; +import EditAccountCodeModal from './EditAccountCodeModal'; +import { NERButton } from '../../../components/NERButton'; + +const AccountManagerTable = () => { + const { + data: accountCodes, + isLoading: accountCodesIsLoading, + isError: accountCodesIsError, + error: accountCodesError + } = useGetAllAccountCodes(); + const [showCreateModal, setShowCreateModal] = useState(false); + const [showEditModal, setShowEditModal] = useState(false); + const [clickedAccountCode, setClickedAccountCode] = useState(); + + if (!accountCodes || accountCodesIsLoading) { + return ; + } + + if (accountCodesIsError) { + return ; + } + + const uniqueIndexCodeNames = (accountCode: AccountCode) => { + const uniqueNames = new Set(accountCode.indexCodes.map((indexCode) => indexCode.name)); + return Array.from(uniqueNames).join(', '); + }; + + const accountManagerTableRows = accountCodes.map((accountCode, index) => ( + { + setClickedAccountCode(accountCode); + setShowEditModal(true); + }} + key={`account-code-${index}`} + sx={{ cursor: 'pointer' }} + > + + {uniqueIndexCodeNames(accountCode)} + + + {accountCode.code} + + + {accountCode.name} + + + + + + )); + + const columns = ['Index Code', 'Account Code', 'Description', 'Allowed']; + + return ( + + + + Account Manager + + { + setShowCreateModal(true); + }} + > + Add Account + + + setShowCreateModal(false)} /> + {clickedAccountCode && ( + { + setShowEditModal(false); + setClickedAccountCode(undefined); + }} + accountCode={clickedAccountCode} + /> + )} + + + + {columns.map((column, index) => ( + + {column} + + ))} + + + {accountManagerTableRows} +
+
+ ); +}; + +export default AccountManagerTable; diff --git a/src/frontend/src/pages/AdminToolsPage/FinanceConfig/CategoriesTable.tsx b/src/frontend/src/pages/AdminToolsPage/FinanceConfig/CategoriesTable.tsx new file mode 100644 index 0000000000..fc3baa90e9 --- /dev/null +++ b/src/frontend/src/pages/AdminToolsPage/FinanceConfig/CategoriesTable.tsx @@ -0,0 +1,110 @@ +import { TableRow, TableCell, Typography, Box, TableHead, Table, TableBody } from '@mui/material'; +import LoadingIndicator from '../../../components/LoadingIndicator'; +import { useGetAllOtherProductReason } from '../../../hooks/finance.hooks'; +import ErrorPage from '../../ErrorPage'; +import { NERButton } from '../../../components/NERButton'; +import React from 'react'; +import { OtherProductReason } from 'shared'; + +const CategoriesTable = () => { + const { + data: categories, + isLoading: categoriesIsLoading, + isError: categoriesIsError, + error: categoriesError + } = useGetAllOtherProductReason(); + // const [showCreateModal, setShowCreateModal] = useState(false); + // const [showEditModal, setShowEditModal] = useState(false); + // const [clickedCategory, setClickedCategory] = useState(); + + if (!categories || categoriesIsLoading) { + return ; + } + + if (categoriesIsError) { + return ; + } + + const uniqueAccountCodeNames = (category: OtherProductReason) => { + const uniqueNames = new Set(category.accountCodes.map((accountCode) => accountCode.code)); + return Array.from(uniqueNames).join(', '); + }; + + const categoriesTableRows = categories.map((category, index) => ( + { + // setClickedCategory(category); + // setShowEditModal(true); + }} + key={`category-${index}`} + sx={{ cursor: 'pointer' }} + > + + {category.indexCode.name} + + + {uniqueAccountCodeNames(category)} + + + {category.name} + + {`$${category.budget}`} + + )); + + const columns = ['Index Code', 'Account Code', 'Name', 'Budget']; + + return ( + + {/* setShowCreateModal(false)} /> + {clickedIndexCode && ( + { + setShowEditModal(false); + setClickedIndexCode(undefined); + }} + indexCode={clickedIndexCode} + /> + )} */} + + + Categories + + { + // setShowCreateModal(true); + }} + > + Add Category + + + + + + {columns.map((column, index) => ( + + {column} + + ))} + + + {categoriesTableRows} +
+
+ ); +}; + +export default CategoriesTable; diff --git a/src/frontend/src/pages/AdminToolsPage/FinanceConfig/CreateCategoryModal.tsx b/src/frontend/src/pages/AdminToolsPage/FinanceConfig/CreateCategoryModal.tsx new file mode 100644 index 0000000000..54454a7349 --- /dev/null +++ b/src/frontend/src/pages/AdminToolsPage/FinanceConfig/CreateCategoryModal.tsx @@ -0,0 +1,20 @@ +// import LoadingIndicator from '../../../components/LoadingIndicator'; +// import { useCreateAccountCode } from '../../../hooks/finance.hooks'; +// import ErrorPage from '../../ErrorPage'; +// import AccountCodeFormModal from './AccountCodeFormModal'; + +// interface CreateCategoryModalProps { +// showModal: boolean; +// handleClose: () => void; +// } + +// const CreateCategoryModal = ({ showModal, handleClose }: CreateCategoryModalProps) => { +// const { isLoading, isError, error, mutateAsync } = useCreateAccountCode(); + +// if (isError) return ; +// if (isLoading) return ; + +// return ; +// }; + +// export default CreateCategoryModal; diff --git a/src/frontend/src/pages/AdminToolsPage/FinanceConfig/EditCategoryModal.tsx b/src/frontend/src/pages/AdminToolsPage/FinanceConfig/EditCategoryModal.tsx new file mode 100644 index 0000000000..b17bc88515 --- /dev/null +++ b/src/frontend/src/pages/AdminToolsPage/FinanceConfig/EditCategoryModal.tsx @@ -0,0 +1,24 @@ +// import { AccountCode } from 'shared'; +// import AccountCodeFormModal from './AccountCodeFormModal'; +// import { useEditAccountCode } from '../../../hooks/finance.hooks'; +// import ErrorPage from '../../ErrorPage'; +// import LoadingIndicator from '../../../components/LoadingIndicator'; + +// interface EditCategoryModalProps { +// showModal: boolean; +// handleClose: () => void; +// accountCode: AccountCode; +// } + +// const EditCategoryModal = ({ showModal, handleClose, accountCode }: EditCategoryModalProps) => { +// const { isLoading, isError, error, mutateAsync } = useEditAccountCode(accountCode.accountCodeId); + +// if (isError) return ; +// if (isLoading) return ; + +// return ( +// +// ); +// }; + +// export default EditCategoryModal; diff --git a/src/shared/src/types/reimbursement-requests-types.ts b/src/shared/src/types/reimbursement-requests-types.ts index 5b8a3db73a..ee11eec3ac 100644 --- a/src/shared/src/types/reimbursement-requests-types.ts +++ b/src/shared/src/types/reimbursement-requests-types.ts @@ -70,6 +70,7 @@ export interface OtherProductReason { dateCreated: Date; budget: number; indexCode: IndexCode; + accountCodes: AccountCode[]; } export type WBSElementData = { wbsNum: WbsNumber; wbsName: string };