현금영수증 리스트

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

@@ -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>