This commit is contained in:
HyeonJongKim
2025-09-22 18:34:31 +09:00
19 changed files with 307 additions and 101 deletions

View File

@@ -0,0 +1,29 @@
import axios from 'axios';
import { API_URL_ADDITIONAL_SERVICE } from '@/shared/api/api-url-additional-service';
import { resultify } from '@/shared/lib/resultify';
import { CBDCAxiosError } from '@/shared/@types/error';
import {
ExtensionFundAccountTransferRequestParams,
ExtensionFundAccountTransferRequestResponse
} from '../../model/fund-account/types';
import {
useMutation,
UseMutationOptions
} from '@tanstack/react-query';
export const extensionFundAccountTransferRequest = (params: ExtensionFundAccountTransferRequestParams) => {
return resultify(
axios.post<ExtensionFundAccountTransferRequestResponse>(API_URL_ADDITIONAL_SERVICE.extensionFundAccountTransferRequest(), params),
);
};
export const useExtensionFundAccountTransferRequestMutation = (options?: UseMutationOptions<ExtensionFundAccountTransferRequestResponse, CBDCAxiosError, ExtensionFundAccountTransferRequestParams>) => {
const mutation = useMutation<ExtensionFundAccountTransferRequestResponse, CBDCAxiosError, ExtensionFundAccountTransferRequestParams>({
...options,
mutationFn: (params: ExtensionFundAccountTransferRequestParams) => extensionFundAccountTransferRequest(params),
});
return {
...mutation,
};
};

View File

@@ -0,0 +1,151 @@
import { DefaulResponsePagination, DefaultRequestPagination } from '@/entities/common/model/types';
export enum FundAccountTabKeys {
TransferList = 'TransferList',
ResultList = 'ResultList'
}
export interface FundAccountTabProps {
activeTab: FundAccountTabKeys;
}
export interface ExtensionFundAccountTransferRequestParams {
mid: string;
transferAmount: number;
receiveBankCode: string;
receiveAccountNo: string;
receiveAccountName: string;
transferMemo: string;
};
export interface ExtensionFundAccountTransferRequestResponse {
tid: string;
result: string;
message: string;
};
export enum FundAccountStatus {
ALL = 'ALL',
SUCCESS = 'SUCCESS',
FAIL = 'FAIL',
PENDING = 'PENDING'
};
export interface ExtensionFundAccountTransferListParams {
mid: string;
fromDate: string;
toDate: string;
status: FundAccountStatus;
pagination: DefaultRequestPagination;
}
export interface ExtensionFundAccountTransferListResponse extends DefaulResponsePagination {
content: Array<FundAccountTransferContent>;
};
export interface FundAccountTransferContent {
pagination: string;
items: Array<FundAccountTransferContentItem>;
};
export interface FundAccountTransferContentItem {
tid: string;
requestDate: string;
transferAmount: number;
receiveBankName: string;
receiveAccountNo: string;
receiveAccountName: string;
status: FundAccountStatus;
processDate: string;
};
export interface FundAccountTransferExcelParams {
mid: string;
fromDate: string;
toDate: string;
status: FundAccountStatus;
};
export interface FundAccountTransferExcelResponse {};
export interface FundAccountTransferDetailParams {
mid: string;
tid: string;
};
export interface FundAccountTransferDetailResponse {
tid: string;
requestDate: string;
transferAmount: number;
receiveBankName: string;
receiveAccountNo: string;
receiveAccountName: string;
status: FundAccountStatus;
processDate: string;
failReason: string;
fee: number;
afterBalance: number;
};
export interface FundAccountResultSummaryParams {
mid: string;
fromDate: string;
toDate: string;
};
export interface FundAccountResultSummaryResponse {
totalCount: number;
totalAmount: number;
successCount: number;
successAmount: number;
failCount: number;
failAmount: number;
pendingCount: number;
pendingAmount: number;
};
export interface FundAccountResultListParams {
mid: string;
fromDate: string;
toDate: string;
status: FundAccountStatus;
pagination: FundAccountStatus;
};
export interface FundAccountResultListResponse extends DefaulResponsePagination {
content: Array<FundAccountResultContent>;
};
export interface FundAccountResultContent {
pagination: string;
items: Array<FundAccountResultContentItem>;
};
export interface FundAccountResultContentItem {
tid: string;
requestDate: string;
transferAmount: number;
receiveBankName: string;
receiveAccountNo: string;
receiveAccountName: string;
status: FundAccountStatus;
processDate: string;
failReason: string;
};
export interface FundAccountResultExcelParams {
mid: string;
fromDate: string;
toDate: string;
status: FundAccountStatus;
};
export interface FundAccountResultExcelResponse {};
export interface FundAccountResultDetailParams {
mid: string;
tid: string;
};
export interface FundAccountResultDetailResponse {
tid: string;
requestDate: string;
transferAmount: number;
receiveBankName: string;
receiveAccountNo: string;
receiveAccountName: string;
status: FundAccountStatus;
processDate: string;
failReason: string;
fee: number;
afterBalance: number;
transferMemo: string;
bankTid: string;
};
export interface FundAccountBalanceParams {
mid: string;
};
export interface FundAccountBalanceResponse {
balalnce: number;
};

