diff --git a/src/entities/transaction/ui/cash-receipt-hand-written-issuance-step1.tsx b/src/entities/transaction/ui/cash-receipt-hand-written-issuance-step1.tsx index 0c4f195..a6c27d4 100644 --- a/src/entities/transaction/ui/cash-receipt-hand-written-issuance-step1.tsx +++ b/src/entities/transaction/ui/cash-receipt-hand-written-issuance-step1.tsx @@ -54,7 +54,7 @@ export const CashReceiptHandWrittenIssuanceStep1 = ({ className="error" type="text" value={ businessNumber } - disabled={ true } + readOnly={ true } /> diff --git a/src/entities/transaction/ui/cash-receipt-hand-written-issuance-step2.tsx b/src/entities/transaction/ui/cash-receipt-hand-written-issuance-step2.tsx index 5603a46..ff0a768 100644 --- a/src/entities/transaction/ui/cash-receipt-hand-written-issuance-step2.tsx +++ b/src/entities/transaction/ui/cash-receipt-hand-written-issuance-step2.tsx @@ -1,37 +1,40 @@ import { ChangeEvent } from 'react'; import { useSetOnBack } from '@/widgets/sub-layout/use-sub-layout'; import { ProcessStep } from '../model/types'; +import { NumericFormat } from 'react-number-format'; export interface CashReceiptHandWrittenIssuanceStep2Props { setProcessStep: (processStep: ProcessStep) => void; + issueAmount: number; supplyAmount: number; vatAmount: number; taxFreeAmount: number; serviceCharge: number; + setIssueAmount: (issueAmount: number) => void; setSupplyAmount: (supplyAmount: number) => void; setVatAmount: (vatAmount: number) => void; setTaxFreeAmount: (taxFreeAmount: number) => void; setServiceCharge: (serviceCharge: number) => void; + onClickToVatCalculate: () => void; }; export const CashReceiptHandWrittenIssuanceStep2 = ({ setProcessStep, + issueAmount, supplyAmount, vatAmount, taxFreeAmount, serviceCharge, + setIssueAmount, setSupplyAmount, setVatAmount, setTaxFreeAmount, - setServiceCharge + setServiceCharge, + onClickToVatCalculate }: CashReceiptHandWrittenIssuanceStep2Props) => { useSetOnBack(() => { setProcessStep(ProcessStep.One); }); - - const onClickToVatCalculate = () => { - - }; - + return ( <>

발행 금액 입력

@@ -41,15 +44,16 @@ export const CashReceiptHandWrittenIssuanceStep2 = ({
발행금액
- + ) => setIssueAmount(parseInt(e.target.value)) } + >
@@ -58,49 +62,45 @@ export const CashReceiptHandWrittenIssuanceStep2 = ({
공급가액
- ) => setSupplyAmount(parseInt(e.target.value)) } - /> + >
VAT
- ) => setVatAmount(parseInt(e.target.value)) } - /> + >
면세금액
- ) => setTaxFreeAmount(parseInt(e.target.value)) } - /> + >
봉사료
- ) => setServiceCharge(parseInt(e.target.value)) } - /> + >
diff --git a/src/entities/user/api/use-business-property-by-mid-mutation.ts b/src/entities/user/api/use-business-property-by-mid-mutation.ts deleted file mode 100644 index 3b33507..0000000 --- a/src/entities/user/api/use-business-property-by-mid-mutation.ts +++ /dev/null @@ -1,29 +0,0 @@ -import axios from 'axios'; -import { API_URL_USER } from '@/shared/api/api-url-user'; -import { resultify } from '@/shared/lib/resultify'; -import { NiceAxiosError } from '@/shared/@types/error'; -import { - BusinessPropertyByMidParams, - BusinessPropertyByMidResponse -} from '../model/types'; -import { - useMutation, - UseMutationOptions -} from '@tanstack/react-query'; - -export const businessPropertyByMid = (params: BusinessPropertyByMidParams) => { - return resultify( - axios.post(API_URL_USER.businessPropertyByMid(), params), - ); -}; - -export const useBusinessPropertyByMidMutation = (options?: UseMutationOptions) => { - const mutation = useMutation({ - ...options, - mutationFn: (params: BusinessPropertyByMidParams) => businessPropertyByMid(params), - }); - - return { - ...mutation, - }; -}; diff --git a/src/entities/user/api/use-business-property-mutation.ts b/src/entities/user/api/use-business-property-mutation.ts new file mode 100644 index 0000000..302ce7b --- /dev/null +++ b/src/entities/user/api/use-business-property-mutation.ts @@ -0,0 +1,29 @@ +import axios from 'axios'; +import { API_URL_USER } from '@/shared/api/api-url-user'; +import { resultify } from '@/shared/lib/resultify'; +import { NiceAxiosError } from '@/shared/@types/error'; +import { + BusinessPropertyParams, + BusinessPropertyResponse +} from '../model/types'; +import { + useMutation, + UseMutationOptions +} from '@tanstack/react-query'; + +export const businessProperty = (params: BusinessPropertyParams) => { + return resultify( + axios.post(API_URL_USER.businessProperty(), params), + ); +}; + +export const useBusinessPropertyMutation = (options?: UseMutationOptions) => { + const mutation = useMutation({ + ...options, + mutationFn: (params: BusinessPropertyParams) => businessProperty(params), + }); + + return { + ...mutation, + }; +}; diff --git a/src/entities/user/model/types.ts b/src/entities/user/model/types.ts index 1408cb0..a268deb 100644 --- a/src/entities/user/model/types.ts +++ b/src/entities/user/model/types.ts @@ -261,13 +261,13 @@ export interface ShortcutUserResponse { usingDefault: boolean; }; -export interface BusinessPropertyByMidParams { +export interface BusinessPropertyParams { mid: string; }; -export interface BusinessPropertyByMidResponse { +export interface BusinessPropertyResponse { companyNumber: string; businessScaleTypeName: string; }; -export interface BusinessInfo extends BusinessPropertyByMidResponse { +export interface BusinessInfo extends BusinessPropertyResponse { }; \ No newline at end of file diff --git a/src/entities/vat-return/model/contant.ts b/src/entities/vat-return/model/contant.ts index d121280..30c8663 100644 --- a/src/entities/vat-return/model/contant.ts +++ b/src/entities/vat-return/model/contant.ts @@ -14,6 +14,6 @@ export const VatReturnTargetTypeBtnGroup = [ ]; export const VatReturnTaxBtnGroups = [ - {name: '과세', value: VatReturnPayTax.Tax }, - {name: '면세', value: VatReturnPayTax.NoTax }, + {name: '과세', value: VatReturnPayTax.TAX }, + {name: '면세', value: VatReturnPayTax.NOTAX }, ]; \ No newline at end of file diff --git a/src/entities/vat-return/model/types.ts b/src/entities/vat-return/model/types.ts index 60faa02..ab2dbca 100644 --- a/src/entities/vat-return/model/types.ts +++ b/src/entities/vat-return/model/types.ts @@ -14,8 +14,8 @@ export enum VatReturnReceiptType { BILL = 'BILL ' }; export enum VatReturnPayTax { - Tax = 'Tax', - NoTax = 'NoTax' + TAX = '0', + NOTAX = '1' }; export enum VatReturnTargetType { ALL = 'ALL', @@ -91,8 +91,6 @@ export interface VatReturnReferenceRequestParams { startMonth: string; endMonth: string; taxType: string, - requestorName: string; - contactNumber: string; email: string; }; export interface VatReturnReferenceRequestResponse { diff --git a/src/entities/vat-return/ui/reference-wrap.tsx b/src/entities/vat-return/ui/reference-wrap.tsx index 124c399..5613999 100644 --- a/src/entities/vat-return/ui/reference-wrap.tsx +++ b/src/entities/vat-return/ui/reference-wrap.tsx @@ -15,14 +15,14 @@ export const ReferenceWrap = () => { const emailOptions = useStore.getState().UserStore.selectOptionsEmails; const userMid = useStore.getState().UserStore.mid; const userEmail = useStore.getState().UserStore.email; - + const [successPageOn, setSuccessPageOn] = useState(false); const [failPageOn, setFailPageOn] = useState(false); const [mid, setMid] = useState(userMid); const [startDate, setStartDate] = useState(moment().format('YYYYMMDD')); const [endDate, setEndDate] = useState(moment().format('YYYYMMDD')); - const [payTax, setPayTax] = useState(VatReturnPayTax.Tax); + const [payTax, setPayTax] = useState(VatReturnPayTax.TAX); const [email, setEmail] = useState(userEmail); const [errorMsg, setErrorMsg] = useState(''); @@ -34,9 +34,7 @@ export const ReferenceWrap = () => { startMonth: startDate, endMonth: endDate, taxType: payTax, - requestorName: '', - contactNumber: '', - email: email + email: email || userEmail } vatReturnReferenceRequest(params).then((rs: VatReturnReferenceRequestResponse) => { setSuccessPageOn(true); diff --git a/src/pages/transaction/cash-receipt/hand-written-issuance-page.tsx b/src/pages/transaction/cash-receipt/hand-written-issuance-page.tsx index d0d1212..64f7cc1 100644 --- a/src/pages/transaction/cash-receipt/hand-written-issuance-page.tsx +++ b/src/pages/transaction/cash-receipt/hand-written-issuance-page.tsx @@ -1,4 +1,4 @@ -import { useState } from 'react'; +import { useEffect, useState } from 'react'; import { PATHS } from '@/shared/constants/paths'; import { useNavigate } from '@/shared/lib/hooks/use-navigate'; import { CashReceiptHandWrittenIssuanceStep1 } from '@/entities/transaction/ui/cash-receipt-hand-written-issuance-step1'; @@ -8,19 +8,23 @@ import { HeaderType} from '@/entities/common/model/types'; import { useSetFooterMode, useSetHeaderTitle, useSetHeaderType } from '@/widgets/sub-layout/use-sub-layout'; import { useCashReceiptManualIssueMutation } from '@/entities/transaction/api/use-cash-receipt-manual-issue-mutation'; import { showAlert } from '@/widgets/show-alert'; +import { useStore } from '@/shared/model/store'; +import { snackBar } from '@/shared/lib'; export const CashReceitHandWrittenIssuancePage = () => { const { navigate } = useNavigate(); - + let businessInfo = useStore.getState().UserStore.businessInfo; + let userMid = useStore.getState().UserStore.mid; // 1 or 2 const [processStep, setProcessStep] = useState(ProcessStep.One); - const [businessNumber, setBusinessNumber] = useState(''); + const [businessNumber, setBusinessNumber] = useState(businessInfo.companyNumber); const [purposeType, setPurposeType] = useState(CashReceiptPurposeType.INCOME_DEDUCTION); const [productName, setProductName] = useState(''); const [buyerName, setBuyerName] = useState(''); const [issueNumber, setIssueNumber] = useState(''); const [email, setEmail] = useState(''); const [phoneNumber, setPhoneNumber] = useState(''); + const [issueAmount, setIssueAmount] = useState(0); const [supplyAmount, setSupplyAmount] = useState(0); const [vatAmount, setVatAmount] = useState(0); const [taxFreeAmount, setTaxFreeAmount] = useState(0); @@ -44,6 +48,7 @@ export const CashReceitHandWrittenIssuancePage = () => { const callManualIssue = () => { let params = { + mid: userMid, businessNumber: businessNumber, purpose: purposeType, productName: productName, @@ -58,41 +63,57 @@ export const CashReceitHandWrittenIssuancePage = () => { }; cashReceiptManualIssue(params).then((rs) => { console.log(rs); - alert('완료'); - navigate(PATHS.transaction.cashReceipt.list); + snackBar('수기 신청이 완료되었습니다.', function(){ + navigate(PATHS.transaction.cashReceipt.list); + }, 3000); }); }; + const onClickToVatCalculate = () => { + let amount = parseInt((issueAmount / 11 * 10).toFixed(0)); + let vat = issueAmount - amount; + setSupplyAmount(amount); + setVatAmount(vat); + }; + const onClickToChangeTab = () => { if(processStep === ProcessStep.One){ if(!businessNumber){ showAlert('사업자 번호는 필수 입력 항목 입니다.'); + return; } else if(!productName){ showAlert('상품명은 필수 입력 항목 입니다.'); + return; } else if(!buyerName){ showAlert('구매자는 필수 입력 항목 입니다.'); + return; } else if(!issueNumber){ showAlert('발행번호는 필수 입력 항목 입니다.'); + return; } else if(email && !checkEmail(email)){ showAlert('이메일 형식이 맞지 않습니다.'); + return; } else if(!phoneNumber){ showAlert('전화번호는 필수 입력 항목 입니다.'); + return; } setProcessStep(ProcessStep.Two); } else if(processStep === ProcessStep.Two){ + if(supplyAmount <= 0){ + showAlert('공급가액은 1원 이상이어야 합니다.'); + return; + } callManualIssue(); - // 완료시? - //alert('완료'); - // navigate(PATHS.transaction.cashReceipt.list); } }; + return ( <>
@@ -136,14 +157,17 @@ export const CashReceitHandWrittenIssuancePage = () => { { (processStep === ProcessStep.Two) && }
diff --git a/src/shared/api/api-url-user.ts b/src/shared/api/api-url-user.ts index a52ada1..0e40784 100644 --- a/src/shared/api/api-url-user.ts +++ b/src/shared/api/api-url-user.ts @@ -60,7 +60,7 @@ export const API_URL_USER = { }, // mid 로 사업자 정보 조회 - businessPropertyByMid: () => { - return `${API_BASE_URL}/api/v1/amsw/business-property/by-mid`; + businessProperty: () => { + return `${API_BASE_URL}/api/v1/${API_URL_KEY}/business-property`; }, } \ No newline at end of file diff --git a/src/shared/ui/filter/select.tsx b/src/shared/ui/filter/select.tsx index b246438..a0f2ab4 100644 --- a/src/shared/ui/filter/select.tsx +++ b/src/shared/ui/filter/select.tsx @@ -1,3 +1,5 @@ +import { ChangeEvent } from "react"; + export interface FilterSelectProps { title: string; selectValue: string; @@ -18,7 +20,6 @@ export const FilterSelect = ({ ); } @@ -33,7 +34,7 @@ export const FilterSelect = ({ diff --git a/src/widgets/sub-layout/index.tsx b/src/widgets/sub-layout/index.tsx index c3f342d..031c20a 100644 --- a/src/widgets/sub-layout/index.tsx +++ b/src/widgets/sub-layout/index.tsx @@ -23,10 +23,10 @@ import { useStore } from '@/shared/model/store'; import { getLocalStorage, setLocalStorage } from '@/shared/lib'; import { StorageKeys } from '@/shared/constants/local-storage'; import { HomeGroupsParams, HomeGroupsResponse } from '@/entities/home/model/types'; -import { BusinessPropertyByMidParams, BusinessPropertyByMidResponse, LoginResponse, ShortcutUserParams, ShortcutUserResponse, UserFindAuthMethodParams, UserFindAuthMethodResponse } from '@/entities/user/model/types'; +import { BusinessPropertyParams, BusinessPropertyResponse, LoginResponse, ShortcutUserParams, ShortcutUserResponse, UserFindAuthMethodParams, UserFindAuthMethodResponse } from '@/entities/user/model/types'; import { useShortcutUserMutation } from '@/entities/user/api/use-shortcut-user-mutation'; import { useShortcutDefaultMutation } from '@/entities/user/api/use-shortcut-detault-mutation'; -import { useBusinessPropertyByMidMutation } from '@/entities/user/api/use-business-property-by-mid-mutation'; +import { useBusinessPropertyMutation } from '@/entities/user/api/use-business-property-mutation'; import { useUserFindAuthMethodMutation } from '@/entities/user/api/use-user-find-authmethod-mutation'; import { useCodesSelectMutation } from '@/entities/common/api/use-codes-select-mutation'; @@ -75,7 +75,7 @@ export const SubLayout = () => { const { mutateAsync: codesSelect} = useCodesSelectMutation(); const { mutateAsync: shortcutUser } = useShortcutUserMutation(); const { mutateAsync: shortcutDefault } = useShortcutDefaultMutation(); - const { mutateAsync: businessPropertyByMid } = useBusinessPropertyByMidMutation(); + const { mutateAsync: businessProperty } = useBusinessPropertyMutation(); const { mutateAsync: findAuthMethod } = useUserFindAuthMethodMutation(); const wrapperClassName = 'wrapper'; @@ -106,13 +106,13 @@ export const SubLayout = () => { }); }; - const callBusinessPropertyByMid = () => { + const callBusinessProperty = () => { if(!!mid){ - let params: BusinessPropertyByMidParams = { + let params: BusinessPropertyParams = { mid: mid }; - businessPropertyByMid(params).then((rs: BusinessPropertyByMidResponse) => { - console.log(rs); + businessProperty(params).then((rs: BusinessPropertyResponse) => { + useStore.getState().UserStore.setBusinessInfo(rs); }); } @@ -178,7 +178,6 @@ export const SubLayout = () => { let emails = rs.emails.map((value: any, index: any) => { return value.content; }); - console.log('emails -->', emails) useStore.getState().UserStore.setUserEmails(emails); let options: Array> = emails.map((value: any, index: any) => { return { @@ -300,7 +299,7 @@ export const SubLayout = () => { }, []); useEffect(() => { if(!!mid){ - // callBusinessPropertyByMid(); + callBusinessProperty(); callFindAuthMethod(); } }, [mid]);