- 부가서비스: KeyIn결제 목업 API 연결

This commit is contained in:
HyeonJongKim
2025-09-17 15:22:20 +09:00
parent 4f97767999
commit 67ded00a23
15 changed files with 229 additions and 334 deletions

View File

@@ -66,8 +66,8 @@ export const KeyInPaymentFilter = ({
let transactionStatusOption = [
{ name: '전체', value: KeyInPaymentTransactionStatus.ALL },
{ name: '승인', value: KeyInPaymentTransactionStatus.APPROVE },
{ name: '전취소', value: KeyInPaymentTransactionStatus.BF_CANCEL },
{ name: '후취소', value: KeyInPaymentTransactionStatus.AF_CANCEL },
{ name: '전취소', value: KeyInPaymentTransactionStatus.ALL_CANCEL },
{ name: '후취소', value: KeyInPaymentTransactionStatus.AFTER_CANCEL },
]
return (

View File

@@ -0,0 +1,44 @@
import { PATHS } from '@/shared/constants/paths';
import { useNavigate } from '@/shared/lib/hooks/use-navigate';
import { KeyInPaymentListProps } from '../../model/types'
import { ListDateGroup } from '../list-date-group';
export const KeyInPaymentList = ({
additionalServiceCategory,
listItems
}: KeyInPaymentListProps ) => {
const { navigate } = useNavigate();
const getListDateGroup = () => {
let rs = [];
for (const [key, value] of Object.entries(listItems)) {
rs.push(
<ListDateGroup
additionalServiceCategory ={ additionalServiceCategory }
key={ key }
date={ key }
items={ value }
></ListDateGroup>
);
}
return rs;
};
const onClickToNavigate = () => {
navigate(PATHS.additionalService.keyInPayment.request)
};
return (
<>
<div className="transaction-list">
{ getListDateGroup() }
<div className="apply-row">
<button
className="btn-50 btn-blue flex-1"
onClick={ () => onClickToNavigate() }
> </button>
</div>
</div>
</>
);
}

View File

@@ -1,57 +0,0 @@
import { PATHS } from '@/shared/constants/paths';
import { useNavigate } from '@/shared/lib/hooks/use-navigate';
interface LinkPaymentPendingItemProps {
transactionId: string;
customerName: string;
status: string;
channel: string;
amount: number;
}
export const LinkPaymentPendingItem = ({
transactionId,
customerName,
status,
channel,
amount
}: LinkPaymentPendingItemProps) => {
const { navigate } = useNavigate();
const onClickToNavigate = () => {
navigate(PATHS.additionalService.linkPayment.pendingDetail, {
state: {
transactionId: transactionId
}
});
};
const getStatusDotClass = () => {
if (status === '발송요청') {
return 'status-dot blue';
}
return 'status-dot gray';
};
return (
<>
<div
className="transaction-item approved"
onClick={() => onClickToNavigate()}
>
<div className="transaction-status">
<div className={getStatusDotClass()}></div>
</div>
<div className="transaction-content">
<div className="transaction-title">{customerName}</div>
<div className="transaction-details">
<span>{status}</span>
<span className="separator"></span>
<span>{channel}</span>
</div>
</div>
<div className="transaction-amount">{amount.toLocaleString()}</div>
</div>
</>
);
};

View File

@@ -2,6 +2,7 @@ import { LinkPaymentPendingListProps } from '../../model/types';
import { ListDateGroup } from '../list-date-group';
export const LinkPaymentPendingList = ({
additionalServiceCategory,
listItems
}: LinkPaymentPendingListProps) => {
@@ -10,11 +11,12 @@ export const LinkPaymentPendingList = ({
for (const [key, value] of Object.entries(listItems)) {
rs.push(
<ListDateGroup
additionalServiceCategory={additionalServiceCategory}
key={key}
date={key}
items={value}
/>
);
></ListDateGroup>
);
}
return rs;
};

View File

@@ -6,7 +6,7 @@ import { useNavigate } from '@/shared/lib/hooks/use-navigate';
import { PATHS } from "@/shared/constants/paths";
import { LinkPaymentPendingList } from "./link-payment-pending-list";
import { AdditionalServiceCategory, LinkPaymentSearchType, LinkPaymentSendingStatus, LinkPaymentSendMethod, SortByKeys } from "../../model/types";
import { SortOptionsBox } from './sort-options-box';
import { SortOptionsBox } from '../sort-options-box';
const sendingStatusBtnGrouup = [
{ name: '전체', value: LinkPaymentSendingStatus.ALL },

View File

@@ -1,62 +0,0 @@
import { PATHS } from '@/shared/constants/paths';
import { useNavigate } from '@/shared/lib/hooks/use-navigate';
import moment from 'moment';
interface LinkPaymentItemProps {
transactionId: string;
customerName: string;
status: string;
channel: string;
paymentMethod: string;
amount: number;
}
export const LinkPaymentItem = ({
transactionId,
customerName,
status,
channel,
paymentMethod,
amount
}: LinkPaymentItemProps) => {
const { navigate } = useNavigate();
const onClickToNavigate = () => {
navigate(PATHS.additionalService.linkPayment.detail, {
state: {
transactionId: transactionId
}
});
};
const getStatusDotClass = () => {
if (status === '결제완료' || status === '입금요청') {
return 'status-dot blue';
}
return 'status-dot gray';
};
return (
<>
<div
className="transaction-item approved"
onClick={() => onClickToNavigate()}
>
<div className="transaction-status">
<div className={getStatusDotClass()}></div>
</div>
<div className="transaction-content">
<div className="transaction-title">{customerName}</div>
<div className="transaction-details">
<span>{status}</span>
<span className="separator"></span>
<span>{channel}</span>
<span className="separator"></span>
<span>{paymentMethod}</span>
</div>
</div>
<div className="transaction-amount">{amount.toLocaleString()}</div>
</div>
</>
);
};

View File

@@ -2,6 +2,7 @@ import { LinkPaymentShippingListProps } from '../../model/types';
import { ListDateGroup } from '../list-date-group';
export const LinkPaymentSHippingHistoryList = ({
additionalServiceCategory,
listItems
}: LinkPaymentShippingListProps) => {
@@ -10,11 +11,12 @@ export const LinkPaymentSHippingHistoryList = ({
for (const [key, value] of Object.entries(listItems)) {
rs.push(
<ListDateGroup
additionalServiceCategory={additionalServiceCategory}
key={key}
date={key}
items={value}
/>
);
></ListDateGroup>
);
}
return rs;
};

View File

@@ -5,7 +5,7 @@ import { LinkPaymentShippingHistoryFilter } from "./filter/link-payment-shipping
import { useNavigate } from '@/shared/lib/hooks/use-navigate';
import { PATHS } from "@/shared/constants/paths";
import { LinkPaymentSHippingHistoryList } from "./link-payment-shipping-history-list";
import { SortOptionsBox } from "./sort-options-box";
import { SortOptionsBox } from "../sort-options-box";
import { AdditionalServiceCategory, LinkPaymentSendMethod, LinkPaymentTransactionStatus, ProcessResult, SortByKeys } from "../../model/types";
import { LinkPaymentSearchType, } from "../../model/types";

View File

@@ -24,15 +24,8 @@ export const ListDateGroup = ({
additionalServiceCategory={ additionalServiceCategory }
key={ key }
tid={ items[i]?.tid }
mid={ items[i]?.mid }
stateDate={ items[i]?.stateDate }
stateCode={ items[i]?.stateCode }
stateName={ items[i]?.stateName }
installmentMonth={ items[i]?.installmentMonth }
serviceCode={ items[i]?.serviceCode }
serviceName={ items[i]?.serviceName }
serviceDetailName={ items[i]?.serviceDetailName }
goodsAmount={ items[i]?.goodsAmount }
paymentDate= { items[i]?.paymentDate}
paymentStatus={ items[i]?.paymentStatus}
requestId={ items[i]?.requestId }
requestDate={ items[i]?.requestDate }

View File

@@ -6,9 +6,7 @@ import moment from 'moment';
export const ListItem = ({
additionalServiceCategory,
tid, mid, stateDate, stateCode, stateName,
installmentMonth, serviceCode, serviceName,
serviceDetailName, goodsAmount,
tid, paymentDate, paymentStatus,
requestId, requestDate, bank, accountNumber,
accountHolder, processResult,
@@ -19,13 +17,16 @@ export const ListItem = ({
const { navigate } = useNavigate();
const getItemClass = () => {
let rs = '';
if(stateCode === '0'){
if (paymentStatus === '') {
rs = '';
}
else if(stateCode === '1'){
else if (paymentStatus === "APPROVAL") {
rs = 'approved';
}
else if(stateCode === '2'){
else if (paymentStatus === "ALL_CANCEL") {
rs = 'refund';
}
else if (paymentStatus === 'AFTER_CANCEL') {
rs = 'refund';
}
return rs;
@@ -33,66 +34,65 @@ export const ListItem = ({
const getDotClass = (str?: string) => {
let rs = '';
if(stateCode === '0'){
if (paymentStatus === '') {
rs = '';
}
else if(stateCode === '1'){
else if (paymentStatus === "APPROVAL") {
rs = 'blue';
}
else if(stateCode === '2'){
else if (paymentStatus === "ALL_CANCEL") {
rs = 'gray';
}
else if (paymentStatus === 'AFTER_CANCEL') {
rs = 'gray';
}
return rs;
};
const onClickToNavigate = () => {
if(additionalServiceCategory === AdditionalServiceCategory.KeyInPayment){
navigate(PATHS.additionalService.keyInPayment, {
state: {
tid: tid,
serviceCode: serviceCode
}
});
if (additionalServiceCategory === AdditionalServiceCategory.KeyInPayment) {
return;
}
else if(additionalServiceCategory === AdditionalServiceCategory.AccountHolderSearch){
else if (additionalServiceCategory === AdditionalServiceCategory.AccountHolderSearch) {
navigate(PATHS.additionalService.accountHolderSearch.detail, {
state: {
requestId: requestId
}
});
}
else if(additionalServiceCategory === AdditionalServiceCategory.LinkPaymentShipping){
else if (additionalServiceCategory === AdditionalServiceCategory.LinkPaymentShipping) {
navigate(PATHS.additionalService.linkPayment.detail, {
state: {
transactionId: transactionId
}
});
}
else if(additionalServiceCategory === AdditionalServiceCategory.LinkPaymentPending){
else if (additionalServiceCategory === AdditionalServiceCategory.LinkPaymentPending) {
navigate(PATHS.additionalService.linkPayment.detail, {
state: {
transactionId: transactionId
}
});
}
else{
else {
alert('additionalServiceCategory가 존재하지 않습니다.');
}
};
const getTime = () => {
let timeStr = '';
if(additionalServiceCategory === AdditionalServiceCategory.KeyInPayment){
let time = stateDate?.substring(8, 12);
if (additionalServiceCategory === AdditionalServiceCategory.KeyInPayment) {
let time = paymentDate?.substring(8, 12);
timeStr = time?.substring(0, 2) + ':' + time?.substring(2, 4);
}
else if(additionalServiceCategory === AdditionalServiceCategory.AccountHolderSearch){
else if (additionalServiceCategory === AdditionalServiceCategory.AccountHolderSearch) {
timeStr = moment(requestDate).format('HH:mm');
}
else if(additionalServiceCategory === AdditionalServiceCategory.LinkPaymentShipping){
else if (additionalServiceCategory === AdditionalServiceCategory.LinkPaymentShipping) {
timeStr = moment(transactionDate).format('HH:mm');
}
else if(additionalServiceCategory === AdditionalServiceCategory.LinkPaymentPending){
else if (additionalServiceCategory === AdditionalServiceCategory.LinkPaymentPending) {
timeStr = moment(sendDate).format('HH:mm');
}
return timeStr
@@ -100,16 +100,16 @@ export const ListItem = ({
const getTitle = () => {
let str = '';
if(additionalServiceCategory === AdditionalServiceCategory.KeyInPayment){
str = `${serviceName}(${serviceDetailName})`;
if (additionalServiceCategory === AdditionalServiceCategory.KeyInPayment) {
str = `${tid}(${amount})`;
}
else if(additionalServiceCategory === AdditionalServiceCategory.AccountHolderSearch){
else if (additionalServiceCategory === AdditionalServiceCategory.AccountHolderSearch) {
str = `${accountHolder}(${accountNumber})`
}
else if(additionalServiceCategory === AdditionalServiceCategory.LinkPaymentShipping){
else if (additionalServiceCategory === AdditionalServiceCategory.LinkPaymentShipping) {
str = `${customerName}(${transactionId})`
}
else if(additionalServiceCategory === AdditionalServiceCategory.LinkPaymentPending){
else if (additionalServiceCategory === AdditionalServiceCategory.LinkPaymentPending) {
str = `${customerName}(${transactionId})`
}
return str;
@@ -117,54 +117,45 @@ export const ListItem = ({
const getDetail = () => {
let rs = [];
if(additionalServiceCategory === AdditionalServiceCategory.KeyInPayment){
if (additionalServiceCategory === AdditionalServiceCategory.KeyInPayment) {
rs.push(
<div className="transaction-details">
<span>{ getTime() }</span>
<span>{getTime()}</span>
<span className="separator">|</span>
<span>{ stateName }</span>
<span className="separator">|</span>
<span>{ mid }</span>
{
(!!installmentMonth && parseInt(installmentMonth) > 1) &&
<>
<span className="separator">|</span>
<span>{ installmentMonth } </span>
</>
}
<span>{paymentStatus}</span>
</div>
);
}
else if(additionalServiceCategory === AdditionalServiceCategory.AccountHolderSearch){
else if (additionalServiceCategory === AdditionalServiceCategory.AccountHolderSearch) {
rs.push(
<div className="transaction-details">
<span>{ getTime() }</span>
<span>{getTime()}</span>
<span className="separator">|</span>
<span>{ bank }</span>
<span>{bank}</span>
<span className="separator">|</span>
<span>{ processResult }</span>
<span>{processResult}</span>
</div>
);
}
else if(additionalServiceCategory === AdditionalServiceCategory.LinkPaymentShipping){
else if (additionalServiceCategory === AdditionalServiceCategory.LinkPaymentShipping) {
rs.push(
<div className="transaction-details">
<span>{ getTime() }</span>
<span>{getTime()}</span>
<span className="separator">|</span>
<span>{ status }</span>
<span>{status}</span>
<span className="separator">|</span>
<span>{ channel }</span>
<span>{channel}</span>
</div>
);
}
else if(additionalServiceCategory === AdditionalServiceCategory.LinkPaymentPending){
else if (additionalServiceCategory === AdditionalServiceCategory.LinkPaymentPending) {
rs.push(
<div className="transaction-details">
<span>{ getTime() }</span>
<span>{getTime()}</span>
<span className="separator">|</span>
<span>{ status }</span>
<span>{status}</span>
<span className="separator">|</span>
<span>{ channel }</span>
<span>{channel}</span>
</div>
);
}
@@ -174,22 +165,22 @@ export const ListItem = ({
return (
<>
<div
className={ `transaction-item ${getItemClass()}` }
onClick={ () => onClickToNavigate() }
className={`transaction-item ${getItemClass()}`}
onClick={() => onClickToNavigate()}
>
<div className="transaction-status">
<div className={ `status-dot ${getDotClass()}`}></div>
<div className={`status-dot ${getDotClass()}`}></div>
</div>
<div className="transaction-content">
<div className="transaction-title">{ getTitle() }</div>
{ getDetail() }
<div className="transaction-title">{getTitle()}</div>
{getDetail()}
</div>
<div className="transaction-amount">
<NumericFormat
value={ goodsAmount || amount }
value={amount}
thousandSeparator
displayType="text"
suffix={ '원' }
suffix={'원'}
></NumericFormat>
</div>
</div>

View File

@@ -1,7 +1,7 @@
import {
SortByKeys,
SortOptionsBoxProps
} from '../../model/types';
} from '../model/types';
export const SortOptionsBox = ({
sortBy,
onClickToSort