계좌점유인증

This commit is contained in:
focp212@naver.com
2025-11-04 10:28:51 +09:00
parent 4f87f40a0e
commit d290e91a45
8 changed files with 177 additions and 45 deletions

View File

@@ -1,5 +1,5 @@
import { DefaulResponsePagination, DefaultRequestPagination } from "@/entities/common/model/types";
import { AdditionalServiceCategory, ExtensionRequestParams, FilterProps, ListItemProps } from "../types";
import { AdditionalServiceCategory, DetailData, ExtensionRequestParams, FilterProps, ListItemProps } from "../types";
// 계좌 점유 조회 관련 타입들
export enum AccountHolderAuthStatus {
@@ -27,6 +27,7 @@ export interface AccountHolderAuthListProps {
additionalServiceCategory: AdditionalServiceCategory;
listItems: Array<ExtensionAccountHolderAuthContentItem>;
mid: string;
setDetailData: (detailData: DetailData) => void;
}
export interface AccountHolderAuthFilterProps extends FilterProps {
mid: string;

View File

@@ -1,12 +1,11 @@
import { ListDateGroup } from '../list-date-group';
import { AdditionalServiceCategory } from '../../model/types';
import { AccountHolderAuthListProps, ExtensionAccountHolderAuthContentItem } from '../../model/account-holder-auth/types';
import { JSX } from 'react';
import { AccountHolderAuthListProps } from '../../model/account-holder-auth/types';
export const AccountHolderAuthList = ({
additionalServiceCategory,
listItems,
mid
mid,
setDetailData
}: AccountHolderAuthListProps) => {
const getListDateGroup = () => {
@@ -27,11 +26,12 @@ export const AccountHolderAuthList = ({
if (list.length > 0) {
rs.push(
<ListDateGroup
additionalServiceCategory={additionalServiceCategory}
key={date + '-' + i}
mid={mid}
date={date}
items={list}
additionalServiceCategory={ additionalServiceCategory }
key={ date + '-' + i }
mid={ mid }
date={ date }
items={ list }
setDetailData={ setDetailData }
></ListDateGroup>
);
}
@@ -45,11 +45,12 @@ export const AccountHolderAuthList = ({
if (list.length > 0) {
rs.push(
<ListDateGroup
additionalServiceCategory={additionalServiceCategory}
mid={mid}
key={date + '-last'}
date={date}
items={list}
additionalServiceCategory={ additionalServiceCategory }
mid={ mid }
key={ date + '-last' }
date={ date }
items={ list }
setDetailData={ setDetailData }
></ListDateGroup>
)
}

View File

@@ -0,0 +1,126 @@
import { useEffect, useState } from 'react';
import { motion } from 'framer-motion';
import { useNavigate } from '@/shared/lib/hooks/use-navigate';
import { useLocation } from 'react-router';
import { useExtensionAccountHolderAuthDetailMutation } from '@/entities/additional-service/api/account-holder-auth/use-extension-account-holder-auth-deatil-mutation';
import { ExtensionAccountHolderAuthDetailParams, ExtensionAccountHolderAuthDetailResponse } from '@/entities/additional-service/model/account-holder-auth/types';
import moment from 'moment';
import { getAuthStatusText } from '@/entities/additional-service/model/account-holder-auth/constant';
import { getAuthResultStatusText } from '@/entities/additional-service/model/face-auth/constant';
import { useTranslation } from 'react-i18next';
import { DetailMotionDuration, DetailMotionStyle, DetailMotionVariants } from '@/entities/common/model/constant';
import { FullMenuClose } from '@/entities/common/ui/full-menu-close';
export interface AccountHolderAuthDetailProps {
detailOn: boolean;
setDetailOn: (detailOn: boolean) => void;
mid: string;
tid: string;
};
export const AccountHolderAuthDetail = ({
detailOn,
setDetailOn,
mid,
tid
}: AccountHolderAuthDetailProps) => {
const { t } = useTranslation();
const [detail, setDetail] = useState<ExtensionAccountHolderAuthDetailResponse>();
const { mutateAsync: accountHolderAuthDetail } = useExtensionAccountHolderAuthDetailMutation();
const callDetail = () => {
let accountHolderAuthDetailParams: ExtensionAccountHolderAuthDetailParams = {
mid: mid,
tid: tid
}
accountHolderAuthDetail(accountHolderAuthDetailParams).then((rs: ExtensionAccountHolderAuthDetailResponse) => {
setDetail(rs);
});
};
const onClickToClose = () => {
setDetailOn(false);
};
const getDate = (date?: string) => {
return (date) ? moment(date, 'YYYYMMDDHHmmss').format('YYYY.MM.DD HH:mm:ss') : '';
};
useEffect(() => {
if(!!mid && !!tid){
callDetail();
}
}, [mid, tid]);
return (
<>
<motion.div
className="full-menu-modal"
initial="hidden"
animate={ (detailOn)? 'visible': 'hidden' }
variants={ DetailMotionVariants }
transition={ DetailMotionDuration }
style={ DetailMotionStyle }
>
<div className="full-menu-container pdw-16">
<div className="full-menu-header">
<div className="full-menu-title center">{ t('additionalService.accountHolderAuth.detailTitle') }</div>
<div className="full-menu-actions">
<FullMenuClose
addClass="full-menu-close"
onClickToCallback={ onClickToClose }
></FullMenuClose>
</div>
</div>
<div className="tab-pane sub active">
<div className="pay-top">
<div className="num-amount">
<span className="amount">{detail?.accountName}</span>
</div>
<span className="num-store">{detail?.accountNo}</span>
<div className="num-day">{getDate(detail?.requestDate)}</div>
</div>
<div className="detail-divider"></div>
<div className="pay-detail">
<div className="detail-title">{t('transaction.sections.detailInfo')}</div>
<ul className="kv-list">
<li className="kv-row">
<span className="k">{t('transaction.fields.companyName')}</span>
<span className="v">{detail?.companyName}</span>
</li>
<li className="kv-row">
<span className="k">{t('transaction.fields.mid')}</span>
<span className="v">{detail?.mid}</span>
</li>
<li className="kv-row">
<span className="k">{t('additionalService.accountHolderAuth.requestDate')}</span>
<span className="v">{getDate(detail?.requestDate)}</span>
</li>
<li className="kv-row">
<span className="k">{t('transaction.fields.bank')}</span>
<span className="v">{detail?.bankName}</span>
</li>
<li className="kv-row">
<span className="k">{t('transaction.fields.accountNo')}</span>
<span className="v">{detail?.accountNo}</span>
</li>
<li className="kv-row">
<span className="k">{t('transaction.fields.accountHolder')}</span>
<span className="v">{detail?.accountName}</span>
</li>
<li className="kv-row">
<span className="k">{t('common.result')}</span>
<span className="v">{getAuthStatusText(t)(detail?.authStatus)}</span>
</li>
<li className="kv-row">
<span className="k">{t('transaction.fields.failureReason')}</span>
<span className="v">{detail?.failReason ? getAuthResultStatusText(t)(detail?.failReason) : '-' }</span>
</li>
</ul>
</div>
</div>
</div>
</motion.div>
</>
);
}

View File

@@ -161,13 +161,13 @@ export const ListItem = ({
}
//이하 상세페이지 존재
else if (additionalServiceCategory === AdditionalServiceCategory.AccountHolderAuth) {
navigate(PATHS.additionalService.accountHolderAuth.detail, {
state: {
additionalServiceCategory: additionalServiceCategory,
if(setDetailData && !!mid && !!tid){
setDetailData({
mid: mid,
tid: tid
}
})
tid: tid,
detailOn: true
});
}
}
else if (additionalServiceCategory === AdditionalServiceCategory.AccountHolderSearch) {
if(setDetailData && !!mid && !!tid){
@@ -177,7 +177,6 @@ export const ListItem = ({
detailOn: true
});
}
}
else if (additionalServiceCategory === AdditionalServiceCategory.LinkPaymentHistory) {
navigate(PATHS.additionalService.linkPayment.detail, {

View File

@@ -20,11 +20,12 @@ import { useTranslation } from 'react-i18next';
import { useExtensionAccountHolderAuthDownloadExcelMutation } from '@/entities/additional-service/api/account-holder-auth/use-extension-account-holder-auth-download-excel-mutation';
import { AccountHolderAuthFilter } from '@/entities/additional-service/ui/account-holder-auth/filter/account-holder-auth-filter';
import { useStore } from '@/shared/model/store';
import { AccountHolderAuthListItem, AccountHolderAuthStatus, ExtensionAccountHolderAuthContentItem, ExtensionAccountHolderAuthDownloadExcelParams, ExtensionAccountHolderAuthDownloadExcelResponse } from '@/entities/additional-service/model/account-holder-auth/types';
import { AdditionalServiceCategory } from '@/entities/additional-service/model/types';
import { AccountHolderAuthStatus, ExtensionAccountHolderAuthContentItem, ExtensionAccountHolderAuthDownloadExcelParams, ExtensionAccountHolderAuthDownloadExcelResponse } from '@/entities/additional-service/model/account-holder-auth/types';
import { AdditionalServiceCategory, DetailData } from '@/entities/additional-service/model/types';
import { EmailBottomSheet } from '@/entities/common/ui/email-bottom-sheet';
import { useExtensionAccessCheck } from '@/shared/lib/hooks/use-extension-access-check';
import useIntersectionObserver from '@/widgets/intersection-observer';
import { AccountHolderAuthDetail } from '@/entities/additional-service/ui/account-holder-auth/detail/account-holder-auth-detail';
export const AccountHolderAuthPage = () => {
const { navigate } = useNavigate();
@@ -46,7 +47,11 @@ export const AccountHolderAuthPage = () => {
const [fromDate, setFromDate] = useState(moment().format('YYYYMMDD'));
const [toDate, setToDate] = useState(moment().format('YYYYMMDD'));
const [authStatus, setAuthStatus] = useState<AccountHolderAuthStatus>(AccountHolderAuthStatus.ALL)
const [detailOn, setDetailOn] = useState<boolean>(false);
const [detailMid, setDetailMid] = useState<string>('');
const [detailTid, setDetailTid] = useState<string>('');
const [emailBottomSheetOn, setEmailBottomSheetOn] = useState<boolean>(false);
useSetHeaderTitle(t('additionalService.accountHolderAuth.title'));
useSetHeaderType(HeaderType.LeftArrow);
useSetFooterMode(false);
@@ -132,6 +137,15 @@ export const AccountHolderAuthPage = () => {
const onClickToAuthStatus = (val: AccountHolderAuthStatus) => {
setAuthStatus(val);
};
const setDetailData = (detailData: DetailData) => {
setDetailOn(detailData.detailOn);
if(detailData.mid){
setDetailMid(detailData.mid);
}
if(detailData.tid){
setDetailTid(detailData.tid);
}
}
const onClickToOpenEmailBottomSheet = () => {
@@ -230,9 +244,10 @@ export const AccountHolderAuthPage = () => {
</div>
</div>
<AccountHolderAuthList
additionalServiceCategory={AdditionalServiceCategory.AccountHolderAuth}
listItems={listItems}
mid={mid}
additionalServiceCategory={ AdditionalServiceCategory.AccountHolderAuth }
listItems={ listItems }
mid={ mid }
setDetailData={ setDetailData }
></AccountHolderAuthList>
<div ref={ setTarget }></div>
</div>
@@ -249,16 +264,20 @@ export const AccountHolderAuthPage = () => {
setStartDate={setFromDate}
setEndDate={setToDate}
setAuthStatus={setAuthStatus}
>
</AccountHolderAuthFilter>
></AccountHolderAuthFilter>
<AccountHolderAuthDetail
detailOn={ detailOn }
setDetailOn={ setDetailOn }
mid={ detailMid }
tid={ detailTid }
></AccountHolderAuthDetail>
<EmailBottomSheet
bottomSheetOn={emailBottomSheetOn}
setBottomSheetOn={setEmailBottomSheetOn}
imageSave={false}
sendEmail={true}
sendRequest={onSendRequest}
/>
></EmailBottomSheet>
</>
);
};

View File

@@ -36,8 +36,6 @@ import { LinkPaymentWaitDetailPage } from './link-payment/link-payment-wait-deta
import { KeyInPaymentRequestPage } from './key-in-payment/requeset-page';
import { KeyInPaymentRequestSuccessPage } from './key-in-payment/request-success-page';
import { AccountHolderSearchRequestPage } from './account-holder-search/request-page';
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';
@@ -59,12 +57,10 @@ export const AdditionalServicePages = () => {
<Route path={ROUTE_NAMES.additionalService.smsPaymentNotification} element={<SmsPaymentPage />} />
<Route path={ROUTE_NAMES.additionalService.accountHolderSearch.base}>
<Route path={ROUTE_NAMES.additionalService.accountHolderSearch.list} element={<AccountHolderSearchPage />} />
<Route path={ROUTE_NAMES.additionalService.accountHolderSearch.detail} element={<AccountHolderSearchDetailPage />} />
<Route path={ROUTE_NAMES.additionalService.accountHolderSearch.request} element={<AccountHolderSearchRequestPage />} />
</Route>
<Route path={ROUTE_NAMES.additionalService.accountHolderAuth.base}>
<Route path={ROUTE_NAMES.additionalService.accountHolderAuth.list} element={<AccountHolderAuthPage/>} />
<Route path={ROUTE_NAMES.additionalService.accountHolderAuth.detail} element={<AccountHolderAuthDetailPage/>} />
</Route>
<Route path={ROUTE_NAMES.additionalService.linkPayment.base}>
<Route path={ROUTE_NAMES.additionalService.linkPayment.shippingHistory} element={<LinkPaymentHistoryPage />} />

View File

@@ -160,10 +160,6 @@ export const PATHS: RouteNamesType = {
`${ROUTE_NAMES.additionalService.base}${ROUTE_NAMES.additionalService.accountHolderSearch.base}`,
ROUTE_NAMES.additionalService.accountHolderSearch.list
),
detail: generatePath(
`${ROUTE_NAMES.additionalService.base}${ROUTE_NAMES.additionalService.accountHolderSearch.base}`,
ROUTE_NAMES.additionalService.accountHolderSearch.detail
),
request: generatePath(
`${ROUTE_NAMES.additionalService.base}${ROUTE_NAMES.additionalService.accountHolderSearch.base}`,
ROUTE_NAMES.additionalService.accountHolderSearch.request,
@@ -175,10 +171,6 @@ export const PATHS: RouteNamesType = {
`${ROUTE_NAMES.additionalService.base}${ROUTE_NAMES.additionalService.accountHolderAuth.base}`,
ROUTE_NAMES.additionalService.accountHolderAuth.list
),
detail: generatePath(
`${ROUTE_NAMES.additionalService.base}${ROUTE_NAMES.additionalService.accountHolderAuth.base}`,
ROUTE_NAMES.additionalService.accountHolderAuth.detail
),
},
linkPayment: {
base: generatePath(`${ROUTE_NAMES.additionalService.base}${ROUTE_NAMES.additionalService.linkPayment.base}`),

View File

@@ -79,13 +79,11 @@ export const ROUTE_NAMES = {
accountHolderSearch: {
base: '/account-holder-search/*',
list: 'list',
detail: 'detail',
request: 'request'
},
accountHolderAuth: {
base: '/account-holder-auth/*',
list: 'list',
detail: 'detail'
},
linkPayment: {
base: '/link-payment/*',