diff --git a/src/entities/additional-service/ui/info-wrap/title-info-wrap.tsx b/src/entities/additional-service/ui/info-wrap/title-info-wrap.tsx index 614fe8f..ee8c4bb 100644 --- a/src/entities/additional-service/ui/info-wrap/title-info-wrap.tsx +++ b/src/entities/additional-service/ui/info-wrap/title-info-wrap.tsx @@ -47,13 +47,7 @@ export const TitleInfoWrap = ({ <>
- + {t('home.money', { value: new Intl.NumberFormat('en-US').format(titleInfo?.amount || 0) })}
{titleInfo?.corpName}
@@ -65,13 +59,7 @@ export const TitleInfoWrap = ({ <>
- + {t('home.money', { value: new Intl.NumberFormat('en-US').format(titleInfo?.amount || 0) })}
{titleInfo?.corpName}
diff --git a/src/entities/additional-service/ui/list-item.tsx b/src/entities/additional-service/ui/list-item.tsx index 85bf42b..0852721 100644 --- a/src/entities/additional-service/ui/list-item.tsx +++ b/src/entities/additional-service/ui/list-item.tsx @@ -557,13 +557,7 @@ export const ListItem = ({ else if (additionalServiceCategory === AdditionalServiceCategory.KeyInPayment) { rs.push(
- + {t('home.money', { value: new Intl.NumberFormat('en-US').format(amount || 0) })}
); } @@ -572,13 +566,7 @@ export const ListItem = ({ ) { rs.push(
- + {t('home.money', { value: new Intl.NumberFormat('en-US').format(amount || 0) })}
); } @@ -588,13 +576,7 @@ export const ListItem = ({ key="payout-item-amount" className="transaction-amount" > - + {t('home.money', { value: new Intl.NumberFormat('en-US').format(amount || 0) })} ); } @@ -606,13 +588,7 @@ export const ListItem = ({ key="fund-account-transfer-amount" className="transaction-amount" > - + {t('home.money', { value: new Intl.NumberFormat('en-US').format(amount || 0) })} ); } @@ -622,13 +598,7 @@ export const ListItem = ({ key="payout-item-amount" className="transaction-amount" > - + {t('home.money', { value: new Intl.NumberFormat('en-US').format(amount || 0) })} ); } diff --git a/src/entities/home/ui/day-status-box-container1.tsx b/src/entities/home/ui/day-status-box-container1.tsx index 3e65ba5..b9ef7d6 100644 --- a/src/entities/home/ui/day-status-box-container1.tsx +++ b/src/entities/home/ui/day-status-box-container1.tsx @@ -71,13 +71,7 @@ export const BoxContainer1 = () => {

{t('home.todaySales')}

- + {t('home.money', { value: new Intl.NumberFormat('en-US').format(sales?.todayTotalAmount || 0) })} = 0)? 'plus': 'minus'}` }> {

{t('home.todaySettlement')}

- + {t('home.money', { value: new Intl.NumberFormat('en-US').format(settlement?.todaySettlementAmount || 0) })} {t('home.depositCompleted')} @@ -162,13 +150,7 @@ export const BoxContainer1 = () => {
{t('home.remainingSettlementLimit')} - + {t('home.money', { value: new Intl.NumberFormat('en-US').format(settlement?.availableCredit || 0) })}
diff --git a/src/entities/home/ui/day-status-box-container2.tsx b/src/entities/home/ui/day-status-box-container2.tsx index 1594006..9a24894 100644 --- a/src/entities/home/ui/day-status-box-container2.tsx +++ b/src/entities/home/ui/day-status-box-container2.tsx @@ -112,13 +112,7 @@ export const BoxContainer2 = () => {

{t('home.totalSales')}

- + {t('home.money', { value: new Intl.NumberFormat('en-US').format(sales?.currentMonthAmount || 0) })} = 0)? 'plus': 'minus'}` }> {

{t('home.totalSettlement')}

- + {t('home.money', { value: new Intl.NumberFormat('en-US').format(settlement?.currentMonthSettlementAmount || 0) })} = 0)? 'plus': 'minus'}` }> {

{t('home.averageTransactionAmount')}

- + {t('home.money', { value: new Intl.NumberFormat('en-US').format(averageTransactionAmount || 0) })}
@@ -192,13 +174,7 @@ export const BoxContainer2 = () => {

{t('home.dailyAverageSalesAndCount')}

- + {t('home.money', { value: new Intl.NumberFormat('en-US').format(dailyAverageSales || 0) })} ( {t('payment.applicationAmount')} : - + {t('home.money', { value: new Intl.NumberFormat('en-US').format(value.applicationAmount || 0) })}
diff --git a/src/entities/settlement/ui/info-wrap/amount-info-wrap.tsx b/src/entities/settlement/ui/info-wrap/amount-info-wrap.tsx index 9b2cf44..0af3e0e 100644 --- a/src/entities/settlement/ui/info-wrap/amount-info-wrap.tsx +++ b/src/entities/settlement/ui/info-wrap/amount-info-wrap.tsx @@ -22,13 +22,7 @@ export const AmountInfoWrap = ({
  • {t('settlement.totalTransactionAmount')} - + {t('home.money', { value: new Intl.NumberFormat('en-US').format(amountInfo?.totalTransactionAmount || 0) })} ·  {t('settlement.creditCard')} - + {t('home.money', { value: new Intl.NumberFormat('en-US').format(amountInfo?.creditCardAmount || 0) })} ·  {t('settlement.accountTransfer')} - + {t('home.money', { value: new Intl.NumberFormat('en-US').format(amountInfo?.accountTransferAmount || 0) })} {t('settlement.transactionAmount')} - + {t('home.money', { value: new Intl.NumberFormat('en-US').format(amountInfo?.transactionAmount || 0) })}
  • {t('settlement.paymentFee')} - + {t('home.money', { value: new Intl.NumberFormat('en-US').format(amountInfo?.paymentFee || 0) })}
  • {t('settlement.escrowFee')} - + {t('home.money', { value: new Intl.NumberFormat('en-US').format(amountInfo?.escrowFee || 0) })}
  • {t('settlement.authFee')} - + {t('home.money', { value: new Intl.NumberFormat('en-US').format(amountInfo?.authFee || 0) })}
  • VAT - + {t('home.money', { value: new Intl.NumberFormat('en-US').format(amountInfo?.vatFee || 0) })}
  • {t('settlement.expectedSettlementAmount')} - + {t('home.money', { value: new Intl.NumberFormat('en-US').format(amountInfo?.settlementAmount || 0) })}
  • {t('settlement.preSettlementCancelOffset')} - + {t('home.money', { value: new Intl.NumberFormat('en-US').format(amountInfo?.preSettlementCancelOffset || 0) })}
  • {t('settlement.settlementAmount')} - + {t('home.money', { value: new Intl.NumberFormat('en-US').format(amountInfo?.finalSettlementAmount || 0) })}
  • diff --git a/src/entities/settlement/ui/list-item.tsx b/src/entities/settlement/ui/list-item.tsx index 7ee755f..b1568f6 100644 --- a/src/entities/settlement/ui/list-item.tsx +++ b/src/entities/settlement/ui/list-item.tsx @@ -65,15 +65,7 @@ export const ListItem = ({ }
    - { - - } + {t('home.money', { value: new Intl.NumberFormat('en-US').format(settlementAmount || transactionAmount || 0) })}
    diff --git a/src/entities/settlement/ui/list-wrap.tsx b/src/entities/settlement/ui/list-wrap.tsx index be990eb..0f2b8cb 100644 --- a/src/entities/settlement/ui/list-wrap.tsx +++ b/src/entities/settlement/ui/list-wrap.tsx @@ -391,13 +391,7 @@ export const ListWrap = ({
    {t('settlement.settlementAmount')}
    - + {t('home.money', { value: new Intl.NumberFormat('en-US').format(settlementAmount || 0) })} @@ -66,55 +67,35 @@ export const VatReturnListDetailBottomSheet = ({
    -
    거래금액 :
    +
    {t('vatReturn.transactionAmount')} :
    - + {t('home.money', { value: new Intl.NumberFormat('en-US').format(transactionAmount || 0) })}
    -
    공급가액 :
    +
    {t('vatReturn.supplyAmount')} :
    - + {t('home.money', { value: new Intl.NumberFormat('en-US').format(supplyAmount || 0) })}
    -
    VAT :
    +
    {t('vatReturn.vat')} :
    - + {t('home.money', { value: new Intl.NumberFormat('en-US').format(vatAmount || 0) })}
    -
    합계금액 :
    +
    {t('vatReturn.totalAmount')} :
    - + {t('home.money', { value: new Intl.NumberFormat('en-US').format(totalAmount || 0) })}
    { breakdown && breakdown.length > 0 &&
    -
    거래일
    -
    합계금액
    +
    {t('vatReturn.transactionDate')}
    +
    {t('vatReturn.totalAmount')}
    { breakdown.map((value, index) => ( @@ -124,15 +105,10 @@ export const VatReturnListDetailBottomSheet = ({ { value.transactionDate? moment(value.transactionDate).format('YYYY-MM-DD'): '' }
    - + {t('home.money', { value: new Intl.NumberFormat('en-US').format(value.totalAmount || 0) })} - openDetail(index) } /> @@ -142,34 +118,19 @@ export const VatReturnListDetailBottomSheet = ({ { isOpenDetail[index] &&
    - 거래금액 - 공급가액 - VAT + {t('vatReturn.transactionAmount')} + {t('vatReturn.supplyAmount')} + {t('vatReturn.vat')}
    - + {t('home.money', { value: new Intl.NumberFormat('en-US').format(value.transactionAmount || 0) })} - + {t('home.money', { value: new Intl.NumberFormat('en-US').format(value.supplyAmount || 0) })} - + {t('home.money', { value: new Intl.NumberFormat('en-US').format(value.vatAmount || 0) })}
    diff --git a/src/entities/vat-return/ui/list-item.tsx b/src/entities/vat-return/ui/list-item.tsx index b36b2c6..955f429 100644 --- a/src/entities/vat-return/ui/list-item.tsx +++ b/src/entities/vat-return/ui/list-item.tsx @@ -1,4 +1,5 @@ import { NumericFormat } from 'react-number-format'; +import { useTranslation } from 'react-i18next'; import { PATHS } from '@/shared/constants/paths'; import { useNavigate } from '@/shared/lib/hooks/use-navigate'; import { ListItemProps } from '../model/types'; @@ -12,6 +13,7 @@ export const ListItem = ({ paymentMethod, amount }: ListItemProps) => { + const { t, i18n } = useTranslation(); const { navigate } = useNavigate(); const onClickToNavigate = () => { @@ -40,12 +42,7 @@ export const ListItem = ({
    - + {t('home.money', { value: new Intl.NumberFormat('en-US').format(amount || 0) })}
    diff --git a/src/entities/vat-return/ui/list-wrap.tsx b/src/entities/vat-return/ui/list-wrap.tsx index c1a2a0a..0cab181 100644 --- a/src/entities/vat-return/ui/list-wrap.tsx +++ b/src/entities/vat-return/ui/list-wrap.tsx @@ -1,16 +1,17 @@ import moment from 'moment'; import { useEffect, useState } from 'react'; +import { useTranslation } from 'react-i18next'; import { IMAGE_ROOT } from '@/shared/constants/common'; import { ListFilter } from './filter/list-filter'; import { SortTypeBox } from '@/entities/common/ui/sort-type-box'; import { DefaultRequestPagination, SortTypeKeys } from '@/entities/common/model/types'; import { DEFAULT_PAGE_PARAM } from '@/entities/common/model/constant'; -import { - VatReturnListContent, - VatReturnListParams, - VatReturnListResponse, - VatReturnReceiptType, - VatReturnTargetType +import { + VatReturnListContent, + VatReturnListParams, + VatReturnListResponse, + VatReturnReceiptType, + VatReturnTargetType } from '../model/types'; import { useVatReturnListMutation } from '../api/use-vat-return-list-mutation'; import { ListDateGroup } from './list-date-group'; @@ -19,6 +20,7 @@ import { EmailBottomSheet } from '@/entities/common/ui/email-bottom-sheet'; import useIntersectionObserver from '@/widgets/intersection-observer'; export const ListWrap = () => { + const { t } = useTranslation(); const userMid = useStore.getState().UserStore.mid; const [onActionIntersect, setOnActionIntersect] = useState(false); @@ -175,20 +177,20 @@ export const ListWrap = () => { value={ moment(startMonth+'01').format('YYYY.MM') + '-' + moment(endMonth+'01').format('YYYY.MM')} readOnly={ true } /> -
    diff --git a/src/entities/vat-return/ui/reference-request-fail.tsx b/src/entities/vat-return/ui/reference-request-fail.tsx index 4a44781..5206108 100644 --- a/src/entities/vat-return/ui/reference-request-fail.tsx +++ b/src/entities/vat-return/ui/reference-request-fail.tsx @@ -1,5 +1,6 @@ import { motion } from 'framer-motion'; -import { +import { useTranslation } from 'react-i18next'; +import { FilterMotionDuration, FilterMotionStyle, FilterMotionVariants @@ -16,6 +17,7 @@ export const ReferenceRequestFail = ({ setPageOn, errorMsg }: ReferenceRequestFailProps) => { + const { t } = useTranslation(); const onClickToClose = () => { setPageOn(false); }; @@ -35,27 +37,27 @@ export const ReferenceRequestFail = ({ style={{ margin: '0 auto' }} >
    -

    - 부가세 참고 자료 + {t('vatReturn.vatReferenceData')}
    - 신청 실패하였습니다 + {t('vatReturn.requestFailed')}

    - 결과 : + {t('vatReturn.result')} : { errorMsg }

    - + >{t('common.confirm')}
    diff --git a/src/entities/vat-return/ui/reference-request-success.tsx b/src/entities/vat-return/ui/reference-request-success.tsx index a576aea..d701f5a 100644 --- a/src/entities/vat-return/ui/reference-request-success.tsx +++ b/src/entities/vat-return/ui/reference-request-success.tsx @@ -1,5 +1,6 @@ import { motion } from 'framer-motion'; -import { +import { useTranslation } from 'react-i18next'; +import { FilterMotionDuration, FilterMotionStyle, FilterMotionVariants @@ -19,6 +20,7 @@ export const ReferenceRequestSuccess = ({ email, startDate }: ReferenceRequestSuccessProps) => { + const { t } = useTranslation(); const onClickToClose = () => { setPageOn(false); }; @@ -33,31 +35,31 @@ export const ReferenceRequestSuccess = ({ style={ FilterMotionStyle } >
    -

    - 부가세 참고 자료 + {t('vatReturn.vatReferenceData')}
    - 신청이 완료되었습니다. + {t('vatReturn.requestCompleted')}

    -

    파일은 선택한 수령 방법으로 제공됩니다.

    +

    {t('vatReturn.fileProvidedBySelectedMethod')}

    - 신청일 : { moment(startDate).format('YYYY.MM.DD') } + {t('vatReturn.applicationDate')} : { moment(startDate).format('YYYY.MM.DD') }
    - 메일주소 : { email } + {t('vatReturn.emailAddress')} : { email }

    -

    참고용 자료이므로 반드시 내부 회계자료 등과
    비교 후 사용해 주세요.

    +

    {t('vatReturn.referenceDataNote')}

    - + >{t('common.confirm')}
    diff --git a/src/entities/vat-return/ui/reference-wrap.tsx b/src/entities/vat-return/ui/reference-wrap.tsx index 374f490..9695d52 100644 --- a/src/entities/vat-return/ui/reference-wrap.tsx +++ b/src/entities/vat-return/ui/reference-wrap.tsx @@ -1,5 +1,6 @@ import moment from 'moment'; import { useState } from 'react'; +import { useTranslation } from 'react-i18next'; import { FilterCalendar } from '@/shared/ui/filter/calendar'; import { FilterSelect } from '@/shared/ui/filter/select'; import { ReferenceRequestSuccess } from './reference-request-success'; @@ -11,6 +12,7 @@ import { useStore } from '@/shared/model/store'; import { useVatReturnReferenceRequestMutation } from '../api/use-vat-return-reference-request-mutation'; export const ReferenceWrap = () => { + const { t } = useTranslation(); const midOptions = useStore.getState().UserStore.selectOptionsMids; const emailOptions = useStore.getState().UserStore.selectOptionsEmails; const userMid = useStore.getState().UserStore.mid; @@ -48,13 +50,13 @@ export const ReferenceWrap = () => { <>
    { maxBtn={ 2 } >
    - + >{t('vatReturn.requestData')}
    { + const { t, i18n } = useTranslation(); const [isOpen, setIsOpen] = useState(false); const [downloadBottomSheetOn, setDownloadBottomSheetOn] = useState(false); @@ -35,45 +37,30 @@ export const AmountSection = ({
    - - + {t('home.money', { value: new Intl.NumberFormat('en-US').format(detail.totalAmount || 0) })}
    -
    - { isOpen && + { isOpen &&
    • - ·  공급가액 + ·  {t('vatReturn.supplyAmount')} - + {t('home.money', { value: new Intl.NumberFormat('en-US').format(detail.supplyAmount || 0) })}
    • - ·  VAT + ·  {t('vatReturn.vat')} - + {t('home.money', { value: new Intl.NumberFormat('en-US').format(detail.vatAmount || 0) })}
    @@ -85,17 +72,17 @@ export const AmountSection = ({
    - { !!detail.issueDate && - moment(detail.issueDate).format('YYYY.MM.DD') + { !!detail.issueDate && + moment(detail.issueDate).format('YYYY.MM.DD') }
    - + >{t('vatReturn.taxInvoice')}
    { !!downloadBottomSheetOn && diff --git a/src/entities/vat-return/ui/section/issue-section.tsx b/src/entities/vat-return/ui/section/issue-section.tsx index 1ffbbef..44aa96a 100644 --- a/src/entities/vat-return/ui/section/issue-section.tsx +++ b/src/entities/vat-return/ui/section/issue-section.tsx @@ -1,4 +1,5 @@ import moment from 'moment'; +import { useTranslation } from 'react-i18next'; import { VatReturnDetailResponse } from '../../model/types'; export interface IssueSectionProps { @@ -8,46 +9,47 @@ export interface IssueSectionProps { export const IssueSection = ({ detail }: IssueSectionProps) => { + const { t } = useTranslation(); return ( <>
    -
    발행 정보
    +
    {t('vatReturn.issueInfo')}
    • MID { detail.mid }
    • - 발행대상일자 + {t('vatReturn.issueTargetDate')} { !!detail.targetBusinessStartDate && !!detail.targetBusinessEndDate && - moment(detail.targetBusinessStartDate).format('YYYY.MM.DD') - + - ' ~ ' - + - moment(detail.targetBusinessEndDate).format('YYYY.MM.DD') + moment(detail.targetBusinessStartDate).format('YYYY.MM.DD') + + + ' ~ ' + + + moment(detail.targetBusinessEndDate).format('YYYY.MM.DD') }
    • - 발행일자 + {t('vatReturn.issueDate')} { !!detail.issueDate && - moment(detail.issueDate).format('YYYY.MM.DD') + moment(detail.issueDate).format('YYYY.MM.DD') }
    • - 적요 + {t('vatReturn.subject')} { detail.subject }
    • - 발행대상 + {t('vatReturn.issueTarget')} { detail.targetType }
    • - 영수구분 + {t('vatReturn.receiptType')} { detail.receiptType }
    • diff --git a/src/entities/vat-return/ui/section/receiver-section.tsx b/src/entities/vat-return/ui/section/receiver-section.tsx index 9b4ae9b..261b57a 100644 --- a/src/entities/vat-return/ui/section/receiver-section.tsx +++ b/src/entities/vat-return/ui/section/receiver-section.tsx @@ -1,3 +1,4 @@ +import { useTranslation } from 'react-i18next'; import { VatReturnDetailResponse } from '../../model/types'; export interface ReceiverSectionProps { @@ -7,23 +8,24 @@ export interface ReceiverSectionProps { export const ReceiverSection = ({ detail }: ReceiverSectionProps) => { + const { t } = useTranslation(); return ( <>
      -
      공급받는 자 정보
      +
      {t('vatReturn.receiverInfo')}
      • - 사업자등록번호 + {t('merchant.businessRegistrationNumber')} { detail.receiverBusinessRegistrationNumber }
      • - 상호명 + {t('merchant.companyName')} { detail.receiverCompanyName }
      • - 대표자명 + {t('merchant.representativeName')} { detail.receiverCeoName }
      diff --git a/src/entities/vat-return/ui/section/supplier-section.tsx b/src/entities/vat-return/ui/section/supplier-section.tsx index f88f19b..b538c4c 100644 --- a/src/entities/vat-return/ui/section/supplier-section.tsx +++ b/src/entities/vat-return/ui/section/supplier-section.tsx @@ -1,3 +1,4 @@ +import { useTranslation } from 'react-i18next'; import { VatReturnDetailResponse } from '../../model/types'; export interface SupplierSectionProps { @@ -7,23 +8,24 @@ export interface SupplierSectionProps { export const SupplierSection = ({ detail }: SupplierSectionProps) => { + const { t } = useTranslation(); return ( <>
      -
      공급자 정보
      +
      {t('vatReturn.supplierInfo')}
      • - 사업자등록번호 + {t('merchant.businessRegistrationNumber')} { detail.supplierBusinessRegistrationNumber }
      • - 상호명 + {t('merchant.companyName')} { detail.supplierCompanyName }
      • - 대표자명 + {t('merchant.representativeName')} { detail.supplierCeoName }
      diff --git a/src/entities/vat-return/ui/vat-return-tab.tsx b/src/entities/vat-return/ui/vat-return-tab.tsx index 1f8fc3f..4c3335b 100644 --- a/src/entities/vat-return/ui/vat-return-tab.tsx +++ b/src/entities/vat-return/ui/vat-return-tab.tsx @@ -1,13 +1,15 @@ +import { useTranslation } from 'react-i18next'; import { PATHS } from '@/shared/constants/paths'; import { useNavigate } from '@/shared/lib/hooks/use-navigate'; -import { - VatReturnTabKeys, - VatReturnTabProps +import { + VatReturnTabKeys, + VatReturnTabProps } from '../model/types'; export const VatReturnTab = ({ activeTab }: VatReturnTabProps) => { + const { t } = useTranslation(); const { navigate } = useNavigate(); const onClickToNavigation = (tab: VatReturnTabKeys) => { @@ -23,14 +25,14 @@ export const VatReturnTab = ({ return( <>
      - - + + onClick={ () => onClickToNavigation(VatReturnTabKeys.VatReference) } + >{t('vatReturn.vatReference')}
      ); diff --git a/src/locales/en.json b/src/locales/en.json index f42d56a..b8affc4 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -190,8 +190,8 @@ }, "account": { "title": "Account Management", - "userManagement": "User Management", - "passwordManagement": "Password Management", + "userManagement": "Users", + "passwordManagement": "Passwords", "userSettings": "User Settings", "addUser": "Add User", "addAccount": "Add Account", @@ -273,6 +273,7 @@ "totalSettlement": "Total Settlement", "currencyWon": "", "currencySymbol": "₩", + "money": "₩{{value}}", "goToSales": "Go to Sales", "transactionInsights": "Transaction Insights", "basedOnLastWeek": "Based on Last Week", @@ -491,6 +492,39 @@ "faceAuth": { "title": "Face Authentication" }, + "vatReturn": { + "title": "VAT Return Data", + "taxInvoice": "Tax Invoice", + "vatReference": "VAT Reference", + "taxInvoiceDetail": "Tax Invoice Details", + "viewDetails": "View Details", + "transactionAmount": "Transaction Amount", + "supplyAmount": "Supply Amount", + "vat": "VAT", + "totalAmount": "Total Amount", + "transactionDate": "Transaction Date", + "amountDetail": "Amount Details", + "issueInfo": "Issue Information", + "issueTargetDate": "Issue Target Date", + "issueDate": "Issue Date", + "subject": "Subject", + "issueTarget": "Issue Target", + "receiptType": "Receipt Type", + "supplierInfo": "Supplier Information", + "receiverInfo": "Receiver Information", + "taxExemptionType": "Tax/Exemption Type", + "transactionPeriod": "Transaction Period", + "receivingEmail": "Receiving Email", + "requestData": "Request Data", + "vatReferenceData": "VAT Reference Data", + "requestCompleted": "Request completed.", + "requestFailed": "Request failed", + "fileProvidedBySelectedMethod": "The file will be provided by the selected method.", + "applicationDate": "Application Date", + "emailAddress": "Email Address", + "referenceDataNote": "Please compare with internal accounting data\nbefore using this reference material.", + "result": "Result" + }, "common": { "latest": "Latest", "oldest": "Oldest" diff --git a/src/locales/ko.json b/src/locales/ko.json index 86e7c67..a03f92f 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -277,6 +277,7 @@ "totalSales": "총 매출액", "totalSettlement": "총 정산액", "currencyWon": "원", + "money": "{{value}}원", "goToSales": "오늘 매출 바로가기", "transactionInsights": "거래 인사이트", "basedOnLastWeek": "최근 일주일 기준", @@ -495,6 +496,39 @@ "faceAuth": { "title": "안면인증" }, + "vatReturn": { + "title": "부가세 신고 자료", + "taxInvoice": "세금 계산서", + "vatReference": "부가세 참고", + "taxInvoiceDetail": "세금계산서 상세", + "viewDetails": "세부내역 조회", + "transactionAmount": "거래금액", + "supplyAmount": "공급가액", + "vat": "VAT", + "totalAmount": "합계금액", + "transactionDate": "거래일", + "amountDetail": "금액상세", + "issueInfo": "발행 정보", + "issueTargetDate": "발행대상일자", + "issueDate": "발행일자", + "subject": "적요", + "issueTarget": "발행대상", + "receiptType": "영수구분", + "supplierInfo": "공급자 정보", + "receiverInfo": "공급받는 자 정보", + "taxExemptionType": "거래 과세/면세 구분", + "transactionPeriod": "거래기간", + "receivingEmail": "수령메일주소", + "requestData": "자료신청", + "vatReferenceData": "부가세 참고 자료", + "requestCompleted": "신청이 완료되었습니다.", + "requestFailed": "신청 실패하였습니다", + "fileProvidedBySelectedMethod": "파일은 선택한 수령 방법으로 제공됩니다.", + "applicationDate": "신청일", + "emailAddress": "메일주소", + "referenceDataNote": "참고용 자료이므로 반드시 내부 회계자료 등과\n비교 후 사용해 주세요.", + "result": "결과" + }, "common": { "latest": "최신순", "oldest": "오래된순" diff --git a/src/pages/additional-service/ars/detail-page.tsx b/src/pages/additional-service/ars/detail-page.tsx index 9250468..f057969 100644 --- a/src/pages/additional-service/ars/detail-page.tsx +++ b/src/pages/additional-service/ars/detail-page.tsx @@ -86,13 +86,7 @@ export const ArsDetailPage = () => {
      - + {t('home.money', { value: new Intl.NumberFormat('en-US').format(detail?.amount || 0) })}
      { detail?.corpName }
      diff --git a/src/pages/additional-service/fund-account/result-detail-page.tsx b/src/pages/additional-service/fund-account/result-detail-page.tsx index 0eb880d..5c2491b 100644 --- a/src/pages/additional-service/fund-account/result-detail-page.tsx +++ b/src/pages/additional-service/fund-account/result-detail-page.tsx @@ -86,13 +86,7 @@ export const FundAccountResultDetailPage = () => {
      - + {t('home.money', { value: new Intl.NumberFormat('en-US').format(detail?.amount || 0) })}
      {detail?.accountName}({detail?.accountNo})
      diff --git a/src/pages/additional-service/fund-account/transfer-detail-page.tsx b/src/pages/additional-service/fund-account/transfer-detail-page.tsx index 30534ab..e1bc605 100644 --- a/src/pages/additional-service/fund-account/transfer-detail-page.tsx +++ b/src/pages/additional-service/fund-account/transfer-detail-page.tsx @@ -79,13 +79,7 @@ export const FundAccountTransferDetailPage = () => {
      - + {t('home.money', { value: new Intl.NumberFormat('en-US').format(detail?.amount || 0) })}
      {detail?.accountName}({detail?.accountNo})
      diff --git a/src/pages/additional-service/link-payment/apply/link-payment-apply-confirm-page.tsx b/src/pages/additional-service/link-payment/apply/link-payment-apply-confirm-page.tsx index e6e011d..4381a08 100644 --- a/src/pages/additional-service/link-payment/apply/link-payment-apply-confirm-page.tsx +++ b/src/pages/additional-service/link-payment/apply/link-payment-apply-confirm-page.tsx @@ -52,17 +52,9 @@ export const LinkPaymentApplyConfirmPage = () => { if (rs.status) { navigate(PATHS.additionalService.linkPayment.confirmSuccess); } else { - // 응답은 성공했지만 status가 false인 경우 - const validationErrors = rs.error?.details?.validationErrors; - if (validationErrors) { - // validation 에러 메시지들을 수집 - const errorMessages = Object.values(validationErrors).join('\n'); - snackBar(`[실패] ${errorMessages}`); - } else { - // 일반 에러 메시지 - const errorMessage = rs.error?.message || '요청을 처리할 수 없습니다.'; - snackBar(`[실패] ${errorMessage}`); - } + // 일반 에러 메시지 + const errorMessage = rs.error?.message || '요청을 처리할 수 없습니다.'; + snackBar(`[실패] ${errorMessage}`); } }) .catch((error) => { diff --git a/src/pages/additional-service/link-payment/link-payment-detail-page.tsx b/src/pages/additional-service/link-payment/link-payment-detail-page.tsx index 61c66a9..e67cf12 100644 --- a/src/pages/additional-service/link-payment/link-payment-detail-page.tsx +++ b/src/pages/additional-service/link-payment/link-payment-detail-page.tsx @@ -157,7 +157,7 @@ export const LinkPaymentDetailPage = () => {
      diff --git a/src/pages/additional-service/link-payment/separate-approval/link-payment-separate-approval-page.tsx b/src/pages/additional-service/link-payment/separate-approval/link-payment-separate-approval-page.tsx index 57d96ad..6bb1e67 100644 --- a/src/pages/additional-service/link-payment/separate-approval/link-payment-separate-approval-page.tsx +++ b/src/pages/additional-service/link-payment/separate-approval/link-payment-separate-approval-page.tsx @@ -52,11 +52,63 @@ export const LinkPaymentSeparateApprovalPage = () => { const handleCheckboxChange = (subRequestId: string) => { setSelectedItems(prev => { - if (prev.includes(subRequestId)) { - return prev.filter(id => id !== subRequestId); - } else { - return [...prev, subRequestId]; + // 현재 클릭한 item 찾기 + const target = items.find(i => i.subRequestId === subRequestId) + || items.find((_, idx) => `item-${idx}` === subRequestId); + if (!target) return prev; + + // 동일한 requestId를 가진 MAIN, SUB 그룹 가져오기 + const sameRequestIdItems = items.filter(i => i.requestId === target.requestId); + const mainItem = sameRequestIdItems.find(i => i.type === LinkPaymentSeparateType.MAIN); + // PENDING 상태인 SUB만 필터링 + const subItems = sameRequestIdItems.filter(i => + i.type === LinkPaymentSeparateType.SUB && i.paymentStatus === 'PENDING' + ); + + const mainId = mainItem?.subRequestId || (mainItem ? `item-${items.indexOf(mainItem)}` : ''); + const subIds = subItems.map(i => i.subRequestId || `item-${items.indexOf(i)}`); + + // ----------------------------- + // MAIN 클릭 시 + // ----------------------------- + if (target.type === LinkPaymentSeparateType.MAIN) { + const isMainChecked = prev.includes(mainId); + if (isMainChecked) { + // MAIN 해제 → PENDING인 SUB만 해제 + return prev.filter(id => ![mainId, ...subIds].includes(id)); + } else { + // MAIN 체크 → PENDING인 SUB만 추가 + return [...new Set([...prev, mainId, ...subIds])]; + } } + + // ----------------------------- + // SUB 클릭 시 + // ----------------------------- + const isChecked = prev.includes(subRequestId); + let updated: string[] = []; + + if (isChecked) { + // SUB 해제 + updated = prev.filter(id => id !== subRequestId); + + // 해제 후 남은 PENDING SUB 중 하나라도 빠져 있으면 MAIN도 해제 + const allPendingSubsChecked = subIds.every(id => updated.includes(id)); + if (!allPendingSubsChecked && mainId) { + updated = updated.filter(id => id !== mainId); + } + } else { + // SUB 체크 + updated = [...prev, subRequestId]; + + // 모든 PENDING SUB 체크되면 MAIN도 자동 체크 + const allPendingSubsChecked = subIds.every(id => updated.includes(id)); + if (allPendingSubsChecked && mainId) { + updated = [...new Set([...updated, mainId])]; + } + } + + return updated; }); }; @@ -67,12 +119,60 @@ export const LinkPaymentSeparateApprovalPage = () => { })); }; - // 기간연장 버튼 활성화 조건: 선택된 항목이 있고, 모든 선택된 항목의 연장기간이 설정됨 - const isExtendButtonEnabled = () => { - if (selectedItems.length === 0) return false; - return selectedItems.every(id => extendPeriods[id] && extendPeriods[id] !== ''); + // 각 SUB 항목이 연장기간 설정 가능한지 체크 + const canExtendPeriod = (item: ExtensionLinkPaySeparateDetailItem) => { + const today = moment().format('YYYYMMDD'); + const paymentLimitDate = item.paymentLimitDate || ''; + const paymentLimitCount = item.paymentLimitCount || 0; + + // 연장횟수 < 3 이고 유효일자 >= 조회일자 + return paymentLimitCount < 3 && paymentLimitDate >= today; }; + // 각 SUB 항목이 링크중단 가능한지 체크 + const canLinkBreak = (item: ExtensionLinkPaySeparateDetailItem) => { + const today = moment().format('YYYYMMDD'); + const paymentLimitDate = item.paymentLimitDate || ''; + + // 유효일자 >= 조회일자 + return paymentLimitDate >= today; + }; + + const isExtendButtonEnabled = () => { + // MAIN 제외, 체크된 SUB 중에서 + const checkedSubs = items.filter((i, index) => { + const itemId = i.subRequestId || `item-${index}`; + return i.type === LinkPaymentSeparateType.SUB && + selectedItems.includes(itemId) && + i.paymentStatus === 'PENDING'; + }); + + // 체크된 SUB가 없으면 비활성화 + if (checkedSubs.length === 0) return false; + + // 모든 체크된 SUB가 연장 가능하고, 연장기간이 설정되어 있어야 함 + return checkedSubs.every((sub) => { + const itemId = sub.subRequestId || `item-${items.indexOf(sub)}`; + return canExtendPeriod(sub) && extendPeriods[itemId] && extendPeriods[itemId] !== ''; + }); + }; + + const isLinkBreadkEnabled = () => { + // MAIN 제외, 체크된 SUB 중에서 + const checkedSubs = items.filter((i, index) => { + const itemId = i.subRequestId || `item-${index}`; + return i.type === LinkPaymentSeparateType.SUB && + selectedItems.includes(itemId) && + i.paymentStatus === 'PENDING'; + }); + + // 체크된 SUB가 없으면 비활성화 + if (checkedSubs.length === 0) return false; + + // 모든 체크된 SUB가 링크중단 가능해야 함 + return checkedSubs.every(sub => canLinkBreak(sub)); + } + const onClickToValidityPeriod = () => { // 기간연장 바텀시트 열기 setExtendedPeriodBottomSheetOn(true); @@ -94,8 +194,13 @@ export const LinkPaymentSeparateApprovalPage = () => { return; } - // 모든 선택된 항목들의 연장 기간이 설정되었는지 확인 - const allHaveExtendPeriod = selectedItems.every(id => extendPeriods[id]); + // MAIN을 제외한 선택된 SUB 항목들의 연장 기간이 설정되었는지 확인 + const selectedSubItems = selectedItems.filter(id => { + const item = items.find(i => (i.subRequestId || `item-${items.indexOf(i)}`) === id); + return item && item.type === LinkPaymentSeparateType.SUB; + }); + + const allHaveExtendPeriod = selectedSubItems.every(id => extendPeriods[id]); if (!allHaveExtendPeriod) { setErrorMessage('모든 선택된 항목의 연장 기간을 선택해주세요.'); @@ -103,15 +208,15 @@ export const LinkPaymentSeparateApprovalPage = () => { return; } - // 첫 번째 선택된 항목의 연장 기간 사용 (모든 항목이 같은 기간으로 연장) - const firstSelectedId = selectedItems[0] as string; - const extendDays = extendPeriods[firstSelectedId] as string; + // 첫 번째 선택된 SUB 항목의 연장 기간 사용 (모든 항목이 같은 기간으로 연장) + const firstSelectedSubId = selectedSubItems[0] as string; + const extendDays = extendPeriods[firstSelectedSubId] as string; // 연장 날짜 계산 (오늘 날짜 + 연장일수) const extendDate = moment().add(parseInt(extendDays), 'days').format('YYYYMMDD'); - // selectedItems를 API 형식으로 변환 - const selectedItemsData = selectedItems.map(itemId => { + // MAIN을 제외한 SUB 항목만 API 형식으로 변환 + const selectedItemsData = selectedSubItems.map(itemId => { const item = items.find(i => (i.subRequestId || `item-${items.indexOf(i)}`) === itemId); return { type: item?.type || '', @@ -157,7 +262,13 @@ export const LinkPaymentSeparateApprovalPage = () => { return; } - const selectedItemsData = selectedItems.map(itemId => { + // MAIN을 제외한 SUB 항목만 필터링 + const selectedSubItems = selectedItems.filter(id => { + const item = items.find(i => (i.subRequestId || `item-${items.indexOf(i)}`) === id); + return item && item.type === LinkPaymentSeparateType.SUB; + }); + + const selectedItemsData = selectedSubItems.map(itemId => { const item = items.find(i => (i.subRequestId || `item-${items.indexOf(i)}`) === itemId); return { type: item?.type || '', @@ -230,67 +341,75 @@ export const LinkPaymentSeparateApprovalPage = () => {
      {items.map((item, index) => { const itemId = item.subRequestId || `item-${index}`; + const isDisabled = item.paymentStatus !== 'PENDING'; return ( -
      -
      - handleCheckboxChange(itemId)} - className="card-checkbox" - /> - [{item.type}] - {item.moid} -
      -
      -
        -
      • - • 거래금액: - {item.amount.toLocaleString()} -
      • -
      • - • 결제상태: - {item.paymentStatusName} -
      • - {item.type !== LinkPaymentSeparateType.MAIN && ( - <> -
      • - • 유효기간: - - {item.paymentLimitDate - ? moment(item.paymentLimitDate, 'YYYYMMDD').format('YYYY/MM/DD') - : '-' - } - -
      • -
      • - • 연장횟수: - {item.paymentLimitCount} -
      • - - )} -
      -
      -
      -
      - - +
      +
      + handleCheckboxChange(itemId)} + className="card-checkbox" + disabled={item.paymentStatus !== 'PENDING'} + /> + [{item.type}] + {item.moid} +
      +
      +
        +
      • + • 거래금액: + {item.amount.toLocaleString()} +
      • +
      • + • 결제상태: + {item.paymentStatusName} +
      • + {item.type !== LinkPaymentSeparateType.MAIN && ( + <> +
      • + • 유효기간: + + {item.paymentLimitDate + ? moment(item.paymentLimitDate, 'YYYYMMDD').format('YYYY/MM/DD') + : '-' + } + +
      • +
      • + • 연장횟수: + {item.paymentLimitCount} +
      • + + )} +
      +
      +
      +
      + + +
      -
      ); })}
      @@ -306,7 +425,7 @@ export const LinkPaymentSeparateApprovalPage = () => {
      diff --git a/src/pages/additional-service/link-payment/separate-approval/link-payment-separate-approval-success-page.tsx b/src/pages/additional-service/link-payment/separate-approval/link-payment-separate-approval-success-page.tsx index d5d5711..3699a61 100644 --- a/src/pages/additional-service/link-payment/separate-approval/link-payment-separate-approval-success-page.tsx +++ b/src/pages/additional-service/link-payment/separate-approval/link-payment-separate-approval-success-page.tsx @@ -1,6 +1,4 @@ import { motion } from 'framer-motion'; -import { useNavigate } from '@/shared/lib/hooks/use-navigate'; -import { PATHS } from "@/shared/constants/paths"; import { FilterMotionDuration, FilterMotionStyle, diff --git a/src/pages/additional-service/payout/detail-page.tsx b/src/pages/additional-service/payout/detail-page.tsx index 2a7b57e..2083760 100644 --- a/src/pages/additional-service/payout/detail-page.tsx +++ b/src/pages/additional-service/payout/detail-page.tsx @@ -108,13 +108,7 @@ export const PayoutDetailPage = () => {
      - + {t('home.money', { value: new Intl.NumberFormat('en-US').format(detail?.disbursementAmount || 0) })}
      {detail?.companyName}
      diff --git a/src/pages/transaction/all-transaction/list-page.tsx b/src/pages/transaction/all-transaction/list-page.tsx index 0aab01a..57167fc 100644 --- a/src/pages/transaction/all-transaction/list-page.tsx +++ b/src/pages/transaction/all-transaction/list-page.tsx @@ -231,13 +231,7 @@ export const AllTransactionListPage = () => {
      {t('transaction.searchAmount')}
      - + {t('home.money', { value: new Intl.NumberFormat('en-US').format(totalAmount || 0) })}
      + >{t('vatReturn.viewDetails')}
      diff --git a/src/pages/vat-return/list-page.tsx b/src/pages/vat-return/list-page.tsx index 693f27e..99273d6 100644 --- a/src/pages/vat-return/list-page.tsx +++ b/src/pages/vat-return/list-page.tsx @@ -1,11 +1,12 @@ import { useState } from 'react'; +import { useTranslation } from 'react-i18next'; import { PATHS } from '@/shared/constants/paths'; import { useNavigate } from '@/shared/lib/hooks/use-navigate'; 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 { +import { useSetHeaderTitle, useSetHeaderType, useSetFooterMode, @@ -13,11 +14,12 @@ import { } from '@/widgets/sub-layout/use-sub-layout'; export const ListPage = () => { + const { t } = useTranslation(); const { navigate } = useNavigate(); const [activeTab, setActiveTab] = useState(VatReturnTabKeys.List); - - useSetHeaderTitle('부가세 신고 자료'); + + useSetHeaderTitle(t('vatReturn.title')); useSetHeaderType(HeaderType.LeftArrow); useSetFooterMode(false); useSetOnBack(() => { diff --git a/src/pages/vat-return/reference-page.tsx b/src/pages/vat-return/reference-page.tsx index c0f90ec..b1e289c 100644 --- a/src/pages/vat-return/reference-page.tsx +++ b/src/pages/vat-return/reference-page.tsx @@ -1,11 +1,12 @@ import { useState } from 'react'; +import { useTranslation } from 'react-i18next'; import { PATHS } from '@/shared/constants/paths'; import { useNavigate } from '@/shared/lib/hooks/use-navigate'; import { VatReturnTab } from '@/entities/vat-return/ui/vat-return-tab'; import { ReferenceWrap } from '@/entities/vat-return/ui/reference-wrap'; import { VatReturnTabKeys } from '@/entities/vat-return/model/types'; import { HeaderType } from '@/entities/common/model/types'; -import { +import { useSetHeaderTitle, useSetHeaderType, useSetFooterMode, @@ -13,11 +14,12 @@ import { } from '@/widgets/sub-layout/use-sub-layout'; export const ReferencePage = () => { + const { t } = useTranslation(); const { navigate } = useNavigate(); const [activeTab, setActiveTab] = useState(VatReturnTabKeys.VatReference); - - useSetHeaderTitle('부가세 신고 자료'); + + useSetHeaderTitle(t('vatReturn.title')); useSetHeaderType(HeaderType.LeftArrow); useSetFooterMode(false); useSetOnBack(() => { diff --git a/src/shared/ui/assets/css/style-fix.css b/src/shared/ui/assets/css/style-fix.css index 9b4648e..3e865ee 100644 --- a/src/shared/ui/assets/css/style-fix.css +++ b/src/shared/ui/assets/css/style-fix.css @@ -233,6 +233,29 @@ main.home-main{ box-shadow: 0 4px 12px rgba(62, 106, 252, 0.2); } +/* PENDING이 아닌 항목 비활성화 스타일 */ +.approval-card.disabled { + opacity: 0.5; + background: var(--color-F9F9F9); + pointer-events: none; +} + +.approval-card.disabled .card-checkbox { + cursor: not-allowed; + background-color: var(--color-E6E6E6); + border-color: var(--color-CCCCCC); +} + +.approval-card.disabled .card-tid, +.approval-card.disabled .info-list .value { + color: var(--color-999999); +} + +.approval-card.disabled .period-selector select { + background-color: var(--color-F3F3F3); + cursor: not-allowed; +} + .approval-card .card-checkbox { display: block !important; position: absolute;