이미지 다운로드 부분 수정

This commit is contained in:
focp212@naver.com
2025-11-11 11:23:52 +09:00
parent a14baf617f
commit 3b23fa2514
4 changed files with 110 additions and 88 deletions

View File

@@ -9,27 +9,30 @@ import { useEffect } from 'react';
import { NumericFormat } from 'react-number-format'; import { NumericFormat } from 'react-number-format';
import { AmountInfo, CustomerInfo, IssueInfo, MerchantInfo, ProductInfo, TransactionInfo } from '@/entities/transaction/model/types'; import { AmountInfo, CustomerInfo, IssueInfo, MerchantInfo, ProductInfo, TransactionInfo } from '@/entities/transaction/model/types';
import moment from 'moment'; import moment from 'moment';
import { RecipientInfo, SupplierInfo, TransactionDetails } from '@/entities/vat-return/model/types';
export interface TaxInvoiceSampleProps { export interface TaxInvoiceSampleProps {
taxInvoiceSampleOn: boolean; taxInvoiceSampleOn: boolean;
setTaxInvoiceSampleOn: (taxInvoiceSampleOn: boolean) => void; setTaxInvoiceSampleOn: (taxInvoiceSampleOn: boolean) => void;
merchantInfo?: MerchantInfo; supplierInfo?: SupplierInfo;
issueInfo?: IssueInfo; recipientInfo?: RecipientInfo;
amountInfo?: AmountInfo; issueDate?: string;
transactionInfo?: TransactionInfo; supplyAmount?: number;
customerInfo?: CustomerInfo; taxAmount?: number
productInfo?: ProductInfo; totalAmount?: number;
transactionDetails?: TransactionDetails;
}; };
export const TaxInvoiceSample = ({ export const TaxInvoiceSample = ({
taxInvoiceSampleOn, taxInvoiceSampleOn,
setTaxInvoiceSampleOn, setTaxInvoiceSampleOn,
merchantInfo, supplierInfo,
issueInfo, recipientInfo,
amountInfo, issueDate,
transactionInfo, supplyAmount,
customerInfo, taxAmount,
productInfo totalAmount,
transactionDetails
}: TaxInvoiceSampleProps) => { }: TaxInvoiceSampleProps) => {
const { t } = useTranslation(); const { t } = useTranslation();
@@ -49,23 +52,7 @@ export const TaxInvoiceSample = ({
setTaxInvoiceSampleOn(false); setTaxInvoiceSampleOn(false);
}; };
const getDateTime = () => {
let date = '';
let time = '';
if(!!issueInfo?.issueDate){
date = moment(issueInfo?.issueDate).format('YYYY.MM.DD');
}
if(!!issueInfo?.issueDate && !!issueInfo?.issueTime){
time = moment(issueInfo?.issueDate+' '+issueInfo?.issueTime).format('HH:mm:ss');
}
if(!!date && !!time){
return date + ' | ' + time;
}
else{
return '';
}
};
useEffect(() => { useEffect(() => {
if(!!taxInvoiceSampleOn){ if(!!taxInvoiceSampleOn){
@@ -105,23 +92,23 @@ export const TaxInvoiceSample = ({
</div> </div>
<div className="row"> <div className="row">
<div className="k"></div> <div className="k"></div>
<div className="v">{ merchantInfo?.merchantName }</div> <div className="v">{ }</div>
</div> </div>
<div className="row"> <div className="row">
<div className="k"></div> <div className="k"></div>
<div className="v">{ merchantInfo?.representativeName }</div> <div className="v">{ }</div>
</div> </div>
<div className="row"> <div className="row">
<div className="k"></div> <div className="k"></div>
<div className="v">{ merchantInfo?.businessNumber }</div> <div className="v">{ }</div>
</div> </div>
<div className="row"> <div className="row">
<div className="k"></div> <div className="k"></div>
<div className="v">{ merchantInfo?.phoneNumber }</div> <div className="v">{ }</div>
</div> </div>
<div className="row"> <div className="row">
<div className="k"></div> <div className="k"></div>
<div className="v">{ merchantInfo?.address }</div> <div className="v">{ }</div>
</div> </div>
<div className="row"> <div className="row">
<div className="k">URL</div> <div className="k">URL</div>
@@ -153,7 +140,7 @@ export const TaxInvoiceSample = ({
<div className="k"> </div> <div className="k"> </div>
<div className="v"> <div className="v">
<NumericFormat <NumericFormat
value={ amountInfo?.amount } value={ 0 }
thousandSeparator thousandSeparator
displayType="text" displayType="text"
></NumericFormat> ></NumericFormat>
@@ -163,7 +150,7 @@ export const TaxInvoiceSample = ({
<div className="k"></div> <div className="k"></div>
<div className="v"> <div className="v">
<NumericFormat <NumericFormat
value={ amountInfo?.supplyAmount } value={ 0 }
thousandSeparator thousandSeparator
displayType="text" displayType="text"
></NumericFormat> ></NumericFormat>
@@ -173,7 +160,7 @@ export const TaxInvoiceSample = ({
<div className="k"></div> <div className="k"></div>
<div className="v"> <div className="v">
<NumericFormat <NumericFormat
value={ amountInfo?.vatAmount } value={ 0 }
thousandSeparator thousandSeparator
displayType="text" displayType="text"
></NumericFormat> ></NumericFormat>
@@ -183,7 +170,7 @@ export const TaxInvoiceSample = ({
<div className="k"></div> <div className="k"></div>
<div className="v"> <div className="v">
<NumericFormat <NumericFormat
value={ amountInfo?.taxFreeAmount } value={ 0 }
thousandSeparator thousandSeparator
displayType="text" displayType="text"
></NumericFormat> ></NumericFormat>
@@ -193,7 +180,7 @@ export const TaxInvoiceSample = ({
<div className="k"></div> <div className="k"></div>
<div className="v"> <div className="v">
<NumericFormat <NumericFormat
value={ amountInfo?.serviceAmount } value={ 0 }
thousandSeparator thousandSeparator
displayType="text" displayType="text"
></NumericFormat> ></NumericFormat>
@@ -202,31 +189,31 @@ export const TaxInvoiceSample = ({
<div className="row split"></div> <div className="row split"></div>
<div className="row"> <div className="row">
<div className="k"></div> <div className="k"></div>
<div className="v">{ transactionInfo?.paymentMethod }</div> <div className="v">{ }</div>
</div> </div>
<div className="row"> <div className="row">
<div className="k"></div> <div className="k"></div>
<div className="v">{ issueInfo?.issueNumber }</div> <div className="v">{ }</div>
</div> </div>
<div className="row"> <div className="row">
<div className="k"></div> <div className="k"></div>
<div className="v">{ customerInfo?.customerName }</div> <div className="v">{ }</div>
</div> </div>
<div className="row"> <div className="row">
<div className="k"></div> <div className="k"></div>
<div className="v">{ productInfo?.productName }</div> <div className="v">{ }</div>
</div> </div>
<div className="row"> <div className="row">
<div className="k"></div> <div className="k"></div>
<div className="v">{ issueInfo?.approvalNumber }</div> <div className="v">{ }</div>
</div> </div>
<div className="row"> <div className="row">
<div className="k"></div> <div className="k"></div>
<div className="v">{ getDateTime() }</div> <div className="v">{ }</div>
</div> </div>
<div className="row"> <div className="row">
<div className="k"></div> <div className="k"></div>
<div className="v">{ issueInfo?.purpose }</div> <div className="v">{ }</div>
</div> </div>
</div> </div>
<div className="notice"> <div className="notice">

View File

@@ -204,34 +204,36 @@ export const AmountInfoSection = ({
userEmail?: string userEmail?: string
) => { ) => {
if(!!tid){ if(!!tid){
let params: CashReceiptReceiptDownloadParams = { if(selectedMode === DownloadSelectedMode.EMAIL
tid: tid && !!userEmail
}; ){
cashReceiptReceiptDownload(params).then((rs: CashReceiptReceiptDownloadResponse) => { // 추가 api 필요
/* }
if(rs?.merchantInfo){ else if(selectedMode === DownloadSelectedMode.IMAGE){
rs.merchantInfo.merchantName = '나이스페이먼츠'; let params: CashReceiptReceiptDownloadParams = {
} tid: tid
*/ };
setReceiptIssueInfo(rs?.issueInfo); cashReceiptReceiptDownload(params).then((rs: CashReceiptReceiptDownloadResponse) => {
setReceiptMerchantInfo(rs?.merchantInfo); /*
setReceiptTransactionInfo(rs?.transactionInfo); if(rs?.merchantInfo){
setReceiptAmountInfo(rs?.amountInfo); rs.merchantInfo.merchantName = '나이스페이먼츠';
setReceiptCustomerInfo(rs?.customerInfo); }
setReceiptProductInfo(rs?.productInfo); */
if(selectedMode === DownloadSelectedMode.IMAGE){ setReceiptIssueInfo(rs?.issueInfo);
setReceiptMerchantInfo(rs?.merchantInfo);
setReceiptTransactionInfo(rs?.transactionInfo);
setReceiptAmountInfo(rs?.amountInfo);
setReceiptCustomerInfo(rs?.customerInfo);
setReceiptProductInfo(rs?.productInfo);
setCashReceiptSampleOn(true); setCashReceiptSampleOn(true);
}
else if(selectedMode === DownloadSelectedMode.EMAIL){ }).catch((e: any) => {
snackBar('거래확인서 다운 성공'); if(e.response?.data?.error?.message){
} snackBar(e.response?.data?.error?.message);
return;
}).catch((e: any) => { }
if(e.response?.data?.error?.message){ });
snackBar(e.response?.data?.error?.message); }
return;
}
});
} }
}; };

View File

@@ -1,11 +1,9 @@
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { motion } from 'framer-motion'; import { motion } from 'framer-motion';
import { PATHS } from '@/shared/constants/paths';
import { useLocation } from 'react-router'; import { useLocation } from 'react-router';
import { useNavigate } from '@/shared/lib/hooks/use-navigate'; import { useNavigate } from '@/shared/lib/hooks/use-navigate';
import { useVatReturnDetailMutation } from '@/entities/vat-return/api/use-vat-return-detail-mutation'; import { useVatReturnDetailMutation } from '@/entities/vat-return/api/use-vat-return-detail-mutation';
import { HeaderType } from '@/entities/common/model/types';
import { import {
Breakdown, Breakdown,
VatReturnBreakdownParams, VatReturnBreakdownParams,
@@ -13,17 +11,10 @@ import {
VatReturnDetailParams, VatReturnDetailParams,
VatReturnDetailResponse VatReturnDetailResponse
} from '@/entities/vat-return/model/types'; } 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 { SupplierSection } from '@/entities/vat-return/ui/section/supplier-section';
import { ReceiverSection } from '@/entities/vat-return/ui/section/receiver-section'; import { ReceiverSection } from '@/entities/vat-return/ui/section/receiver-section';
import { IssueSection } from '@/entities/vat-return/ui/section/issue-section'; import { IssueSection } from '@/entities/vat-return/ui/section/issue-section';
import { AmountSection } from '@/entities/vat-return/ui/section/amount-section'; import { AmountSection } from '@/entities/vat-return/ui/section/amount-section';
import { useVatReturnTaxInvoiceMutation } from '@/entities/vat-return/api/use-vat-return-tax-invoice-mutation';
import { VatReturnListDetailBottomSheet } from '@/entities/vat-return/ui/list-detail-bottom-sheet'; import { VatReturnListDetailBottomSheet } from '@/entities/vat-return/ui/list-detail-bottom-sheet';
import { useVatReturnBreakdownMutation } from '@/entities/vat-return/api/use-vat-return-breakdown-mutation'; import { useVatReturnBreakdownMutation } from '@/entities/vat-return/api/use-vat-return-breakdown-mutation';
import { DetailMotionDuration, DetailMotionStyle, DetailMotionVariants } from '@/entities/common/model/constant'; import { DetailMotionDuration, DetailMotionStyle, DetailMotionVariants } from '@/entities/common/model/constant';
@@ -46,14 +37,11 @@ export const TaxInvoiceDetail = ({
const { navigate } = useNavigate(); const { navigate } = useNavigate();
const location = useLocation(); const location = useLocation();
// taxInvoiceNumber = 'TAX202506300001';
const [openAmount, setOpenAmount] = useState<boolean>(false); const [openAmount, setOpenAmount] = useState<boolean>(false);
const [bottomSheetOn, setBottomSheetOn] = useState<boolean>(false); const [bottomSheetOn, setBottomSheetOn] = useState<boolean>(false);
const [detail, setDetail] = useState<VatReturnDetailResponse>({}); const [detail, setDetail] = useState<VatReturnDetailResponse>({});
const [breakdown, setBreakdown] = useState<Array<Breakdown>>([]); const [breakdown, setBreakdown] = useState<Array<Breakdown>>([]);
const { mutateAsync: vatReturnTaxInvoice } = useVatReturnTaxInvoiceMutation();
const { mutateAsync: vatReturnDetail } = useVatReturnDetailMutation(); const { mutateAsync: vatReturnDetail } = useVatReturnDetailMutation();
const { mutateAsync: vatReturnBreakdown } = useVatReturnBreakdownMutation(); const { mutateAsync: vatReturnBreakdown } = useVatReturnBreakdownMutation();
@@ -125,6 +113,7 @@ export const TaxInvoiceDetail = ({
<div className="option-list pb-86"> <div className="option-list pb-86">
<div className="txn-detail"> <div className="txn-detail">
<AmountSection <AmountSection
taxInvoiceNumber={ taxInvoiceNumber }
detail={ detail } detail={ detail }
></AmountSection> ></AmountSection>
<div className="txn-divider minus"></div> <div className="txn-divider minus"></div>

View File

@@ -1,24 +1,39 @@
import moment from 'moment'; import moment from 'moment';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { VatReturnDetailResponse } from '../../model/types'; import { RecipientInfo, SupplierInfo, TransactionDetails, VatReturnDetailResponse, VatReturnTaxInvoiceParams, VatReturnTaxInvoiceResponse } from '../../model/types';
import { SectionTitleArrow } from '@/entities/common/ui/section-title-arrow'; import { SectionTitleArrow } from '@/entities/common/ui/section-title-arrow';
import { NumericFormat } from 'react-number-format';
import SlideDown from 'react-slidedown'; import SlideDown from 'react-slidedown';
import 'react-slidedown/lib/slidedown.css'; import 'react-slidedown/lib/slidedown.css';
import { useState } from 'react'; import { useState } from 'react';
import { DownloadBottomSheet, DownloadSelectedMode } from '@/entities/common/ui/download-bottom-sheet'; import { DownloadBottomSheet, DownloadSelectedMode } from '@/entities/common/ui/download-bottom-sheet';
import { useVatReturnTaxInvoiceMutation } from '../../api/use-vat-return-tax-invoice-mutation';
import { TaxInvoiceSample } from '@/entities/common/ui/tax-invoice-sample';
export interface AmountSectionProps { export interface AmountSectionProps {
taxInvoiceNumber: string;
detail: VatReturnDetailResponse; detail: VatReturnDetailResponse;
}; };
export const AmountSection = ({ export const AmountSection = ({
taxInvoiceNumber,
detail detail
}: AmountSectionProps) => { }: AmountSectionProps) => {
const { t, i18n } = useTranslation(); const { t, i18n } = useTranslation();
const [isOpen, setIsOpen] = useState<boolean>(false); const [isOpen, setIsOpen] = useState<boolean>(false);
const [downloadBottomSheetOn, setDownloadBottomSheetOn] = useState<boolean>(false); const [downloadBottomSheetOn, setDownloadBottomSheetOn] = useState<boolean>(false);
const [taxInvoiceSampleOn, setTaxInvoiceSampleOn] = useState<boolean>(false);
const [supplierInfo, setSupplierInfo] = useState<SupplierInfo>();
const [recipientInfo, setRecipientInfo] = useState<RecipientInfo>();
const [issueDate, setIssueDate] = useState<string>();
const [supplyAmount, setSupplyAmount] = useState<number>();
const [taxAmount, setTaxAmount] = useState<number>();
const [totalAmount, setTotalAmount] = useState<number>();
const [transactionDetails, setTransactionDetails] = useState<TransactionDetails>();
const { mutateAsync: vatReturnTaxInvoice } = useVatReturnTaxInvoiceMutation();
const openSection = () => { const openSection = () => {
const status = !isOpen; const status = !isOpen;
setIsOpen(status); setIsOpen(status);
@@ -28,7 +43,29 @@ export const AmountSection = ({
selectedMode: DownloadSelectedMode, selectedMode: DownloadSelectedMode,
userEmail?: string userEmail?: string
) => { ) => {
if(selectedMode === DownloadSelectedMode.EMAIL
&& !!userEmail
){
// 추가 API 필요
}
else if(selectedMode === DownloadSelectedMode.IMAGE){
let params: VatReturnTaxInvoiceParams = {
taxInvoiceNumber: taxInvoiceNumber
};
vatReturnTaxInvoice(params).then((rs: VatReturnTaxInvoiceResponse) => {
setSupplierInfo(rs?.supplierInfo);
setRecipientInfo(rs?.recipientInfo);
setIssueDate(rs?.issueDate);
setSupplyAmount(rs?.supplyAmount);
setTaxAmount(rs?.taxAmount);
setTotalAmount(rs?.totalAmount);
setTransactionDetails(rs?.transactionDetails);
setTaxInvoiceSampleOn(true);
});
}
}; };
const onClickToOpenDownloadBottomSheet = () => { const onClickToOpenDownloadBottomSheet = () => {
@@ -97,6 +134,13 @@ export const AmountSection = ({
sendRequest={ onRequestDownload } sendRequest={ onRequestDownload }
></DownloadBottomSheet> ></DownloadBottomSheet>
} }
{ !!taxInvoiceSampleOn &&
<TaxInvoiceSample
taxInvoiceSampleOn={ taxInvoiceSampleOn }
setTaxInvoiceSampleOn={ setTaxInvoiceSampleOn }
></TaxInvoiceSample>
}
</> </>
); );
}; };