From a351710cc7d1878b5993ec9343816e800bbdc5f3 Mon Sep 17 00:00:00 2001 From: HyeonJongKim Date: Thu, 16 Oct 2025 09:42:09 +0900 Subject: [PATCH] =?UTF-8?q?-=20=EC=95=88=EB=A9=B4=EC=9D=B8=EC=A6=9D=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=B6=94=EA=B0=80=20(=EC=B6=94?= =?UTF-8?q?=ED=9B=84=20=EB=AA=A9=EC=97=85=EC=9C=BC=EB=A1=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EC=9E=91=EC=97=85=20=ED=95=84=EC=9A=94)=20-=20?= =?UTF-8?q?=EC=9E=90=EA=B8=88=EC=9D=B4=EC=B2=B4=20:=20isFormValid(?= =?UTF-8?q?=EC=9D=B4=EC=B2=B4=EC=8B=A0=EC=B2=AD=20Validation=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80[=EC=9E=84=EC=8B=9C]=20=EC=B6=94=EA=B0=80=20=EC=9E=91?= =?UTF-8?q?=EC=97=85=20=ED=95=84=EC=9A=94)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/face-auth/constant.ts | 7 + .../model/face-auth/types.ts | 39 ++++ .../additional-service/model/types.ts | 4 +- .../ui/face-auth/face-auth-list.tsx | 32 +++ .../ui/face-auth/filter/face-auth-filter.tsx | 138 ++++++++++++ .../ui/key-in-payment/key-in-payment-list.tsx | 4 +- .../additional-service/ui/list-item.tsx | 38 +++- .../additional-service-pages.tsx | 4 + .../face-auth/face-auth-page.tsx | 204 ++++++++++++++++++ .../fund-account/transfer-request-page.tsx | 16 +- .../key-in-payment/requeset-page.tsx | 13 +- .../apply/link-payment-apply-success-page.tsx | 2 +- .../payout/request-page.tsx | 63 +++--- 13 files changed, 523 insertions(+), 41 deletions(-) create mode 100644 src/entities/additional-service/model/face-auth/constant.ts create mode 100644 src/entities/additional-service/model/face-auth/types.ts create mode 100644 src/entities/additional-service/ui/face-auth/face-auth-list.tsx create mode 100644 src/entities/additional-service/ui/face-auth/filter/face-auth-filter.tsx create mode 100644 src/pages/additional-service/face-auth/face-auth-page.tsx diff --git a/src/entities/additional-service/model/face-auth/constant.ts b/src/entities/additional-service/model/face-auth/constant.ts new file mode 100644 index 0000000..6581558 --- /dev/null +++ b/src/entities/additional-service/model/face-auth/constant.ts @@ -0,0 +1,7 @@ +import { ProcessResult } from "../types"; + +export const ResultStatusBtnGroup = [ + { name: '전체', value: ProcessResult.ALL }, + { name: '성공', value: ProcessResult.SUCCESS }, + { name: '실패', value: ProcessResult.FAIL }, +]; \ No newline at end of file diff --git a/src/entities/additional-service/model/face-auth/types.ts b/src/entities/additional-service/model/face-auth/types.ts new file mode 100644 index 0000000..7c359a0 --- /dev/null +++ b/src/entities/additional-service/model/face-auth/types.ts @@ -0,0 +1,39 @@ + +// ======================================== +// 안면인증 관련 타입들 +// ======================================== + +import { FilterProps, ListItemProps, ProcessResult } from "../types"; + +export enum FaceAuthTransactionType { + ALL = "ALL", + AUTH = "AUTH", + REGISTER = "REGISTER" +} + +export interface FaceAuthListItem { + tid?: string; + requestDate?: string; + resultStatus?: string; + name?: string; +} + +export interface FaceAuthListProps { + listItems: Record>; + mid: string; +} + +export interface FaceAuthFilterProps extends FilterProps { + mid: string; + memberId: string; + startDate: string; + endDate: string; + transactionType: FaceAuthTransactionType; + processResult: ProcessResult; + setMid: (mid: string) => void; + setMemberId: (memberId: string) => void; + setStartDate: (startDate: string) => void; + setEndDate: (endDate: string) => void; + setTransactionType: (transactionType: FaceAuthTransactionType) => void; + setProcessResult: (processResult: ProcessResult) => void; +} \ No newline at end of file diff --git a/src/entities/additional-service/model/types.ts b/src/entities/additional-service/model/types.ts index 697e3d6..dbd8286 100644 --- a/src/entities/additional-service/model/types.ts +++ b/src/entities/additional-service/model/types.ts @@ -5,6 +5,7 @@ import { ArsListContent } from './ars/types'; import { AlimtalkListContent } from './alimtalk/types'; import { SmsPaymentListItem } from './sms-payment/types'; import type { ExtensionSmsDetailResponse } from './sms-payment/types'; +import { FaceAuthListItem } from './face-auth/types'; // ======================================== // 공통 Enums 및 타입들 @@ -30,6 +31,7 @@ export enum AdditionalServiceCategory { Payout = 'Payout', Ars = 'Ars', Alimtalk = 'Alimtalk', + FaceAuth = 'FaceAuth' } // ======================================== @@ -387,7 +389,7 @@ export interface ListItemProps extends LinkPaymentWaitListItem, SmsPaymentListItem, PayoutContent, FundAccountTransferContentItem, FundAccountResultContentItem, - ArsListContent, AlimtalkListContent { + ArsListContent, AlimtalkListContent, FaceAuthListItem { additionalServiceCategory?: AdditionalServiceCategory; mid?: string; onResendClick?: (mid: string, tid: string) => void; diff --git a/src/entities/additional-service/ui/face-auth/face-auth-list.tsx b/src/entities/additional-service/ui/face-auth/face-auth-list.tsx new file mode 100644 index 0000000..a2a55dd --- /dev/null +++ b/src/entities/additional-service/ui/face-auth/face-auth-list.tsx @@ -0,0 +1,32 @@ +import { ListDateGroup } from '../list-date-group'; +import { AdditionalServiceCategory } from '../../model/types'; +import { FaceAuthListProps } from '../../model/face-auth/types'; + +export const FaceAuthList = ({ + listItems, + mid +}: FaceAuthListProps) => { + const getListDateGroup = () => { + let rs = []; + for (const [key, value] of Object.entries(listItems)) { + rs.push( + + ); + } + return rs; + }; + + return ( + <> +
+ {getListDateGroup()} +
+ + ); +}; diff --git a/src/entities/additional-service/ui/face-auth/filter/face-auth-filter.tsx b/src/entities/additional-service/ui/face-auth/filter/face-auth-filter.tsx new file mode 100644 index 0000000..59a8fbc --- /dev/null +++ b/src/entities/additional-service/ui/face-auth/filter/face-auth-filter.tsx @@ -0,0 +1,138 @@ +import moment from 'moment'; +import { IMAGE_ROOT } from '@/shared/constants/common'; +import { motion } from 'framer-motion'; +import { useState } from 'react'; +import {ProcessResult} from '../../../model/types'; +import { FilterSelect } from '@/shared/ui/filter/select'; +import { FilterInput } from '@/shared/ui/filter/input'; +import { FilterCalendar } from '@/shared/ui/filter/calendar'; +import { FilterButtonGroups } from '@/shared/ui/filter/button-groups'; +import { FilterMotionDuration, FilterMotionStyle, FilterMotionVariants } from '@/entities/common/model/constant'; +import { useStore } from '@/shared/model/store'; +import { FaceAuthFilterProps, FaceAuthTransactionType } from '@/entities/additional-service/model/face-auth/types'; + +export const FaceAuthFilter = ({ + filterOn, + setFilterOn, + mid, + memberId, + startDate, + endDate, + transactionType, + processResult, + setMid, + setMemberId, + setStartDate, + setEndDate, + setTransactionType, + setProcessResult +}: FaceAuthFilterProps) => { + + const [filterMid, setFilterMid] = useState(mid); + const [filterMemberId, setFilterMemberId] = useState(memberId); + const [filterStartDate, setFilterStartDate] = useState(moment(startDate).format('YYYY.MM.DD')); + const [filterEndDate, setFilterEndDate] = useState(moment(endDate).format('YYYY.MM.DD')); + const [filterTransactionType, setFilterTransactionType] = useState(transactionType); + const [filterProcessResult, setFilterProcessResult] = useState(processResult); + + const midOptions = useStore.getState().UserStore.selectOptionsMids; + + const onClickToClose = () => { + setFilterOn(false); + }; + + const onClickToSetFilter = () => { + setMid(filterMid); + setMemberId(filterMemberId); + setStartDate(filterStartDate); + setEndDate(filterEndDate); + setTransactionType(filterTransactionType); + setProcessResult(filterProcessResult); + onClickToClose(); + }; + + const transactionTypeBtnGroup = [ + { name: '전체', value: FaceAuthTransactionType.ALL }, + { name: '인증', value: FaceAuthTransactionType.AUTH }, + { name: '등록', value: FaceAuthTransactionType.REGISTER }, + ]; + + const processResultBtnGroup = [ + { name: '전체', value: ProcessResult.ALL }, + { name: '성공', value: ProcessResult.SUCCESS }, + { name: '실패', value: ProcessResult.FAIL }, + ]; + + return ( + <> + +
+
+
필터
+
+ +
+
+ +
+ + + + + + + + + +
+
+ +
+
+
+ + ); +} diff --git a/src/entities/additional-service/ui/key-in-payment/key-in-payment-list.tsx b/src/entities/additional-service/ui/key-in-payment/key-in-payment-list.tsx index 976f8d4..33243b6 100644 --- a/src/entities/additional-service/ui/key-in-payment/key-in-payment-list.tsx +++ b/src/entities/additional-service/ui/key-in-payment/key-in-payment-list.tsx @@ -26,9 +26,7 @@ export const KeyInPaymentList = ({ }; const onClickToNavigate = () => { - navigate(PATHS.additionalService.keyInPayment.request, { - state: { mid } - }); + navigate(PATHS.additionalService.keyInPayment.request); }; return ( diff --git a/src/entities/additional-service/ui/list-item.tsx b/src/entities/additional-service/ui/list-item.tsx index 9c9c4b7..fe40905 100644 --- a/src/entities/additional-service/ui/list-item.tsx +++ b/src/entities/additional-service/ui/list-item.tsx @@ -28,6 +28,7 @@ export const ListItem = ({ paymentMethod, receiverName, smsCl, + name, onResendClick }: ListItemProps) => { const { navigate } = useNavigate(); @@ -80,6 +81,14 @@ export const ListItem = ({ rs = 'gray'; } } + else if (additionalServiceCategory === AdditionalServiceCategory.FaceAuth) { + if (resultStatus === "SUCCESS") { + rs = 'blue'; + } + else if (resultStatus === "FAIL") { + rs = 'gray'; + } + } else if (additionalServiceCategory === AdditionalServiceCategory.LinkPaymentHistory) { if (paymentStatus === "PAYMENT_COMPLETE") { rs = 'blue'; @@ -115,12 +124,15 @@ export const ListItem = ({ }; const onClickToNavigate = () => { + // 상세페이지 없음 if (additionalServiceCategory === AdditionalServiceCategory.KeyInPayment || - additionalServiceCategory === AdditionalServiceCategory.SMSPayment + additionalServiceCategory === AdditionalServiceCategory.SMSPayment || + additionalServiceCategory === AdditionalServiceCategory.FaceAuth ) { return; } + //이하 상세페이지 존재 else if (additionalServiceCategory === AdditionalServiceCategory.AccountHolderAuth) { navigate(PATHS.additionalService.accountHolderAuth.detail, { state: { @@ -225,6 +237,10 @@ export const ListItem = ({ let time = requestDate?.substring(8, 14); timeStr = time?.substring(0, 2) + ':' + time?.substring(2, 4) + ':' + time?.substring(4, 6); } + else if (additionalServiceCategory === AdditionalServiceCategory.FaceAuth) { + let time = requestDate?.substring(8, 14); + timeStr = time?.substring(0, 2) + ':' + time?.substring(2, 4) + ':' + time?.substring(4, 6); + } else if (additionalServiceCategory === AdditionalServiceCategory.FundAccountTransfer) { timeStr = moment(requestDate).format('mm:ss'); } @@ -256,6 +272,9 @@ export const ListItem = ({ else if (additionalServiceCategory === AdditionalServiceCategory.AccountHolderSearch) { str = `${accountNo}`; } + else if (additionalServiceCategory === AdditionalServiceCategory.FaceAuth) { + str = `${name}(${tid})`; + } else if (additionalServiceCategory === AdditionalServiceCategory.LinkPaymentHistory || additionalServiceCategory === AdditionalServiceCategory.LinkPaymentWait ) { @@ -316,6 +335,16 @@ export const ListItem = ({ ); } + else if (additionalServiceCategory === AdditionalServiceCategory.FaceAuth) { + rs.push( + //TODO : 추후 수정 필요 +
+ {processStatus} + | + {status} +
+ ); + } else if (additionalServiceCategory === AdditionalServiceCategory.LinkPaymentHistory) { if (paymentStatus === "PAYMENT_FAIL" || paymentStatus === "INACTIVE") { rs.push( @@ -418,6 +447,13 @@ export const ListItem = ({ ); } + else if (additionalServiceCategory === AdditionalServiceCategory.FaceAuth) { + rs.push( +
+ {resultStatus === 'SUCCESS' ? '성공' : '실패'} +
+ ); + } else if (additionalServiceCategory === AdditionalServiceCategory.AccountHolderAuth) { rs.push(
diff --git a/src/pages/additional-service/additional-service-pages.tsx b/src/pages/additional-service/additional-service-pages.tsx index 9af3e23..ee44b71 100644 --- a/src/pages/additional-service/additional-service-pages.tsx +++ b/src/pages/additional-service/additional-service-pages.tsx @@ -39,6 +39,7 @@ import { AccountHolderSearchRequestPage } from './account-holder-search/request- import { AccountHolderSearchDetailPage } from './account-holder-search/detail-page'; import { AccountHolderAuthDetailPage } from './account-holder-auth/detail-page'; import { LinkPaymentSeparateApprovalPage } from './link-payment/separate-approval/link-payment-separate-approval-page'; +import { FaceAuthPage } from './face-auth/face-auth-page'; export const AdditionalServicePages = () => { return ( @@ -100,6 +101,9 @@ export const AdditionalServicePages = () => { } /> } /> + + } /> + ); diff --git a/src/pages/additional-service/face-auth/face-auth-page.tsx b/src/pages/additional-service/face-auth/face-auth-page.tsx new file mode 100644 index 0000000..06de619 --- /dev/null +++ b/src/pages/additional-service/face-auth/face-auth-page.tsx @@ -0,0 +1,204 @@ +import moment from 'moment'; +import { ProcessResult } from '@/entities/additional-service/model/types'; +import { SortTypeKeys } from '@/entities/common/model/types'; +import { SortTypeBox } from '@/entities/common/ui/sort-type-box'; +import { DEFAULT_PAGE_PARAM } from '@/entities/common/model/constant'; +import { useNavigate } from '@/shared/lib/hooks/use-navigate'; +import { IMAGE_ROOT } from '@/shared/constants/common'; +import { HeaderType } from '@/entities/common/model/types'; +import { useEffect, useState } from 'react'; +import { useStore } from '@/shared/model/store'; +import { PATHS } from '@/shared/constants/paths'; +import { + useSetHeaderTitle, + useSetHeaderType, + useSetFooterMode, + useSetOnBack +} from '@/widgets/sub-layout/use-sub-layout'; + +import { FaceAuthList } from '@/entities/additional-service/ui/face-auth/face-auth-list'; +import { FaceAuthFilter } from '@/entities/additional-service/ui/face-auth/filter/face-auth-filter'; +import { FaceAuthListItem, FaceAuthTransactionType } from '@/entities/additional-service/model/face-auth/types'; +import { ResultStatusBtnGroup } from '@/entities/additional-service/model/face-auth/constant'; + +export const FaceAuthPage = () => { + const { navigate } = useNavigate(); + const userMid = useStore.getState().UserStore.mid; + + const [sortType, setSortType] = useState(SortTypeKeys.LATEST); + const [listItems, setListItems] = useState({}); + const [pageParam, setPageParam] = useState(DEFAULT_PAGE_PARAM); + const [filterOn, setFilterOn] = useState(false); + const [mid, setMid] = useState(userMid); + const [memberId, setMemberId] = useState(''); + const [startDate, setStartDate] = useState(moment().format('YYYY-MM-DD')); + const [endDate, setEndDate] = useState(moment().format('YYYY-MM-DD')); + const [transactionType, setTransactionType] = useState(FaceAuthTransactionType.ALL); + const [processResult, setProcessResult] = useState(ProcessResult.ALL); + + useSetHeaderTitle('안면인증'); + useSetHeaderType(HeaderType.LeftArrow); + useSetFooterMode(false); + useSetOnBack(() => { + navigate(PATHS.home); + }); + + //TODO : API 연동 + //const { mutateAsync: faceAuthHistoryList } = useExtensionFaceAuthHistoryListMutation(); + //const { mutateAsync: downloadExcel } = useExtensionFaceAuthDownloadExcelMutation(); + + const assembleData = (content: Array) => { + console.log('rs.content:', content); + let data: any = {}; + if (content && content.length > 0) { + for (let i = 0; i < content?.length; i++) { + let requestDate = content[i]?.requestDate?.substring(0, 8); + let groupDate = moment(requestDate).format('YYYYMMDD'); + if (!!groupDate && !data.hasOwnProperty(groupDate)) { + data[groupDate] = []; + } + if (!!groupDate && data.hasOwnProperty(groupDate)) { + data[groupDate].push(content[i]); + } + } + } + console.log('Data : ', data); + return data; + }; + + const callList = (option?: { + sortType?: SortTypeKeys, + val?: string + }) => { + pageParam.sortType = (option?.sortType) ? option.sortType : sortType; + setPageParam(pageParam); + let listParams = { + mid: mid, + memberId: memberId, + fromDate: startDate, + toDate: endDate, + transactionType: transactionType, + resultStatus: processResult, + page: pageParam + }; + + //faceAuthHistoryList(listParams).then((rs) => { + // setListItems(assembleData(rs.content)); + //}); + }; + + const onClickToDownloadExcel = () => { + // downloadExcel({ + // mid: mid, + // memberId: memberId, + // fromDate: startDate, + // toDate: endDate, + // transactionType: transactionType, + // resultStatus: processResult + // }).then((rs) => { + // console.log('Excel Dowload Status : ' + rs.status); + // }); + }; + + const onClickToOpenFilter = () => { + setFilterOn(!filterOn); + }; + + const onClickToSort = (sort: SortTypeKeys) => { + setSortType(sort); + callList({ sortType: sort }); + }; + + const onClickToTransactionStatus = (val: ProcessResult) => { + setProcessResult(val); + callList({ + val: val + }); + }; + + useEffect(() => { + callList(); + }, [mid, memberId, startDate, endDate, transactionType, processResult]); + + return ( + <> +
+
+
+
+
+
+ + +
+ +
+
+ +
+ +
+
+ { + ResultStatusBtnGroup.map((value, index) => ( + onClickToTransactionStatus(value.value)} + >{value.name} + )) + } +
+
+
+ +
+
+
+ + + ); +}; \ No newline at end of file diff --git a/src/pages/additional-service/fund-account/transfer-request-page.tsx b/src/pages/additional-service/fund-account/transfer-request-page.tsx index 28dabc8..42c4666 100644 --- a/src/pages/additional-service/fund-account/transfer-request-page.tsx +++ b/src/pages/additional-service/fund-account/transfer-request-page.tsx @@ -17,6 +17,7 @@ export const FundAccountTransferRequestPage = () => { const { navigate } = useNavigate(); const userMid = useStore.getState().UserStore.mid; + const [mid, setMid] = useState(userMid); const [transferAmount, setTransferAmount] = useState(0); const [receiveBankCode, setReceiveBankCode] = useState(''); @@ -46,6 +47,14 @@ export const FundAccountTransferRequestPage = () => { navigate(PATHS.additionalService.payout.list); }); }; + + const isFormValid = () => { + return ( + receiveAccountNo.trim() !== '' && + receiveAccountName.trim() !== '' && + transferAmount >0 + ) + } return ( <> @@ -55,9 +64,11 @@ export const FundAccountTransferRequestPage = () => {
-
서브ID
+
가맹점
- +
@@ -121,6 +132,7 @@ export const FundAccountTransferRequestPage = () => {
diff --git a/src/pages/additional-service/key-in-payment/requeset-page.tsx b/src/pages/additional-service/key-in-payment/requeset-page.tsx index 99444e5..d2da84f 100644 --- a/src/pages/additional-service/key-in-payment/requeset-page.tsx +++ b/src/pages/additional-service/key-in-payment/requeset-page.tsx @@ -13,14 +13,15 @@ import { } from '@/widgets/sub-layout/use-sub-layout'; import { overlay } from 'overlay-kit'; import { Dialog } from '@/shared/ui/dialogs/dialog'; +import { useStore } from '@/shared/model/store'; export const KeyInPaymentRequestPage = () => { const { navigate } = useNavigate(); const location = useLocation(); - const { mid: receivedMid } = location.state || {}; + const userMid = useStore.getState().UserStore.mid; - const [mid, setMid] = useState(receivedMid || ''); + const [mid, setMid] = useState(userMid || ''); const [goodsName, setGoodsName] = useState(''); const [amount, setAmount] = useState(0); const [buyerName, setBuyerName] = useState(''); @@ -115,7 +116,7 @@ export const KeyInPaymentRequestPage = () => { const isValidCardNumber = () => { return cardNo1.length === 4 && cardNo2.length === 4 && - cardNo3.length === 4 && cardNo4.length === 4; + cardNo3.length === 4 && cardNo4.length === 4; }; const isValidCardExpiration = () => { @@ -293,7 +294,7 @@ export const KeyInPaymentRequestPage = () => {
유효기간(월/년)*
-
+
{ pattern="[0-9]*" maxLength={2} placeholder='MM' - style={{flex: 1}} + style={{ flex: 1 }} /> / { pattern="[0-9]*" maxLength={2} placeholder='YY' - style={{flex: 1}} + style={{ flex: 1 }} />
diff --git a/src/pages/additional-service/link-payment/apply/link-payment-apply-success-page.tsx b/src/pages/additional-service/link-payment/apply/link-payment-apply-success-page.tsx index 2d784d3..30e0bc2 100644 --- a/src/pages/additional-service/link-payment/apply/link-payment-apply-success-page.tsx +++ b/src/pages/additional-service/link-payment/apply/link-payment-apply-success-page.tsx @@ -11,7 +11,7 @@ export const LinkPaymentApplySuccessPage = () => { useSetFooterMode(false); const onClickToHome = () => { - navigate(PATHS.additionalService.linkPayment.base); + navigate(PATHS.additionalService.linkPayment.shippingHistory); }; return ( diff --git a/src/pages/additional-service/payout/request-page.tsx b/src/pages/additional-service/payout/request-page.tsx index 91d9e2f..a23b8d9 100644 --- a/src/pages/additional-service/payout/request-page.tsx +++ b/src/pages/additional-service/payout/request-page.tsx @@ -2,10 +2,10 @@ import { IMAGE_ROOT } from "@/shared/constants/common"; import { PATHS } from '@/shared/constants/paths'; import { useNavigate } from '@/shared/lib/hooks/use-navigate'; import { CalendarType, HeaderType } from '@/entities/common/model/types'; -import { - useSetHeaderTitle, - useSetHeaderType, - useSetFooterMode, +import { + useSetHeaderTitle, + useSetHeaderType, + useSetFooterMode, useSetOnBack } from '@/widgets/sub-layout/use-sub-layout'; import { useState } from "react"; @@ -25,7 +25,7 @@ export const PayoutRequestPage = () => { const [settlementDate, setSettlementDate] = useState(''); const { mutateAsync: extensionPayoutRequest } = useExtensionPayoutRequestMutation(); - + useSetHeaderTitle('지급대행 신청'); useSetHeaderType(HeaderType.RightClose); useSetFooterMode(false); @@ -45,6 +45,14 @@ export const PayoutRequestPage = () => { }); }; + const isFormValid = () => { + return ( + submallId.trim() !== '' && + disbursementAmount > 0 && + settlementDate.trim() !== '' + ); + }; + const setNewDate = (date: string) => { setSettlementDate(date); setCalendarOpen(false); @@ -62,40 +70,40 @@ export const PayoutRequestPage = () => {
서브ID
- setSubmallId(e.target.value) } + setSubmallId(e.target.value)} />
지급액
- setDisbursementAmount(parseInt(e.target.value)) } - /> + setDisbursementAmount(parseInt(e.target.value))} + />
지급일
- - @@ -108,16 +116,17 @@ export const PayoutRequestPage = () => {
-
);