diff --git a/src/entities/common/model/types.ts b/src/entities/common/model/types.ts index 783350b..ae38c95 100644 --- a/src/entities/common/model/types.ts +++ b/src/entities/common/model/types.ts @@ -37,6 +37,10 @@ export enum HeaderType { LeftArrow = 'LeftArrow', RightClose = 'RightClose', }; +export enum AltMsgKeys { + Fold = '접기', + UnFold = '펼치기', +}; export interface FilterRangeAmountProps { title?: string; minAmount?: number | string; @@ -172,4 +176,8 @@ export interface EmptyTokenAddSendCodeParams { export interface EmptyTokenAddSendCodeResponse { expiresIn: string; authCode: string; +}; + +export interface DetailArrowProps { + show?: boolean; }; \ No newline at end of file diff --git a/src/entities/payment/ui/data-notification-notify-content.tsx b/src/entities/payment/ui/data-notification-notify-content.tsx index cc374f4..3f7d4b0 100644 --- a/src/entities/payment/ui/data-notification-notify-content.tsx +++ b/src/entities/payment/ui/data-notification-notify-content.tsx @@ -63,7 +63,7 @@ export const DataNotificationNotifyContent = ({ { isOpen &&
- - - - - + + + { !!show && +
+ +
+ } +
{ amountInfo?.mid }
diff --git a/src/entities/transaction/ui/info-wrap/detail-info-wrap.tsx b/src/entities/transaction/ui/info-wrap/detail-info-wrap.tsx index 9d843fe..ffbcfe3 100644 --- a/src/entities/transaction/ui/info-wrap/detail-info-wrap.tsx +++ b/src/entities/transaction/ui/info-wrap/detail-info-wrap.tsx @@ -1,6 +1,8 @@ import moment from 'moment'; import { DetailArrow } from '../detail-arrow'; import { InfoWrapKeys, DetailInfoProps } from '../../model/types'; +import { SlideDown } from 'react-slidedown'; +import 'react-slidedown/lib/slidedown.css'; export const DetailInfoWrap = ({ transactionCategory, @@ -24,44 +26,48 @@ export const DetailInfoWrap = ({ > 상세 정보 - + + { !!show && + + } + ) diff --git a/src/entities/transaction/ui/info-wrap/escrow-info-wrap.tsx b/src/entities/transaction/ui/info-wrap/escrow-info-wrap.tsx index 86bab13..0c7972d 100644 --- a/src/entities/transaction/ui/info-wrap/escrow-info-wrap.tsx +++ b/src/entities/transaction/ui/info-wrap/escrow-info-wrap.tsx @@ -1,7 +1,8 @@ import moment from 'moment'; -import { motion } from 'framer-motion'; import { DetailArrow } from '../detail-arrow'; import { InfoWrapKeys, DetailInfoProps } from '../../model/types'; +import { SlideDown } from 'react-slidedown'; +import 'react-slidedown/lib/slidedown.css'; export const EscrowInfoWrap = ({ transactionCategory, @@ -9,11 +10,7 @@ export const EscrowInfoWrap = ({ show, onClickToShowInfo }: DetailInfoProps) => { - const variants = { - hidden: { height: 0, display: 'none' }, - visible: { height: 'auto', display: 'block' }, - }; - + const onClickToSetShowInfo = () => { if(!!onClickToShowInfo){ onClickToShowInfo(InfoWrapKeys.Escrow); @@ -29,54 +26,52 @@ export const EscrowInfoWrap = ({ > 정산 정보 - -
  • - 배송상태 - { escrowInfo?.deliveryStatus } -
  • -
  • - 배송등록 - { moment(escrowInfo?.deliveryRegistrationDate).format('YYYY.MM.DD') } -
  • -
  • - 배송완료 - { moment(escrowInfo?.deliveryCompleteDate).format('YYYY.MM.DD') } -
  • -
  • - 구매확인 - { moment(escrowInfo?.purchaseConfirmDate).format('YYYY.MM.DD') } -
  • -
  • - 구매거절 - { escrowInfo?.purchaseRejectReason } -
  • -
  • - 거절사유 - { escrowInfo?.rejectReason } -
  • -
  • - 에스크로인증번호 - { escrowInfo?.escrowCertNumber } -
  • -
  • - 택배사 - { escrowInfo?.deliveryCompany } -
  • -
  • - 운송장번호 - { escrowInfo?.trackingNumber } -
  • -
  • - 배송주소 - { escrowInfo?.deliveryAddress } -
  • -
    + + { !!show && + + } + ) diff --git a/src/entities/transaction/ui/info-wrap/part-cancel-info-wrap.tsx b/src/entities/transaction/ui/info-wrap/part-cancel-info-wrap.tsx index 8c61e08..541d014 100644 --- a/src/entities/transaction/ui/info-wrap/part-cancel-info-wrap.tsx +++ b/src/entities/transaction/ui/info-wrap/part-cancel-info-wrap.tsx @@ -1,8 +1,9 @@ import moment from 'moment'; -import { motion } from 'framer-motion'; import { NumericFormat } from 'react-number-format'; import { DetailArrow } from '../detail-arrow'; import { InfoWrapKeys, DetailInfoProps } from '../../model/types'; +import { SlideDown } from 'react-slidedown'; +import 'react-slidedown/lib/slidedown.css'; export const PartCancelInfoWrap = ({ transactionCategory, @@ -19,7 +20,7 @@ export const PartCancelInfoWrap = ({ partCancelAmount: {name: '부분취소 금액', type: 'number'}, remainingAmount: {name: (serviceCode === '05')? '재승인 금액': '부분취소 후 잔액', type: 'number'}, }; - console.log(serviceCode) + const showSubItems: Record> = { // 신용카드 '01': ['originalTid', 'originalAmount', 'partCancelTid', @@ -91,11 +92,6 @@ export const PartCancelInfoWrap = ({ return rs; }; - const variants = { - hidden: { height: 0, display: 'none' }, - visible: { height: 'auto', display: 'block' }, - }; - const onClickToSetShowInfo = () => { if(!!onClickToShowInfo){ onClickToShowInfo(InfoWrapKeys.PartCancel); @@ -111,15 +107,14 @@ export const PartCancelInfoWrap = ({ > 부분취소 정보 - - { subLi() } - + + { !!show && + + } + + ) diff --git a/src/entities/transaction/ui/info-wrap/payment-info-wrap.tsx b/src/entities/transaction/ui/info-wrap/payment-info-wrap.tsx index a53f201..8771bf9 100644 --- a/src/entities/transaction/ui/info-wrap/payment-info-wrap.tsx +++ b/src/entities/transaction/ui/info-wrap/payment-info-wrap.tsx @@ -3,6 +3,8 @@ import { motion } from 'framer-motion'; import { DetailArrow } from '../detail-arrow'; import { InfoWrapKeys, DetailInfoProps, TransactionCategory } from '../../model/types'; import { NumericFormat } from 'react-number-format'; +import { SlideDown } from 'react-slidedown'; +import 'react-slidedown/lib/slidedown.css'; export const PaymentInfoWrap = ({ transactionCategory, @@ -114,11 +116,6 @@ export const PaymentInfoWrap = ({ return rs; }; - const variants = { - hidden: { height: 0, display: 'none' }, - visible: { height: 'auto', display: 'block' }, - }; - const onClickToSetShowInfo = () => { if(!!onClickToShowInfo){ onClickToShowInfo(InfoWrapKeys.Payment); @@ -134,36 +131,34 @@ export const PaymentInfoWrap = ({ > 결제 정보 - - { (transactionCategory === TransactionCategory.AllTransaction) && - subLi() - } - { (transactionCategory === TransactionCategory.Escrow) && - <> -
  • - 승인 금액 - - - -
  • -
  • - 승인 번호 - { paymentInfo?.approvalNumber } -
  • - - } -
    + + { !!show && + + } + ) diff --git a/src/entities/transaction/ui/info-wrap/settlement-info-wrap.tsx b/src/entities/transaction/ui/info-wrap/settlement-info-wrap.tsx index 87f8607..9e87306 100644 --- a/src/entities/transaction/ui/info-wrap/settlement-info-wrap.tsx +++ b/src/entities/transaction/ui/info-wrap/settlement-info-wrap.tsx @@ -1,8 +1,9 @@ import moment from 'moment'; import { NumericFormat } from 'react-number-format'; -import { motion } from 'framer-motion'; import { DetailArrow } from '../detail-arrow'; import { InfoWrapKeys, DetailInfoProps } from '../../model/types'; +import { SlideDown } from 'react-slidedown'; +import 'react-slidedown/lib/slidedown.css'; export const SettlementInfoWrap = ({ transactionCategory, @@ -90,11 +91,6 @@ export const SettlementInfoWrap = ({ return rs; }; - const variants = { - hidden: { height: 0, display: 'none' }, - visible: { height: 'auto', display: 'block' }, - }; - const onClickToSetShowInfo = () => { if(!!onClickToShowInfo){ onClickToShowInfo(InfoWrapKeys.Settlement); @@ -110,15 +106,13 @@ export const SettlementInfoWrap = ({ > 정산 정보 - + + { !!show && +
      { subLi() } - +
    + } +
    ) diff --git a/src/entities/transaction/ui/info-wrap/transaction-info-wrap.tsx b/src/entities/transaction/ui/info-wrap/transaction-info-wrap.tsx index 5e51278..073cd21 100644 --- a/src/entities/transaction/ui/info-wrap/transaction-info-wrap.tsx +++ b/src/entities/transaction/ui/info-wrap/transaction-info-wrap.tsx @@ -1,8 +1,9 @@ import moment from 'moment'; -import { motion } from 'framer-motion'; import { DetailArrow } from '../detail-arrow'; import { InfoWrapKeys, DetailInfoProps, TransactionCategory } from '../../model/types'; import { NumericFormat } from 'react-number-format'; +import { SlideDown } from 'react-slidedown'; +import 'react-slidedown/lib/slidedown.css'; export const TransactionInfoWrap = ({ transactionCategory, @@ -93,12 +94,6 @@ export const TransactionInfoWrap = ({ return rs; }; - - const variants = { - hidden: { height: 0, display: 'none' }, - visible: { height: 'auto', display: 'block' }, - }; - const onClickToSetShowInfo = () => { if(!!onClickToShowInfo){ onClickToShowInfo(InfoWrapKeys.Transaction); @@ -110,17 +105,13 @@ export const TransactionInfoWrap = ({
    onClickToSetShowInfo() }>
    onClickToSetShowInfo() } > 거래 정보
    - + + { !!show && +
      { (transactionCategory === TransactionCategory.AllTransaction) && subLi() } @@ -136,8 +127,9 @@ export const TransactionInfoWrap = ({ } - - +
    + } +
    ) diff --git a/src/pages/settlement/list/detail-page.tsx b/src/pages/settlement/list/detail-page.tsx index 7612fee..aaa87e0 100644 --- a/src/pages/settlement/list/detail-page.tsx +++ b/src/pages/settlement/list/detail-page.tsx @@ -1,15 +1,21 @@ import { useEffect, useState } from 'react'; -import { useParams } from 'react-router-dom'; +import { useLocation } from 'react-router'; import { PATHS } from '@/shared/constants/paths'; import { useNavigate } from '@/shared/lib/hooks/use-navigate'; -import { DetailAmountInfo } from '@/entities/settlement/ui/detail-amount-info'; -import { DetailSettlementInfo } from '@/entities/settlement/ui/detail-settlement-info'; +import { AmountInfoWrap } from '@/entities/settlement/ui/info-wrap/amount-info-wrap'; +import { SettlementInfoWrap } from '@/entities/settlement/ui/info-wrap/settlement-info-wrap'; +import { TransactionInfoWrap } from '@/entities/settlement/ui/info-wrap/transaction-info-wrap' import { HeaderType } from '@/entities/common/model/types'; import { - SettlementDetailParams, - DetailResponse, - DetailAmountInfoProps, - DetailSettlementInfoProps, + AmountInfo, + InfoWrapKeys, + SettlementInfo, + SettlementPeriodType, + SettlementsHistoryDetailParams, + SettlementsHistoryDetailResponse, + SettlementsTransactionDetailParams, + SettlementsTransactionDetailResponse, + TransactionInfo } from '@/entities/settlement/model/types'; import { useSetOnBack, @@ -17,15 +23,33 @@ import { useSetHeaderType, useSetFooterMode } from '@/widgets/sub-layout/use-sub-layout'; +import { useSettlementsHistoryDetailMutation } from '@/entities/settlement/api/use-settlements-history-detail-mutation'; +import { useSettlementsTransactionDetailMutation } from '@/entities/settlement/api/use-settlements-transaction-detail-mutation'; +import { NumericFormat } from 'react-number-format'; +import moment from 'moment'; export const DetailPage = () => { const { navigate } = useNavigate(); - const { tid } = useParams(); + const location = useLocation(); + + const [amountInfo, setAmountInfo] = useState(); + const [settlementInfo, setSettlementInfo] = useState(); + const [settlementAmount, setSettlementAmount] = useState(); + const [settlementDate, setSettlementDate] = useState(); + const [transactionInfo, setTransactionInfo] = useState(); + const [transactionAmount, setTransactionAmount] = useState(); + const [merchantName, setMerchantName] = useState(); - const [amountInfo, setAmountInfo] = useState(); - const [settlementInfo, setSettlementInfo] = useState(); - const [showAmount, setShowAmount] = useState(false); const [showSettlement, setShowSettlement] = useState(false); + const [showTransaction, setShowTransaction] = useState(false); + + const { mutateAsync: settlementsHistoryDetail } = useSettlementsHistoryDetailMutation(); + const { mutateAsync: settlementsTransactionDetail } = useSettlementsTransactionDetailMutation(); + + const settlementId = location.state.settlementId; + const approvalNumber = location.state.approvalNumber; + const periodType = location.state.periodType; + useSetHeaderTitle('정산내역 상세'); useSetHeaderType(HeaderType.RightClose); @@ -34,15 +58,49 @@ export const DetailPage = () => { }); useSetFooterMode(false); - const onClickToShowInfo = (info: string) => { - if(info === 'amount'){ - setShowAmount(!showAmount); - } - else if(info === 'settlement'){ + const callSettlementDetail = () => { + let params: SettlementsHistoryDetailParams = { + settlementId: settlementId + }; + + settlementsHistoryDetail(params).then((rs: SettlementsHistoryDetailResponse) => { + setAmountInfo(rs.amountInfo); + setSettlementInfo(rs.settlementInfo); + setSettlementAmount(rs.settlementAmount); + setSettlementDate(rs.settlementDate); + }); + }; + const callTransactionDetail = () => { + let params: SettlementsTransactionDetailParams = { + approvalNumber: approvalNumber + }; + + settlementsTransactionDetail(params).then((rs: SettlementsTransactionDetailResponse) => { + setAmountInfo(rs.amountInfo); + setTransactionInfo(rs.transactionInfo); + setTransactionAmount(rs.transactionAmount); + setMerchantName(rs.merchantName); + }); + }; + + const onClickToShowInfo = (infoWrapKey: InfoWrapKeys) => { + if(infoWrapKey === InfoWrapKeys.Settlement){ setShowSettlement(!showSettlement); } + else if(infoWrapKey === InfoWrapKeys.Transaction){ + setShowTransaction(!showTransaction); + } }; + useEffect(() => { + if(periodType === SettlementPeriodType.SETTLEMENT_DATE){ + callSettlementDetail(); + } + else if(periodType === SettlementPeriodType.TRANSACTION_DATE){ + callTransactionDetail(); + } + }, []); + return ( <>
    @@ -50,33 +108,57 @@ export const DetailPage = () => {
    -
    -
    -
    63,736,320
    - {/* - - */} + { (periodType === SettlementPeriodType.SETTLEMENT_DATE) && +
    +
    +
    + +
    +
    +
    { moment(settlementDate).format('YYYY.MM.DD') }
    -
    2025.06.08
    -
    + } + { (periodType === SettlementPeriodType.TRANSACTION_DATE) && +
    +
    +
    + +
    +
    +
    { merchantName }
    +
    + }
    - onClickToShowInfo(info) } - > + >
    - onClickToShowInfo(info) } - > + { (periodType === SettlementPeriodType.SETTLEMENT_DATE) && + onClickToShowInfo(infoWrapKey) } + > + } + { (periodType === SettlementPeriodType.TRANSACTION_DATE) && + onClickToShowInfo(infoWrapKey) } + > + }
    -
    - -
    diff --git a/src/pages/settlement/settlement-pages.tsx b/src/pages/settlement/settlement-pages.tsx index d6289b7..abba32d 100644 --- a/src/pages/settlement/settlement-pages.tsx +++ b/src/pages/settlement/settlement-pages.tsx @@ -3,6 +3,7 @@ import { SentryRoutes } from '@/shared/configs/sentry'; import { ROUTE_NAMES } from '@/shared/constants/route-names'; import { CalendarPage } from './calendar/calendar-page'; import { ListPage } from './list/list-page'; +import { DetailPage } from './list/detail-page'; export const SettlementPages = () => { return ( @@ -10,6 +11,7 @@ export const SettlementPages = () => { } /> } /> + } /> ); diff --git a/src/shared/api/api-url-settlement.ts b/src/shared/api/api-url-settlement.ts new file mode 100644 index 0000000..d07dfda --- /dev/null +++ b/src/shared/api/api-url-settlement.ts @@ -0,0 +1,37 @@ +import { + API_BASE_URL, + API_URL_KEY, +} from './../constants/url'; + +/* Settlement Management = 정산 API */ +export const API_URL_SETTLEMENT = { + settlementsTransactionSummary: () => { + // POST: 정산내역 거래건별 요약 조회 + return `${API_BASE_URL}/api/v1/${API_URL_KEY}/settlements/transaction/summary`; + }, + settlementsTransactionList: () => { + // POST: 정산내역 거래건별 조회 + return `${API_BASE_URL}/api/v1/${API_URL_KEY}/settlements/transaction/list`; + }, + settlementsTransactionDetail: () => { + // POST: 정산내역 거래건별 상세 조회 + return `${API_BASE_URL}/api/v1/${API_URL_KEY}/settlements/transaction/detail`; + }, + settlementsHistory: () => { + // POST: 정산내역 조회 + return `${API_BASE_URL}/api/v1/${API_URL_KEY}/settlements/history`; + }, + settlementsHistorySummary: () => { + // POST: 정산내역 요약 조회 + return `${API_BASE_URL}/api/v1/${API_URL_KEY}/settlements/history/summary`; + }, + settlementsHistoryDetail: () => { + // POST: 정산내역 거래건별 조회 + return `${API_BASE_URL}/api/v1/${API_URL_KEY}/settlements/history/detail`; + }, + settlementsCalendar: () => { + // POST: 정산내역 거래건별 조회 + return `${API_BASE_URL}/api/v1/${API_URL_KEY}/settlements/calendar`; + }, + +}; \ No newline at end of file diff --git a/src/shared/api/urls.ts b/src/shared/api/urls.ts index 95a67d8..4de4105 100644 --- a/src/shared/api/urls.ts +++ b/src/shared/api/urls.ts @@ -91,15 +91,6 @@ export const API_URL = { return `${API_BASE_URL}/api/v1/${API_URL_KEY}/codes/cache/refresh/${codeCl}`; }, - - settlementList: () => { - return `${API_BASE_URL}/api/v1/${API_URL_KEY}/transaction/list`; - }, - - businessMemberInfo: () => { - return `${API_BASE_URL}/api/v1/${API_URL_KEY}/transaction/detail`; - }, - /* User Management - 사용자 관리 API */ userExistsUserid: () => { // 중복 사용자 ID 확인 @@ -109,6 +100,11 @@ export const API_URL = { // 사용자 추가 return `${API_BASE_URL}/api/v1/${API_URL_KEY}/user/create`; }, + + // 가맹정 API 추가후 삭제 + businessMemberInfo: () => { + return `${API_BASE_URL}/api/v1/${API_URL_KEY}/transaction/detail`; + }, /* Empty Token API Management - jwt 토큰이 없는 API 관리 */ diff --git a/src/shared/constants/route-names.ts b/src/shared/constants/route-names.ts index d3b3214..b841af4 100644 --- a/src/shared/constants/route-names.ts +++ b/src/shared/constants/route-names.ts @@ -30,7 +30,7 @@ export const ROUTE_NAMES = { base: '/settlement/*', calendar: 'calendar', list: 'list', - detail: 'detail/:tid', + detail: 'detail/:detailId', }, businessMember: { base: '/business-member/*', diff --git a/src/shared/ui/assets/css/style-fix.css b/src/shared/ui/assets/css/style-fix.css index e0b5c2d..99d675e 100644 --- a/src/shared/ui/assets/css/style-fix.css +++ b/src/shared/ui/assets/css/style-fix.css @@ -15,28 +15,25 @@ main { -ms-overflow-style: none; scrollbar-width: none; } +.tab-content{ + overflow-y: unset; +} .ic20.rot-180{ transform: rotate(180deg); } -.txn-divider{ - z-index: 20; -} -.txn-section{ - z-index: 20; - background-color: #ffffff; -} -.kv-list{ - padding-bottom: 20px; - z-index: 10; -} /* calendar */ .react-calendar{ margin: 10% auto; - } +.kv-list{ + padding-bottom: 20px; +} +.txn-divider{ + margin-top: 0px; +} header{ padding-top: env(safe-area-inset-top) !important; diff --git a/src/widgets/pull-to-refresh/pull-to-refresh.tsx b/src/widgets/pull-to-refresh/pull-to-refresh.tsx index 51b2c19..a2e6a77 100644 --- a/src/widgets/pull-to-refresh/pull-to-refresh.tsx +++ b/src/widgets/pull-to-refresh/pull-to-refresh.tsx @@ -241,9 +241,11 @@ export const PullToRefresh: React.FC = ({ */}
    {children} + {/*
    {refreshingContent}
    + */}
    );