From d5c12f4b6997bd92226d394743cc3cd0b63537e2 Mon Sep 17 00:00:00 2001 From: "focp212@naver.com" Date: Thu, 25 Sep 2025 14:01:03 +0900 Subject: [PATCH] =?UTF-8?q?=EC=84=B8=EA=B8=88=EA=B3=84=EC=82=B0=EC=84=9C?= =?UTF-8?q?=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=20=EC=83=81=EC=84=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/info-wrap/escrow-info-wrap.tsx | 10 +- .../tax/api/use-invoice-detail-mutation.ts | 29 ---- .../tax/api/use-invoice-list-mutation.ts | 29 ---- src/entities/tax/model/types.ts | 96 ------------- .../tax/ui/detail-amount-info-section.tsx | 47 ------- .../tax/ui/detail-supplier-info-section.tsx | 26 ---- src/entities/tax/ui/invoice-list.tsx | 29 ---- src/entities/tax/ui/tax-tab.tsx | 37 ----- .../api/use-vat-return-detail-mutation.ts | 29 ++++ .../api/use-vat-return-list-mutation.ts | 29 ++++ src/entities/vat-return/model/types.ts | 81 +++++++++++ .../ui/list-date-group.tsx | 0 .../ui/list-filter.tsx} | 31 ++-- .../{tax => vat-return}/ui/list-item.tsx | 6 +- .../ui/list-wrap.tsx} | 99 +++++-------- .../vat-return/ui/section/amount-section.tsx | 85 +++++++++++ .../ui/section/issue-section.tsx} | 29 ++-- .../ui/section/receiver-section.tsx} | 20 +-- .../ui/section/supplier-section.tsx | 32 +++++ .../ui/var-reference-req-fail.tsx | 0 .../ui/vat-reference-req-success.tsx | 0 .../ui/vat-reference-wrap.tsx | 0 src/entities/vat-return/ui/vat-return-tab.tsx | 37 +++++ src/pages/tax/invoice/detail-page.tsx | 133 ------------------ src/pages/tax/tax-pages.tsx | 20 --- src/pages/vat-return/detail-page.tsx | 82 +++++++++++ .../{tax/invoice => vat-return}/list-page.tsx | 14 +- .../vat-reference-page.tsx | 10 +- src/pages/vat-return/vat-return-pages.tsx | 18 +++ .../{api-url-tax.ts => api-url-vat-return.ts} | 8 +- src/shared/configs/sentry/index.tsx | 4 +- src/shared/constants/paths.ts | 19 +-- src/shared/constants/route-names.ts | 11 +- src/shared/ui/menu/index.tsx | 4 +- 34 files changed, 518 insertions(+), 586 deletions(-) delete mode 100644 src/entities/tax/api/use-invoice-detail-mutation.ts delete mode 100644 src/entities/tax/api/use-invoice-list-mutation.ts delete mode 100644 src/entities/tax/model/types.ts delete mode 100644 src/entities/tax/ui/detail-amount-info-section.tsx delete mode 100644 src/entities/tax/ui/detail-supplier-info-section.tsx delete mode 100644 src/entities/tax/ui/invoice-list.tsx delete mode 100644 src/entities/tax/ui/tax-tab.tsx create mode 100644 src/entities/vat-return/api/use-vat-return-detail-mutation.ts create mode 100644 src/entities/vat-return/api/use-vat-return-list-mutation.ts create mode 100644 src/entities/vat-return/model/types.ts rename src/entities/{tax => vat-return}/ui/list-date-group.tsx (100%) rename src/entities/{tax/ui/invoice-filter.tsx => vat-return/ui/list-filter.tsx} (85%) rename src/entities/{tax => vat-return}/ui/list-item.tsx (93%) rename src/entities/{tax/ui/invoice-list-wrap.tsx => vat-return/ui/list-wrap.tsx} (56%) create mode 100644 src/entities/vat-return/ui/section/amount-section.tsx rename src/entities/{tax/ui/detail-publish-info-section.tsx => vat-return/ui/section/issue-section.tsx} (53%) rename src/entities/{tax/ui/detail-receiver-info-section.tsx => vat-return/ui/section/receiver-section.tsx} (53%) create mode 100644 src/entities/vat-return/ui/section/supplier-section.tsx rename src/entities/{tax => vat-return}/ui/var-reference-req-fail.tsx (100%) rename src/entities/{tax => vat-return}/ui/vat-reference-req-success.tsx (100%) rename src/entities/{tax => vat-return}/ui/vat-reference-wrap.tsx (100%) create mode 100644 src/entities/vat-return/ui/vat-return-tab.tsx delete mode 100644 src/pages/tax/invoice/detail-page.tsx delete mode 100644 src/pages/tax/tax-pages.tsx create mode 100644 src/pages/vat-return/detail-page.tsx rename src/pages/{tax/invoice => vat-return}/list-page.tsx (62%) rename src/pages/{tax/vat-reference => vat-return}/vat-reference-page.tsx (67%) create mode 100644 src/pages/vat-return/vat-return-pages.tsx rename src/shared/api/{api-url-tax.ts => api-url-vat-return.ts} (55%) diff --git a/src/entities/merchant/ui/info-wrap/escrow-info-wrap.tsx b/src/entities/merchant/ui/info-wrap/escrow-info-wrap.tsx index 0485233..c15f677 100644 --- a/src/entities/merchant/ui/info-wrap/escrow-info-wrap.tsx +++ b/src/entities/merchant/ui/info-wrap/escrow-info-wrap.tsx @@ -26,10 +26,10 @@ export const EscrowInfoWrap = ({ const [isOpen, setIsOpen] = useState(false); - const opeSection = () => { - const staus = !isOpen; - setIsOpen(staus); - if(!!staus){ + const openSection = () => { + const status = !isOpen; + setIsOpen(status); + if(!!status){ setOpenChild(type); } else { @@ -47,7 +47,7 @@ export const EscrowInfoWrap = ({ <>
opeSection() } + onClick={ () => openSection() } > { title }
diff --git a/src/entities/tax/api/use-invoice-detail-mutation.ts b/src/entities/tax/api/use-invoice-detail-mutation.ts deleted file mode 100644 index 49f9447..0000000 --- a/src/entities/tax/api/use-invoice-detail-mutation.ts +++ /dev/null @@ -1,29 +0,0 @@ -import axios from 'axios'; -import { API_URL_TAX } from '@/shared/api/api-url-tax'; -import { resultify } from '@/shared/lib/resultify'; -import { CBDCAxiosError } from '@/shared/@types/error'; -import { - InvoiceDetailParams, - InvoiceDetailResponse -} from '../model/types'; -import { - useMutation, - UseMutationOptions -} from '@tanstack/react-query'; - -export const invoiceDetail = (params: InvoiceDetailParams) => { - return resultify( - axios.post(API_URL_TAX.invoiceDetail(), params), - ); -}; - -export const useInvoiceDetailMutation = (options?: UseMutationOptions) => { - const mutation = useMutation({ - ...options, - mutationFn: (params: InvoiceDetailParams) => invoiceDetail(params), - }); - - return { - ...mutation, - }; -}; diff --git a/src/entities/tax/api/use-invoice-list-mutation.ts b/src/entities/tax/api/use-invoice-list-mutation.ts deleted file mode 100644 index 6353b42..0000000 --- a/src/entities/tax/api/use-invoice-list-mutation.ts +++ /dev/null @@ -1,29 +0,0 @@ -import axios from 'axios'; -import { API_URL_TAX } from '@/shared/api/api-url-tax'; -import { resultify } from '@/shared/lib/resultify'; -import { CBDCAxiosError } from '@/shared/@types/error'; -import { - InvoiceListResponse, - InvoiceListParams, -} from '../model/types'; -import { - useMutation, - UseMutationOptions -} from '@tanstack/react-query'; - -export const invoiceList = (params: InvoiceListParams) => { - return resultify( - axios.post(API_URL_TAX.invoiceList(), params), - ); -}; - -export const useInvoiceListMutation = (options?: UseMutationOptions) => { - const mutation = useMutation({ - ...options, - mutationFn: (params: InvoiceListParams) => invoiceList(params), - }); - - return { - ...mutation, - }; -}; diff --git a/src/entities/tax/model/types.ts b/src/entities/tax/model/types.ts deleted file mode 100644 index edb74ad..0000000 --- a/src/entities/tax/model/types.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { DefaulResponsePagination, DefaultRequestPagination } from '@/entities/common/model/types'; - - -export enum TaxTabKeys { - InvoiceList = 'InvoiceList', - VatReference = 'VatReference', -}; -export interface TaxTabProps { - activeTab: TaxTabKeys; -}; -export interface InvoiceFilterProps { - filterOn: boolean; - setFilterOn: (filterOn: boolean) => void; - mid: string; - startDate: string; - endDate: string; - receiptType: string; - targetType: string; - setMid: (mid: string) => void; - setStartDate: (date: string) => void; - setEndDate: (date: string) => void; - setReceiptType: (type: string) => void; - setTargetType: (type: string) => void; -}; - -export enum DetailInfoSectionKeys { - Amount = 'Amount', - Publish = 'Publish', - Receiver = 'Receiver', - Supplier = 'Supplier', -}; - -export interface InvoiceListParams { - mid: string; - startDate?: string; - endDate?: string; - receiptType?: string; - targetType?: string; -}; - - -export interface InvoiceListResponse extends DefaulResponsePagination { - content: Array; -} - -export interface ListItemProps extends InvoiceListItem { -}; - -export interface InvoiceListItem { - id: number - companyName: string; - mid: string; - issueDate: string; - paymentMethod: string; - amount: number; -}; - -export interface ListDateGroupProps { - date: string; - items: Array -} -export interface InvoiceListProps { - listItems: Record> -}; -export interface InvoiceDetailParams { - svcCd?: string; - tid: string; -}; - -export interface InvoiceDetailResponse { - -}; -export interface DetailAmountInfoProps { - -}; -export interface DetailPublishInfoProps { - -}; -export interface DetailReceiverInfoProps { - -}; -export interface DetailSupplierInfoProps { - -}; -export interface DetailResponse { - amountInfo?: DetailAmountInfoProps; - publishInfo?: DetailPublishInfoProps; - receiverInfo?: DetailReceiverInfoProps; - supplierInfo?: DetailSupplierInfoProps; -}; - -export interface DetailInfoSectionProps extends DetailResponse { - isOpen?: boolean; - tid?: string; - onClickToShowInfo?: (info: DetailInfoSectionKeys) => void; -}; \ No newline at end of file diff --git a/src/entities/tax/ui/detail-amount-info-section.tsx b/src/entities/tax/ui/detail-amount-info-section.tsx deleted file mode 100644 index e9f12a2..0000000 --- a/src/entities/tax/ui/detail-amount-info-section.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { DetailInfoSectionProps } from '../model/types'; -import { SectionTitleArrow } from '@/entities/common/ui/section-title-arrow'; - -export const DetailAmountInfoSection = ({ - amountInfo, - isOpen, - onClickToShowInfo -}: DetailInfoSectionProps) => { - - return ( - <> -
-
-
48,125,100
- -
-
-
    -
  • - ·  공급가액 - 43,750,000 원 -
  • -
  • - ·  VAT - 4,375,100 원 -
  • -
-
-
- croquis01m -
-
- 2025.08.19 -
-
- - -
-
- - ); -}; \ No newline at end of file diff --git a/src/entities/tax/ui/detail-supplier-info-section.tsx b/src/entities/tax/ui/detail-supplier-info-section.tsx deleted file mode 100644 index e1c0304..0000000 --- a/src/entities/tax/ui/detail-supplier-info-section.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { DetailInfoSectionProps } from '../model/types'; - -export const DetailSupplierInfoSection = ({ - supplierInfo, - isOpen, - onClickToShowInfo -}: DetailInfoSectionProps) => { - - return ( - <> -
-
공급자 정보
-
-
    -
  • - 사업자등록번호 - 222-22-22222 -
  • -
  • - 상호명 - 나이스페이먼츠 -
  • -
- - ); -}; \ No newline at end of file diff --git a/src/entities/tax/ui/invoice-list.tsx b/src/entities/tax/ui/invoice-list.tsx deleted file mode 100644 index 4c0edc8..0000000 --- a/src/entities/tax/ui/invoice-list.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { InvoiceListProps } from '../model/types'; -import { ListDateGroup } from './list-date-group'; - -export const InvoiceList = ({ - listItems -}: InvoiceListProps) => { - - const getListDateGroup = () => { - let rs = []; - for (const [key, value] of Object.entries(listItems)) { - rs.push( - - ); - } - return rs; - }; - - return ( - <> -
- { getListDateGroup() } -
- - ) -}; \ No newline at end of file diff --git a/src/entities/tax/ui/tax-tab.tsx b/src/entities/tax/ui/tax-tab.tsx deleted file mode 100644 index 03b8fa0..0000000 --- a/src/entities/tax/ui/tax-tab.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { PATHS } from '@/shared/constants/paths'; -import { useNavigate } from '@/shared/lib/hooks/use-navigate'; -import { - TaxTabKeys, - TaxTabProps -} from '../model/types'; - -export const TaxTab = ({ - activeTab -}: TaxTabProps) => { - const { navigate } = useNavigate(); - - const onClickToNavigation = (tab: TaxTabKeys) => { - if(activeTab !== tab){ - if(tab === TaxTabKeys.InvoiceList){ - navigate(PATHS.tax.invoice.list); - } - else if(tab === TaxTabKeys.VatReference){ - navigate(PATHS.tax.vatReference); - } - } - }; - return( - <> -
- - -
- - ); -}; \ No newline at end of file diff --git a/src/entities/vat-return/api/use-vat-return-detail-mutation.ts b/src/entities/vat-return/api/use-vat-return-detail-mutation.ts new file mode 100644 index 0000000..2959c77 --- /dev/null +++ b/src/entities/vat-return/api/use-vat-return-detail-mutation.ts @@ -0,0 +1,29 @@ +import axios from 'axios'; +import { API_URL_VAT_RETURN } from '@/shared/api/api-url-vat-return'; +import { resultify } from '@/shared/lib/resultify'; +import { CBDCAxiosError } from '@/shared/@types/error'; +import { + VatReturnDetailParams, + VatReturnDetailResponse +} from '../model/types'; +import { + useMutation, + UseMutationOptions +} from '@tanstack/react-query'; + +export const vatReturnDetail = (params: VatReturnDetailParams) => { + return resultify( + axios.post(API_URL_VAT_RETURN.vatReturnDetail(), params), + ); +}; + +export const useVatReturnDetailMutation = (options?: UseMutationOptions) => { + const mutation = useMutation({ + ...options, + mutationFn: (params: VatReturnDetailParams) => vatReturnDetail(params), + }); + + return { + ...mutation, + }; +}; diff --git a/src/entities/vat-return/api/use-vat-return-list-mutation.ts b/src/entities/vat-return/api/use-vat-return-list-mutation.ts new file mode 100644 index 0000000..2d68d8a --- /dev/null +++ b/src/entities/vat-return/api/use-vat-return-list-mutation.ts @@ -0,0 +1,29 @@ +import axios from 'axios'; +import { API_URL_VAT_RETURN } from '@/shared/api/api-url-vat-return'; +import { resultify } from '@/shared/lib/resultify'; +import { CBDCAxiosError } from '@/shared/@types/error'; +import { + VatReturnListResponse, + VatReturnListParams, +} from '../model/types'; +import { + useMutation, + UseMutationOptions +} from '@tanstack/react-query'; + +export const vatReturnList = (params: VatReturnListParams) => { + return resultify( + axios.post(API_URL_VAT_RETURN.vatReturnList(), params), + ); +}; + +export const useVatReturnListMutation = (options?: UseMutationOptions) => { + const mutation = useMutation({ + ...options, + mutationFn: (params: VatReturnListParams) => vatReturnList(params), + }); + + return { + ...mutation, + }; +}; diff --git a/src/entities/vat-return/model/types.ts b/src/entities/vat-return/model/types.ts new file mode 100644 index 0000000..2874001 --- /dev/null +++ b/src/entities/vat-return/model/types.ts @@ -0,0 +1,81 @@ +import { DefaulResponsePagination, DefaultRequestPagination } from '@/entities/common/model/types'; + + +export enum VatReturnTabKeys { + List = 'List', + VatReference = 'VatReference', +}; +export interface VatReturnTabProps { + activeTab: VatReturnTabKeys; +}; +export enum VatReturnReceiptType { + ALL = 'ALL', + RECEIPT = 'RECEIPT', + BILL = 'BILL ' +}; +export enum VatReturnTargetType { + ALL = 'ALL', + GENERAL = 'GENERAL', + DIFFERENCE_COLLECTION = 'DIFFERENCE_COLLECTION', + REFUND_SETTLEMENT = 'REFUND_SETTLEMENT', +}; + +export interface VatReturnListParams { + mid: string; + startDate?: string; + endDate?: string; + receiptType?: VatReturnReceiptType; + targetType?: VatReturnTargetType; + pagination?: DefaultRequestPagination; +}; + + +export interface VatReturnListResponse extends DefaulResponsePagination { + content: Array; +}; + +export interface VatReturnListContent { + id?: number + companyName?: string; + mid?: string; + issueDate?: string; + paymentMethod?: string; + amount?: number; +}; + +export interface ListDateGroupProps { + date?: string; + items?: Array +} +export interface ListItemProps { + id?: number; + companyName?: string; + mid?: string; + issueDate?: string; + paymentMethod?: string; + amount?: number; +} +export interface VatReturnDetailParams { + taxInvoiceNumber?: string; +}; + +export interface VatReturnDetailResponse { + id?: number; + totalAmount?: number; + supplyAmount?: number; + vatAmount?: number; + mid?: string; + targetBusinessStartDate?: string; + targetBusinessEndDate?: string; + issueDate?: string; + subject?: string; + targetType?: VatReturnTargetType; + receiptType?: VatReturnReceiptType; + email?: string; + receiverBusinessRegistrationNumber?: string; + receiverCompanyName?: string; + receiverCeoName?: string; + supplierBusinessRegistrationNumber?: string; + supplierCompanyName?: string; + supplierCeoName?: string; +}; \ No newline at end of file diff --git a/src/entities/tax/ui/list-date-group.tsx b/src/entities/vat-return/ui/list-date-group.tsx similarity index 100% rename from src/entities/tax/ui/list-date-group.tsx rename to src/entities/vat-return/ui/list-date-group.tsx diff --git a/src/entities/tax/ui/invoice-filter.tsx b/src/entities/vat-return/ui/list-filter.tsx similarity index 85% rename from src/entities/tax/ui/invoice-filter.tsx rename to src/entities/vat-return/ui/list-filter.tsx index 2d1406b..f75dd6e 100644 --- a/src/entities/tax/ui/invoice-filter.tsx +++ b/src/entities/vat-return/ui/list-filter.tsx @@ -1,8 +1,24 @@ import { motion } from 'framer-motion'; import { IMAGE_ROOT } from '@/shared/constants/common'; -import { InvoiceFilterProps } from '../model/types'; +import { VatReturnReceiptType, VatReturnTargetType } from '../model/types'; +import { FilterMotionDuration, FilterMotionStyle, FilterMotionVariants } from '@/entities/common/model/constant'; -export const InvoiceFilter = ({ +export interface ListFilterProps { + filterOn: boolean; + setFilterOn: (filterOn: boolean) => void; + mid: string; + startDate: string; + endDate: string; + receiptType: VatReturnReceiptType; + targetType: VatReturnTargetType; + setMid: (mid: string) => void; + setStartDate: (date: string) => void; + setEndDate: (date: string) => void; + setReceiptType: (receiptType: VatReturnReceiptType) => void; + setTargetType: (targetType: VatReturnTargetType) => void; +}; + +export const ListFilter = ({ filterOn, setFilterOn, mid, @@ -15,7 +31,7 @@ export const InvoiceFilter = ({ setEndDate, setReceiptType, setTargetType -}: InvoiceFilterProps) => { +}: ListFilterProps) => { const variants = { hidden: { x: '100%' }, visible: { x: '0%' }, @@ -31,12 +47,9 @@ export const InvoiceFilter = ({ className="full-menu-modal" initial="hidden" animate={ (filterOn)? 'visible': 'hidden' } - variants={ variants } - transition={{ duration: 0.3 }} - style={{ - width: '100%', - height: '100%', - }} + variants={ FilterMotionVariants } + transition={ FilterMotionDuration } + style={ FilterMotionStyle } >
diff --git a/src/entities/tax/ui/list-item.tsx b/src/entities/vat-return/ui/list-item.tsx similarity index 93% rename from src/entities/tax/ui/list-item.tsx rename to src/entities/vat-return/ui/list-item.tsx index 2a374da..f2ac798 100644 --- a/src/entities/tax/ui/list-item.tsx +++ b/src/entities/vat-return/ui/list-item.tsx @@ -15,9 +15,9 @@ export const ListItem = ({ const { navigate } = useNavigate(); const onClickToNavigate = () => { - navigate(PATHS.tax.invoice.detail, { + navigate(PATHS.vatReturn.detail, { state: { - id: id + taxInvoiceNumber: id } }); }; @@ -44,7 +44,7 @@ export const ListItem = ({ value={ amount } thousandSeparator displayType="text" - suffix={ '원' } + suffix='원' >
diff --git a/src/entities/tax/ui/invoice-list-wrap.tsx b/src/entities/vat-return/ui/list-wrap.tsx similarity index 56% rename from src/entities/tax/ui/invoice-list-wrap.tsx rename to src/entities/vat-return/ui/list-wrap.tsx index d8627a1..331a7c7 100644 --- a/src/entities/tax/ui/invoice-list-wrap.tsx +++ b/src/entities/vat-return/ui/list-wrap.tsx @@ -2,43 +2,44 @@ import moment from 'moment'; import { useEffect, useState } from 'react'; import { IMAGE_ROOT } from '@/shared/constants/common'; -import { InvoiceFilter } from './invoice-filter'; +import { ListFilter } from './list-filter'; import { SortOptionsBox } from '@/entities/common/ui/sort-options-box'; import { SortByKeys } from '@/entities/common/model/types'; -import { InvoiceList } from './invoice-list'; -import { useInvoiceListMutation } from '../api/use-invoice-list-mutation'; import { DEFAULT_PAGE_PARAM } from '@/entities/common/model/constant'; -import { ListItemProps } from '../model/types'; +import { + VatReturnListContent, + VatReturnListParams, + VatReturnReceiptType, + VatReturnTargetType +} from '../model/types'; +import { useVatReturnListMutation } from '../api/use-vat-return-list-mutation'; +import { ListDateGroup } from './list-date-group'; -export const InvoiceListWrap = () => { +export const ListWrap = () => { const [filterOn, setFilterOn] = useState(false); const [sortBy, setSortBy] = useState(SortByKeys.New); - const [listItems, setListItems] = useState({}); + const [listItems, setListItems] = useState>>({}); const [pageParam, setPageParam] = useState(DEFAULT_PAGE_PARAM); const [mid, setMid] = useState('nictest00m'); const [startDate, setStartDate] = useState(moment().subtract(1, 'month').format('YYYY-MM-DD')); const [endDate, setEndDate] = useState(moment().format('YYYY-MM-DD')); - const [receiptType, setReceiptType] = useState(''); - const [targetType, setTargetType] = useState(''); - const { mutateAsync: invoiceList } = useInvoiceListMutation(); + const [receiptType, setReceiptType] = useState(VatReturnReceiptType.ALL); + const [targetType, setTargetType] = useState(VatReturnTargetType.ALL); + + const { mutateAsync: vatReturnList } = useVatReturnListMutation(); const callList = () => { - let listParams = { + let params: VatReturnListParams = { mid: mid, startDate: startDate, endDate: endDate, receiptType: receiptType, targetType: targetType, }; - invoiceList(listParams).then((rs) => { + vatReturnList(params).then((rs) => { setListItems(assembleData(rs.content)); }); - // setListItems({ - // '20250601': [ - // {tid: 'a1234567', pname: '와와디디', userid: 'nictest01m', idate: '20250630', kind: 'PG수수료', amount: 48125100}, - // {tid: 'b34534534', pname: '와와디디', userid: 'wadizcop@m', idate: '20250630', kind: 'PG수수료', amount: 23845000}, - // ] - // }) + }; const onClickToOpenFIlter = () => { @@ -52,7 +53,23 @@ export const InvoiceListWrap = () => { callList(); }, []); - const assembleData = (content: Array) => { + const getListDateGroup = () => { + let rs = []; + if(Object.keys(listItems).length > 0){ + for (const [key, value] of Object.entries(listItems)) { + rs.push( + + ); + } + } + return rs; + }; + + const assembleData = (content: Array) => { let data: any = {}; if(content && content.length > 0){ for(let i=0;i { } } } - console.log('Data : ', data) return data; }; return ( @@ -103,52 +119,13 @@ export const InvoiceListWrap = () => { onClickToSort={ onClickToSort } >
- - {/*
-
-
25.06
- -
-
-
-
-
-
와와디디 (nictest01m)
-
- 2025.06.30 - | - PG수수료 -
-
-
48,125,100원
-
- -
-
-
-
-
-
와와디디 (wadizcop@m)
-
- 2025.06.30 - | - PG수수료 -
-
-
23,845,000원
-
- -
+ { getListDateGroup() }
- */ - }
- { setEndDate={ setEndDate } setReceiptType={ setReceiptType } setTargetType={ setTargetType } - > + > ); }; \ No newline at end of file diff --git a/src/entities/vat-return/ui/section/amount-section.tsx b/src/entities/vat-return/ui/section/amount-section.tsx new file mode 100644 index 0000000..d07322d --- /dev/null +++ b/src/entities/vat-return/ui/section/amount-section.tsx @@ -0,0 +1,85 @@ +import moment from 'moment'; +import { VatReturnDetailResponse } from '../../model/types'; +import { SectionTitleArrow } from '@/entities/common/ui/section-title-arrow'; +import { NumericFormat } from 'react-number-format'; +import SlideDown from 'react-slidedown'; +import 'react-slidedown/lib/slidedown.css'; +import { useState } from 'react'; + +export interface AmountSectionProps { + detail: VatReturnDetailResponse; +}; + +export const AmountSection = ({ + detail +}: AmountSectionProps) => { + const [isOpen, setIsOpen] = useState(false); + + const openSection = () => { + const status = !isOpen; + setIsOpen(status); + }; + return ( + <> +
+
+
+ + +
+ +
+ + { isOpen && +
+
    +
  • + ·  공급가액 + + + +
  • +
  • + ·  VAT + + + +
  • +
+
+ } +
+
+ { detail.mid } +
+
+ { moment(detail.issueDate).format('YYYY.MM.DD') } +
+
+ + +
+
+ + ); +}; \ No newline at end of file diff --git a/src/entities/tax/ui/detail-publish-info-section.tsx b/src/entities/vat-return/ui/section/issue-section.tsx similarity index 53% rename from src/entities/tax/ui/detail-publish-info-section.tsx rename to src/entities/vat-return/ui/section/issue-section.tsx index 5d99b27..bfdc7ee 100644 --- a/src/entities/tax/ui/detail-publish-info-section.tsx +++ b/src/entities/vat-return/ui/section/issue-section.tsx @@ -1,10 +1,13 @@ -import { DetailInfoSectionProps } from '../model/types'; +import moment from 'moment'; +import { VatReturnDetailResponse } from '../../model/types'; -export const DetailPublishInfoSection = ({ - publishInfo, - isOpen, - onClickToShowInfo -}: DetailInfoSectionProps) => { +export interface IssueSectionProps { + detail: VatReturnDetailResponse +}; + +export const IssueSection = ({ + detail +}: IssueSectionProps) => { return ( <> @@ -13,31 +16,31 @@ export const DetailPublishInfoSection = ({
  • MID - nictest01m + { detail.mid }
  • 발행대상일자 - 2025.06.01 ~ 2025.06.30 + { moment(detail.targetBusinessStartDate).format('YYYY.MM.DD') } ~ { moment(detail.targetBusinessEndDate).format('YYYY.MM.DD') }
  • 발행일자 - 2025.06.30 + { moment(detail.issueDate).format('YYYY.MM.DD') }
  • 적요 - PG 수수료 + { detail.subject }
  • 발행대상 - 일반 + { detail.targetType }
  • 영수구분 - 영수 + { detail.receiptType }
  • Email - test@nicepay.co.kr + { detail.email }
diff --git a/src/entities/tax/ui/detail-receiver-info-section.tsx b/src/entities/vat-return/ui/section/receiver-section.tsx similarity index 53% rename from src/entities/tax/ui/detail-receiver-info-section.tsx rename to src/entities/vat-return/ui/section/receiver-section.tsx index 4cab110..9b4ae9b 100644 --- a/src/entities/tax/ui/detail-receiver-info-section.tsx +++ b/src/entities/vat-return/ui/section/receiver-section.tsx @@ -1,10 +1,12 @@ -import { DetailInfoSectionProps } from '../model/types'; +import { VatReturnDetailResponse } from '../../model/types'; -export const DetailReceiverInfoSection = ({ - receiverInfo, - isOpen, - onClickToShowInfo -}: DetailInfoSectionProps) => { +export interface ReceiverSectionProps { + detail: VatReturnDetailResponse +}; + +export const ReceiverSection = ({ + detail +}: ReceiverSectionProps) => { return ( <> @@ -14,15 +16,15 @@ export const DetailReceiverInfoSection = ({
  • 사업자등록번호 - 123-12-12345 + { detail.receiverBusinessRegistrationNumber }
  • 상호명 - 와와디디 + { detail.receiverCompanyName }
  • 대표자명 - 김테스트 + { detail.receiverCeoName }
diff --git a/src/entities/vat-return/ui/section/supplier-section.tsx b/src/entities/vat-return/ui/section/supplier-section.tsx new file mode 100644 index 0000000..f88f19b --- /dev/null +++ b/src/entities/vat-return/ui/section/supplier-section.tsx @@ -0,0 +1,32 @@ +import { VatReturnDetailResponse } from '../../model/types'; + +export interface SupplierSectionProps { + detail: VatReturnDetailResponse +}; + +export const SupplierSection = ({ + detail +}: SupplierSectionProps) => { + + return ( + <> +
+
공급자 정보
+
+
    +
  • + 사업자등록번호 + { detail.supplierBusinessRegistrationNumber } +
  • +
  • + 상호명 + { detail.supplierCompanyName } +
  • +
  • + 대표자명 + { detail.supplierCeoName } +
  • +
+ + ); +}; \ No newline at end of file diff --git a/src/entities/tax/ui/var-reference-req-fail.tsx b/src/entities/vat-return/ui/var-reference-req-fail.tsx similarity index 100% rename from src/entities/tax/ui/var-reference-req-fail.tsx rename to src/entities/vat-return/ui/var-reference-req-fail.tsx diff --git a/src/entities/tax/ui/vat-reference-req-success.tsx b/src/entities/vat-return/ui/vat-reference-req-success.tsx similarity index 100% rename from src/entities/tax/ui/vat-reference-req-success.tsx rename to src/entities/vat-return/ui/vat-reference-req-success.tsx diff --git a/src/entities/tax/ui/vat-reference-wrap.tsx b/src/entities/vat-return/ui/vat-reference-wrap.tsx similarity index 100% rename from src/entities/tax/ui/vat-reference-wrap.tsx rename to src/entities/vat-return/ui/vat-reference-wrap.tsx diff --git a/src/entities/vat-return/ui/vat-return-tab.tsx b/src/entities/vat-return/ui/vat-return-tab.tsx new file mode 100644 index 0000000..b47c919 --- /dev/null +++ b/src/entities/vat-return/ui/vat-return-tab.tsx @@ -0,0 +1,37 @@ +import { PATHS } from '@/shared/constants/paths'; +import { useNavigate } from '@/shared/lib/hooks/use-navigate'; +import { + VatReturnTabKeys, + VatReturnTabProps +} from '../model/types'; + +export const VatReturnTab = ({ + activeTab +}: VatReturnTabProps) => { + const { navigate } = useNavigate(); + + const onClickToNavigation = (tab: VatReturnTabKeys) => { + if(activeTab !== tab){ + if(tab === VatReturnTabKeys.List){ + navigate(PATHS.vatReturn.list); + } + else if(tab === VatReturnTabKeys.VatReference){ + navigate(PATHS.vatReturn.vatReference); + } + } + }; + return( + <> +
+ + +
+ + ); +}; \ No newline at end of file diff --git a/src/pages/tax/invoice/detail-page.tsx b/src/pages/tax/invoice/detail-page.tsx deleted file mode 100644 index b109db3..0000000 --- a/src/pages/tax/invoice/detail-page.tsx +++ /dev/null @@ -1,133 +0,0 @@ -import { useEffect, useState } from 'react'; -import { PATHS } from '@/shared/constants/paths'; -import { useLocation } from 'react-router'; -import { useNavigate } from '@/shared/lib/hooks/use-navigate'; -import { useInvoiceDetailMutation } from '@/entities/tax/api/use-invoice-detail-mutation'; -import { DetailAmountInfoSection } from '@/entities/tax/ui/detail-amount-info-section'; -import { DetailPublishInfoSection } from '@/entities/tax/ui/detail-publish-info-section'; -import { DetailReceiverInfoSection } from '@/entities/tax/ui/detail-receiver-info-section'; -import { DetailSupplierInfoSection } from '@/entities/tax/ui/detail-supplier-info-section'; -import { HeaderType } from '@/entities/common/model/types'; -import { - DetailResponse, - InvoiceDetailParams, - DetailAmountInfoProps, - DetailInfoSectionKeys, - DetailPublishInfoProps, - DetailReceiverInfoProps, - DetailSupplierInfoProps -} from '@/entities/tax/model/types'; -import { - useSetOnBack, - useSetHeaderTitle, - useSetHeaderType, - useSetFooterMode -} from '@/widgets/sub-layout/use-sub-layout'; - -export const InvoiceDetailPage = () => { - const { navigate } = useNavigate(); - const location = useLocation(); - - const [tid, setTid] = useState(location?.state.tid); - - const [amountInfo, setAmountInfo] = useState(); - const [publishInfo, setPublishInfo] = useState(); - const [receiverInfo, setReceiverInfo] = useState(); - const [supplierInfo, setSupplierInfo] = useState(); - - const [showAmount, setShowAmount] = useState(false); - const [showPublish, setShowPublish] = useState(false); - const [showReceiver, setShowReceiver] = useState(false); - const [showSupplier, setShowSupplier] = useState(false); - - useSetHeaderTitle('세금계산서 상세'); - useSetHeaderType(HeaderType.RightClose); - useSetOnBack(() => { - navigate(PATHS.tax.invoice.list); - }); - useSetFooterMode(false); - - - const { mutateAsync: invoiceDetail } = useInvoiceDetailMutation(); - - const onClickToShowInfo = (info: DetailInfoSectionKeys) => { - if(info === DetailInfoSectionKeys.Amount){ - setShowAmount(!showAmount); - } - else if(info === DetailInfoSectionKeys.Publish){ - setShowPublish(!showReceiver); - } - else if(info === DetailInfoSectionKeys.Receiver){ - setShowReceiver(!showReceiver); - } - else if(info === DetailInfoSectionKeys.Supplier){ - setShowSupplier(!showSupplier); - } - }; - - const callDetail = () => { - let invoiceDetailParams: InvoiceDetailParams = { - svcCd: 'st', - tid: tid - }; - invoiceDetail(invoiceDetailParams).then((rs: DetailResponse) => { - setAmountInfo(rs.amountInfo); - setPublishInfo(rs.publishInfo); - setReceiverInfo(rs.receiverInfo); - setSupplierInfo(rs.supplierInfo); - }); - }; - useEffect(() => { - // callDetail(); - }, []); - - return ( - <> -
-
-
-
-
- - onClickToShowInfo(info) } - > - -
- - onClickToShowInfo(info) } - > - -
- - onClickToShowInfo(info) } - > - -
- - onClickToShowInfo(info) } - > - -
-
-
-
-
- - ) -}; \ No newline at end of file diff --git a/src/pages/tax/tax-pages.tsx b/src/pages/tax/tax-pages.tsx deleted file mode 100644 index 13ee62c..0000000 --- a/src/pages/tax/tax-pages.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { Route } from 'react-router-dom'; -import { SentryRoutes } from '@/shared/configs/sentry'; -import { ROUTE_NAMES } from '@/shared/constants/route-names'; -import { InvoiceListPage } from './invoice/list-page'; -import { InvoiceDetailPage } from './invoice/detail-page'; -import { VatReferencePage } from './vat-reference/vat-reference-page'; - -export const TaxPages = () => { - return ( - <> - - - } /> - } /> - - } /> - - - ); -}; diff --git a/src/pages/vat-return/detail-page.tsx b/src/pages/vat-return/detail-page.tsx new file mode 100644 index 0000000..ffb9e57 --- /dev/null +++ b/src/pages/vat-return/detail-page.tsx @@ -0,0 +1,82 @@ +import { useEffect, useState } from 'react'; +import { PATHS } from '@/shared/constants/paths'; +import { useLocation } from 'react-router'; +import { useNavigate } from '@/shared/lib/hooks/use-navigate'; +import { useVatReturnDetailMutation } from '@/entities/vat-return/api/use-vat-return-detail-mutation'; +import { HeaderType } from '@/entities/common/model/types'; +import { + VatReturnDetailParams, + VatReturnDetailResponse +} from '@/entities/vat-return/model/types'; +import { + useSetOnBack, + useSetHeaderTitle, + useSetHeaderType, + useSetFooterMode +} from '@/widgets/sub-layout/use-sub-layout'; +import { SupplierSection } from '@/entities/vat-return/ui/section/supplier-section'; +import { ReceiverSection } from '@/entities/vat-return/ui/section/receiver-section'; +import { IssueSection } from '@/entities/vat-return/ui/section/issue-section'; +import { AmountSection } from '@/entities/vat-return/ui/section/amount-section'; + +export const DetailPage = () => { + const { navigate } = useNavigate(); + const location = useLocation(); + + let taxInvoiceNumber = location?.state.taxInvoiceNumber; + taxInvoiceNumber = 'TAX202506300001'; + + const [openAmount, setOpenAmount] = useState(false); + const [detail, setDetail] = useState({}); + + useSetHeaderTitle('세금계산서 상세'); + useSetHeaderType(HeaderType.RightClose); + useSetOnBack(() => { + navigate(PATHS.vatReturn.list); + }); + useSetFooterMode(false); + + const { mutateAsync: vatReturnDetail } = useVatReturnDetailMutation(); + + const callDetail = () => { + let params: VatReturnDetailParams = { + taxInvoiceNumber: taxInvoiceNumber, + }; + vatReturnDetail(params).then((rs: VatReturnDetailResponse) => { + setDetail(rs); + }); + }; + useEffect(() => { + callDetail(); + }, []); + + return ( + <> +
+
+
+
+
+ +
+ +
+ +
+ +
+
+
+
+
+ + ) +}; \ No newline at end of file diff --git a/src/pages/tax/invoice/list-page.tsx b/src/pages/vat-return/list-page.tsx similarity index 62% rename from src/pages/tax/invoice/list-page.tsx rename to src/pages/vat-return/list-page.tsx index e8999c1..dd2b6e5 100644 --- a/src/pages/tax/invoice/list-page.tsx +++ b/src/pages/vat-return/list-page.tsx @@ -1,9 +1,9 @@ import { useState } from 'react'; import { PATHS } from '@/shared/constants/paths'; import { useNavigate } from '@/shared/lib/hooks/use-navigate'; -import { TaxTab } from '@/entities/tax/ui/tax-tab'; -import { InvoiceListWrap } from '@/entities/tax/ui/invoice-list-wrap'; -import { TaxTabKeys } from '@/entities/tax/model/types'; +import { VatReturnTab } from '@/entities/vat-return/ui/vat-return-tab'; +import { ListWrap } from '@/entities/vat-return/ui/list-wrap'; +import { VatReturnTabKeys } from '@/entities/vat-return/model/types'; import { HeaderType } from '@/entities/common/model/types'; import { useSetHeaderTitle, @@ -12,9 +12,9 @@ import { useSetOnBack } from '@/widgets/sub-layout/use-sub-layout'; -export const InvoiceListPage = () => { +export const ListPage = () => { const { navigate } = useNavigate(); - const [activeTab, setActiveTab] = useState(TaxTabKeys.InvoiceList); + const [activeTab, setActiveTab] = useState(VatReturnTabKeys.List); useSetHeaderTitle('부가세 신고 자료'); useSetHeaderType(HeaderType.LeftArrow); useSetFooterMode(true); @@ -27,8 +27,8 @@ export const InvoiceListPage = () => {
- - + +
diff --git a/src/pages/tax/vat-reference/vat-reference-page.tsx b/src/pages/vat-return/vat-reference-page.tsx similarity index 67% rename from src/pages/tax/vat-reference/vat-reference-page.tsx rename to src/pages/vat-return/vat-reference-page.tsx index 6d6c6d3..fb7aebf 100644 --- a/src/pages/tax/vat-reference/vat-reference-page.tsx +++ b/src/pages/vat-return/vat-reference-page.tsx @@ -1,9 +1,9 @@ import { useState } from 'react'; import { PATHS } from '@/shared/constants/paths'; import { useNavigate } from '@/shared/lib/hooks/use-navigate'; -import { TaxTab } from '@/entities/tax/ui/tax-tab'; -import { VatReferenceWrap } from '@/entities/tax/ui/vat-reference-wrap'; -import { TaxTabKeys } from '@/entities/tax/model/types'; +import { VatReturnTab } from '@/entities/vat-return/ui/vat-return-tab'; +import { VatReferenceWrap } from '@/entities/vat-return/ui/vat-reference-wrap'; +import { VatReturnTabKeys } from '@/entities/vat-return/model/types'; import { HeaderType } from '@/entities/common/model/types'; import { useSetHeaderTitle, @@ -16,7 +16,7 @@ import { export const VatReferencePage = () => { const { navigate } = useNavigate(); - const [activeTab, setActiveTab] = useState(TaxTabKeys.VatReference); + const [activeTab, setActiveTab] = useState(VatReturnTabKeys.VatReference); useSetHeaderTitle('부가세 신고 자료'); useSetHeaderType(HeaderType.LeftArrow); useSetFooterMode(true); @@ -29,7 +29,7 @@ export const VatReferencePage = () => {
- +
diff --git a/src/pages/vat-return/vat-return-pages.tsx b/src/pages/vat-return/vat-return-pages.tsx new file mode 100644 index 0000000..03bfb47 --- /dev/null +++ b/src/pages/vat-return/vat-return-pages.tsx @@ -0,0 +1,18 @@ +import { Route } from 'react-router-dom'; +import { SentryRoutes } from '@/shared/configs/sentry'; +import { ROUTE_NAMES } from '@/shared/constants/route-names'; +import { ListPage } from './list-page'; +import { DetailPage } from './detail-page'; +import { VatReferencePage } from './vat-reference-page'; + +export const VatReturnPages = () => { + return ( + <> + + } /> + } /> + } /> + + + ); +}; diff --git a/src/shared/api/api-url-tax.ts b/src/shared/api/api-url-vat-return.ts similarity index 55% rename from src/shared/api/api-url-tax.ts rename to src/shared/api/api-url-vat-return.ts index f10f1d9..9f47870 100644 --- a/src/shared/api/api-url-tax.ts +++ b/src/shared/api/api-url-vat-return.ts @@ -3,11 +3,13 @@ import { API_URL_KEY, } from './../constants/url'; -export const API_URL_TAX = { - invoiceList: () => { +export const API_URL_VAT_RETURN = { + vatReturnList: () => { + // POST: 세금계산서 목록 조회 return `${API_BASE_URL}/api/v1/${API_URL_KEY}/vat-return/list`; }, - invoiceDetail: () => { + vatReturnDetail: () => { + // POST: 세금계산서 상세 조회 return `${API_BASE_URL}/api/v1/${API_URL_KEY}/vat-return/detail`; }, }; \ No newline at end of file diff --git a/src/shared/configs/sentry/index.tsx b/src/shared/configs/sentry/index.tsx index 894ce22..6c4af87 100644 --- a/src/shared/configs/sentry/index.tsx +++ b/src/shared/configs/sentry/index.tsx @@ -79,7 +79,7 @@ const SettlementPages = lazyLoad('/src/pages/settlement/settlement-pages const MerchantPages = lazyLoad('/src/pages/merchant/merchant-pages'); const PaymentPages = lazyLoad('/src/pages/payment/payment-pages'); const AccountPages = lazyLoad('/src/pages/account/account-pages'); -const TaxPages = lazyLoad('/src/pages/tax/tax-pages'); +const VatReturnPages = lazyLoad('/src/pages/vat-return/vat-return-pages'); const AdditionalServicePages = lazyLoad('/src/pages/additional-service/additional-service-pages'); const SupportPages = lazyLoad('/src/pages/support/support-pages'); const SettingPage = lazyLoad('/src/pages/setting/setting-page'); @@ -125,7 +125,7 @@ const Pages = () => { } /> } /> } /> - } /> + } /> } /> } /> } /> diff --git a/src/shared/constants/paths.ts b/src/shared/constants/paths.ts index 4c0e8c2..e2f6d03 100644 --- a/src/shared/constants/paths.ts +++ b/src/shared/constants/paths.ts @@ -124,20 +124,11 @@ export const PATHS: RouteNamesType = { ), } }, - tax: { - base: generatePath(ROUTE_NAMES.tax.base), - invoice: { - base: generatePath(`${ROUTE_NAMES.tax.base}${ROUTE_NAMES.tax.invoice.base}`), - list: generatePath( - `${ROUTE_NAMES.tax.base}${ROUTE_NAMES.tax.invoice.base}`, - ROUTE_NAMES.tax.invoice.list, - ), - detail: generatePath( - `${ROUTE_NAMES.tax.base}${ROUTE_NAMES.tax.invoice.base}`, - ROUTE_NAMES.tax.invoice.detail, - ), - }, - vatReference: generatePath(ROUTE_NAMES.tax.base, ROUTE_NAMES.tax.vatReference), + vatReturn: { + base: generatePath(ROUTE_NAMES.vatReturn.base), + list: generatePath(ROUTE_NAMES.vatReturn.base, ROUTE_NAMES.vatReturn.list), + detail: generatePath(ROUTE_NAMES.vatReturn.base, ROUTE_NAMES.vatReturn.detail), + vatReference: generatePath(ROUTE_NAMES.vatReturn.base, ROUTE_NAMES.vatReturn.vatReference), }, additionalService: { base: generatePath(ROUTE_NAMES.additionalService.base), diff --git a/src/shared/constants/route-names.ts b/src/shared/constants/route-names.ts index e1de3e6..8643f62 100644 --- a/src/shared/constants/route-names.ts +++ b/src/shared/constants/route-names.ts @@ -58,13 +58,10 @@ export const ROUTE_NAMES = { modifyLoginPassword: 'modifyLoginPassword' } }, - tax: { - base: '/tax/*', - invoice: { - base: '/invoice/*', - list: 'list', - detail: 'detail', - }, + vatReturn: { + base: '/vat-return/*', + list: 'list', + detail: 'detail', vatReference: 'vatReference' }, additionalService: { diff --git a/src/shared/ui/menu/index.tsx b/src/shared/ui/menu/index.tsx index 76d3a6c..ec62d3a 100644 --- a/src/shared/ui/menu/index.tsx +++ b/src/shared/ui/menu/index.tsx @@ -73,8 +73,8 @@ export const Menu = ({ category: '부가세 신고 자료', categoryIcon: 'vat-icon', items: [ - {title: '세금계산서', path: PATHS.tax.invoice.list}, - {title: '부가세 참고', path: PATHS.tax.vatReference}, + {title: '세금계산서', path: PATHS.vatReturn.list}, + {title: '부가세 참고', path: PATHS.vatReturn.vatReference}, ] }, additionalService: {