From e22fb917088f1b761ab1dfd000ffcb6fceca1175 Mon Sep 17 00:00:00 2001 From: HyeonJongKim Date: Fri, 21 Nov 2025 10:54:34 +0900 Subject: [PATCH 1/6] =?UTF-8?q?-=20=EB=B6=80=EA=B0=80=EC=84=9C=EB=B9=84?= =?UTF-8?q?=EC=8A=A4=20=EC=86=8C=EA=B0=9C=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=ED=81=AC=EA=B8=B0=20=EC=B6=95=EC=86=8C,=20=EB=AC=B8=EA=B5=AC?= =?UTF-8?q?=20=ED=91=9C=EC=8B=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/locales/ko.json | 12 ++++++------ src/shared/ui/assets/css/style-fix.css | 12 ++++++++++++ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/locales/ko.json b/src/locales/ko.json index 1d00309..e94a57d 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -893,27 +893,27 @@ }, "services": { "sms": "SMS 결제 통보", - "smsDesc": "입금 요청부터 완료까지 SMS 자동 전송", + "smsDesc": "입금 요청부터 완료까지 \n SMS 자동 전송", "ars": "신용카드 ARS 결제", - "arsDesc": "전화 한 통으로 결제 성공 편리하고 안전한 서비스", + "arsDesc": "전화 한 통으로 결제 성공 \n 편리하고 안전한 서비스", "keyIn": "KEY-IN 결제", "keyInDesc": "카드정보 입력만으로 \n 간편하게 결제 가능", "accountHolderSearch": "계좌성명조회", - "accountHolderSearchDesc": "예금주 정보 입력으로 즉시 예금주 확인", + "accountHolderSearchDesc": "예금주 정보 입력으로 \n 즉시 예금주 확인", "payout": "지급대행", "payoutDesc": "하위 가맹점에 빠른 정산금 지급 지급대행 서비스", "settlementAgency": "정산대행", "settlementAgencyDesc": "하위 가맹점 정산금 계산부터 지급까지 자동 해결 서비스", "linkPayment": "링크 결제", - "linkPaymentDesc": "결제 링크 전송만으로 어디서든 결제 가능 서비스", + "linkPaymentDesc": "결제 링크 전송만으로 \n 어디서든 결제 가능 서비스", "fundAccount": "자금이체", "fundAccountDesc": "예치금으로 즉시 송금, 파일 등록만으로 다중 송금 가능", "accountHolderAuth": "계좌점유인증", "accountHolderAuthDesc": "1원 송금으로 \n 계좌 점유 인증 가능", "alimtalk": "알림톡 결제통보", - "alimtalkDesc": "결제 상태를 알림톡으로 쉽고 빠른 안내", + "alimtalkDesc": "결제 상태를 알림톡으로 \n 쉽고 빠른 안내", "faceAuth": "안면인증", - "faceAuthDesc": "얼굴 인식만으로 본인확인과 \n 결제 가능한 안전 결제 서비스" + "faceAuthDesc": "얼굴 인식만으로 본인확인과 결제 가능한 안전 결제 서비스" }, "settlementAgency": { "title": "정산대행", diff --git a/src/shared/ui/assets/css/style-fix.css b/src/shared/ui/assets/css/style-fix.css index 9695952..eec6083 100644 --- a/src/shared/ui/assets/css/style-fix.css +++ b/src/shared/ui/assets/css/style-fix.css @@ -567,6 +567,18 @@ main.pop{ padding-bottom: 100px; } +/* 부가서비스 리스트 스타일 조정 */ +.ing-list .list-wrap02 { + gap: 50px; +} + +.ing-list .list-wrap01 img, +.ing-list .list-wrap02 img { + width: 60px; + height: 60px; + object-fit: contain; +} + .resend-text { word-break: break-all !important; } From e07e5c5629dd930970857c0c8b6a49b7aa4dfdbf Mon Sep 17 00:00:00 2001 From: "focp212@naver.com" Date: Fri, 21 Nov 2025 11:46:49 +0900 Subject: [PATCH 2/6] =?UTF-8?q?=EA=B1=B0=EB=9E=98=EB=82=B4=EC=97=AD?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=EA=B1=B0=EB=9E=98=ED=99=95=EC=9D=B8?= =?UTF-8?q?=EC=84=9C=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.development | 2 - package.json | 2 +- .../support/ui/detail/notice-detail.tsx | 3 + ...use-all-transaction-issue-send-mutation.ts | 39 +++++++ src/entities/transaction/model/types.ts | 34 ++++++ .../ui/detail/all-transaction-detail.tsx | 3 + .../ui/filter/all-transaction-filter.tsx | 2 +- .../ui/section/amount-info-section.tsx | 100 +++++++++++++----- src/shared/api/api-url-transaction.ts | 4 + src/shared/model/store.ts | 12 +++ .../ui/masked-input/masked-name-input.tsx | 4 +- src/widgets/sub-layout/index.tsx | 4 +- 12 files changed, 175 insertions(+), 34 deletions(-) create mode 100644 src/entities/transaction/api/use-all-transaction-issue-send-mutation.ts diff --git a/.env.development b/.env.development index 299350a..8fe3793 100644 --- a/.env.development +++ b/.env.development @@ -1,6 +1,4 @@ VITE_APP_ENV=development -# VITE_APP_AUTH_PROXY_HOST='http://3.35.79.250:8090' -# VITE_APP_API_PROXY_HOST='http://3.35.79.250:8080' VITE_APP_AUTH_PROXY_HOST='https://auth.nicepay.co.kr' VITE_APP_API_PROXY_HOST='https://rest.nicepay.co.kr' GENERATE_SOURCEMAP=false diff --git a/package.json b/package.json index c9dbcae..7d5038d 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "version": "1.0.3", "type": "module", "scripts": { - "dev": "env-cmd -f .env.local vite --host --open", + "dev": "env-cmd -f .env.development vite --host --open", "build:development": "env-cmd -f .env.development vite build", "build": "env-cmd -f .env.production vite build", "lint": "eslint . --ext js,jsx,ts,tsx --report-unused-disable-directives --max-warnings 0", diff --git a/src/entities/support/ui/detail/notice-detail.tsx b/src/entities/support/ui/detail/notice-detail.tsx index b50c5d5..4c88a3a 100644 --- a/src/entities/support/ui/detail/notice-detail.tsx +++ b/src/entities/support/ui/detail/notice-detail.tsx @@ -84,6 +84,9 @@ export const NoticeDetail = ({ className="notice-detail__body" dangerouslySetInnerHTML={{ __html: result.contents || '' }} > + {/* +
{ result.contents }
+ */} diff --git a/src/entities/transaction/api/use-all-transaction-issue-send-mutation.ts b/src/entities/transaction/api/use-all-transaction-issue-send-mutation.ts new file mode 100644 index 0000000..18e8b79 --- /dev/null +++ b/src/entities/transaction/api/use-all-transaction-issue-send-mutation.ts @@ -0,0 +1,39 @@ +import axios from 'axios'; +import { API_URL_TRANSACTION } from '@/shared/api/api-url-transaction'; +import { resultify } from '@/shared/lib/resultify'; +import { NiceAxiosError } from '@/shared/@types/error'; +import { + AllTransactionIssueSendParams, + AllTransactionIssueSendResponse +} from '../model/types'; +import { + useMutation, + UseMutationOptions +} from '@tanstack/react-query'; +import { getHeaderUserAgent } from '@/shared/constants/url'; + +export const allTransactionIssueSend = (params: AllTransactionIssueSendParams) => { + let headerOptions = { + menuId: 31, + apiType: 'SEND' + }; + let options = { + headers: { + 'X-User-Agent': getHeaderUserAgent(headerOptions) + } + }; + return resultify( + axios.post(API_URL_TRANSACTION.transactionIssueSend(), params, options), + ); +}; + +export const useAllTransactionIssueSendMutation = (options?: UseMutationOptions) => { + const mutation = useMutation({ + ...options, + mutationFn: (params: AllTransactionIssueSendParams) => allTransactionIssueSend(params), + }); + + return { + ...mutation, + }; +}; diff --git a/src/entities/transaction/model/types.ts b/src/entities/transaction/model/types.ts index d3249e7..323432c 100644 --- a/src/entities/transaction/model/types.ts +++ b/src/entities/transaction/model/types.ts @@ -454,8 +454,10 @@ export interface ImportantInfo { approvalDate?: string; approvalTime?: string; transactionDate?: string; + transactionTime?: string; requestDate?: string; cancelDate?: string; + cancelTime?: string; goodsName?: string; orderNumber?: string; @@ -483,6 +485,7 @@ export interface PaymentInfo { depositorName?: string; depositDeadline?: string; depositDate?: string; + depositTime?: string; refundScheduleDate?: string; refundBankName?: string; refundAccountNumber?: string; @@ -906,4 +909,35 @@ export interface EscrowMailResendParams { }; export interface EscrowMailResendResponse { +}; + +export interface AllTransactionIssueSendParams { + sendEmail: string; + mid?: string; + tid: string; + buyerName?: string; + approvalDate?: string; + depositDate?: string; + transactionDate?: string; + approvalTime?: string; + depositTime?: string; + transactionTime?: string; + transactionAmount?: number; + goodsName?: string; + buyerTel?: string; + approvalNo?: string; + installmentMonth?: string; + moid?: string; + bankName?: string; + accountNo?: string; + purchaseCompany?: string; + cancelDate?: string; + cancelTime?: string; + serviceCode?: string; + transactionStatus?: string; +}; +export interface AllTransactionIssueSendResponse { + code: string; + message: string; + ordNm: string; }; \ No newline at end of file diff --git a/src/entities/transaction/ui/detail/all-transaction-detail.tsx b/src/entities/transaction/ui/detail/all-transaction-detail.tsx index 6f71696..7fe8094 100644 --- a/src/entities/transaction/ui/detail/all-transaction-detail.tsx +++ b/src/entities/transaction/ui/detail/all-transaction-detail.tsx @@ -191,6 +191,9 @@ export const AllTransactionDetail = ({ { const { t } = useTranslation(); + const { mutateAsync: allTransactionIssueSend } = useAllTransactionIssueSendMutation(); const { mutateAsync: cashReceiptReceiptDownload } = useCashReceiptReceiptDownloadMutation(); const { mutateAsync: cashReceiptReceiptSendEamil } = useCashReceiptReceiptSendEmailMutation(); - const { downloadBottomSheetOn, setDownloadBottomSheetOn } = useDownloadBottomSheetOnStore(); + const { downloadBottomSheetOn2, setDownloadBottomSheetOn2 } = useDownloadBottomSheetOn2Store(); const [cashReceiptSampleOn, setCashReceiptSampleOn] = useState(false); const [receiptIssueInfo, setReceiptIssueInfo] = useState({}); @@ -35,7 +40,7 @@ export const AmountInfoSection = ({ const [receiptAmountInfo, setReceiptAmountInfo] = useState({}); const [receiptCustomerInfo, setReceiptCustomerInfo] = useState(); const [receiptProductInfo, setReceiptProductInfo] = useState(); - + let newAmountInfo: Record | undefined = amountInfo; const subItems: Record> = { transactionRequestAmount: {name: t('transaction.fields.transactionRequestAmount'), type: 'number'}, @@ -199,7 +204,7 @@ export const AmountInfoSection = ({ }; const onClickToOpenDownloadBottomSheet = () => { - setDownloadBottomSheetOn(true); + setDownloadBottomSheetOn2(true); }; const onRequestDownload = ( @@ -210,21 +215,63 @@ export const AmountInfoSection = ({ if(selectedMode === DownloadSelectedMode.EMAIL && !!userEmail ){ - let params: CashReceiptReceiptSendEmailParams = { - tid: tid, - email: userEmail - }; - cashReceiptReceiptSendEamil(params).then((rs: CashReceiptReceiptSendEmailResponse) => { - console.log(rs); - if(rs.message){ - snackBar(rs.message); - } - }).catch((e: any) => { - if(e.response?.data?.error?.message){ - snackBar(e.response?.data?.error?.message); - return; - } - }); + if(transactionCategory === TransactionCategory.AllTransaction){ + let params: AllTransactionIssueSendParams = { + sendEmail: userEmail, + mid: amountInfo?.mid, + tid: tid, + buyerName: transactionInfo?.buyerName, + approvalDate: importantInfo?.approvalDate, + depositDate: paymentInfo?.depositDate, + transactionDate: importantInfo?.transactionDate, + approvalTime: importantInfo?.approvalTime, + depositTime: paymentInfo?.depositTime, + transactionTime: importantInfo?.transactionTime, + transactionAmount: amountInfo?.transactionAmount, + goodsName: importantInfo?.goodsName, + buyerTel: transactionInfo?.buyerTel, + approvalNo: paymentInfo?.approvalNo, + installmentMonth: paymentInfo?.approvalNo, + moid: importantInfo?.moid, + bankName: paymentInfo?.bankName || paymentInfo?.refundBankName, + accountNo: paymentInfo?.accountNo || paymentInfo?.refundAccountNo, + purchaseCompany: paymentInfo?.purchaseCompany, + cancelDate: importantInfo?.cancelDate, + cancelTime: importantInfo?.cancelTime, + serviceCode: serviceCode, + transactionStatus: importantInfo?.transactionStatus + }; + allTransactionIssueSend(params).then((rs: AllTransactionIssueSendResponse) => { + if(rs.message){ + snackBar(rs.message); + } + else{ + snackBar('메일이 전송 되었습니다.'); + } + }).catch((e: any) => { + if(e.response?.data?.error?.message){ + snackBar(e.response?.data?.error?.message); + return; + } + }); + } + else if(transactionCategory === TransactionCategory.CashReceipt){ + let params: CashReceiptReceiptSendEmailParams = { + tid: tid, + email: userEmail + }; + cashReceiptReceiptSendEamil(params).then((rs: CashReceiptReceiptSendEmailResponse) => { + console.log(rs); + if(rs.message){ + snackBar(rs.message); + } + }).catch((e: any) => { + if(e.response?.data?.error?.message){ + snackBar(e.response?.data?.error?.message); + return; + } + }); + } } else if(selectedMode === DownloadSelectedMode.IMAGE){ let params: CashReceiptReceiptDownloadParams = { @@ -460,8 +507,9 @@ export const AmountInfoSection = ({ }
- { (transactionCategory === TransactionCategory.CashReceipt) && - !!canDownloadReceipt && + { ((transactionCategory === TransactionCategory.AllTransaction) || + ((transactionCategory === TransactionCategory.CashReceipt) && + !!canDownloadReceipt)) &&
- { !!downloadBottomSheetOn && + { !!downloadBottomSheetOn2 && diff --git a/src/shared/api/api-url-transaction.ts b/src/shared/api/api-url-transaction.ts index cde9273..f9a8f8c 100644 --- a/src/shared/api/api-url-transaction.ts +++ b/src/shared/api/api-url-transaction.ts @@ -31,6 +31,10 @@ export const API_URL_TRANSACTION = { // POST: 거래취소 정보 조회 return `${API_BASE_URL}/api/v1/${API_URL_KEY}/transaction/cancel-info`; }, + transactionIssueSend: () => { + // POST: 거래확인서 메일 발송 + return `${API_BASE_URL}/api/v1/${API_URL_KEY}/transaction/issue/send`; + }, /* Cash Receipt Management - 현금영수증 API */ cashReceiptList: () => { diff --git a/src/shared/model/store.ts b/src/shared/model/store.ts index 96d6182..7134056 100644 --- a/src/shared/model/store.ts +++ b/src/shared/model/store.ts @@ -10,6 +10,10 @@ export interface DownloadBottomSheetOnStore { downloadBottomSheetOn: boolean; setDownloadBottomSheetOn: (downloadBottomSheetOn: boolean) => void; }; +export interface DownloadBottomSheetOn2Store { + downloadBottomSheetOn2: boolean; + setDownloadBottomSheetOn2: (downloadBottomSheetOn2: boolean) => void; +}; export interface FilterOnStore { filterOn: boolean; setFilterOn: (filterOn: boolean) => void; @@ -50,6 +54,14 @@ export const useDownloadBottomSheetOnStore = create( })); } })); +export const useDownloadBottomSheetOn2Store = create((set) => ({ + downloadBottomSheetOn2: false, + setDownloadBottomSheetOn2: (downloadBottomSheetOn2: boolean) => { + set((state: {downloadBottomSheetOn2: boolean}) => ({ + downloadBottomSheetOn2: (state.downloadBottomSheetOn2 = downloadBottomSheetOn2) + })); + } +})); export const useFilterlOnStore = create((set) => ({ filterOn: false, diff --git a/src/shared/ui/masked-input/masked-name-input.tsx b/src/shared/ui/masked-input/masked-name-input.tsx index 622d8b8..2a49ea1 100644 --- a/src/shared/ui/masked-input/masked-name-input.tsx +++ b/src/shared/ui/masked-input/masked-name-input.tsx @@ -54,11 +54,11 @@ export const MaskedNameInput = ({ onChange(valueWithoutSpace); }} onChange={(e: ChangeEvent) => { - + if(isComposing){ // composition 중에는 스페이스 제거 const valueWithoutSpace = e.target.value.replace(/\s/g, ''); onChange(valueWithoutSpace); - + } }} onFocus={onFocus} /> diff --git a/src/widgets/sub-layout/index.tsx b/src/widgets/sub-layout/index.tsx index cd5dc8e..ef97c1f 100644 --- a/src/widgets/sub-layout/index.tsx +++ b/src/widgets/sub-layout/index.tsx @@ -260,8 +260,8 @@ export const SubLayout = () => { let userParmas; if(!isNativeEnvironment){ userParmas = { - //id: 'nictest00', - id: 'reptest22m', + id: 'nictest00', + //id: 'reptest22m', password: 'nictest00' }; // userParmas = { From 4caaaae054c4f1de12ff910c091a01412a39330b Mon Sep 17 00:00:00 2001 From: "focp212@naver.com" Date: Fri, 21 Nov 2025 11:56:48 +0900 Subject: [PATCH 3/6] =?UTF-8?q?=ED=95=84=ED=84=B0=20=EB=B2=84=EA=B7=B8=20?= =?UTF-8?q?=ED=94=BD=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/entities/settlement/ui/filter/list-filter.tsx | 2 +- src/entities/transaction/ui/filter/cash-receipt-filter.tsx | 2 +- src/entities/transaction/ui/filter/escrow-filter.tsx | 2 +- src/entities/vat-return/ui/filter/list-filter.tsx | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/entities/settlement/ui/filter/list-filter.tsx b/src/entities/settlement/ui/filter/list-filter.tsx index d5689ea..767723e 100644 --- a/src/entities/settlement/ui/filter/list-filter.tsx +++ b/src/entities/settlement/ui/filter/list-filter.tsx @@ -98,7 +98,7 @@ export const ListFilter = ({
Date: Fri, 21 Nov 2025 13:53:58 +0900 Subject: [PATCH 4/6] =?UTF-8?q?-=20=EB=A7=81=ED=81=AC=EA=B2=B0=EC=A0=9C=20?= =?UTF-8?q?=EB=88=84=EB=9D=BD=EB=90=9C=20=EA=B2=B0=EC=A0=9C=EC=88=98?= =?UTF-8?q?=EB=8B=A8=20=ED=95=84=ED=84=B0=20=EB=B0=8F=20=EB=A6=AC=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EB=88=84=EB=9D=BD=ED=95=AD=EB=AA=A9=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/link-pay/constant.ts | 36 +++++++++++++++++-- .../model/link-pay/types.ts | 4 +++ .../filter/link-payment-history-filter.tsx | 17 +++++++-- .../link-payment-history-wrap.tsx | 5 ++- .../additional-service/ui/list-item.tsx | 15 +++++--- src/locales/en.json | 13 ++++++- src/locales/ko.json | 18 ++++++++-- 7 files changed, 93 insertions(+), 15 deletions(-) diff --git a/src/entities/additional-service/model/link-pay/constant.ts b/src/entities/additional-service/model/link-pay/constant.ts index a655cb0..8c21cf0 100644 --- a/src/entities/additional-service/model/link-pay/constant.ts +++ b/src/entities/additional-service/model/link-pay/constant.ts @@ -1,8 +1,40 @@ import { TFunction } from 'i18next'; -import { LinkPaymentProcessStatus } from "./types"; +import { LinkPaymentPaymentMethod, LinkPaymentProcessStatus } from "./types"; export const getProcessStatusBtnGroup = (t: TFunction) => [ { name: t('transaction.constants.all'), value: LinkPaymentProcessStatus.ALL }, { name: t('additionalService.linkPay.sendRequest'), value: LinkPaymentProcessStatus.SEND_REQUEST }, { name: t('additionalService.linkPay.sendCancel'), value: LinkPaymentProcessStatus.SEND_CANCEL } -] \ No newline at end of file +] + +export const getPaymentMethodOptionGroup = (t: TFunction) => [ + { name: t('additionalService.linkPayment.paymentMethod.all'), value: '' }, + { name: t('additionalService.linkPayment.paymentMethod.card'), value: LinkPaymentPaymentMethod.CARD}, + { name: t('additionalService.linkPayment.paymentMethod.bank'), value: LinkPaymentPaymentMethod.BANK}, + { name: t('additionalService.linkPayment.paymentMethod.virtualAccount'), value: LinkPaymentPaymentMethod.VIRTURE_BANK}, + { name: t('additionalService.linkPayment.paymentMethod.phone'), value: LinkPaymentPaymentMethod.PHONE}, + { name: t('additionalService.linkPayment.paymentMethod.cultureland'), value: LinkPaymentPaymentMethod.CULTURELAND}, + { name: t('additionalService.linkPayment.paymentMethod.ssgMoney'), value: LinkPaymentPaymentMethod.SSG_MONEY}, + { name: t('additionalService.linkPayment.paymentMethod.ssgBank'), value: LinkPaymentPaymentMethod.SSG_BANK}, + { name: t('additionalService.linkPayment.paymentMethod.cmsBank'), value: LinkPaymentPaymentMethod.CMS_BANK}, //계좌간편결제 + { name: t('additionalService.linkPayment.paymentMethod.tmoneyPay'), value: LinkPaymentPaymentMethod.TMONEY_PAY}, +] + +export const getPaymentMethodText = (t: TFunction) => (status?: string): string => { + if (!status) return ''; + + const paymentMethodMap: Record = { + [LinkPaymentPaymentMethod.ALL]: t('additionalService.linkPayment.paymentMethod.all'), + [LinkPaymentPaymentMethod.CARD]: t('additionalService.linkPayment.paymentMethod.card'), + [LinkPaymentPaymentMethod.BANK]: t('additionalService.linkPayment.paymentMethod.bank'), + [LinkPaymentPaymentMethod.VIRTURE_BANK]: t('additionalService.linkPayment.paymentMethod.virtualAccount'), + [LinkPaymentPaymentMethod.PHONE]: t('additionalService.linkPayment.paymentMethod.phone'), + [LinkPaymentPaymentMethod.CULTURELAND]: t('additionalService.linkPayment.paymentMethod.cultureland'), + [LinkPaymentPaymentMethod.SSG_MONEY]: t('additionalService.linkPayment.paymentMethod.ssgMoney'), + [LinkPaymentPaymentMethod.SSG_BANK]: t('additionalService.linkPayment.paymentMethod.ssgBank'), + [LinkPaymentPaymentMethod.CMS_BANK]: t('additionalService.linkPayment.paymentMethod.cmsBank'), + [LinkPaymentPaymentMethod.TMONEY_PAY]: t('additionalService.linkPayment.paymentMethod.tmoneyPay') + } + + return paymentMethodMap[status as LinkPaymentPaymentMethod] || status; +} \ No newline at end of file diff --git a/src/entities/additional-service/model/link-pay/types.ts b/src/entities/additional-service/model/link-pay/types.ts index 819197f..a51e75e 100644 --- a/src/entities/additional-service/model/link-pay/types.ts +++ b/src/entities/additional-service/model/link-pay/types.ts @@ -20,6 +20,7 @@ export enum LinkPaymentSearchCl { } export enum LinkPaymentPaymentMethod { + ALL = "", CARD = "CARD", BANK = "BANK", VIRTURE_BANK = "VIRTURE_BANK", @@ -124,6 +125,7 @@ export interface LinkPaymentHistoryFilterProps extends FilterProps { mid: string; searchCl: LinkPaymentSearchCl; searchValue: string; + paymentMethod: LinkPaymentPaymentMethod; fromDate: string; toDate: string; paymentStatus: LinkPaymentPaymentStatus; @@ -132,6 +134,7 @@ export interface LinkPaymentHistoryFilterProps extends FilterProps { setMid: (mid: string) => void; setSearchType: (searchType: LinkPaymentSearchCl) => void; setSearchKeyword: (searchKeyWorld: string) => void; + setPaymentMethod: (paymentMethod: LinkPaymentPaymentMethod) => void; setStartDate: (startDate: string) => void; setEndDate: (endDate: string) => void; setPaymentStatus: (transactionStatus: LinkPaymentPaymentStatus) => void; @@ -161,6 +164,7 @@ export interface LinkPaymentWaitFilterProps extends FilterProps { export interface ExtensionLinkPayHistoryListParams extends ExtensionRequestParams { searchCl: string; searchValue: string; + paymentMethod: LinkPaymentPaymentMethod; fromDate: string; toDate: string; paymentStatus: LinkPaymentPaymentStatus; diff --git a/src/entities/additional-service/ui/link-payment/filter/link-payment-history-filter.tsx b/src/entities/additional-service/ui/link-payment/filter/link-payment-history-filter.tsx index 13dbecd..dfd538a 100644 --- a/src/entities/additional-service/ui/link-payment/filter/link-payment-history-filter.tsx +++ b/src/entities/additional-service/ui/link-payment/filter/link-payment-history-filter.tsx @@ -13,11 +13,12 @@ import { FilterCalendar } from '@/shared/ui/filter/calendar'; import { FilterButtonGroups } from '@/shared/ui/filter/button-groups'; import { FilterMotionDuration, FilterMotionStyle, FilterMotionVariants } from '@/entities/common/model/constant'; import { useStore } from '@/shared/model/store'; -import { LinkPaymentHistoryFilterProps, LinkPaymentPaymentStatus, LinkPaymentSearchCl, LinkPaymentSendMethod, LinkPaymentSendStatus } from '@/entities/additional-service/model/link-pay/types'; +import { LinkPaymentHistoryFilterProps, LinkPaymentPaymentMethod, LinkPaymentPaymentStatus, LinkPaymentSearchCl, LinkPaymentSendMethod, LinkPaymentSendStatus } from '@/entities/additional-service/model/link-pay/types'; import { FilterSelectMid } from '@/shared/ui/filter/select-mid'; import { useTranslation } from 'react-i18next'; import { FullMenuClose } from '@/entities/common/ui/full-menu-close'; import { useKeyboardAware } from '@/shared/lib/hooks'; +import { getPaymentMethodOptionGroup } from '@/entities/additional-service/model/link-pay/constant'; export const LinkPaymentHistoryFilter = ({ filterOn, @@ -25,6 +26,7 @@ export const LinkPaymentHistoryFilter = ({ mid, searchCl, searchValue, + paymentMethod, fromDate, toDate, paymentStatus, @@ -33,6 +35,7 @@ export const LinkPaymentHistoryFilter = ({ setMid, setSearchType, setSearchKeyword, + setPaymentMethod, setStartDate, setEndDate, setPaymentStatus, @@ -44,6 +47,7 @@ export const LinkPaymentHistoryFilter = ({ const [filterMid, setFilterMid] = useState(mid); const [filterSearchCl, setFilterSearchCl] = useState(searchCl); const [filterSearchValue, setFilterSearchValue] = useState(searchValue); + const [filterPaymentMethod, setFilterPaymentMethod] = useState(paymentMethod); const [filterStartDate, setFilterStartDate] = useState(fromDate); const [filterEndDate, setFilterEndDate] = useState(toDate); const [filterTransactionStatus, setFilterTransactionStatus] = useState(paymentStatus) @@ -85,6 +89,7 @@ export const LinkPaymentHistoryFilter = ({ setMid(filterMid); setSearchType(filterSearchCl); setSearchKeyword(filterSearchValue); + setPaymentMethod(filterPaymentMethod); setStartDate(filterStartDate); setEndDate(filterEndDate); setPaymentStatus(filterTransactionStatus); @@ -112,7 +117,7 @@ export const LinkPaymentHistoryFilter = ({
@@ -131,8 +136,14 @@ export const LinkPaymentHistoryFilter = ({ selectOptions={searchTypeOption} inputValue={filterSearchValue} inputSetter={setFilterSearchValue} - handleInputFocus={ handleInputFocus } + handleInputFocus={handleInputFocus} >
+ { mid: mid, searchCl: searchCl, searchValue: searchValue, + paymentMethod: paymentMethod, fromDate: fromDate, toDate: toDate, paymentStatus: paymentStatus, @@ -333,6 +334,7 @@ export const LinkPaymentHistoryWrap = () => { mid={mid} searchCl={searchCl} searchValue={searchValue} + paymentMethod={paymentMethod} fromDate={fromDate} toDate={toDate} paymentStatus={paymentStatus} @@ -341,6 +343,7 @@ export const LinkPaymentHistoryWrap = () => { setMid={setMid} setSearchType={setSearchCl} setSearchKeyword={setSearchValue} + setPaymentMethod={setPaymentMethod} setStartDate={setFromDate} setEndDate={setToDate} setPaymentStatus={setPaymentStatus} diff --git a/src/entities/additional-service/ui/list-item.tsx b/src/entities/additional-service/ui/list-item.tsx index 4665fa7..ca76dca 100644 --- a/src/entities/additional-service/ui/list-item.tsx +++ b/src/entities/additional-service/ui/list-item.tsx @@ -14,6 +14,7 @@ import { ServiceCode } from '../model/alimtalk/types'; import { getAlimtalkAlimClText, getAlimtalkSendClTypeText, getAlimtalkSendTypeText, getAlimtalkServiceCodeText } from '../model/alimtalk/constant'; import { getAuthResultStatusText, getTransTypeText } from '../model/face-auth/constant'; import { getPayoutStatusText } from '../model/payout/constant'; +import { getPaymentMethodText } from '../model/link-pay/constant'; export const ListItem = ({ additionalServiceCategory, @@ -376,9 +377,9 @@ export const ListItem = ({ } else if (additionalServiceCategory === AdditionalServiceCategory.LinkPaymentHistory ) { - str = `${getMaskedName(buyerName)}`; + str = receiverInfo ? `${getMaskedName(buyerName)}(${receiverInfo})` : `${getMaskedName(buyerName)}`; } else if (additionalServiceCategory === AdditionalServiceCategory.LinkPaymentWait) { - str = `${getMaskedName(buyerName)}(${receiverInfo})`; + str = receiverInfo ? `${getMaskedName(buyerName)}(${receiverInfo})` : `${getMaskedName(buyerName)}`; } else if (additionalServiceCategory === AdditionalServiceCategory.Payout) { str = companyName; @@ -452,7 +453,7 @@ export const ListItem = ({ ); } else if (additionalServiceCategory === AdditionalServiceCategory.LinkPaymentHistory) { - if (paymentStatus === "0" || paymentStatus === "3" || paymentStatus === "4") { + if (paymentStatus === "2" || paymentStatus === "4") { rs.push(
{getPaymentStatusText(t)(paymentStatus)} @@ -466,8 +467,12 @@ export const ListItem = ({ {getPaymentStatusText(t)(paymentStatus)} | {getSendMethodText(t)(sendMethod)} - | - {paymentMethod} + {paymentMethod && ( + <> + | + {getPaymentMethodText(t)(paymentMethod)} + + )}
); } diff --git a/src/locales/en.json b/src/locales/en.json index b2b0702..959a7af 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -1291,7 +1291,18 @@ "apply": "Apply", "sendRequest": "Send Request", "sendCancel": "Send Cancel", - "progressStatus": "Progress Status" + "progressStatus": "Progress Status", + "paymentMethod": { + "card": "Credit Card", + "bank": "Bank Transfer", + "virtualAccount": "Virtual Account", + "phone": "Mobile Phone", + "cultureland": "Cultureland", + "ssgMoney": "SSG Money", + "ssgBank": "SSG Bank", + "cmsBank": "Easy Account Payment", + "tmoneyPay": "T-money Pay" + } }, "infoWrap": { "paymentInfo": "Payment Information", diff --git a/src/locales/ko.json b/src/locales/ko.json index e94a57d..4da06cf 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -1286,13 +1286,25 @@ "kakao": "카카오", "merchant": "가맹점", "phoneNumberEmail": "휴대폰번호/이메일", - "transactionStatus": "거래 상태", - "sendResult": "발송 결과", + "transactionStatus": "결제 상태", + "sendResult": "전송결과", "sendMethod": "발송수단", "apply": "적용", "sendRequest": "발송요청", "sendCancel": "발송취소", - "progressStatus": "진행상태" + "progressStatus": "진행상태", + "paymentMethod": { + "all": "전체", + "card": "신용카드", + "bank": "계좌이체", + "virtualAccount": "가상계좌", + "phone": "휴대폰", + "cultureland": "문화상품권", + "ssgMoney": "SSG머니", + "ssgBank": "SSG뱅크", + "cmsBank": "계좌간편결제", + "tmoneyPay": "티머니페이" + } }, "infoWrap": { "paymentInfo": "결제 정보", From c5521a40b65c52e396e223e1462bc726429db6e5 Mon Sep 17 00:00:00 2001 From: HyeonJongKim Date: Fri, 21 Nov 2025 14:47:47 +0900 Subject: [PATCH 5/6] =?UTF-8?q?-=20=EB=A7=81=ED=81=AC=EA=B2=B0=EC=A0=9C=20?= =?UTF-8?q?=ED=99=95=EC=9D=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=9E=98?= =?UTF-8?q?=EB=A6=BC=20=EC=88=98=EC=A0=95,=20=EC=9D=B4=EC=A0=84=20?= =?UTF-8?q?=EB=B2=84=ED=8A=BC=20=ED=81=B4=EB=A6=AD=20=EC=8B=9C=20=EC=A0=84?= =?UTF-8?q?=20step2,1=20=EC=9C=BC=EB=A1=9C=20Form=20=EC=9C=A0=EC=A7=80?= =?UTF-8?q?=ED=95=9C=EC=B1=84=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../link-payment/apply/link-payment-step1.tsx | 7 ++- .../apply/link-payment-apply-confirm-page.tsx | 4 +- .../apply/link-payment-apply-page.tsx | 44 ++++++++++++------- src/shared/ui/assets/css/style-fix.css | 28 ++++++++++++ 4 files changed, 64 insertions(+), 19 deletions(-) diff --git a/src/entities/additional-service/ui/link-payment/apply/link-payment-step1.tsx b/src/entities/additional-service/ui/link-payment/apply/link-payment-step1.tsx index 0974aba..5cacbfe 100644 --- a/src/entities/additional-service/ui/link-payment/apply/link-payment-step1.tsx +++ b/src/entities/additional-service/ui/link-payment/apply/link-payment-step1.tsx @@ -131,9 +131,14 @@ export const LinkPaymentStep1 = ({ formData, setFormData }: LinkPaymentStep1Prop
handleInputChange('moid', e.target.value)} + onChange={(e) => { + // 영문자와 숫자만 허용 (한글, 특수문자 제거) + const cleanedValue = e.target.value.replace(/[^a-zA-Z0-9]/g, ''); + handleInputChange('moid', cleanedValue); + }} onFocus={handleInputFocus} />
diff --git a/src/pages/additional-service/link-payment/apply/link-payment-apply-confirm-page.tsx b/src/pages/additional-service/link-payment/apply/link-payment-apply-confirm-page.tsx index 2a827f4..d7f25d0 100644 --- a/src/pages/additional-service/link-payment/apply/link-payment-apply-confirm-page.tsx +++ b/src/pages/additional-service/link-payment/apply/link-payment-apply-confirm-page.tsx @@ -91,7 +91,9 @@ export const LinkPaymentApplyConfirmPage = () => { }; const onClickToBack = () => { - navigate(-1); + navigate(PATHS.additionalService.linkPayment.request, { + state: { formData, returnToStep: 2 } + }); }; return ( diff --git a/src/pages/additional-service/link-payment/apply/link-payment-apply-page.tsx b/src/pages/additional-service/link-payment/apply/link-payment-apply-page.tsx index 2752cea..8aa276b 100644 --- a/src/pages/additional-service/link-payment/apply/link-payment-apply-page.tsx +++ b/src/pages/additional-service/link-payment/apply/link-payment-apply-page.tsx @@ -11,12 +11,14 @@ import { IdentityType, Language } from '@/entities/additional-service/model/type import { LinkContentType, LinkPaymentFormData, LinkPaymentSendMethod } from '@/entities/additional-service/model/link-pay/types'; import { useStore } from '@/shared/model/store'; import moment from 'moment'; +import { useLocation } from 'react-router'; export const LinkPaymentApplyPage = () => { const { t } = useTranslation(); const { navigate } = useNavigate(); + const location = useLocation(); const midOptionsWithoutGids = useStore.getState().UserStore.selectOptionsMidsWithoutGids; const userMid = useStore.getState().UserStore.mid; @@ -27,23 +29,31 @@ export const LinkPaymentApplyPage = () => { }); const initialMid = (midItem.length > 0) ? userMid : (midOptionsWithoutGids.length > 0 ? midOptionsWithoutGids[0]?.value || '' : ''); - const [processStep, setProcessStep] = useState(ProcessStep.One); - const [formData, setFormData] = useState({ - mid: initialMid, - sendMethod: LinkPaymentSendMethod.SMS, - goodsName: '', - amount: 0, - moid: '', - paymentLimitDate: moment().format('YYYY.MM.DD'), - buyerName: '', - email: '', - phoneNumber: '', - isIdentity: false, - identityType: IdentityType.INDIVIDUAL, - identityValue: '', - language: Language.KR, - linkContentType: LinkContentType.BASIC - }); + // location.state에서 formData와 returnToStep 받기 + const savedFormData = location.state?.formData; + const returnToStep = location.state?.returnToStep; + + const [processStep, setProcessStep] = useState( + returnToStep === 2 ? ProcessStep.Two : ProcessStep.One + ); + const [formData, setFormData] = useState( + savedFormData || { + mid: initialMid, + sendMethod: LinkPaymentSendMethod.SMS, + goodsName: '', + amount: 0, + moid: '', + paymentLimitDate: moment().format('YYYY.MM.DD'), + buyerName: '', + email: '', + phoneNumber: '', + isIdentity: false, + identityType: IdentityType.INDIVIDUAL, + identityValue: '', + language: Language.KR, + linkContentType: LinkContentType.BASIC + } + ); useSetHeaderTitle(t('additionalService.linkPayment.applyTitle')); useSetHeaderType(HeaderType.LeftArrow); diff --git a/src/shared/ui/assets/css/style-fix.css b/src/shared/ui/assets/css/style-fix.css index eec6083..512b265 100644 --- a/src/shared/ui/assets/css/style-fix.css +++ b/src/shared/ui/assets/css/style-fix.css @@ -579,6 +579,34 @@ main.pop{ object-fit: contain; } +/* 링크결제 확인 페이지 */ +main.pop { + height: 100vh; + overflow: hidden; + display: flex; + flex-direction: column; +} + +main.pop .sub-wrap { + flex: 1; + overflow-y: auto; + overflow-x: hidden; + padding-bottom: 120px; + -webkit-overflow-scrolling: touch; +} + +main.pop .preview-body { + max-width: 338px; + width: 100%; + min-height: auto; +} + +main.pop .apply-row { + position: fixed; + bottom: 0; + flex-shrink: 0; +} + .resend-text { word-break: break-all !important; } From 347467eb9ac334edc082eaee1040d5045bcd279b Mon Sep 17 00:00:00 2001 From: HyeonJongKim Date: Fri, 21 Nov 2025 15:25:06 +0900 Subject: [PATCH 6/6] =?UTF-8?q?-=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EC=9D=B8?= =?UTF-8?q?=EC=A6=9D=EC=A0=95=EB=B3=B4=20minus=20btn=20=EB=B0=80=EB=A6=BC?= =?UTF-8?q?=20=ED=98=84=EC=83=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../additional-service/ui/list-item.tsx | 16 ++++++++-------- src/shared/ui/assets/css/style-fix.css | 17 +++++++++++++++++ 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/entities/additional-service/ui/list-item.tsx b/src/entities/additional-service/ui/list-item.tsx index ca76dca..c2cf6ca 100644 --- a/src/entities/additional-service/ui/list-item.tsx +++ b/src/entities/additional-service/ui/list-item.tsx @@ -488,7 +488,7 @@ export const ListItem = ({ } else if (additionalServiceCategory === AdditionalServiceCategory.Payout) { rs.push( -
+
{getPayoutStatusText(t)(status)} | {submallId} @@ -524,7 +524,7 @@ export const ListItem = ({ } else if (additionalServiceCategory === AdditionalServiceCategory.Ars) { rs.push( -
+
{getTime()} | {getStatus()} @@ -537,7 +537,7 @@ export const ListItem = ({ } else if (additionalServiceCategory === AdditionalServiceCategory.Alimtalk) { rs.push( -
+
{getTime()} | {getAlimtalkServiceCodeText(t)(serviceCode)} @@ -562,14 +562,14 @@ export const ListItem = ({ let rs: any[] = []; if (additionalServiceCategory === AdditionalServiceCategory.AccountHolderSearch) { rs.push( -
+
{resultStatus === 'SUCCESS' ? t('additionalService.common.success') : t('additionalService.common.fail')}
); } else if (additionalServiceCategory === AdditionalServiceCategory.FaceAuth) { rs.push( -
+
{authResult === 'SUCCESS' ? t('additionalService.common.success') : t('additionalService.common.fail')}
); @@ -578,14 +578,14 @@ export const ListItem = ({ const statusText = authStatus === 'REQUEST' ? t('additionalService.common.request') : authStatus === 'SUCCESS' ? t('additionalService.common.success') : t('additionalService.common.fail'); const statusClass = authStatus === 'SUCCESS' || 'REQUEST' ? 'success' : 'fail'; rs.push( -
+
{statusText}
); } else if (additionalServiceCategory === AdditionalServiceCategory.KeyInPayment) { rs.push( -
+
{t('home.money', { value: new Intl.NumberFormat('en-US').format(amount || 0) })}
); @@ -594,7 +594,7 @@ export const ListItem = ({ additionalServiceCategory === AdditionalServiceCategory.LinkPaymentWait ) { rs.push( -
+
{t('home.money', { value: new Intl.NumberFormat('en-US').format(amount || 0) })}
); diff --git a/src/shared/ui/assets/css/style-fix.css b/src/shared/ui/assets/css/style-fix.css index 512b265..2e9f13a 100644 --- a/src/shared/ui/assets/css/style-fix.css +++ b/src/shared/ui/assets/css/style-fix.css @@ -630,4 +630,21 @@ main.pop .apply-row { } .tab36 { font-size: var(--fs-15); +} + +/* 로그인 인증 정보 input-row 레이아웃 수정 */ +.settings-login-auth .input-row { + display: flex; + align-items: center; + gap: 16px; + padding-bottom: 16px; +} + +.settings-login-auth .input-row input { + flex: 1; + min-width: 0; +} + +.settings-login-auth .icon-btn.minus { + flex-shrink: 0; } \ No newline at end of file