1- import { FormControl , FormLabel , TextField } from '@mui/material' ;
1+ import { FormControl , FormLabel , MenuItem , Select , TextField } from '@mui/material' ;
22import NERFormModal from '../../../components/NERFormModal' ;
33import { Controller , useForm } from 'react-hook-form' ;
44import { DatePicker } from '@mui/x-date-pickers' ;
55import LoadingIndicator from '../../../components/LoadingIndicator' ;
66import { yupResolver } from '@hookform/resolvers/yup' ;
77import * as yup from 'yup' ;
88import { useDownloadPDFOfImages } from '../../../hooks/finance.hooks' ;
9- import { useState } from 'react' ;
109import { useToast } from '../../../hooks/toasts.hooks' ;
1110import { ReimbursementRequest } from 'shared' ;
11+ import { useState } from 'react' ;
1212
1313const schema = yup . object ( ) . shape ( {
1414 startDate : yup . date ( ) . required ( 'Start Date is required' ) ,
15- endDate : yup . date ( ) . min ( yup . ref ( 'startDate' ) , `end date can't be before start date` ) . required ( 'End Date is required' )
15+ endDate : yup . date ( ) . min ( yup . ref ( 'startDate' ) , `end date can't be before start date` ) . required ( 'End Date is required' ) ,
16+ refundSource : yup . string ( ) . required ( )
1617} ) ;
1718
1819interface GenerateReceiptsFormInput {
1920 startDate : Date ;
2021 endDate : Date ;
22+ refundSource : string ;
2123}
2224
2325interface GenerateReceiptsModalProps {
2426 open : boolean ;
2527 setOpen : ( val : boolean ) => void ;
2628 allReimbursementRequests ?: ReimbursementRequest [ ] ;
27- startDate : Date ;
28- endDate : Date ;
29- setStartDate : ( val : Date ) => void ;
30- setEndDate : ( val : Date ) => void ;
3129}
3230
33- const GenerateReceiptsModal = ( {
34- open,
35- setOpen,
36- allReimbursementRequests,
37- startDate,
38- setStartDate,
39- endDate,
40- setEndDate
41- } : GenerateReceiptsModalProps ) => {
31+ const GenerateReceiptsModal = ( { open, setOpen, allReimbursementRequests } : GenerateReceiptsModalProps ) => {
4232 const toast = useToast ( ) ;
43- const [ startDatePickerOpen , setStartDatePickerOpen ] = useState ( false ) ;
33+
4434 const [ endDatePickerOpen , setEndDatePickerOpen ] = useState ( false ) ;
35+ const [ startDatePickerOpen , setStartDatePickerOpen ] = useState ( false ) ;
36+
37+ const { mutateAsync, isLoading } = useDownloadPDFOfImages ( ) ;
4538
46- const { mutateAsync , isLoading } = useDownloadPDFOfImages ( startDate , endDate ) ;
39+ const refundSourceOptions = [ 'BUDGET' , 'CASH' , 'BOTH' ] ;
4740
4841 const onGenerateReceiptsSubmit = async ( data : GenerateReceiptsFormInput ) => {
4942 if ( ! allReimbursementRequests ) return ;
43+
5044 const filteredRequests = allReimbursementRequests
5145 . filter (
5246 ( val : ReimbursementRequest ) => new Date ( val . dateCreated . toDateString ( ) ) >= new Date ( data . startDate . toDateString ( ) )
5347 )
5448 . filter (
5549 ( val : ReimbursementRequest ) => new Date ( val . dateCreated . toDateString ( ) ) <= new Date ( data . endDate . toDateString ( ) )
5650 )
57- . filter ( ( val : ReimbursementRequest ) => ! val . dateDeleted ) ;
51+ . filter ( ( val : ReimbursementRequest ) => ! val . dateDeleted )
52+ . filter (
53+ ( val : ReimbursementRequest ) =>
54+ ! val . dateDeleted && ( data . refundSource === 'BOTH' || val . account === data . refundSource )
55+ ) ;
56+
5857 const receipts = filteredRequests ?. flatMap ( ( request : ReimbursementRequest ) => request . receiptPictures ) ;
58+
5959 try {
6060 await mutateAsync ( {
61- fileIds : receipts . map ( ( receipt ) => receipt . googleFileId )
61+ fileIds : receipts . map ( ( receipt ) => receipt . googleFileId ) ,
62+ startDate : data . startDate ,
63+ endDate : data . endDate ,
64+ refundSource : data . refundSource
6265 } ) ;
6366 } catch ( error : unknown ) {
6467 if ( error instanceof Error ) {
@@ -74,7 +77,12 @@ const GenerateReceiptsModal = ({
7477 reset,
7578 formState : { errors, isValid }
7679 } = useForm ( {
77- resolver : yupResolver ( schema )
80+ resolver : yupResolver ( schema ) ,
81+ defaultValues : {
82+ startDate : new Date ( ) ,
83+ endDate : new Date ( ) ,
84+ refundSource : refundSourceOptions [ 2 ]
85+ }
7886 } ) ;
7987
8088 return (
@@ -104,9 +112,7 @@ const GenerateReceiptsModal = ({
104112 onClose = { ( ) => setStartDatePickerOpen ( false ) }
105113 onOpen = { ( ) => setStartDatePickerOpen ( true ) }
106114 onChange = { ( newValue ) => {
107- const newDate = newValue ?? new Date ( ) ;
108- setStartDate ( newDate ) ;
109- onChange ( newDate ) ;
115+ onChange ( newValue ?? new Date ( ) ) ;
110116 } }
111117 PopperProps = { {
112118 placement : 'right'
@@ -136,9 +142,7 @@ const GenerateReceiptsModal = ({
136142 onClose = { ( ) => setEndDatePickerOpen ( false ) }
137143 onOpen = { ( ) => setEndDatePickerOpen ( true ) }
138144 onChange = { ( newValue ) => {
139- const newDate = newValue ?? new Date ( ) ;
140- setEndDate ( newDate ) ;
141- onChange ( newDate ) ;
145+ onChange ( newValue ?? new Date ( ) ) ;
142146 } }
143147 PopperProps = { {
144148 placement : 'right'
@@ -156,6 +160,22 @@ const GenerateReceiptsModal = ({
156160 ) }
157161 />
158162 </ FormControl >
163+ < FormControl fullWidth >
164+ < FormLabel > Receipt Type</ FormLabel >
165+ < Controller
166+ name = "refundSource"
167+ control = { control }
168+ render = { ( { field : { onChange, value } } ) => (
169+ < Select value = { value } onChange = { ( event ) => onChange ( event . target . value ) } >
170+ { refundSourceOptions . map ( ( status ) => (
171+ < MenuItem key = { status } value = { status } >
172+ { status }
173+ </ MenuItem >
174+ ) ) }
175+ </ Select >
176+ ) }
177+ />
178+ </ FormControl >
159179 </ >
160180 ) }
161181 </ NERFormModal >
0 commit comments