현금영수증 리스트

This commit is contained in:
focp212@naver.com
2025-10-21 16:21:57 +09:00
parent 81d977b97d
commit 841a9d8542
44 changed files with 1208 additions and 717 deletions

View File

@@ -40,7 +40,7 @@ export interface UserAccountAuthWrapProps {
status: string;
};
export interface PermItem {
menuId?: string;
menuId?: number;
menuName?: string;
subMenu?: Array<PermItem>;
};

View File

@@ -48,64 +48,64 @@ export const UserAccountAuthWrap = ({
}, [currentStatus, currentIdCL, status, idCL]);
let menuItems = [
{menuId: '30', parent: '30', menuName: '거래조회', subMenu:
{menuId: 30, parent: 30, menuName: '거래조회', subMenu:
[
{menuId: '31', parent: '30', menuName: '거래내역조회'},
{menuId: '32', parent: '30', menuName: '현금영수증발행'},
{menuId: '33', parent: '30', menuName: '에스크로'},
{menuId: '34', parent: '30', menuName: '빌링'}
{menuId: 31, parent: 30, menuName: '거래내역조회'},
{menuId: 32, parent: 30, menuName: '현금영수증발행'},
{menuId: 33, parent: 30, menuName: '에스크로'},
{menuId: 34, parent: 30, menuName: '빌링'}
]
},
{menuId: '35', parent: '35', menuName: '정산조회', subMenu:
{menuId: 35, parent: 35, menuName: '정산조회', subMenu:
[
{menuId: '36', parent: '35', menuName: '정산달력'},
{menuId: '37', parent: '35', menuName: '정산내역'},
{menuId: 36, parent: 35, menuName: '정산달력'},
{menuId: 37, parent: 35, menuName: '정산내역'},
]
},
{menuId: '38', parent: '38', menuName: '가맹점관리', subMenu:
{menuId: 38, parent: 38, menuName: '가맹점관리', subMenu:
[
{menuId: '39', parent: '38', menuName: '가맹점정보'},
{menuId: '40', parent: '38', menuName: '등록현황'},
{menuId: 39, parent: 38, menuName: '가맹점정보'},
{menuId: 40, parent: 38, menuName: '등록현황'},
]
},
{menuId: '41', parent: '41', menuName: '결제관리', subMenu:
{menuId: 41, parent: 41, menuName: '결제관리', subMenu:
[
{menuId: '42', parent: '41', menuName: '결제정보'},
{menuId: '43', parent: '41', menuName: '결제데이터통보'},
{menuId: 42, parent: 41, menuName: '결제정보'},
{menuId: 43, parent: 41, menuName: '결제데이터통보'},
]
},
{menuId: '44', parent: '44', menuName: '계정관리', subMenu:
{menuId: 44, parent: 44, menuName: '계정관리', subMenu:
[
{menuId: '45', parent: '44', menuName: '사용자관리'},
{menuId: '46', parent: '44', menuName: '비밀번호관리'},
{menuId: 45, parent: 44, menuName: '사용자관리'},
{menuId: 46, parent: 44, menuName: '비밀번호관리'},
]
},
{menuId: '47', parent: '47', menuName: '부가세신고자료', subMenu:
{menuId: 47, parent: 47, menuName: '부가세신고자료', subMenu:
[
{menuId: '48', parent: '47', menuName: '세금계산서'},
{menuId: '49', parent: '47', menuName: '부가세참고'},
{menuId: 48, parent: 47, menuName: '세금계산서'},
{menuId: 49, parent: 47, menuName: '부가세참고'},
]
},
{menuId: '50', parent: '50', menuName: '부가서비스', subMenu:
{menuId: 50, parent: 50, menuName: '부가서비스', subMenu:
[
{menuId: '51', parent: '50', menuName: '부가서비스소개'},
{menuId: '52', parent: '50', menuName: '신용카드ARS카드결제'},
{menuId: '53', parent: '50', menuName: '지급대행'},
{menuId: '54', parent: '50', menuName: '링크결제'},
{menuId: '55', parent: '50', menuName: '자금이체'},
{menuId: '56', parent: '50', menuName: 'KEY-IN결제'},
{menuId: '57', parent: '50', menuName: 'SMS결제통보'},
{menuId: '58', parent: '50', menuName: '알림톡결제통보'},
{menuId: '59', parent: '50', menuName: '계좌점유인증'},
{menuId: '60', parent: '50', menuName: '계좌성명조회'},
{menuId: '65', parent: '50', menuName: '안면인증'},
{menuId: 51, parent: 50, menuName: '부가서비스소개'},
{menuId: 52, parent: 50, menuName: '신용카드ARS카드결제'},
{menuId: 53, parent: 50, menuName: '지급대행'},
{menuId: 54, parent: 50, menuName: '링크결제'},
{menuId: 55, parent: 50, menuName: '자금이체'},
{menuId: 56, parent: 50, menuName: 'KEY-IN결제'},
{menuId: 57, parent: 50, menuName: 'SMS결제통보'},
{menuId: 58, parent: 50, menuName: '알림톡결제통보'},
{menuId: 59, parent: 50, menuName: '계좌점유인증'},
{menuId: 60, parent: 50, menuName: '계좌성명조회'},
{menuId: 65, parent: 50, menuName: '안면인증'},
]
},
{menuId: '61', parent: '61', menuName: '고객지원', subMenu:
{menuId: 61, parent: 61, menuName: '고객지원', subMenu:
[
{menuId: '62', parent: '61', menuName: '공지사항'},
{menuId: '63', parent: '61', menuName: '자주묻는질문'},
{menuId: '64', parent: '61', menuName: '1:1문의'},
{menuId: 62, parent: 61, menuName: '공지사항'},
{menuId: 63, parent: 61, menuName: '자주묻는질문'},
{menuId: 64, parent: 61, menuName: '1:1문의'},
]
},
]

View File

@@ -1,11 +1,6 @@
import { DefaulResponsePagination, DefaultRequestPagination } from '@/entities/common/model/types';
export interface AlarmItemProps {
title?: string;
name?: string;
category?: string;
date?: string;
};
export interface AppAlarmMarkParams {
appNotificationSequence: number;

View File

@@ -1,13 +1,22 @@
import { PATHS } from '@/shared/constants/paths';
import { IMAGE_ROOT } from '@/shared/constants/common';
import { useNavigate } from '@/shared/lib/hooks/use-navigate';
import { AlarmItemProps } from '../model/types';
import moment from 'moment';
export interface AlarmItemProps {
appNotificationCategory?: string;
notificationReceivedDate?: string;
appNotificationTitle?: string;
appNotificationContent?: string;
appNotificationLink?: string;
};
export const AlarmItem = ({
title,
name,
category,
date
appNotificationCategory,
notificationReceivedDate,
appNotificationTitle,
appNotificationContent,
appNotificationLink
}: AlarmItemProps) => {
const { navigate } = useNavigate();
const onClickToNavigate = (alarmId: number) => {
@@ -18,10 +27,10 @@ export const AlarmItem = ({
return (
<div className="notice-item">
<div className="notice-content">
<div className="notice-title">{ title }</div>
<div className="notice-title">{ appNotificationTitle }</div>
<div className="notice-meta">
<strong>{ name }</strong>
<span>{ date }</span>
<strong>{ appNotificationCategory }</strong>
<span>{ moment(notificationReceivedDate).format('YYYY.MM.DD HH:mm:ss') }</span>
</div>
</div>
<div
@@ -30,7 +39,7 @@ export const AlarmItem = ({
>
<img
src={ IMAGE_ROOT + '/Forward.svg' }
alt={ category + '바로가기' }
alt={ appNotificationCategory + ' 바로가기' }
/>
</div>
</div>

View File

@@ -1,6 +1,13 @@
import { IMAGE_ROOT } from '@/shared/constants/common';
import { AlarmItem } from './alarm-item';
import { AlarmItemProps } from '../model/types';
import { AlarmListContent, AppAlarmListParams, AppAlarmListResponse, MERCHANT_ADMIN_APP } from '../model/types';
import { useEffect, useState } from 'react';
import { useAppAlarmListMutation } from '../api/use-app-alarm-list-mutation';
import { DEFAULT_PAGE_PARAM } from '@/entities/common/model/constant';
import { useTranslation } from 'react-i18next';
import { useNavigate } from '@/shared/lib/hooks';
import useIntersectionObserver from '@/widgets/intersection-observer';
import { useStore } from '@/shared/model/store';
export interface AlarmListProps {
category: string;
@@ -9,35 +16,106 @@ export interface AlarmListProps {
export const AlarmList = ({
category
}: AlarmListProps) => {
const { navigate } = useNavigate();
const { t } = useTranslation();
const userInfo = useStore.getState().UserStore.userInfo;
const [onActionIntersect, setOnActionIntersect] = useState<boolean>(false);
const [pageParam, setPageParam] = useState(DEFAULT_PAGE_PARAM);
const [nextCursor, setNextCursor] = useState<string | null>(null);
const [appCl, setAppCl] = useState<MERCHANT_ADMIN_APP>(MERCHANT_ADMIN_APP.MERCHANT_ADMIN_APP)
const [appNotificationCategory, setAppNotificationCategory] = useState<string>('');
const [resultList, setResultList] = useState<Array<AlarmListContent>>([]);
const [selectedCategory, setSelectedCategory] = useState<string>('');
const { mutateAsync: appAlarmList } = useAppAlarmListMutation();
const alarmItems: Array<AlarmItemProps> = [
{title: '시스템 안정화를 위한 정기 점검이 예정되어 있습니다.', name: '공지사항', category: 'notice', date: '2025.06.01 10:00:00'},
{title: '가맹점 관리 메뉴에 거래내역 엑셀 다운로드 기능이 추가 되었습니다.', name: '공지사항', category: 'notice', date: '2025.06.01 10:00:00'},
{title: '신규 가맹점을 대상으로 거래수수료 인하 혜택을 12월까지 제공합니다.', name: '공지사항', category: 'notice', date: '2025.06.01 10:00:00'},
{title: '앱의 안정성과 사용성을 개선한 버전 2.3.1이 출시되었습니다.', name: '공지사항', category: 'notice', date: '2025.06.01 10:00:00'},
{title: '점검 시간 동안 일부 서비스 이용이 제한될 수 있으니 미리 확인해주세요.', name: '공지사항', category: 'notice', date: '2025.06.01 10:00:00'},
{title: '가맹점 관리 메뉴에 거래내역 엑셀 다운로드 기능이 추가 되었습니다.', name: '공지사항', category: 'notice', date: '2025.06.01 10:00:00'},
{title: '신규 가맹점을 대상으로 거래수수료 인하 혜택을 12월까지 제공합니다.', name: '공지사항', category: 'notice', date: '2025.06.01 10:00:00'},
{title: '앱의 안정성과 사용성을 개선한 버전 2.3.1이 출시되었습니다.', name: '공지사항', category: 'notice', date: '2025.06.01 10:00:00'},
{title: '점검 시간 동안 일부 서비스 이용이 제한될 수 있으니 미리 확인해주세요.', name: '공지사항', category: 'notice', date: '2025.06.01 10:00:00'},
];
const getAlarmItems = () => {
let rs = [];
for(let i=0;i<alarmItems.length;i++){
if(category === 'all' || (alarmItems[i]?.category === category)){
rs.push(
<AlarmItem
title={ alarmItems[i]?.title }
name={ alarmItems[i]?.name }
category={ alarmItems[i]?.category }
date={ alarmItems[i]?.date }
></AlarmItem>
)
}
for(let i=0;i<resultList.length;i++){
rs.push(
<AlarmItem
appNotificationCategory={ resultList[i]?.appNotificationCategory }
notificationReceivedDate={ resultList[i]?.notificationReceivedDate }
appNotificationTitle={ resultList[i]?.appNotificationTitle }
appNotificationContent={ resultList[i]?.appNotificationContent }
appNotificationLink={ resultList[i]?.appNotificationLink }
></AlarmItem>
)
}
return rs;
};
const onIntersect: IntersectionObserverCallback = (entries: Array<IntersectionObserverEntry>) => {
entries.forEach((entry: IntersectionObserverEntry) => {
if(entry.isIntersecting){
console.log('Element is now intersecting with the root. [' + onActionIntersect + ']');
if(onActionIntersect && !!nextCursor){
callList('page');
}
}
else{
console.log('Element is no longer intersecting with the root.');
}
});
};
const { setTarget } = useIntersectionObserver({
threshold: 1,
onIntersect
});
const callList = (type?: string) => {
if(userInfo.usrid){
let params: AppAlarmListParams = {
usrid: userInfo.usrid,
appCl: appCl,
appNotificationCategory: appNotificationCategory,
...{
page: pageParam
}
}
if(type === 'page'){
if(params.page){
params.page.cursor = nextCursor;
}
}
else{
setNextCursor(null);
if(params.page){
params.page.cursor = null;
}
}
appAlarmList(params).then((rs: AppAlarmListResponse) => {
if(rs){
if(type === 'page'){
setResultList([
...resultList,
...rs.content
]);
}
else{
setResultList(rs.content);
}
if(rs.hasNext){
setNextCursor(rs.nextCursor);
setOnActionIntersect(true);
}
else{
setNextCursor(null);
}
}
});
}
};
useEffect(() => {
callList();
}, [selectedCategory]);
return (
<>
<div className="notice-box sub">

View File

@@ -38,95 +38,95 @@ export const BottomSheetMotionDuration = {
export const MenuItems = [
{
menuId: '30',
parent: '30',
menuId: 30,
parent: 30,
menuName: '거래조회',
menuIcon: 'transaction-icon',
subMenu: [
{menuId: '31', parent: '30', menuName: '거래내역조회', path: PATHS.transaction.allTransaction.list},
{menuId: '32', parent: '30', menuName: '현금영수증발행', path: PATHS.transaction.cashReceipt.list},
{menuId: '33', parent: '30', menuName: '에스크로', path: PATHS.transaction.escrow.list},
{menuId: '34', parent: '30', menuName: '빌링', path: PATHS.transaction.billing.list}
{menuId: 31, parent: 30, menuName: '거래내역조회', menuNameEng: '', programPath: PATHS.transaction.allTransaction.list},
{menuId: 32, parent: 30, menuName: '현금영수증발행', menuNameEng: '', programPath: PATHS.transaction.cashReceipt.list},
{menuId: 33, parent: 30, menuName: '에스크로', menuNameEng: '', programPath: PATHS.transaction.escrow.list},
{menuId: 34, parent: 30, menuName: '빌링', menuNameEng: '', programPath: PATHS.transaction.billing.list}
]
},
{
menuId: '35',
parent: '35',
menuId: 35,
parent: 35,
menuName: '정산조회',
menuIcon: 'settlement-icon',
subMenu: [
{menuId: '36', parent: '35', menuName: '정산달력', path: PATHS.settlement.calendar},
{menuId: '37', parent: '35', menuName: '정산내역', path: PATHS.settlement.list}
{menuId: 36, parent: 35, menuName: '정산달력', menuNameEng: '', programPath: PATHS.settlement.calendar},
{menuId: 37, parent: 35, menuName: '정산내역', menuNameEng: '', programPath: PATHS.settlement.list}
]
},
{
menuId: '38',
parent: '38',
menuId: 38,
parent: 38,
menuName: '가맹점관리',
menuIcon: 'merchant-icon',
subMenu: [
{menuId: '39', parent: '38', menuName: '가맹점정보', path: PATHS.merchant.info},
{menuId: '40', parent: '38', menuName: '등록현황', path: PATHS.merchant.registrationStatus}
{menuId: 39, parent: 38, menuName: '가맹점정보', menuNameEng: '', programPath: PATHS.merchant.info},
{menuId: 40, parent: 38, menuName: '등록현황', menuNameEng: '', programPath: PATHS.merchant.registrationStatus}
]
},
{
menuId: '41',
parent: '41',
menuId: 41,
parent: 41,
menuName: '결제관리',
menuIcon: 'payment-icon',
subMenu: [
{menuId: '42', parent: '41', menuName: '결제정보', path: PATHS.payment.info},
{menuId: '43', parent: '41', menuName: '결제데이터통보', path: PATHS.payment.notificationData},
{menuId: 42, parent: 41, menuName: '결제정보', menuNameEng: '', programPath: PATHS.payment.info},
{menuId: 43, parent: 41, menuName: '결제데이터통보', menuNameEng: '', programPath: PATHS.payment.notificationData},
]
},
{
menuId: '44',
parent: '44',
menuId: 44,
parent: 44,
menuName: '계정관리',
menuIcon: 'account-icon',
subMenu: [
{menuId: '45', parent: '44', menuName: '사용자관리', path: PATHS.account.user.manage},
{menuId: '46', parent: '44', menuName: '비밀번호관리', path: PATHS.account.password.manage},
{menuId: 45, parent: 44, menuName: '사용자관리', menuNameEng: '', programPath: PATHS.account.user.manage},
{menuId: 46, parent: 44, menuName: '비밀번호관리', menuNameEng: '', programPath: PATHS.account.password.manage},
]
},
{
menuId: '47',
parent: '47',
menuId: 47,
parent: 47,
menuName: '부가세신고자료',
menuIcon: 'vat-icon',
subMenu: [
{menuId: '48', parent: '47', menuName: '세금계산서', path: PATHS.vatReturn.list},
{menuId: '49', parent: '47', menuName: '부가세참고', path: PATHS.vatReturn.reference},
{menuId: 48, parent: 47, menuName: '세금계산서', menuNameEng: '', programPath: PATHS.vatReturn.list},
{menuId: 49, parent: 47, menuName: '부가세참고', menuNameEng: '', programPath: PATHS.vatReturn.reference},
]
},
{
menuId: '50',
parent: '50',
menuId: 50,
parent: 50,
menuName: '부가서비스',
menuIcon: 'service-icon',
subMenu: [
{menuId: '51', parent: '50', menuName: '부가서비스소개', path: PATHS.additionalService.list},
{menuId: '52', parent: '50', menuName: '신용카드ARS카드결제', path: PATHS.additionalService.ars.list},
{menuId: '53', parent: '50', menuName: '지급대행', path: PATHS.additionalService.payout.list},
{menuId: '54', parent: '50', menuName: '링크결제', path: PATHS.additionalService.linkPayment.shippingHistory},
{menuId: '55', parent: '50', menuName: '자금이체', path: PATHS.additionalService.fundAccount.transferList},
{menuId: '56', parent: '50', menuName: 'KEY-IN결제', path: PATHS.additionalService.keyInPayment.list},
{menuId: '57', parent: '50', menuName: 'SMS결제통보', path: PATHS.additionalService.smsPaymentNotification},
{menuId: '58', parent: '50', menuName: '알림톡결제통보', path: PATHS.additionalService.alimtalk.list},
{menuId: '59', parent: '50', menuName: '계좌점유인증', path: PATHS.additionalService.accountHolderAuth.list},
{menuId: '60', parent: '50', menuName: '계좌성명조회', path: PATHS.additionalService.accountHolderSearch.list},
{menuId: '65', parent: '50', menuName: '안면인증', path: PATHS.additionalService.faceAuth.list},
{menuId: 51, parent: 50, menuName: '부가서비스소개', menuNameEng: '', programPath: PATHS.additionalService.list},
{menuId: 52, parent: 50, menuName: '신용카드ARS카드결제', menuNameEng: '', programPath: PATHS.additionalService.ars.list},
{menuId: 53, parent: 50, menuName: '지급대행', menuNameEng: '', programPath: PATHS.additionalService.payout.list},
{menuId: 54, parent: 50, menuName: '링크결제', menuNameEng: '', programPath: PATHS.additionalService.linkPayment.shippingHistory},
{menuId: 55, parent: 50, menuName: '자금이체', menuNameEng: '', programPath: PATHS.additionalService.fundAccount.transferList},
{menuId: 56, parent: 50, menuName: 'KEY-IN결제', menuNameEng: '', programPath: PATHS.additionalService.keyInPayment.list},
{menuId: 57, parent: 50, menuName: 'SMS결제통보', menuNameEng: '', programPath: PATHS.additionalService.smsPaymentNotification},
{menuId: 58, parent: 50, menuName: '알림톡결제통보', menuNameEng: '', programPath: PATHS.additionalService.alimtalk.list},
{menuId: 59, parent: 50, menuName: '계좌점유인증', menuNameEng: '', programPath: PATHS.additionalService.accountHolderAuth.list},
{menuId: 60, parent: 50, menuName: '계좌성명조회', menuNameEng: '', programPath: PATHS.additionalService.accountHolderSearch.list},
{menuId: 65, parent: 50, menuName: '안면인증', menuNameEng: '', programPath: PATHS.additionalService.faceAuth.list},
]
},
{
menuId: '61',
parent: '61',
menuId: 61,
parent: 61,
menuName: '고객지원',
menuIcon: 'support-icon',
subMenu: [
{menuId: '62', parent: '61', menuName: '공지사항', path: PATHS.support.notice.list},
{menuId: '63', parent: '61', menuName: '자주묻는질문', path: PATHS.support.faq.list},
{menuId: '64', parent: '61', menuName: '1:1문의', path: PATHS.support.qna.list},
{menuId: 62, parent: 61, menuName: '공지사항', menuNameEng: '', programPath: PATHS.support.notice.list},
{menuId: 63, parent: 61, menuName: '자주묻는질문', menuNameEng: '', programPath: PATHS.support.faq.list},
{menuId: 64, parent: 61, menuName: '1:1문의', menuNameEng: '', programPath: PATHS.support.qna.list},
]
},
];

View File

@@ -36,8 +36,11 @@ export const FavoriteWrapper = ({
const [favoriteItems, setFavoriteItems] = useState<Array<UserFavorite>>([]);
const itemAdd: UserFavorite = {
img: IMAGE_ROOT + '/ico_menu_plus.svg',
title: '편집하기'
menuId: 0,
menuName: '편집하기',
menuNameEng: 'edit',
iconFilePath: IMAGE_ROOT + '/ico_menu_plus.svg',
programPath: '',
};
const onClickToFavoriteEdit = () => {
@@ -67,15 +70,15 @@ export const FavoriteWrapper = ({
<SwiperSlide key={ `favorite-slide-key-${i}` }>
<div
className="swiper-item"
onClick={ () => onClickToNavigate(favoriteItems[i]?.path) }
onClick={ () => onClickToNavigate(favoriteItems[i]?.programPath) }
>
<div className="swiper-icon coin-icon">
<img
src={ favoriteItems[i]?.img }
alt={ favoriteItems[i]?.title }
src={ favoriteItems[i]?.iconFilePath || '' }
alt={ favoriteItems[i]?.menuName }
/>
</div>
<span className="swiper-text">{ favoriteItems[i]?.title }</span>
<span className="swiper-text">{ favoriteItems[i]?.menuName }</span>
</div>
</SwiperSlide>
);
@@ -93,11 +96,11 @@ export const FavoriteWrapper = ({
>
<div className="swiper-icon coin-icon">
<img
src={ itemAdd.img }
alt={ itemAdd.title }
src={ itemAdd.iconFilePath || '' }
alt={ itemAdd.menuName }
/>
</div>
<span className="swiper-text">{ itemAdd.title }</span>
<span className="swiper-text">{ itemAdd.menuName }</span>
</div>
</SwiperSlide>
);

View File

@@ -1,11 +1,12 @@
import { RefObject } from "react";
export interface MenuItem {
menuId?: string;
parent?: string;
menuId?: number;
parent?: number;
menuName: string;
menuIcon?: string;
path?: string;
menuNameEng?: string;
iconFilePath?: string;
programPath?: string;
subMenu?: Array<MenuItem>
};

View File

@@ -8,13 +8,13 @@ import { PATHS } from '@/shared/constants/paths';
import { MenuItem } from '../model/types';
export interface MenuCategoryProps {
menuId?: string;
menuId?: number;
menuIcon?: string;
menuName?: string;
subMenu?: Array<MenuItem>;
setMenuOn?: (menuOn: boolean) => void;
editMode?: boolean;
setChangeMenuId: (menuId?: string) => void;
setChangeMenuId: (menuIdChecked?: string) => void;
buttonRefs: RefObject<Array<HTMLDivElement>>;
itemIndex: number;
};
@@ -34,7 +34,7 @@ export const MenuCategory = ({
const location = useLocation();
const [favoriteItems, setFavoriteItems] = useState<Array<UserFavorite>>([]);
const [menuIds, setMenuIds] = useState<Array<string | undefined>>([]);
const [menuIds, setMenuIds] = useState<Array<number | undefined>>([]);
const onClickToNavigate = (path?: string) => {
if(!!path && !!setMenuOn && !editMode){
@@ -45,9 +45,11 @@ export const MenuCategory = ({
const favoriteSetting = (
checked: boolean,
title?: string,
path?: string,
menuId?: string
menuId?: number,
menuName?: string,
menuNameEng?: string,
iconFilePath?: string,
programPath?: string,
) => {
let userFavorite = useStore.getState().UserStore.userFavorite;
let randomNum = Math.floor(Math.random() * 3) + 1;
@@ -55,10 +57,11 @@ export const MenuCategory = ({
userFavorite = [
...userFavorite,
{
title: title,
img: `${IMAGE_ROOT}/ico_menu_0${randomNum}.svg`,
path: path,
menuId: menuId
menuId: menuId,
menuName: menuName,
menuNameEng: menuNameEng,
iconFilePath: `${IMAGE_ROOT}/ico_menu_0${randomNum}.svg`,
programPath: programPath
}
];
}
@@ -78,7 +81,7 @@ export const MenuCategory = ({
const callFavoiteItems = () => {
let userFavorite = useStore.getState().UserStore.userFavorite;
setFavoriteItems(userFavorite);
let newArr: Array<string | undefined> = userFavorite.map((value, index) => {
let newArr: Array<number | undefined> = userFavorite.map((value, index) => {
return value.menuId;
});
setMenuIds(newArr);
@@ -88,15 +91,22 @@ export const MenuCategory = ({
callFavoiteItems();
}, []);
useEffect(() => {
if(menuIds.length > 0) {
// callShortcutSave();
}
}, [menuIds]);
const getMenuItems = () => {
let rs = [];
if(subMenu){
for(let i=0;i<subMenu.length;i++){
if(!!editMode){
if(!!editMode && subMenu[i] && subMenu[i]?.menuId){
rs.push(
<li
key={ `menu-item-key-${menuId}-${i}` }
onClick={ () => onClickToNavigate(subMenu[i]?.path) }
onClick={ () => onClickToNavigate(subMenu[i]?.programPath) }
>
<span>{ subMenu[i]?.menuName }</span>
<div className="check_box_scrap">
@@ -107,9 +117,11 @@ export const MenuCategory = ({
checked={ menuIds.includes(subMenu[i]?.menuId)? true: false }
onChange={ (e) => favoriteSetting(
e.target.checked,
subMenu[i]?.menuName,
subMenu[i]?.path,
subMenu[i]?.menuId
subMenu[i]?.menuId,
subMenu[i]?.menuName,
subMenu[i]?.menuNameEng,
subMenu[i]?.iconFilePath,
subMenu[i]?.programPath,
)}
/>
<label
@@ -124,7 +136,7 @@ export const MenuCategory = ({
rs.push(
<li
key={ `menu-item-key-${i}` }
onClick={ () => onClickToNavigate(subMenu[i]?.path) }
onClick={ () => onClickToNavigate(subMenu[i]?.programPath) }
>{ subMenu[i]?.menuName }</li>
);
}

View File

@@ -40,7 +40,7 @@ export interface SettlementsTransactionSummaryParams {
endDate: string;
paymentMethod: SettlementPaymentMethod;
transactionIds?: Array<string>;
pagination: DefaultRequestPagination
page: DefaultRequestPagination
};
export interface SettlementsTransactionSummaryResponse {
settlementAmount?: number;
@@ -57,7 +57,7 @@ export interface SettlementsTransactionListParams {
startDate: string;
endDate: string;
paymentMethod: SettlementPaymentMethod;
pagination: DefaultRequestPagination;
page: DefaultRequestPagination;
};
export interface SettlementsTransactionListResponse extends DefaulResponsePagination {
content: Array<SettlementsTransactionListContent>;
@@ -108,7 +108,7 @@ export interface SettlementsHistoryParams {
startDate: string;
endDate: string;
paymentMethod: SettlementPaymentMethod;
pagination: DefaultRequestPagination
page: DefaultRequestPagination
};
export interface SettlementsHistoryResponse extends DefaulResponsePagination {
content: Array<SettlementsHistoryContent>;
@@ -178,7 +178,7 @@ export interface ListDateGroupProps {
};
export interface ListItemProps extends SettlementsHistoryContent, SettlementsTransactionListContent {
periodType: SettlementPeriodType;
}
};
export interface AmountInfoWrapProps {
periodType: SettlementPeriodType;

View File

@@ -19,7 +19,7 @@ export const CalendarWrap = () => {
const userMid = useStore.getState().UserStore.mid;
const [mid, setMid] = useState<string>(userMid);
const [yearMonth, setYearMonth] = useState<string>(moment().format('YYYY-MM'));
const [yearMonth, setYearMonth] = useState<string>(moment().format('YYYYMM'));
const [totalCompletedAmount, setTotalCompletedAmount] = useState<number>(0);
const [totalScheduledAmount, setTotalScheduledAmount] = useState<number>(0);
const [scheduledList, setScheduledList] = useState<Array<SettlementDays | undefined>>([]);
@@ -62,11 +62,11 @@ export const CalendarWrap = () => {
setCompletedDateList(completedDateArr);
}
}).finally(() => {
let maxYearMonth = moment().format('YYYY-MM');
let maxYearMonthValue = moment(maxYearMonth).format('YYYYMM');
let newYearMonth = moment(yearMonth).add(1, 'month').format('YYYY-MM');
let newYearMonthValue = moment(newYearMonth).format('YYYYMM');
if(parseInt(newYearMonthValue) <= parseInt(maxYearMonthValue)){
let maxYearMonth = moment().format('YYYYMM');
// let maxYearMonthValue = moment(maxYearMonth).format('YYYYMM');
let newYearMonth = moment(yearMonth).add(1, 'month').format('YYYYMM');
// let newYearMonthValue = moment(newYearMonth).format('YYYYMM');
if(parseInt(newYearMonth) <= parseInt(maxYearMonth)){
setLastMonth(false);
}
else{
@@ -76,13 +76,13 @@ export const CalendarWrap = () => {
};
const onClickToMoveMonthPrev = () => {
let newYearMonth = moment(yearMonth).subtract(1, 'month').format('YYYY-MM');
let newYearMonth = moment(yearMonth).subtract(1, 'month').format('YYYYMM');
setYearMonth(newYearMonth);
};
const onClickToMoveMonthNext = () => {
let maxYearMonth = moment().format('YYYY-MM');
let maxYearMonth = moment().format('YYYYMM');
let maxYearMonthValue = moment(maxYearMonth).format('YYYYMM');
let newYearMonth = moment(yearMonth).add(1, 'month').format('YYYY-MM');
let newYearMonth = moment(yearMonth).add(1, 'month').format('YYYYMM');
let newYearMonthValue = moment(newYearMonth).format('YYYYMM');
if(parseInt(newYearMonthValue) <= parseInt(maxYearMonthValue)){
setYearMonth(newYearMonth);

View File

@@ -22,9 +22,13 @@ import {
SettlementPaymentMethod,
SettlementsHistoryContent,
ListDateGroupProps,
SettlementsTransactionListContent
SettlementsTransactionListContent,
SettlementsHistoryParams,
SettlementsHistoryResponse,
SettlementsHistorySummaryParams,
SettlementsHistorySummaryResponse
} from '../model/types';
import { SortTypeKeys } from '@/entities/common/model/types';
import { DefaultRequestPagination, SortTypeKeys } from '@/entities/common/model/types';
import { useStore } from '@/shared/model/store';
export interface ListWrapProps {
@@ -40,14 +44,14 @@ export const ListWrap = ({
const userMid = useStore.getState().UserStore.mid;
const [sortType, setSortType] = useState<SortTypeKeys>(SortTypeKeys.LATEST);
const [settlementDateListItems, setSettlementDateListItems] = useState<Record<string, Array<SettlementsHistoryContent>>>({});
const [transactionDatelistItems, setTransactionDateListItems] = useState<Record<string, Array<SettlementsTransactionListContent>>>({});
const [settlementDateListItems, setSettlementDateListItems] = useState<Array<SettlementsHistoryContent>>([]);
const [transactionDatelistItems, setTransactionDateListItems] = useState<Array<SettlementsTransactionListContent>>([]);
const [filterOn, setFilterOn] = useState<boolean>(false);
const [pageParam, setPageParam] = useState(DEFAULT_PAGE_PARAM);
const [pageParam, setPageParam] = useState<DefaultRequestPagination>(DEFAULT_PAGE_PARAM);
const [mid, setMid] = useState<string>(userMid);
const [periodType, setPeriodType] = useState<SettlementPeriodType>(SettlementPeriodType.SETTLEMENT_DATE);
const [startDate, setStartDate] = useState(startDateFromCalendar? moment(startDateFromCalendar).format('YYYY-MM-DD'): moment().format('YYYY-MM-DD'));
const [endDate, setEndDate] = useState(endDateFromCalendar? moment(endDateFromCalendar).format('YYYY-MM-DD'): moment().format('YYYY-MM-DD'));
const [startDate, setStartDate] = useState(startDateFromCalendar? moment(startDateFromCalendar).format('YYYYMMDD'): moment().format('YYYYMMDD'));
const [endDate, setEndDate] = useState(endDateFromCalendar? moment(endDateFromCalendar).format('YYYYMMDD'): moment().format('YYYYMMDD'));
const [paymentMethod, setPaymentMethod] = useState<SettlementPaymentMethod>(SettlementPaymentMethod.ALL);
const [settlementAmount, setSettlementAmount] = useState<number>();
@@ -61,7 +65,7 @@ export const ListWrap = ({
const [authFeeAmount, setAuthFeeAmount] = useState<number>();
const [vatAmount, setVatAmount] = useState<number>();
const [preSettlementCancelOffset, setPreSettlementCancelOffset] = useState<number>();
const [transactionIds, setTransactionIds] = useState<Array<string>>([]);
const [isOpenSummary, setIsOpenSummary] = useState<boolean>(false);
const { mutateAsync: settlementsHistory } = useSettlementsHistoryMutation();
@@ -83,24 +87,28 @@ export const ListWrap = ({
sortType?: SortTypeKeys,
val?: string
}) => {
let listSummaryParams = {
let listSummaryParams: SettlementsHistorySummaryParams = {
mid: mid,
periodType: periodType,
startDate: startDate,
endDate: endDate,
paymentMethod: paymentMethod,
};
pageParam.sortType = (option?.sortType)? option.sortType: sortType;
setPageParam(pageParam);
let listParams = {
let listParams: SettlementsHistoryParams = {
...listSummaryParams,
...{pagination: pageParam}
...{
page: pageParam
}
};
settlementsHistory(listParams).then((rs) => {
setSettlementDateListItems(assembleData(rs.content));
if(listParams.page){
listParams.page.sortType = (option?.sortType)? option.sortType: sortType;
setPageParam(listParams.page);
}
settlementsHistory(listParams).then((rs: SettlementsHistoryResponse) => {
setSettlementDateListItems(rs.content);
});
settlementsHistorySummary(listSummaryParams).then((rs) => {
settlementsHistorySummary(listSummaryParams).then((rs: SettlementsHistorySummaryResponse) => {
setSettlementAmount(rs.settlementAmount);
setTransactionAmount(rs.transactionAmount);
setPgFeeAmount(rs.pgFeeAmount);
@@ -113,27 +121,28 @@ export const ListWrap = ({
sortType?: SortTypeKeys,
val?: string
}) => {
pageParam.sortType = (option?.sortType)? option.sortType: sortType;
setPageParam(pageParam);
let params = {
mid: mid,
periodType: periodType,
startDate: startDate,
endDate: endDate,
paymentMethod: paymentMethod,
pagination: pageParam
page: pageParam
};
let summaryParams = {
...params,
transactionIds: [
"TXN_20250608_001",
"TXN_20250608_002"
]
...{
transactionIds: transactionIds
}
};
if(params.page){
params.page.sortType = (option?.sortType)? option.sortType: sortType;
setPageParam(params.page);
}
settlementsTransactionList(params).then((rs) => {
setTransactionDateListItems(assembleData(rs.content));
setTransactionDateListItems(rs.content);
});
settlementsTransactionSummary(summaryParams).then((rs) => {
setSettlementAmount(rs.settlementAmount);
@@ -145,22 +154,7 @@ export const ListWrap = ({
setPreSettlementCancelOffset(rs.preSettlementCancelOffset);
});
};
const assembleData = (content: Array<SettlementsHistoryContent>) => {
let data: any = {};
if(content && content.length > 0){
for(let i=0;i<content?.length;i++){
let groupDate = moment(content[i]?.settlementDate).format('YYYYMMDD');
if(!!groupDate && !data.hasOwnProperty(groupDate)){
data[groupDate] = [];
}
if(!!groupDate && data.hasOwnProperty(groupDate)){
data[groupDate].push(content[i]);
}
}
}
return data;
};
const onClickToSort = (sort: SortTypeKeys) => {
setSortType(sort);
if(periodType === SettlementPeriodType.SETTLEMENT_DATE){
@@ -185,40 +179,111 @@ export const ListWrap = ({
}
}
};
useEffect(() => {
setTransactionIds([
'TXN_20250608_001',
'TXN_20250608_002'
]);
}, []);
useEffect(() => {
callList();
}, [periodType]);
const getSettlementDateListDateGroup = () => {
let rs = [];
if(Object.keys(settlementDateListItems).length > 0){
for (const [key, value] of Object.entries(settlementDateListItems)) {
rs.push(
<ListDateGroup
key={ key }
periodType={ periodType }
date={ key }
items={ value }
></ListDateGroup>
);
let date = '';
let list: Array<SettlementsHistoryContent> = [];
if(settlementDateListItems){
}
for(let i=0;i<settlementDateListItems.length;i++){
let listItem = settlementDateListItems[i];
if(!!listItem){
let settlementDateTime = listItem?.settlementDate;
let settlementDate = settlementDateTime?.substr(0, 8);
if(settlementDateListItems[i] && settlementDate){
if(i === 0){
date = settlementDate;
}
if(date !== settlementDate){
date = settlementDate;
if(list.length > 0){
rs.push(
<ListDateGroup
key={ date + '-' + i }
periodType={ periodType }
date={ date }
items={ list }
></ListDateGroup>
);
}
list = [];
}
list.push(listItem);
}
}
}
if(list.length > 0){
rs.push(
<ListDateGroup
key={ date + '-last' }
periodType={ periodType }
date={ date }
items={ list }
></ListDateGroup>
);
}
return rs;
};
const getTransactionDateListDateGroup = () => {
let rs = [];
if(Object.keys(transactionDatelistItems).length > 0){
for (const [key, value] of Object.entries(transactionDatelistItems)) {
rs.push(
<ListDateGroup
key={ key }
periodType={ periodType }
date={ key }
items={ value }
></ListDateGroup>
);
let date = '';
let list: Array<SettlementsTransactionListContent> = [];
for(let i=0;i<transactionDatelistItems.length;i++){
let listItem = transactionDatelistItems[i];
if(!!listItem){
let settlementDateTime = listItem.settlementDate;
let settlementDate = settlementDateTime?.substr(0, 8);
if(settlementDate){
if(i === 0){
date = settlementDate;
}
if(date !== settlementDate){
date = settlementDate;
if(list.length > 0){
rs.push(
<ListDateGroup
key={ date + '-' + i }
periodType={ periodType }
date={ date }
items={ list }
></ListDateGroup>
);
}
list = [];
}
list.push(listItem);
}
}
}
if(list.length > 0){
rs.push(
<ListDateGroup
key={ date + '-last' }
periodType={ periodType }
date={ date }
items={ list }
></ListDateGroup>
);
}
return rs;
};
const onClickToOpenFilter = () => {

View File

@@ -0,0 +1,29 @@
import axios from 'axios';
import { API_URL_TRANSACTION } from '@/shared/api/api-url-transaction';
import { resultify } from '@/shared/lib/resultify';
import { CBDCAxiosError } from '@/shared/@types/error';
import {
CashReceiptReceiptDownloadParams,
CashReceiptReceiptDownloadResponse
} from '../model/types';
import {
useMutation,
UseMutationOptions
} from '@tanstack/react-query';
export const cashReceiptReceiptDownload = (params: CashReceiptReceiptDownloadParams) => {
return resultify(
axios.post<CashReceiptReceiptDownloadResponse>(API_URL_TRANSACTION.cashReceiptReceiptDownload(), params),
);
};
export const useCashReceiptReceiptDownloadMutation = (options?: UseMutationOptions<CashReceiptReceiptDownloadResponse, CBDCAxiosError, CashReceiptReceiptDownloadParams>) => {
const mutation = useMutation<CashReceiptReceiptDownloadResponse, CBDCAxiosError, CashReceiptReceiptDownloadParams>({
...options,
mutationFn: (params: CashReceiptReceiptDownloadParams) => cashReceiptReceiptDownload(params),
});
return {
...mutation,
};
};

View File

@@ -0,0 +1,29 @@
import axios from 'axios';
import { API_URL_TRANSACTION } from '@/shared/api/api-url-transaction';
import { resultify } from '@/shared/lib/resultify';
import { CBDCAxiosError } from '@/shared/@types/error';
import {
CashReceiptSummaryParams,
CashReceiptSummaryResponse
} from '../model/types';
import {
useMutation,
UseMutationOptions
} from '@tanstack/react-query';
export const cashReceiptSummary = (params: CashReceiptSummaryParams) => {
return resultify(
axios.post<CashReceiptSummaryResponse>(API_URL_TRANSACTION.cashReceiptSummary(), params),
);
};
export const useCashReceiptSummaryMutation = (options?: UseMutationOptions<CashReceiptSummaryResponse, CBDCAxiosError, CashReceiptSummaryParams>) => {
const mutation = useMutation<CashReceiptSummaryResponse, CBDCAxiosError, CashReceiptSummaryParams>({
...options,
mutationFn: (params: CashReceiptSummaryParams) => cashReceiptSummary(params),
});
return {
...mutation,
};
};

View File

@@ -3,13 +3,13 @@ import {
AllTransactionSearchCl,
AllTransactionServiceCode,
AllTransactionStatusCode,
CashReceiptPurposeType,
CashReceiptTransactionType,
CashReceiptProcessResult,
BillingPaymentMethod,
BillingProcessResult,
BillingRequestStatus,
BillingSearchType,
CashReceiptIssueStatus,
CashReceiptProcessResult,
CashReceiptPurposeType,
EscrowDeliveryStatus,
EscrowSearchType,
EscrowSettlementStatus
@@ -145,10 +145,10 @@ export const CashReceiptPurposeTypeBtnGroup = [
{name: '소득공제', value: CashReceiptPurposeType.INCOME_DEDUCTION},
{name: '지출증빙', value: CashReceiptPurposeType.EXPENSE_PROOF},
];
export const CashReceiptIssueStatusBtnGroup = [
{name: '전체', value: CashReceiptIssueStatus.ALL},
{name: '승인', value: CashReceiptIssueStatus.APPROVAL},
{name: '취소', value: CashReceiptIssueStatus.CANCEL},
export const CashReceiptTransactionTypeBtnGroup = [
{name: '전체', value: CashReceiptTransactionType.ALL},
{name: '승인', value: CashReceiptTransactionType.APPROVAL},
{name: '취소', value: CashReceiptTransactionType.CANCEL},
];
export const CashReceiptProcessResultBtnGroup = [
{name: '전체', value: CashReceiptProcessResult.ALL},

View File

@@ -1,4 +1,10 @@
import { DefaulResponsePagination, DefaultRequestPagination, SortTypeKeys, SuccessResult } from '@/entities/common/model/types';
import {
DefaulResponsePagination,
DefaultRequestPagination,
SortTypeKeys,
SuccessResult
} from '@/entities/common/model/types';
import { MerchantInfo } from '@/entities/payment/model/types';
export enum CancelTabKeys {
All = 'All',
@@ -68,7 +74,7 @@ export enum CashReceiptPurposeType {
INCOME_DEDUCTION = 'INCOME_DEDUCTION',
EXPENSE_PROOF = 'EXPENSE_PROOF',
};
export enum CashReceiptIssueStatus {
export enum CashReceiptTransactionType {
ALL = 'ALL',
APPROVAL = 'APPROVAL',
CANCEL = 'CANCEL',
@@ -82,6 +88,10 @@ export enum CashReceiptProcessResult {
REQUEST_FAIL = 'REQUEST_FAIL',
ISSUE_FAIL = 'ISSUE_FAIL',
};
export enum CashReceiptSearchNumberType {
APPROVAL_NUMBER = 'APPROVAL_NUMBER',
ISSUE_NUMBER = 'ISSUE_NUMBER'
};
export enum EscrowSearchType {
ALL = 'ALL',
ORDER_NUMBER = 'ORDER_NUMBER',
@@ -136,19 +146,19 @@ export interface ListDateGroupProps {
};
export interface AllTransactionListProps {
transactionCategory: TransactionCategory;
listItems: Array<any>;
listItems: Array<ListItemProps>;
};
export interface CashReceiptListProps {
transactionCategory: TransactionCategory;
listItems: Record<string, Array<ListItemProps>>
listItems: Array<ListItemProps>;
};
export interface EscrowListProps {
transactionCategory: TransactionCategory;
listItems: Record<string, Array<ListItemProps>>
listItems: Array<ListItemProps>;
};
export interface BillingListProps {
transactionCategory: TransactionCategory;
listItems: Record<string, Array<ListItemProps>>
listItems: Array<ListItemProps>;
};
export interface AllTransactionListItem {
tid?: string;
@@ -162,23 +172,25 @@ export interface AllTransactionListItem {
goodsAmount?: number;
};
export interface CashReceiptListItem {
id?: number;
amount?: number;
transactionDate?: string;
transactionTime?: string;
customerName?: string;
issueNumber?: number;
issueStatus?: string;
paymentMethod?: string;
issueNumber?: string;
approvalNumber?: string;
amount?: number;
processResult?: string;
transactionDateTime?: string;
paymentMethod?: string;
transactionType?: string;
};
export interface EscrowListItem {
id?: number;
tid?: string;
mid?: string;
transactionDateTime?: string;
transactionDate?: string;
transactionTime?: string;
customerName?: string;
issueNumber?: number;
issueNumber?: string;
transactionAmount?: number;
deliveryStatus?: string;
deliveryStatus?: EscrowDeliveryStatus;
settlementStatus?: string;
cancelStatus?: string;
};
@@ -190,16 +202,12 @@ export interface BillingItem {
billKey?: string;
tid?: string;
orderNumber?: string;
approvalNumber?: string;
approvalDate?: string;
transactionDateTime?: string;
transactionDate?: string;
transactionTime?: string;
transactionAmount?: number;
requestStatus?: string;
processResult?: string;
paymentMethod?: string;
installmentMonth?: string;
productName?: string;
buyerName?: string;
};
export interface AllTransactionListResponse extends DefaulResponsePagination {
content: Array<ListItemProps>;
@@ -212,12 +220,9 @@ export interface EscrowListResponse extends DefaulResponsePagination {
};
export interface BillingListResponse extends DefaulResponsePagination {
content: Array<ListItemProps>;
};
export interface AllTransactionListSummaryParams extends AllTransactionListParams {
}
export interface AllTransactionListSummaryParams extends AllTransactionListParams {}
export interface AllTransactionListSummaryResponse {
totalCount: number;
@@ -243,15 +248,36 @@ export interface AllTransactionListParams {
};
export interface CashReceiptListParams {
mid: string;
startDate: string;
endDate: string;
purposeType: CashReceiptPurposeType;
issueStatus: string;
processResult: string;
pagination: DefaultRequestPagination
mid?: string;
startDate?: string;
endDate?: string;
purposeType?: CashReceiptPurposeType;
transactionType?: CashReceiptTransactionType;
processResult?: CashReceiptProcessResult;
searchNumberType?: CashReceiptSearchNumberType;
searchNumber?: string;
page?: DefaultRequestPagination
};
export interface CashReceiptSummaryParams extends CashReceiptListParams {};
export interface CashReceiptSummaryResponse {
approvalCount: number;
approvalAmount: number;
cancelCount: number;
cancelAmount: number;
totalCount: number;
};
export interface CashReceiptReceiptDownloadParams {
approvalNumber: string;
};
export interface CashReceiptReceiptDownloadResponse {
issueInfo: IssueInfo;
merchantInfo: MerchantInfo;
transactionInfo: TransactionInfo;
amountInfo: AmountInfo;
customerInfo: CustomerInfo;
productInfo: ProductInfo;
};
export interface EscrowListParams {
mid?: string;
searchType?: string;
@@ -262,7 +288,7 @@ export interface EscrowListParams {
settlementStatus?: string;
minAmount?: number;
maxAmount?: number;
pagination?: DefaultRequestPagination;
page?: DefaultRequestPagination;
};
export interface BillingListParams {
@@ -276,7 +302,7 @@ export interface BillingListParams {
paymentMethod?: string;
minAmount?: number;
maxAmount?: number;
pagination?: DefaultRequestPagination
page?: DefaultRequestPagination
};
export interface AllTransactionDetailParams {
@@ -320,7 +346,7 @@ export interface ImportantInfo {
requestDate?: string;
cancelDate?: string;
goodsName?: string;
orderNumber?: string;
};
export interface PaymentInfo {
@@ -387,15 +413,24 @@ export interface PartCancelInfo {
};
export interface IssueInfo {
approvalNumber?: number;
issueNumber?: number;
issueDateTime?: string;
approvalNumber?: string;
issueDate?: string;
issueTime?: string;
purpose?: CashReceiptPurposeType;
paymentMethod?: string;
productName?: string;
transmissionStatus?: string;
transactionType?: string;
};
export interface CustomerInfo {
customerName: string;
customerIdentity: string;
};
export interface ProductInfo {
productName: string;
};
export interface DetailInfo {
cancelDate?: string;
cancelApprovalNumber?: number;
@@ -569,18 +604,22 @@ export interface AllTransactionFilterProps extends FilterProps {
serviceCodeOptions?: Array<Record<string, any>>;
};
export interface CashReceiptFilterProps extends FilterProps {
mid : string;
mid: string;
startDate: string;
endDate: string;
purposeType: CashReceiptPurposeType;
issueStatus: CashReceiptIssueStatus;
transactionType: CashReceiptTransactionType;
processResult: CashReceiptProcessResult;
searchNumberType: CashReceiptSearchNumberType;
searchNumber: string;
setMid: (mid: string) => void;
setStartDate: (startDate: string) => void;
setEndDate: (endDate: string) => void;
setPurposeType: (purposeType: CashReceiptPurposeType) => void;
setIssueStatus: (issueStatus: CashReceiptIssueStatus) => void;
setTransactionType: (issueStatus: CashReceiptTransactionType) => void;
setProcessResult: (processResult: CashReceiptProcessResult) => void;
setSearchNumberType: (searchNumberType: CashReceiptSearchNumberType) => void;
setSearchNumber: (searchNumber: string) => void;
};
export interface EscrowFilterProps extends FilterProps {
mid: string;

View File

@@ -1,4 +1,4 @@
import { AllTransactionListProps } from '../model/types';
import { AllTransactionListProps, ListItemProps } from '../model/types';
import { ListDateGroup } from './list-date-group';
export const AllTransactionList = ({
@@ -8,28 +8,33 @@ export const AllTransactionList = ({
const getListDateGroup = () => {
let rs = [];
let date = '';
let list = [];
let list: Array<ListItemProps> = [];
for(let i=0;i<listItems.length;i++){
let transactionDateTime = listItems[i].transactionDateTime;
let transactionDate = transactionDateTime.substr(0, 8);
if(i === 0){
date = transactionDate;
}
if(date !== transactionDate){
date = transactionDate;
if(list.length > 0){
rs.push(
<ListDateGroup
transactionCategory={ transactionCategory }
key={ date + '-' + i }
date={ date }
items={ list }
></ListDateGroup>
)
let items = listItems[i];
if(!!items){
let transactionDateTime = items.transactionDateTime;
let transactionDate = transactionDateTime?.substr(0, 8);
if(!!transactionDate){
if(i === 0){
date = transactionDate;
}
if(date !== transactionDate){
date = transactionDate;
if(list.length > 0){
rs.push(
<ListDateGroup
transactionCategory={ transactionCategory }
key={ date + '-' + i }
date={ date }
items={ list }
></ListDateGroup>
);
}
list = [];
}
list.push(items);
}
list = [];
}
list.push(listItems[i]);
}
if(list.length > 0){
rs.push(
@@ -39,7 +44,7 @@ export const AllTransactionList = ({
date={ date }
items={ list }
></ListDateGroup>
)
);
}
return rs;
};

View File

@@ -11,15 +11,43 @@ export const BillingList = ({
const getListDateGroup = () => {
let rs = [];
for (const [key, value] of Object.entries(listItems)) {
let date = '';
let list = [];
for(let i=0;i<listItems.length;i++){
let items = listItems[i];
if(!!items){
let transactionDate = items.transactionDate;
if(!!transactionDate){
if(i === 0){
date = transactionDate;
}
if(date !== transactionDate){
date = transactionDate;
if(list.length > 0){
rs.push(
<ListDateGroup
transactionCategory={ transactionCategory }
key={ date + '-' + i }
date={ date }
items={ list }
></ListDateGroup>
);
}
list = [];
}
list.push(items);
}
}
}
if(list.length > 0){
rs.push(
<ListDateGroup
transactionCategory={ transactionCategory }
key={ key }
date={ key }
items={ value }
key={ date + '-last' }
date={ date }
items={ list }
></ListDateGroup>
);
);
}
return rs;
};

View File

@@ -11,15 +11,43 @@ export const CashReceiptList = ({
const getListDateGroup = () => {
let rs = [];
for (const [key, value] of Object.entries(listItems)) {
let date = '';
let list = [];
for(let i=0;i<listItems.length;i++){
let items = listItems[i];
if(!!items){
let transactionDate = items.transactionDate;
if(!!transactionDate){
if(i === 0){
date = transactionDate;
}
if(date !== transactionDate){
date = transactionDate;
if(list.length > 0){
rs.push(
<ListDateGroup
transactionCategory={ transactionCategory }
key={ date + '-' + i }
date={ date }
items={ list }
></ListDateGroup>
);
}
list = [];
}
list.push(items);
}
}
}
if(list.length > 0){
rs.push(
<ListDateGroup
transactionCategory={ transactionCategory }
key={ key }
date={ key }
items={ value }
key={ date + '-last' }
date={ date }
items={ list }
></ListDateGroup>
);
);
}
return rs;
};
@@ -31,13 +59,13 @@ export const CashReceiptList = ({
return (
<>
<div className="transaction-list">
{ getListDateGroup() }
<div className="apply-row bottom-padding">
<button
className="btn-50 btn-blue flex-1"
onClick={ () => onClickToNavigate() }
></button>
</div>
{ getListDateGroup() }
</div>
<div className="apply-row">
<button
className="btn-50 btn-blue flex-1"
onClick={ () => onClickToNavigate() }
></button>
</div>
</>
);

View File

@@ -8,19 +8,47 @@ export const EscrowList = ({
const getListDateGroup = () => {
let rs = [];
for (const [key, value] of Object.entries(listItems)) {
let date = '';
let list = [];
for(let i=0;i<listItems.length;i++){
let items = listItems[i];
if(!!items){
let transactionDate = items.transactionDate;
if(!!transactionDate){
if(i === 0){
date = transactionDate;
}
if(date !== transactionDate){
date = transactionDate;
if(list.length > 0){
rs.push(
<ListDateGroup
transactionCategory={ transactionCategory }
key={ date + '-' + i }
date={ date }
items={ list }
></ListDateGroup>
);
}
list = [];
}
list.push(items);
}
}
}
if(list.length > 0){
rs.push(
<ListDateGroup
transactionCategory={ transactionCategory }
key={ key }
date={ key }
items={ value }
key={ date + '-last' }
date={ date }
items={ list }
></ListDateGroup>
);
);
}
return rs;
};
return (
<>
<div className="transaction-list">

View File

@@ -8,14 +8,15 @@ import { FilterCalendar } from '@/shared/ui/filter/calendar';
import { FilterButtonGroups } from '@/shared/ui/filter/button-groups';
import {
CashReceiptPurposeTypeBtnGroup,
CashReceiptIssueStatusBtnGroup,
CashReceiptTransactionTypeBtnGroup,
CashReceiptProcessResultBtnGroup
} from '@/entities/transaction/model/contant';
import {
CashReceiptFilterProps,
CashReceiptPurposeType,
CashReceiptIssueStatus,
CashReceiptProcessResult
CashReceiptTransactionType,
CashReceiptProcessResult,
CashReceiptSearchNumberType
} from '../../model/types';
import {
FilterMotionDuration,
@@ -31,22 +32,25 @@ export const CashReceiptFilter = ({
startDate,
endDate,
purposeType,
issueStatus,
transactionType,
processResult,
searchNumberType,
setMid,
setStartDate,
setEndDate,
setPurposeType,
setIssueStatus,
setProcessResult
setTransactionType,
setProcessResult,
setSearchNumberType
}: CashReceiptFilterProps) => {
const [filterMid, setFilterMid] = useState<string>(mid);
const [filterStartDate, setFilterStartDate] = useState<string>(startDate);
const [filterEndDate, setFilterEndDate] = useState<string>(endDate);
const [filterPurposeType, setFilterPurposeType] = useState<CashReceiptPurposeType>(purposeType);
const [filterIssueStatus, setFilterIssueStatus] = useState<CashReceiptIssueStatus>(issueStatus);
const [filterTransactionType, setFilterTransactionType] = useState<CashReceiptTransactionType>(transactionType);
const [filterProcessResult, setFilterProcessResult] = useState<CashReceiptProcessResult>(processResult);
const [filterSearchNumberType, setFilterSearchNumberType] = useState<CashReceiptSearchNumberType>(searchNumberType);
const [filterIssueType, setFilterIssueType] = useState<string>('');
const [filterIssueNumber, setFilterIssueNumber] = useState<string>('');
@@ -70,14 +74,14 @@ export const CashReceiptFilter = ({
setStartDate(filterStartDate);
setEndDate(filterEndDate);
setPurposeType(filterPurposeType);
setIssueStatus(filterIssueStatus);
setTransactionType(filterTransactionType);
setProcessResult(filterProcessResult);
onClickToClose();
};
useEffect(() => {
setFilterIssueStatus(issueStatus);
}, [issueStatus]);
setFilterTransactionType(transactionType);
}, [transactionType]);
return (
<>
@@ -129,9 +133,9 @@ export const CashReceiptFilter = ({
></FilterButtonGroups>
<FilterButtonGroups
title='거래구분'
activeValue={ filterIssueStatus }
btnGroups={ CashReceiptIssueStatusBtnGroup }
setter={ setFilterIssueStatus }
activeValue={ filterTransactionType }
btnGroups={ CashReceiptTransactionTypeBtnGroup }
setter={ setFilterTransactionType }
></FilterButtonGroups>
<FilterButtonGroups
title='진행상태'
@@ -141,8 +145,8 @@ export const CashReceiptFilter = ({
></FilterButtonGroups>
<FilterSelectInput
title='승인번호/발행번호'
selectValue={ filterIssueType }
selectSetter={ setFilterIssueType }
selectValue={ filterSearchNumberType }
selectSetter={ setFilterSearchNumberType }
selectOptions={ issueTypeOptionsGroup }
inputValue={ filterIssueNumber }
inputSetter={ setFilterIssueNumber }

View File

@@ -51,11 +51,9 @@ export const ListDateGroup = ({
serviceDetailName={ items[i]?.serviceDetailName }
goodsAmount={ items[i]?.goodsAmount }
id={ items[i]?.id }
amount={ items[i]?.amount }
customerName={ items[i]?.customerName }
issueNumber={ items[i]?.issueNumber }
issueStatus={ items[i]?.issueStatus }
paymentMethod={ items[i]?.paymentMethod }
processResult={ items[i]?.processResult }
transactionDateTime={ items[i]?.transactionDateTime }

View File

@@ -11,8 +11,8 @@ export const ListItem = ({
tid, mid, statusCode,
installmentMonth, serviceName, serviceCode,
serviceDetailName, goodsAmount,
id, amount, customerName, issueNumber,
issueStatus, paymentMethod, processResult,
amount, customerName, issueNumber,
paymentMethod, processResult,
transactionDateTime, transactionAmount,
deliveryStatus, settlementStatus,
cancelStatus, billKey, orderNumber
@@ -173,7 +173,7 @@ export const ListItem = ({
<div className="transaction-details">
<span>{ getTime() }</span>
<span className="separator">|</span>
<span>{ issueStatus }</span>
<span>{ }</span>
<span className="separator">|</span>
<span>{ paymentMethod }</span>
<span className="separator">|</span>

View File

@@ -19,11 +19,11 @@ export const IssueInfoSection = ({
</li>
<li className="kv-row">
<span className="k"></span>
<span className="v">{ issueInfo?.issueNumber }</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k"></span>
<span className="v">{ moment(issueInfo?.issueDateTime).format('YYYY.MM.DD HH:mm:ss') }</span>
<span className="v">{ }</span>
</li>
<li className="kv-row">
<span className="k"></span>

View File

@@ -0,0 +1,29 @@
import axios from 'axios';
import { API_URL_USER } from '@/shared/api/api-url-user';
import { resultify } from '@/shared/lib/resultify';
import { CBDCAxiosError } from '@/shared/@types/error';
import {
ShortcutDefaultParams,
ShortcutDefaultResponse
} from '../model/types';
import {
useMutation,
UseMutationOptions
} from '@tanstack/react-query';
export const shortcutDefault = (params: ShortcutDefaultParams) => {
return resultify(
axios.post<ShortcutDefaultResponse>(API_URL_USER.shortcutDefault(), params),
);
};
export const useShortcutDefaultMutation = (options?: UseMutationOptions<ShortcutDefaultResponse, CBDCAxiosError, ShortcutDefaultParams>) => {
const mutation = useMutation<ShortcutDefaultResponse, CBDCAxiosError, ShortcutDefaultParams>({
...options,
mutationFn: (params: ShortcutDefaultParams) => shortcutDefault(params),
});
return {
...mutation,
};
};

View File

@@ -0,0 +1,29 @@
import axios from 'axios';
import { API_URL_USER } from '@/shared/api/api-url-user';
import { resultify } from '@/shared/lib/resultify';
import { CBDCAxiosError } from '@/shared/@types/error';
import {
ShortcutSaveParams,
ShortcutSaveResponse
} from '../model/types';
import {
useMutation,
UseMutationOptions
} from '@tanstack/react-query';
export const shortcutSave = (params: ShortcutSaveParams) => {
return resultify(
axios.post<ShortcutSaveResponse>(API_URL_USER.shortcutSave(), params),
);
};
export const useShortcutSaveMutation = (options?: UseMutationOptions<ShortcutSaveResponse, CBDCAxiosError, ShortcutSaveParams>) => {
const mutation = useMutation<ShortcutSaveResponse, CBDCAxiosError, ShortcutSaveParams>({
...options,
mutationFn: (params: ShortcutSaveParams) => shortcutSave(params),
});
return {
...mutation,
};
};

View File

@@ -0,0 +1,29 @@
import axios from 'axios';
import { API_URL_USER } from '@/shared/api/api-url-user';
import { resultify } from '@/shared/lib/resultify';
import { CBDCAxiosError } from '@/shared/@types/error';
import {
ShortcutUserParams,
ShortcutUserResponse
} from '../model/types';
import {
useMutation,
UseMutationOptions
} from '@tanstack/react-query';
export const shortcutUser = (params: ShortcutUserParams) => {
return resultify(
axios.post<ShortcutUserResponse>(API_URL_USER.shortcutUser(), params),
);
};
export const useShortcutUserMutation = (options?: UseMutationOptions<ShortcutUserResponse, CBDCAxiosError, ShortcutUserParams>) => {
const mutation = useMutation<ShortcutUserResponse, CBDCAxiosError, ShortcutUserParams>({
...options,
mutationFn: (params: ShortcutUserParams) => shortcutUser(params),
});
return {
...mutation,
};
};

View File

@@ -29,10 +29,12 @@ export interface LoginResponse {
};
export interface UserFavorite {
title?: string;
img?: string;
path?: string;
menuId?: string;
seq?: number;
menuId?: number;
menuName?: string;
menuNameEng?: string;
iconFilePath?: string | null;
programPath?: string;
};
export interface UserInfo extends LoginResponse {
status: boolean;
@@ -221,9 +223,40 @@ export interface AuthMethodItem {
authMethodType: string;
sequence: number;
content: string;
}
};
export interface UserAuthMethodData {
emails: Array<AuthMethodItem>;
phones: Array<AuthMethodItem>;
}
};
export interface ShortcutDefaultParams {
usrid: string;
};
export interface ShortcutDefaultResponse {
shortcuts: Array<Shortcuts>;
usingDefault: boolean;
};
export interface Shortcuts {
seq: number;
menuId: number;
menuName: string;
menuNameEng: string;
iconFilePath: string;
programPath: string;
};
export interface ShortcutSaveParams {
usrid: string;
isDefault: boolean;
menuIds: Array<number | undefined>;
};
export interface ShortcutSaveResponse {
};
export interface ShortcutUserParams {
usrid: string;
};
export interface ShortcutUserResponse {
shortcuts: Array<Shortcuts>;
usingDefault: boolean;
};