View File

@@ -29,7 +29,7 @@ export enum AdditionalServiceCategory {
AccountHolderSearch = 'AccountHolderSearch',
LinkPaymentHistory = 'LinkPaymentHistory',
LinkPaymentPending = 'LinkPaymentPending',
FundTransfer = 'FundTransfer',
FundAccount = 'FundAccount',
SettlementAgency = 'SettlementAgency',
Payout = 'Payout',
}
@@ -339,19 +339,6 @@ export interface DetailInfoSectionProps extends DetailResponse {
onClickToShowInfo?: (info: DetailInfoSectionKeys) => void;
}
// ========================================
// 자금이체 관련 타입들
// ========================================
export enum FundTransferTabKeys {
RequestList = 'RequestList',
ResultInquiry = 'ResultInquiry'
}
export interface FundTransferTabProps {
activeTab: FundTransferTabKeys;
}
// ========================================
// 정산기관 관련 타입들
// ========================================

View File

@@ -1,6 +1,6 @@
import { IMAGE_ROOT } from "@/shared/constants/common";
export const FundTransferResultInquiryWrap = () => {
export const FundAccountResultListWrap = () => {
return (
<>

View File

@@ -0,0 +1,37 @@
import { PATHS } from '@/shared/constants/paths';
import { useNavigate } from '@/shared/lib/hooks/use-navigate';
import {
FundAccountTabKeys,
FundAccountTabProps
} from '../../model/fund-account/types';
export const FundAccountTab = ({
activeTab
}: FundAccountTabProps) => {
const { navigate } = useNavigate();
const onClickToNavigation = (tab: FundAccountTabKeys) => {
if(activeTab !== tab){
if(tab === FundAccountTabKeys.TransferList){
navigate(PATHS.additionalService.fundAccount.transferList);
}
else if(tab === FundAccountTabKeys.ResultList){
navigate(PATHS.additionalService.fundAccount.resultList);
}
}
};
return (
<>
<div className="subTab">
<button
className={`subtab-btn ${(activeTab === FundAccountTabKeys.TransferList)? 'active': ''}` }
onClick={ () => onClickToNavigation(FundAccountTabKeys.TransferList) }
> </button>
<button
className={`subtab-btn ${(activeTab === FundAccountTabKeys.ResultList)? 'active': ''}` }
onClick={ () => onClickToNavigation(FundAccountTabKeys.ResultList) }
> </button>
</div>
</>
);
};

View File

@@ -1,6 +1,6 @@
import { IMAGE_ROOT } from "@/shared/constants/common";
export const FundTransferRequestListWrap = () => {
export const FundAccountTransferListWrap = () => {
return (
<>

View File

@@ -1,37 +0,0 @@
import { PATHS } from '@/shared/constants/paths';
import { useNavigate } from '@/shared/lib/hooks/use-navigate';
import {
FundTransferTabKeys,
FundTransferTabProps
} from '../../model/types';
export const FundTransferTab = ({
activeTab
}: FundTransferTabProps) => {
const { navigate } = useNavigate();
const onClickToNavigation = (tab: FundTransferTabKeys) => {
if(activeTab !== tab){
if(tab === FundTransferTabKeys.RequestList){
navigate(PATHS.additionalService.fundTransfer.requestList);
}
else if(tab === FundTransferTabKeys.ResultInquiry){
navigate(PATHS.additionalService.fundTransfer.resultInquiry);
}
}
};
return (
<>
<div className="subTab">
<button
className={`subtab-btn ${(activeTab === FundTransferTabKeys.RequestList)? 'active': ''}` }
onClick={ () => onClickToNavigation(FundTransferTabKeys.RequestList) }
> </button>
<button
className={`subtab-btn ${(activeTab === FundTransferTabKeys.ResultInquiry)? 'active': ''}` }
onClick={ () => onClickToNavigation(FundTransferTabKeys.ResultInquiry) }
> </button>
</div>
</>
);
};

View File

@@ -137,7 +137,7 @@ export const ListItem = ({
}
});
}
else if (additionalServiceCategory === AdditionalServiceCategory.FundTransfer) {
else if (additionalServiceCategory === AdditionalServiceCategory.FundAccount) {
}
else if (additionalServiceCategory === AdditionalServiceCategory.SettlementAgency) {

View File

@@ -13,9 +13,9 @@ import { LinkPaymentHistoryPage } from './link-payment/link-payment-history-page
import { LinkPaymentWaitSendPage } from './link-payment/link-payment-wait-send-page';
import { KakaoPaymentNotificationListPage } from './kakao-payment-notification/list-page';
import { KakaoPaymentNotificationSettingPage } from './kakao-payment-notification/setting-page';
import { FundTransferRequestListPage } from './fund-transfer/request-list-page';
import { FundTransferRequestRegisterPage } from './fund-transfer/request-register-page';
import { FundTransferResultInquiryPage } from './fund-transfer/result-inquiry-page';
import { FundAccountTransferListPage } from './fund-account/transfer-list-page';
import { FundAccountTransferRequestPage } from './fund-account/transfer-request-page';
import { FundAccountResultListPage } from './fund-account/result-list-page';
import { SettlementAgencyManagePage } from './settlement-agency/manage-page';
import { SettlementAgencyDepositPage } from './settlement-agency/deposit-page';
import { SettlementAgencyMemberPage } from './settlement-agency/member-page';
@@ -73,10 +73,10 @@ export const AdditionalServicePages = () => {
<Route path={ROUTE_NAMES.additionalService.kakaoPaymentNotification.list} element={<KakaoPaymentNotificationListPage />} />
<Route path={ROUTE_NAMES.additionalService.kakaoPaymentNotification.setting} element={<KakaoPaymentNotificationSettingPage />} />
</Route>
<Route path={ROUTE_NAMES.additionalService.fundTransfer.base}>
<Route path={ROUTE_NAMES.additionalService.fundTransfer.requestList} element={<FundTransferRequestListPage />} />
<Route path={ROUTE_NAMES.additionalService.fundTransfer.requestRegister} element={<FundTransferRequestRegisterPage />} />
<Route path={ROUTE_NAMES.additionalService.fundTransfer.resultInquiry} element={<FundTransferResultInquiryPage />} />
<Route path={ROUTE_NAMES.additionalService.fundAccount.base}>
<Route path={ROUTE_NAMES.additionalService.fundAccount.transferList} element={<FundAccountTransferListPage />} />
<Route path={ROUTE_NAMES.additionalService.fundAccount.transferRequest} element={<FundAccountTransferRequestPage />} />
<Route path={ROUTE_NAMES.additionalService.fundAccount.resultList} element={<FundAccountResultListPage />} />
</Route>
<Route path={ROUTE_NAMES.additionalService.settlementAgency.base}>
<Route path={ROUTE_NAMES.additionalService.settlementAgency.manage} element={<SettlementAgencyManagePage />} />

View File

@@ -1,9 +1,9 @@
import { useState } from 'react';
import { PATHS } from '@/shared/constants/paths';
import { useNavigate } from '@/shared/lib/hooks/use-navigate';
import { FundTransferTab } from '@/entities/additional-service/ui/fund-transfer/fund-transfer-tab';
import { FundTransferResultInquiryWrap } from '@/entities/additional-service/ui/fund-transfer/fund-transfer-result-inquiry-wrap';
import { FundTransferTabKeys } from '@/entities/additional-service/model/types';
import { FundAccountTab } from '@/entities/additional-service/ui/fund-account/tab';
import { FundAccountResultListWrap } from '@/entities/additional-service/ui/fund-account/result-list-wrap';
import { FundAccountTabKeys } from '@/entities/additional-service/model/fund-account/types';
import { HeaderType } from '@/entities/common/model/types';
import {
useSetHeaderTitle,
@@ -12,10 +12,10 @@ import {
useSetOnBack
} from '@/widgets/sub-layout/use-sub-layout';
export const FundTransferResultInquiryPage = () => {
export const FundAccountResultListPage = () => {
const { navigate } = useNavigate();
const [activeTab, setActiveTab] = useState<FundTransferTabKeys>(FundTransferTabKeys.ResultInquiry);
const [activeTab, setActiveTab] = useState<FundAccountTabKeys>(FundAccountTabKeys.ResultList);
useSetHeaderTitle('자금이체');
useSetHeaderType(HeaderType.LeftArrow);
@@ -28,9 +28,9 @@ export const FundTransferResultInquiryPage = () => {
<>
<main>
<div className="tab-content">
<div className="tab-pane sub active">
<FundTransferTab activeTab={ activeTab }></FundTransferTab>
<FundTransferResultInquiryWrap></FundTransferResultInquiryWrap>
<div className="tab-pane pt-46 active">
<FundAccountTab activeTab={ activeTab }></FundAccountTab>
<FundAccountResultListWrap></FundAccountResultListWrap>
</div>
</div>
</main>

View File

@@ -1,9 +1,9 @@
import { useState } from 'react';
import { PATHS } from '@/shared/constants/paths';
import { useNavigate } from '@/shared/lib/hooks/use-navigate';
import { FundTransferTab } from '@/entities/additional-service/ui/fund-transfer/fund-transfer-tab';
import { FundTransferRequestListWrap } from '@/entities/additional-service/ui/fund-transfer/fund-transfer-request-list-wrap';
import { FundTransferTabKeys } from '@/entities/additional-service/model/types';
import { FundAccountTab } from '@/entities/additional-service/ui/fund-account/tab';
import { FundAccountTransferListWrap } from '@/entities/additional-service/ui/fund-account/transfer-list-wrap';
import { FundAccountTabKeys } from '@/entities/additional-service/model/fund-account/types';
import { HeaderType } from '@/entities/common/model/types';
import {
useSetHeaderTitle,
@@ -12,10 +12,10 @@ import {
useSetOnBack
} from '@/widgets/sub-layout/use-sub-layout';
export const FundTransferRequestListPage = () => {
export const FundAccountTransferListPage = () => {
const { navigate } = useNavigate();
const [activeTab, setActiveTab] = useState<FundTransferTabKeys>(FundTransferTabKeys.RequestList);
const [activeTab, setActiveTab] = useState<FundAccountTabKeys>(FundAccountTabKeys.TransferList);
useSetHeaderTitle('자금이체');
useSetHeaderType(HeaderType.LeftArrow);
@@ -29,8 +29,8 @@ export const FundTransferRequestListPage = () => {
<main>
<div className="tab-content">
<div className="tab-pane pt-46 active">
<FundTransferTab activeTab={ activeTab }></FundTransferTab>
<FundTransferRequestListWrap></FundTransferRequestListWrap>
<FundAccountTab activeTab={ activeTab }></FundAccountTab>
<FundAccountTransferListWrap></FundAccountTransferListWrap>
</div>
</div>
</main>

View File

@@ -0,0 +1,6 @@
export const FundAccountTransferRequestPage = () => {
return (
<></>
);
};

View File

@@ -1,6 +0,0 @@
export const FundTransferRequestRegisterPage = () => {
return (
<></>
);
};

View File

@@ -53,7 +53,7 @@ export const IntroPage = () => {
},
{
className: 'list-wrap02', serviceName: '자금이체', serviceDesc: '예치금으로 즉시 송금, 파일 등록만으로 다중 송금 가능',
icon: IMAGE_ROOT + '/icon_ing08.svg', path: PATHS.additionalService.fundTransfer.requestList
icon: IMAGE_ROOT + '/icon_ing08.svg', path: PATHS.additionalService.fundAccount.transferList
},
{
className: 'list-wrap02', serviceName: '계좌점유인증', serviceDesc: '1원 송금으로 실제 계좌 점유 확인 여부',

View File

@@ -141,7 +141,8 @@ export const API_URL_ADDITIONAL_SERVICE = {
// POST: 알림톡 결제 통보 상세 조회
return `${API_BASE_URL}/api/v1/${API_URL_KEY}/extension/alimtalk/detail`;
},
// Payou tManagement 부가서비스 > 지급대행 API
// Payout Management 부가서비스 > 지급대행 API
extensionPayoutRequest: () => {
// POST: 지급대행 신청
return `${API_BASE_URL}/api/v1/${API_URL_KEY}/extension/payout/request`;
@@ -162,4 +163,42 @@ export const API_URL_ADDITIONAL_SERVICE = {
// POST: 지급대행 상세 조회 > 입출금 확인증 다운로드
return `${API_BASE_URL}/api/v1/${API_URL_KEY}/extension/payout/detail/download/certificate`;
},
// Fund Account Management 부가서비스 > 자금이체 API
extensionFundAccountTransferRequest: () => {
// POST: 자금이체 > 이체신청
return `${API_BASE_URL}/api/v1/${API_URL_KEY}/extension/fund-account/transfer/request`;
},
extensionFundAccountTransferList: () => {
// POST: 자금이체 이체내역 목록 조회
return `${API_BASE_URL}/api/v1/${API_URL_KEY}/extension/fund-account/transfer/list`;
},
extensionFundAccountTransferExcel: () => {
// POST: 자금이체 이체내역 엑셀 다운
return `${API_BASE_URL}/api/v1/${API_URL_KEY}/extension/fund-account/transfer/excel`;
},
extensionFundAccountTransferDetail: () => {
// POST: 자금이체 이체내역 상세 조회
return `${API_BASE_URL}/api/v1/${API_URL_KEY}/extension/fund-account/transfer/detail`;
},
extensionFundAccountResultSummary: () => {
// POST: 자금이체 처리결과 요약 조회
return `${API_BASE_URL}/api/v1/${API_URL_KEY}/extension/fund-account/result/summary`;
},
extensionFundAccountResultList: () => {
// POST: 자금이체 처리결과 목록 조회
return `${API_BASE_URL}/api/v1/${API_URL_KEY}/extension/fund-account/result/list`;
},
extensionFundAccountResultExcel: () => {
// POST: 자금이체 이체내역 목록 조회
return `${API_BASE_URL}/api/v1/${API_URL_KEY}/extension/fund-account/result/excel`;
},
extensionFundAccountResultDetail: () => {
// POST: 자금이체 처리결과 상세 조회
return `${API_BASE_URL}/api/v1/${API_URL_KEY}/extension/fund-account/result/detail`;
},
extensionFundAccountBalance: () => {
// POST: 자금이체 이체내역 목록 조회
return `${API_BASE_URL}/api/v1/${API_URL_KEY}/extension/fund-account/balance`;
},
};

View File

@@ -241,19 +241,19 @@ export const PATHS: RouteNamesType = {
ROUTE_NAMES.additionalService.kakaoPaymentNotification.setting,
),
},
fundTransfer: {
base: generatePath(`${ROUTE_NAMES.additionalService.base}${ROUTE_NAMES.additionalService.fundTransfer.base}`),
requestList: generatePath(
`${ROUTE_NAMES.additionalService.base}${ROUTE_NAMES.additionalService.fundTransfer.base}`,
ROUTE_NAMES.additionalService.fundTransfer.requestList,
fundAccount: {
base: generatePath(`${ROUTE_NAMES.additionalService.base}${ROUTE_NAMES.additionalService.fundAccount.base}`),
transferList: generatePath(
`${ROUTE_NAMES.additionalService.base}${ROUTE_NAMES.additionalService.fundAccount.base}`,
ROUTE_NAMES.additionalService.fundAccount.transferList,
),
requestRegister: generatePath(
`${ROUTE_NAMES.additionalService.base}${ROUTE_NAMES.additionalService.fundTransfer.base}`,
ROUTE_NAMES.additionalService.fundTransfer.requestRegister,
transferRequest: generatePath(
`${ROUTE_NAMES.additionalService.base}${ROUTE_NAMES.additionalService.fundAccount.base}`,
ROUTE_NAMES.additionalService.fundAccount.transferRequest,
),
resultInquiry: generatePath(
`${ROUTE_NAMES.additionalService.base}${ROUTE_NAMES.additionalService.fundTransfer.base}`,
ROUTE_NAMES.additionalService.fundTransfer.resultInquiry,
resultList: generatePath(
`${ROUTE_NAMES.additionalService.base}${ROUTE_NAMES.additionalService.fundAccount.base}`,
ROUTE_NAMES.additionalService.fundAccount.resultList,
),
},
settlementAgency: {

View File

@@ -109,11 +109,11 @@ export const ROUTE_NAMES = {
list: 'list',
setting: 'setting',
},
fundTransfer: {
base: '/fund-transfer/*',
requestList: 'request-list',
requestRegister: 'request-register',
resultInquiry: 'result-inquiry',
fundAccount: {
base: '/fund-account/*',
transferList: 'transfer-list',
transferRequest: 'transfer-request',
resultList: 'result-list',
},
settlementAgency: {
base: '/settlement-agency/*',

View File

@@ -89,7 +89,7 @@ export const Menu = ({
{title: '계좌점유인증', path: PATHS.additionalService.accountHolderAuth.list},
{title: '링크결제', path: PATHS.additionalService.linkPayment.shippingHistory},
{title: '알림톡 결제통보', path: PATHS.additionalService.kakaoPaymentNotification.list},
{title: '자금이체', path: PATHS.additionalService.fundTransfer.requestList},
{title: '자금이체', path: PATHS.additionalService.fundAccount.transferList},
{title: '정산대행', path: PATHS.additionalService.settlementAgency.manage},
{title: '지급대행', path: PATHS.additionalService.payout.list},
]