Merge branch 'payout'

This commit is contained in:
focp212@naver.com
2025-09-22 14:57:03 +09:00
7 changed files with 128 additions and 25 deletions

View File

@@ -17,7 +17,7 @@ export const extensionPayoutDetailDownloadCertificate = (params: ExtensionPayout
); );
}; };
export const useExtensionPayoutDetailMutation = (options?: UseMutationOptions<ExtensionPayoutDetailDownloadCertificateResponse, CBDCAxiosError, ExtensionPayoutDetailDownloadCertificateParams>) => { export const useExtensionPayoutDetailDownloadCertificateMutation = (options?: UseMutationOptions<ExtensionPayoutDetailDownloadCertificateResponse, CBDCAxiosError, ExtensionPayoutDetailDownloadCertificateParams>) => {
const mutation = useMutation<ExtensionPayoutDetailDownloadCertificateResponse, CBDCAxiosError, ExtensionPayoutDetailDownloadCertificateParams>({ const mutation = useMutation<ExtensionPayoutDetailDownloadCertificateResponse, CBDCAxiosError, ExtensionPayoutDetailDownloadCertificateParams>({
...options, ...options,
mutationFn: (params: ExtensionPayoutDetailDownloadCertificateParams) => extensionPayoutDetailDownloadCertificate(params), mutationFn: (params: ExtensionPayoutDetailDownloadCertificateParams) => extensionPayoutDetailDownloadCertificate(params),

View File

@@ -16,7 +16,8 @@ export enum FilterDateOptions {
}; };
export enum CalendarType { export enum CalendarType {
Start = 'Start', Start = 'Start',
End = 'End' End = 'End',
Single = 'Single'
}; };
export interface DefaultRequestPagination { export interface DefaultRequestPagination {
cursor: string; cursor: string;

View File

@@ -7,9 +7,35 @@ import {
useSetFooterMode, useSetFooterMode,
useSetOnBack useSetOnBack
} from '@/widgets/sub-layout/use-sub-layout'; } from '@/widgets/sub-layout/use-sub-layout';
import { useExtensionPayoutDetailMutation } from '@/entities/additional-service/api/payout/use-extension-payout-detail-mutation';
import { useLocation } from 'react-router';
import { ExtensionPayoutDetailDownloadCertificateParams, ExtensionPayoutDetailDownloadCertificateResponse, ExtensionPayoutDetailParams, ExtensionPayoutDetailResponse } from '@/entities/additional-service/model/payout/types';
import { useEffect, useState } from 'react';
import { NumericFormat } from 'react-number-format';
import { useExtensionPayoutDetailDownloadCertificateMutation } from '@/entities/additional-service/api/payout/use-extension-payout-detail-download-cetificate-mutation';
export const PayoutDetailPage = () => { export const PayoutDetailPage = () => {
const { navigate } = useNavigate(); const { navigate } = useNavigate();
const location = useLocation();
const tid = location.state.tid;
const mid = location.state.mid;
const [detail, setDetail] = useState<ExtensionPayoutDetailResponse>();
const { mutateAsync: extensionPayoutDetail } = useExtensionPayoutDetailMutation();
const { mutateAsync: extensionPayoutDetailDownloadCertification } = useExtensionPayoutDetailDownloadCertificateMutation();
const callSettlementDetail = () => {
let params: ExtensionPayoutDetailParams = {
tid: tid,
mid: mid,
};
extensionPayoutDetail(params).then((rs: ExtensionPayoutDetailResponse) => {
setDetail(rs);
});
};
useSetHeaderTitle('지급대행 상세'); useSetHeaderTitle('지급대행 상세');
useSetHeaderType(HeaderType.LeftArrow); useSetHeaderType(HeaderType.LeftArrow);
@@ -18,6 +44,20 @@ export const PayoutDetailPage = () => {
navigate(PATHS.additionalService.payout.list); navigate(PATHS.additionalService.payout.list);
}); });
const onClickToDownload = () => {
let params: ExtensionPayoutDetailDownloadCertificateParams = {
tid: tid,
mid: mid,
};
extensionPayoutDetailDownloadCertification(params).then((rs: ExtensionPayoutDetailDownloadCertificateResponse) => {
console.log(rs);
});
};
useEffect(() => {
callSettlementDetail();
}, []);
return ( return (
<> <>
<main className="full-height"> <main className="full-height">
@@ -25,7 +65,14 @@ export const PayoutDetailPage = () => {
<div className="tab-pane sub active"> <div className="tab-pane sub active">
<div className="pay-top"> <div className="pay-top">
<div className="num-amount"> <div className="num-amount">
<span className="amount">10,000,000</span> <span className="amount">
<NumericFormat
value={ detail?.disbursementAmount }
thousandSeparator
displayType="text"
suffix='원'
></NumericFormat>
</span>
</div> </div>
<div className="num-store"></div> <div className="num-store"></div>
<div className="num-day">2025.08.19</div> <div className="num-day">2025.08.19</div>
@@ -33,6 +80,7 @@ export const PayoutDetailPage = () => {
<button <button
className="receipt-btn" className="receipt-btn"
type="button" type="button"
onClick={ onClickToDownload }
> >
<span className="icon-24 download"></span> <span className="icon-24 download"></span>
<span> </span> <span> </span>
@@ -45,43 +93,43 @@ export const PayoutDetailPage = () => {
<ul className="kv-list"> <ul className="kv-list">
<li className="kv-row"> <li className="kv-row">
<span className="k"></span> <span className="k"></span>
<span className="v"></span> <span className="v">{ detail?.disbursementStatus }</span>
</li> </li>
<li className="kv-row"> <li className="kv-row">
<span className="k"></span> <span className="k"></span>
<span className="v"></span> <span className="v">{ detail?.transTypeName }</span>
</li> </li>
<li className="kv-row"> <li className="kv-row">
<span className="k"></span> <span className="k"></span>
<span className="v">2025.06.05</span> <span className="v">{ detail?.requestDate }</span>
</li> </li>
<li className="kv-row"> <li className="kv-row">
<span className="k"></span> <span className="k"></span>
<span className="v">2025.06.08 11:00:00</span> <span className="v">{ detail?.settlementDate }</span>
</li> </li>
<li className="kv-row"> <li className="kv-row">
<span className="k"></span> <span className="k"></span>
<span className="v">'123456789'</span> <span className="v">{ detail?.companyNo }</span>
</li> </li>
<li className="kv-row"> <li className="kv-row">
<span className="k"></span> <span className="k"></span>
<span className="v"></span> <span className="v">{ detail?.accountName }</span>
</li> </li>
<li className="kv-row"> <li className="kv-row">
<span className="k"></span> <span className="k"></span>
<span className="v"></span> <span className="v">{ detail?.bankName }</span>
</li> </li>
<li className="kv-row"> <li className="kv-row">
<span className="k"></span> <span className="k"></span>
<span className="v">'1123456789'</span> <span className="v">{ detail?.accountNo }</span>
</li> </li>
<li className="kv-row"> <li className="kv-row">
<span className="k"></span> <span className="k"></span>
<span className="v"></span> <span className="v">{ detail?.depositName }</span>
</li> </li>
<li className="kv-row"> <li className="kv-row">
<span className="k"></span> <span className="k"></span>
<span className="v">&nbsp;</span> <span className="v">{ detail?.failReason }</span>
</li> </li>
</ul> </ul>
</div> </div>

View File

@@ -160,6 +160,7 @@ export const PayoutListPage = () => {
rs.push( rs.push(
<ListDateGroup <ListDateGroup
additionalServiceCategory={ AdditionalServiceCategory.Payout } additionalServiceCategory={ AdditionalServiceCategory.Payout }
mid={ mid }
key={ key } key={ key }
date={ key } date={ key }
items={ value } items={ value }

View File

@@ -1,24 +1,55 @@
import { IMAGE_ROOT } from "@/shared/constants/common"; import { IMAGE_ROOT } from "@/shared/constants/common";
import { PATHS } from '@/shared/constants/paths'; import { PATHS } from '@/shared/constants/paths';
import { useNavigate } from '@/shared/lib/hooks/use-navigate'; import { useNavigate } from '@/shared/lib/hooks/use-navigate';
import { HeaderType } from '@/entities/common/model/types'; import { CalendarType, HeaderType } from '@/entities/common/model/types';
import { import {
useSetHeaderTitle, useSetHeaderTitle,
useSetHeaderType, useSetHeaderType,
useSetFooterMode, useSetFooterMode,
useSetOnBack useSetOnBack
} from '@/widgets/sub-layout/use-sub-layout'; } from '@/widgets/sub-layout/use-sub-layout';
import { useState } from "react";
import { useExtensionPayoutRequestMutation } from "@/entities/additional-service/api/payout/use-extension-payout-request-mutation";
import { ExtensionPayoutRequestParams, ExtensionPayoutRequestResponse } from "@/entities/additional-service/model/payout/types";
import NiceCalendar from "@/shared/ui/calendar/nice-calendar";
export const PayoutRequestPage = () => { export const PayoutRequestPage = () => {
const { navigate } = useNavigate(); const { navigate } = useNavigate();
const [calendarOpen, setCalendarOpen] = useState<boolean>(false);
const [mid, setMid] = useState<string>('nictest001m')
const [submallId, setSubmallId] = useState<string>('');
const [disbursementAmount, setDisbursementAmount] = useState<number>(0);
const [settlementDate, setSettlementDate] = useState<string>('');
const { mutateAsync: extensionPayoutRequest } = useExtensionPayoutRequestMutation();
useSetHeaderTitle('지급대행 신청'); useSetHeaderTitle('지급대행 신청');
useSetHeaderType(HeaderType.LeftArrow); useSetHeaderType(HeaderType.RightClose);
useSetFooterMode(false); useSetFooterMode(false);
useSetOnBack(() => { useSetOnBack(() => {
navigate(PATHS.additionalService.payout.list); navigate(PATHS.additionalService.payout.list);
}); });
const callExtensionPayoutRequest = () => {
let params: ExtensionPayoutRequestParams = {
mid: mid,
submallId: submallId,
disbursementAmount: disbursementAmount,
settlementDate: settlementDate,
};
extensionPayoutRequest(params).then((rs: ExtensionPayoutRequestResponse) => {
navigate(PATHS.additionalService.payout.list);
});
};
const setNewDate = (date: string) => {
setSettlementDate(date);
setCalendarOpen(false);
};
const onClickToOpenCalendar = () => {
setCalendarOpen(true);
};
return ( return (
<> <>
<main> <main>
@@ -31,8 +62,8 @@ export const PayoutRequestPage = () => {
<div className="billing-field"> <div className="billing-field">
<input <input
type="text" type="text"
value="BIKYvattest01m" value={ submallId }
readOnly={ true } onChange={ (e) => setSubmallId(e.target.value) }
/> />
</div> </div>
</div> </div>
@@ -41,8 +72,8 @@ export const PayoutRequestPage = () => {
<div className="billing-field"> <div className="billing-field">
<input <input
type="text" type="text"
value="테스트상품123" value={ disbursementAmount }
readOnly={ true } onChange={ (e) => setDisbursementAmount(parseInt(e.target.value)) }
/> />
</div> </div>
</div> </div>
@@ -54,11 +85,12 @@ export const PayoutRequestPage = () => {
className="date-input" className="date-input"
type="text" type="text"
placeholder="날짜 선택" placeholder="날짜 선택"
value="2025.06.08" value={ settlementDate }
/> />
<button <button
className="date-btn" className="date-btn"
type="button" type="button"
onClick={ () => onClickToOpenCalendar() }
> >
<img <img
src={ IMAGE_ROOT + '/ico_date.svg' } src={ IMAGE_ROOT + '/ico_date.svg' }
@@ -73,6 +105,18 @@ export const PayoutRequestPage = () => {
</div> </div>
</div> </div>
</main> </main>
<div className="apply-row">
<button
className="btn-50 btn-blue flex-1"
onClick={ callExtensionPayoutRequest }
></button>
</div>
<NiceCalendar
calendarOpen={ calendarOpen }
setCalendarOpen={ setCalendarOpen }
calendarType={ CalendarType.Single }
setNewDate={ setNewDate }
></NiceCalendar>
</> </>
); );
}; };

View File

@@ -9,8 +9,9 @@ import { CalendarType } from '@/entities/common/model/types';
interface NiceCalendarProps { interface NiceCalendarProps {
calendarOpen: boolean; calendarOpen: boolean;
setCalendarOpen: (calendarOpen: boolean) => void; setCalendarOpen: (calendarOpen: boolean) => void;
startDate: string; startDate?: string;
endDate: string; endDate?: string;
singleDate?: string;
calendarType: CalendarType; calendarType: CalendarType;
setNewDate: (date: string) => void; setNewDate: (date: string) => void;
}; };
@@ -20,6 +21,7 @@ const NiceCalendar = ({
setCalendarOpen, setCalendarOpen,
startDate, startDate,
endDate, endDate,
singleDate,
calendarType, calendarType,
setNewDate setNewDate
}: NiceCalendarProps) => { }: NiceCalendarProps) => {
@@ -37,14 +39,21 @@ const NiceCalendar = ({
const setMinMaxValueDate = () => { const setMinMaxValueDate = () => {
if(calendarType === CalendarType.Start){ if(calendarType === CalendarType.Start){
setMinDate(undefined); setMinDate(undefined);
if(!!endDate){
setMaxDate(new Date(endDate)); setMaxDate(new Date(endDate));
}
setValueDate(startDate); setValueDate(startDate);
} }
else if(calendarType === CalendarType.End){ else if(calendarType === CalendarType.End){
if(!!startDate){
setMinDate(new Date(startDate)); setMinDate(new Date(startDate));
}
setMaxDate(new Date()); setMaxDate(new Date());
setValueDate(endDate); setValueDate(endDate);
} }
else if(calendarType === CalendarType.Single){
setValueDate(singleDate);
}
}; };
const formatMonthYear = (locale: string | undefined, date: Date) => { const formatMonthYear = (locale: string | undefined, date: Date) => {