거래내역 상세 페이지 관련

This commit is contained in:
focp212@naver.com
2025-10-23 17:56:05 +09:00
parent 7ce247a743
commit 40da87c5ad
9 changed files with 306 additions and 76 deletions

View File

@@ -4,7 +4,6 @@ import {
SortTypeKeys,
SuccessResult
} from '@/entities/common/model/types';
import { MerchantInfo } from '@/entities/payment/model/types';
export enum CancelTabKeys {
All = 'All',
@@ -26,6 +25,7 @@ export enum InfoSectionKeys {
Issue = 'Issue',
Detail = 'Detail',
Escrow = 'Escrow',
Merchant = 'Merchant'
};
export enum ProcessStep {
One = 'One',
@@ -397,12 +397,14 @@ export interface TransactionInfo {
transactionAmount?: number;
};
export interface SettlementInfo {
approvalSettleDate?: string;
approvalSettleAmount?: number;
cancelSettleDate?: string;
cancelSettleAmount?: number;
approvalSettlementDate?: string;
approvalSettlementAmount?: number;
cancelSettlementDate?: string;
cancelSettlementAmount?: number;
/*
scheduledSettlementDate?: string;
completedSettlementDate?: string;
*/
};
export interface PartCancelInfo {
originalTid?: string;
@@ -444,16 +446,16 @@ export interface DetailInfo {
canDownloadReceipt?: boolean;
};
export interface EscrowInfo {
deliveryStatus: string;
deliveryRegistrationDate: string;
deliveryCompleteDate: string;
purchaseConfirmDate: string;
purchaseRejectReason: string;
rejectReason: string;
escrowCertNumber: string;
deliveryCompany: string;
trackingNumber: number;
deliveryAddress: string;
deliveryStatus?: string;
deliveryRegistrationDate?: string;
deliveryCompleteDate?: string;
purchaseConfirmDate?: string;
purchaseRejectReason?: string;
rejectReason?: string;
escrowCertNumber?: string;
deliveryCompany?: string;
trackingNumber?: number;
deliveryAddress?: string;
};
export interface BillingInfo {
@@ -467,6 +469,12 @@ export interface BillingInfo {
installmentMonth: string;
productName: string;
buyerName: string;
};
export interface MerchantInfo {
shopName?: string;
gid?: string;
aid?: string;
}
export interface DetailResponse {
@@ -480,6 +488,7 @@ export interface DetailResponse {
detailInfo?: DetailInfo;
escrowInfo?: EscrowInfo;
billingInfo?: BillingInfo;
merchantInfo?: MerchantInfo;
};
export interface BillingDetailResponse extends BillingInfo {

View File

@@ -2,7 +2,7 @@ import moment from 'moment';
import { NumericFormat } from 'react-number-format';
import { SectionTitleArrow } from '@/entities/common/ui/section-title-arrow';
import { useDownloadConfirmationMutation } from '../../api/use-download-confirmation-mutation';
import { InfoSectionKeys, InfoSectionProps } from '../../model/types';
import { InfoSectionKeys, InfoSectionProps, TransactionCategory } from '../../model/types';
import { SlideDown } from 'react-slidedown';
import 'react-slidedown/lib/slidedown.css';
@@ -218,7 +218,15 @@ export const AmountInfoSection = ({
{ !!isOpen &&
<div className="amount-expand">
<ul className="amount-list">
{ subLi() }
{ (transactionCategory === TransactionCategory.AllTransaction) &&
subLi()
}
{ (transactionCategory === TransactionCategory.CashReceipt) &&
<></>
}
{ (transactionCategory === TransactionCategory.Escrow) &&
<></>
}
</ul>
</div>
}
@@ -226,13 +234,18 @@ export const AmountInfoSection = ({
<div className="txn-mid">
<span className="value">{ amountInfo?.mid }</span>
</div>
<div className="txn-doc">
<button
className="doc-btn"
type="button"
onClick={ () => onClickToDownloadConfirmation() }
> </button>
</div>
{
((transactionCategory === TransactionCategory.CashReceipt) ||
(transactionCategory === TransactionCategory.Escrow) ||
(transactionCategory === TransactionCategory.Billing)) &&
<div className="txn-doc">
<button
className="doc-btn"
type="button"
onClick={ () => onClickToDownloadConfirmation() }
> </button>
</div>
}
</div>
</>
);

View File

@@ -5,7 +5,6 @@ import { SlideDown } from 'react-slidedown';
import 'react-slidedown/lib/slidedown.css';
export const EscrowInfoSection = ({
transactionCategory,
escrowInfo,
isOpen,
onClickToOpenInfo
@@ -30,43 +29,43 @@ export const EscrowInfoSection = ({
{ !!isOpen &&
<ul className="kv-list">
<li className="kv-row">
<span className="k"></span>
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ escrowInfo?.deliveryStatus }</span>
</li>
<li className="kv-row">
<span className="k"></span>
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ moment(escrowInfo?.deliveryRegistrationDate).format('YYYY.MM.DD') }</span>
</li>
<li className="kv-row">
<span className="k"></span>
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ moment(escrowInfo?.deliveryCompleteDate).format('YYYY.MM.DD') }</span>
</li>
<li className="kv-row">
<span className="k"></span>
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ moment(escrowInfo?.purchaseConfirmDate).format('YYYY.MM.DD') }</span>
</li>
<li className="kv-row">
<span className="k"></span>
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ escrowInfo?.purchaseRejectReason }</span>
</li>
<li className="kv-row">
<span className="k"></span>
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ escrowInfo?.rejectReason }</span>
</li>
<li className="kv-row">
<span className="k"></span>
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ escrowInfo?.escrowCertNumber }</span>
</li>
<li className="kv-row">
<span className="k"></span>
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ escrowInfo?.deliveryCompany }</span>
</li>
<li className="kv-row">
<span className="k"></span>
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ escrowInfo?.trackingNumber }</span>
</li>
<li className="kv-row">
<span className="k"></span>
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ escrowInfo?.deliveryAddress }</span>
</li>
</ul>

View File

@@ -152,41 +152,46 @@ export const ImportantInfoSection = ({
subLi()
}
{
/*
(transactionCategory === TransactionCategory.Escrow) &&
<>
<li className="kv-row">
<span className="k">주문번호</span>
<span className="v">{ importantInfo?.orderNumber }</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k">TID</span>
<span className="v">{ importantInfo?.tid }</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k">거래상태</span>
<span className="v">{ importantInfo?.transactionStatus }</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k">결제수단</span>
<span className="v">{ importantInfo?.paymentMethod }</span>
<span className="k">거래수단</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k">승인일</span>
<span className="v">{ moment(importantInfo?.approvalDate).format('YYYY.MM.DD') }</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k">거래일</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k">요청일</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k">취소일</span>
<span className="v">{ moment(importantInfo?.cancelDate).format('YYYY.MM.DD') }</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k">상품명</span>
<span className="v">{ importantInfo?.goodsName }</span>
<span className="v">{ }</span>
</li>
</>
*/
}
</ul>
</div>
</>

View File

@@ -0,0 +1,48 @@
import { SectionTitleArrow } from '@/entities/common/ui/section-title-arrow';
import { InfoSectionKeys, InfoSectionProps } from '../../model/types';
import { SlideDown } from 'react-slidedown';
import 'react-slidedown/lib/slidedown.css';
export const MerchantInfoSection = ({
merchantInfo,
isOpen,
onClickToOpenInfo
}: InfoSectionProps) => {
const onClickToSetOpenInfo = () => {
if(!!onClickToOpenInfo){
onClickToOpenInfo(InfoSectionKeys.Merchant);
}
};
return (
<>
<div className="txn-section">
<div
className="section-title with-toggle"
onClick={ () => onClickToSetOpenInfo() }
>
<SectionTitleArrow isOpen={ isOpen }></SectionTitleArrow>
</div>
<SlideDown className={'my-dropdown-slidedown'}>
{ !!isOpen &&
<ul className="kv-list">
<li className="kv-row">
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ merchantInfo?.shopName }</span>
</li>
<li className="kv-row">
<span className="k">·&nbsp;&nbsp;GID</span>
<span className="v">{ merchantInfo?.gid }</span>
</li>
<li className="kv-row">
<span className="k">·&nbsp;&nbsp;AID</span>
<span className="v">{ merchantInfo?.aid }</span>
</li>
</ul>
}
</SlideDown>
</div>
</>
);
};

View File

@@ -153,19 +153,100 @@ export const PaymentInfoSection = ({
{ (transactionCategory === TransactionCategory.Escrow) &&
<>
<li className="kv-row">
<span className="k"> </span>
<span className="v">
<NumericFormat
value={ paymentInfo?.paymentAmount }
thousandSeparator
displayType="text"
suffix='원'
></NumericFormat>
</span>
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k"> </span>
<span className="v">{ paymentInfo?.approvalNumber }</span>
<span className="k">·&nbsp;&nbsp;()</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k">·&nbsp;&nbsp;()</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k">·&nbsp;&nbsp;VAN</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k">·&nbsp;&nbsp;VAN</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k">·&nbsp;&nbsp;()</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ }</span>
</li>
</>
}

View File

@@ -1,7 +1,7 @@
import moment from 'moment';
import { NumericFormat } from 'react-number-format';
import { SectionTitleArrow } from '@/entities/common/ui/section-title-arrow';
import { InfoSectionKeys, InfoSectionProps } from '../../model/types';
import { InfoSectionKeys, InfoSectionProps, TransactionCategory } from '../../model/types';
import { SlideDown } from 'react-slidedown';
import 'react-slidedown/lib/slidedown.css';
@@ -106,13 +106,53 @@ export const SettlementInfoSection = ({
>
<SectionTitleArrow isOpen={ isOpen }></SectionTitleArrow>
</div>
<SlideDown className={'my-dropdown-slidedown'}>
{ !!isOpen &&
<ul className="kv-list">
{ subLi() }
</ul>
{ (transactionCategory === TransactionCategory.AllTransaction) &&
<SlideDown className={'my-dropdown-slidedown'}>
{ !!isOpen &&
<ul className="kv-list">
{ subLi() }
</ul>
}
</SlideDown>
}
{ (transactionCategory === TransactionCategory.Escrow) &&
<SlideDown className={'my-dropdown-slidedown'}>
{ !!isOpen &&
<ul className="kv-list">
<li className="kv-row">
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ moment(settlementInfo?.approvalSettlementDate).format('YYYY.MM.DD') }</span>
</li>
<li className="kv-row">
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">
<NumericFormat
value={ settlementInfo?.approvalSettlementAmount }
thousandSeparator
displayType="text"
suffix='원'
></NumericFormat>
</span>
</li>
<li className="kv-row">
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ moment(settlementInfo?.cancelSettlementDate).format('YYYY.MM.DD') }</span>
</li>
<li className="kv-row">
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">
<NumericFormat
value={ settlementInfo?.cancelSettlementAmount }
thousandSeparator
displayType="text"
suffix='원'
></NumericFormat>
</span>
</li>
</ul>
}
</SlideDown>
}
</SlideDown>
</div>
</>
)

View File

@@ -121,12 +121,33 @@ export const TransactionInfoSection = ({
{ (transactionCategory === TransactionCategory.Escrow) &&
<>
<li className="kv-row">
<span className="k"></span>
<span className="v">NICE PAY</span>
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k"></span>
<span className="v">123-45-67890</span>
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ }</span>
</li>
{ /* 계좌이체 혹은 가상계좌 */ }
<li className="kv-row">
<span className="k">·&nbsp;&nbsp;</span>
<span className="v">{ }</span>
</li>
</>
}

View File

@@ -18,7 +18,8 @@ import {
PaymentInfo,
TransactionInfo,
SettlementInfo,
InfoSectionKeys
InfoSectionKeys,
MerchantInfo
} from '@/entities/transaction/model/types';
import {
useSetOnBack,
@@ -28,6 +29,7 @@ import {
} from '@/widgets/sub-layout/use-sub-layout';
import { EscrowMailResendBottomSheet } from '@/entities/transaction/ui/escrow-mail-resend-bottom-sheet';
import { useEscrowMailResendMutation } from '@/entities/transaction/api/use-escrow-mail-resend-mutation';
import { MerchantInfoSection } from '@/entities/transaction/ui/section/merchant-info-section';
export const EscrowDetailPage = () => {
const { navigate } = useNavigate();
@@ -39,12 +41,16 @@ export const EscrowDetailPage = () => {
const [paymentInfo, setPaymentInfo] = useState<PaymentInfo>();
const [transactionInfo, setTransactionInfo] = useState<TransactionInfo>();
const [settlementInfo, setSettlementInfo] = useState<SettlementInfo>();
const [merchantInfo, setMerchantInfo] = useState<MerchantInfo>();
const [showAmountInfo, setShowAmountInfo] = useState<boolean>(false);
const [showImportantInfo, setShowImportantInfo] = useState<boolean>(false);
const [showEscroInfo, setShowEscroInfo] = useState<boolean>(false);
const [showPaymentInfo, setShowPaymentInfo] = useState<boolean>(false);
const [showTransactionInfo, setShowTransactionInfo] = useState<boolean>(false);
const [showSettlementInfo, setShowSettlementInfo] = useState<boolean>(false);
const [showMerchantInfo, setShowMerchantInfo] = useState<boolean>(false);
const [bottomSheetOn, setBottomSheetOn] = useState<boolean>(false);
const [orderNumber, setOrderNumber] = useState<string>();
@@ -65,11 +71,12 @@ export const EscrowDetailPage = () => {
issueNumber: location?.state.issueNumber,
};
escrowDetail(escroDetailParams).then((rs: DetailResponse) => {
setImportantInfo(rs.importantInfo);
setEscrowInfo(rs.escrowInfo);
setPaymentInfo(rs.paymentInfo);
setTransactionInfo(rs.transactionInfo);
setSettlementInfo(rs.settlementInfo);
setImportantInfo(rs.importantInfo || {});
setEscrowInfo(rs.escrowInfo || {});
setPaymentInfo(rs.paymentInfo || {});
setTransactionInfo(rs.transactionInfo || {});
setSettlementInfo(rs.settlementInfo || {});
setMerchantInfo(rs.merchantInfo || {});
setOrderNumber(rs.importantInfo?.orderNumber);
setTid(rs.importantInfo?.tid);
@@ -112,6 +119,9 @@ export const EscrowDetailPage = () => {
else if(infoSectionKey === InfoSectionKeys.Settlement){
setShowSettlementInfo(!showSettlementInfo);
}
else if(infoSectionKey === InfoSectionKeys.Merchant){
setShowMerchantInfo(!showMerchantInfo);
}
};
return (
@@ -127,8 +137,7 @@ export const EscrowDetailPage = () => {
></ImportantInfoSection>
<div className="txn-divider minus"></div>
<EscrowInfoSection
transactionCategory={ TransactionCategory.Escrow }
importantInfo={ importantInfo }
escrowInfo={ escrowInfo }
isOpen={ showEscroInfo }
onClickToOpenInfo={ (infoSectionKey) => onClickToOpenInfo(infoSectionKey) }
></EscrowInfoSection>
@@ -153,6 +162,11 @@ export const EscrowDetailPage = () => {
isOpen={ showSettlementInfo }
onClickToOpenInfo={ (infoSectionKey) => onClickToOpenInfo(infoSectionKey) }
></SettlementInfoSection>
<MerchantInfoSection
merchantInfo={ merchantInfo }
isOpen={ showMerchantInfo }
onClickToOpenInfo={ (infoSectionKey) => onClickToOpenInfo(infoSectionKey) }
></MerchantInfoSection>
<div className="txn-divider"></div>
</div>
</div>