66import { expenseTypePipe } from '../../../utils/pipes' ;
77import { Edit } from '@mui/icons-material' ;
88import CheckIcon from '@mui/icons-material/Check' ;
9+ import CloseIcon from '@mui/icons-material/Close' ;
910import ConfirmationNumberIcon from '@mui/icons-material/ConfirmationNumber' ;
1011import DeleteIcon from '@mui/icons-material/Delete' ;
1112import LocalShippingIcon from '@mui/icons-material/LocalShipping' ;
@@ -18,7 +19,11 @@ import ActionsMenu, { ButtonInfo } from '../../../components/ActionsMenu';
1819import NERModal from '../../../components/NERModal' ;
1920import PageLayout from '../../../components/PageLayout' ;
2021import VerticalDetailDisplay from '../../../components/VerticalDetailDisplay' ;
21- import { useDeleteReimbursementRequest , useMarkReimbursementRequestAsDelivered } from '../../../hooks/finance.hooks' ;
22+ import {
23+ useDeleteReimbursementRequest ,
24+ useDenyReimbursementRequest ,
25+ useMarkReimbursementRequestAsDelivered
26+ } from '../../../hooks/finance.hooks' ;
2227import { useToast } from '../../../hooks/toasts.hooks' ;
2328import { useCurrentUser } from '../../../hooks/users.hooks' ;
2429import {
@@ -33,7 +38,9 @@ import {
3338 imageDownloadUrl ,
3439 imageFileUrl ,
3540 isReimbursementRequestAdvisorApproved ,
36- isReimbursementRequestSaboSubmitted
41+ isReimbursementRequestReimbursed ,
42+ isReimbursementRequestSaboSubmitted ,
43+ isReimbursementRequestDenied
3744} from '../../../utils/reimbursement-request.utils' ;
3845import { routes } from '../../../utils/routes' ;
3946import AddSABONumberModal from './AddSABONumberModal' ;
@@ -53,11 +60,13 @@ const ReimbursementRequestDetailsView: React.FC<ReimbursementRequestDetailsViewP
5360 const [ addSaboNumberModalShow , setAddSaboNumberModalShow ] = useState < boolean > ( false ) ;
5461 const toast = useToast ( ) ;
5562 const [ showDeleteModal , setShowDeleteModal ] = useState ( false ) ;
63+ const [ showDenyModal , setShowDenyModal ] = useState ( false ) ;
5664 const [ showMarkDelivered , setShowMarkDelivered ] = useState ( false ) ;
5765 const [ showSubmitToSaboModal , setShowSubmitToSaboModal ] = useState ( false ) ;
5866 const { mutateAsync : deleteReimbursementRequest } = useDeleteReimbursementRequest (
5967 reimbursementRequest . reimbursementRequestId
6068 ) ;
69+ const { mutateAsync : denyReimbursementRequest } = useDenyReimbursementRequest ( reimbursementRequest . reimbursementRequestId ) ;
6170 const { mutateAsync : markDelivered } = useMarkReimbursementRequestAsDelivered ( reimbursementRequest . reimbursementRequestId ) ;
6271
6372 const handleDelete = ( ) => {
@@ -71,6 +80,17 @@ const ReimbursementRequestDetailsView: React.FC<ReimbursementRequestDetailsViewP
7180 }
7281 } ;
7382
83+ const handleDeny = ( ) => {
84+ try {
85+ denyReimbursementRequest ( ) ;
86+ setShowDenyModal ( false ) ;
87+ } catch ( e : unknown ) {
88+ if ( e instanceof Error ) {
89+ toast . error ( e . message , 3000 ) ;
90+ }
91+ }
92+ } ;
93+
7494 const handleMarkDelivered = ( ) => {
7595 try {
7696 markDelivered ( ) ;
@@ -97,6 +117,21 @@ const ReimbursementRequestDetailsView: React.FC<ReimbursementRequestDetailsViewP
97117 ) ;
98118 } ;
99119
120+ const DenyModal = ( ) => {
121+ return (
122+ < NERModal
123+ open = { showDenyModal }
124+ onHide = { ( ) => setShowDenyModal ( false ) }
125+ title = "Warning!"
126+ cancelText = "No"
127+ submitText = "Yes"
128+ onSubmit = { handleDeny }
129+ >
130+ < Typography > Are you sure you want to deny this reimbursement request?</ Typography >
131+ </ NERModal >
132+ ) ;
133+ } ;
134+
100135 const MarkDeliveredModal = ( ) => (
101136 < NERModal
102137 open = { showMarkDelivered }
@@ -225,13 +260,29 @@ const ReimbursementRequestDetailsView: React.FC<ReimbursementRequestDetailsViewP
225260 title : 'Approve' ,
226261 onClick : ( ) => setShowSubmitToSaboModal ( true ) ,
227262 icon : < CheckIcon /> ,
228- disabled : ! user . isFinance || isReimbursementRequestSaboSubmitted ( reimbursementRequest )
263+ disabled :
264+ ! user . isFinance ||
265+ isReimbursementRequestSaboSubmitted ( reimbursementRequest ) ||
266+ isReimbursementRequestDenied ( reimbursementRequest )
267+ } ,
268+ {
269+ title : 'Deny' ,
270+ onClick : ( ) => setShowDenyModal ( true ) ,
271+ icon : < CloseIcon /> ,
272+ disabled :
273+ ! user . isFinance ||
274+ isReimbursementRequestReimbursed ( reimbursementRequest ) ||
275+ isReimbursementRequestDenied ( reimbursementRequest )
229276 }
230277 ] ;
231278
232279 return (
233280 < PageLayout
234- title = { `${ fullNamePipe ( reimbursementRequest . recipient ) } 's Reimbursement Request` }
281+ title = { `${
282+ isReimbursementRequestDenied ( reimbursementRequest )
283+ ? `${ fullNamePipe ( reimbursementRequest . recipient ) } 's Reimbursement Request - Denied`
284+ : `${ fullNamePipe ( reimbursementRequest . recipient ) } 's Reimbursement Request`
285+ } `}
235286 previousPages = { [
236287 {
237288 name : 'Finance' ,
@@ -241,6 +292,7 @@ const ReimbursementRequestDetailsView: React.FC<ReimbursementRequestDetailsViewP
241292 headerRight = { < ActionsMenu buttons = { buttons } /> }
242293 >
243294 < DeleteModal />
295+ < DenyModal />
244296 < MarkDeliveredModal />
245297 < SubmitToSaboModal
246298 open = { showSubmitToSaboModal }
0 commit comments