From d8ed11b4bfd5d9d79f1dd4a03435eff025fa12d6 Mon Sep 17 00:00:00 2001 From: "focp212@naver.com" Date: Thu, 23 Oct 2025 13:56:32 +0900 Subject: [PATCH] =?UTF-8?q?email=20=EC=9E=90=EB=8F=99=20=EC=85=8B=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../account/ui/user-login-auth-info-wrap.tsx | 8 +- src/entities/common/ui/email-bottom-sheet.tsx | 12 +- src/entities/user/model/store.ts | 44 ++++++ src/entities/user/model/types.ts | 4 +- src/entities/vat-return/model/types.ts | 14 +- .../ui/list-detail-bottom-sheet.tsx | 139 ++++++++++++++++++ .../vat-return/ui/section/amount-section.tsx | 31 +++- src/pages/transaction/billing/list-page.tsx | 18 +-- src/pages/vat-return/detail-page.tsx | 33 ++++- src/widgets/sub-layout/index.tsx | 33 ++++- 10 files changed, 297 insertions(+), 39 deletions(-) create mode 100644 src/entities/vat-return/ui/list-detail-bottom-sheet.tsx diff --git a/src/entities/account/ui/user-login-auth-info-wrap.tsx b/src/entities/account/ui/user-login-auth-info-wrap.tsx index 04066e3..aeee3d7 100644 --- a/src/entities/account/ui/user-login-auth-info-wrap.tsx +++ b/src/entities/account/ui/user-login-auth-info-wrap.tsx @@ -299,7 +299,7 @@ export const UserLoginAuthInfoWrap = ({ removeMethods.push({ usrid: usrid, systemAdminClassId: mid, - idCl: idCL, + idCl: idCL || '', authMethodType: "EMAIL", sequence: email.sequence, content: email.content @@ -318,7 +318,7 @@ export const UserLoginAuthInfoWrap = ({ removeMethods.push({ usrid: usrid, systemAdminClassId: mid, - idCl: idCL, + idCl: idCL || '', authMethodType: "PHONE", sequence: phone.sequence, content: phone.content @@ -334,7 +334,7 @@ export const UserLoginAuthInfoWrap = ({ addMethods.push({ usrid: usrid, systemAdminClassId: mid, - idCl: idCL, + idCl: idCL || '', authMethodType: "EMAIL", sequence: existingEmailCount + index + 1, content: email @@ -348,7 +348,7 @@ export const UserLoginAuthInfoWrap = ({ addMethods.push({ usrid: usrid, systemAdminClassId: mid, - idCl: idCL, + idCl: idCL || '', authMethodType: "PHONE", sequence: existingPhoneCount + index + 1, content: phone diff --git a/src/entities/common/ui/email-bottom-sheet.tsx b/src/entities/common/ui/email-bottom-sheet.tsx index 3fe263c..756d8b0 100644 --- a/src/entities/common/ui/email-bottom-sheet.tsx +++ b/src/entities/common/ui/email-bottom-sheet.tsx @@ -1,5 +1,6 @@ import { BottomSheetMotionDuration, BottomSheetMotionVaiants } from '@/entities/common/model/constant'; import { IMAGE_ROOT } from '@/shared/constants/common'; +import { useStore } from '@/shared/model/store'; import { motion } from 'framer-motion'; import { ChangeEvent, useState } from 'react'; @@ -18,12 +19,9 @@ export const EmailBottomSheet = ({ sendEmail, sendRequest }: EmailBottomSheetProps) => { - const emailList = [ - {name: 'test1@nicepay.co.kr', value: 'test1@nicepay.co.kr'}, - {name: 'test2@nicepay.co.kr', value: 'test2@nicepay.co.kr'}, - {name: 'test3@nicepay.co.kr', value: 'test3@nicepay.co.kr'}, - ]; - const [userEmail, setUserEmail] = useState(emailList[0]?.value || ''); + const optionsEmails = useStore.getState().UserStore.selectOptionsEmails; + const email = useStore.getState().UserStore.email; + const [userEmail, setUserEmail] = useState(email); const onClickToClose = () => { setBottomSheetOn(false); }; @@ -94,7 +92,7 @@ export const EmailBottomSheet = ({ onChange={ (e: ChangeEvent) => setUserEmail(e.target.value) } > { - emailList.map((value, index) => ( + optionsEmails.map((value, index) => ( )) } diff --git a/src/entities/user/model/store.ts b/src/entities/user/model/store.ts index 1c0935c..4fbe32b 100644 --- a/src/entities/user/model/store.ts +++ b/src/entities/user/model/store.ts @@ -13,11 +13,17 @@ export interface UserInfoState { userFavorite: Array; setUserFavorite: (update: SetStateAction>) => void; userMids: Array; + userEmails: Array; setUserMids: (update: SetStateAction>) => void; + setUserEmails: (update: SetStateAction>) => void; selectOptionsMids: Array>; setSelectOptionsMids: (update: SetStateAction>>) => void; + selectOptionsEmails: Array>; + setSelectOptionsEmails: (update: SetStateAction>>) => void; mid: string; setMid: (update: SetStateAction) => void; + email: string; + setEmail: (update: SetStateAction) => void; firstAccess: boolean; setFirstAccess: (update: SetStateAction) => void; }; @@ -27,8 +33,11 @@ const initialUserInfoState = { businessInfo: {} as BusinessInfo, userFavorite: [] as Array, userMids: [] as Array, + userEmails: [] as Array, selectOptionsMids: [] as Array>, + selectOptionsEmails: [] as Array>, mid: '' as string, + email: '' as string, firstAccess: true as boolean, } as UserInfoState; @@ -97,6 +106,19 @@ export const createUserInfoStore = lens((set, get) => ({ }; }); }, + setUserEmails: (update) => { + set((state: UserInfoState) => { + const newUserEmails = (typeof update === 'function') + ? update(state.userEmails): update; + return { + ...state, + userEmails: [ + ...state.userEmails, + ...newUserEmails + ], + }; + }); + }, setSelectOptionsMids: (update) => { set((state: UserInfoState) => { const newSelectOptionsMids = (typeof update === 'function') @@ -109,6 +131,18 @@ export const createUserInfoStore = lens((set, get) => ({ }; }); }, + setSelectOptionsEmails: (update) => { + set((state: UserInfoState) => { + const newSelectOptionsEmails = (typeof update === 'function') + ? update(state.selectOptionsEmails): update; + return { + ...state, + selectOptionsEmails: [ + ...newSelectOptionsEmails + ], + }; + }); + }, setMid: (update) => { set((state: UserInfoState) => { const newMid = (typeof update === 'function') @@ -119,6 +153,16 @@ export const createUserInfoStore = lens((set, get) => ({ } }); }, + setEmail: (update) => { + set((state: UserInfoState) => { + const newEmail = (typeof update === 'function') + ? update(state.email): update; + return { + ...state, + email: newEmail + } + }); + }, setFirstAccess: (update) => { set((state: UserInfoState) => { const newFirstAccess = (typeof update === 'function') diff --git a/src/entities/user/model/types.ts b/src/entities/user/model/types.ts index b9ef356..1408cb0 100644 --- a/src/entities/user/model/types.ts +++ b/src/entities/user/model/types.ts @@ -67,8 +67,8 @@ export interface UserExistsUseridParams { export interface UserFindAuthMethodParams { mid: string; usrid: string; - idCL: string; - status: string; + idCL?: string; + status?: string; page?: DefaultRequestPagination; }; diff --git a/src/entities/vat-return/model/types.ts b/src/entities/vat-return/model/types.ts index ee33175..60faa02 100644 --- a/src/entities/vat-return/model/types.ts +++ b/src/entities/vat-return/model/types.ts @@ -111,13 +111,13 @@ export interface VatReturnTaxInvoiceParams { taxInvoiceNumber: string; } export interface VatReturnTaxInvoiceResponse { - supplierInfo: SupplierInfo; - recipientInfo: RecipientInfo; - issueDate: string; - supplyAmount: number; - taxAmount: number; - totalAmount: number; - transactionDetails: TransactionDetails; + supplierInfo?: SupplierInfo; + recipientInfo?: RecipientInfo; + issueDate?: string; + supplyAmount?: number; + taxAmount?: number; + totalAmount?: number; + transactionDetails?: TransactionDetails; }; export interface SupplierInfo { diff --git a/src/entities/vat-return/ui/list-detail-bottom-sheet.tsx b/src/entities/vat-return/ui/list-detail-bottom-sheet.tsx new file mode 100644 index 0000000..8293ef8 --- /dev/null +++ b/src/entities/vat-return/ui/list-detail-bottom-sheet.tsx @@ -0,0 +1,139 @@ +import { IMAGE_ROOT } from "@/shared/constants/common"; + +export interface VatReturnListDetailBottomSheetProps { + bottomSheetOn: boolean; + setBottomSheetOn: (bottomSheetOn: boolean) => void; +}; + +export const VatReturnListDetailBottomSheet = ({ + bottomSheetOn, + setBottomSheetOn +}: VatReturnListDetailBottomSheetProps) => { + + const onClickToClose = () => { + setBottomSheetOn(false); + }; + return ( + <> +
+
+
+
+

세부내역 조회

+ +
+
+ +
+
+
+
+
거래금액 :
+
1,000,000,000
+
+
+
공급가액 :
+
43,758,520
+
+
+
VAT :
+
4,366,850
+
+
+
합계금액 :
+
48,125,100
+
+
+
+
+
거래일
+
합계금액
+
+
+ + 2025/08/01 +
+ 8,125,100 + +
+
+
+
+ 거래금액 + 공급가액 + VAT +
+
+ 1,000,000 + 720,000 + 80,000 +
+
+
+ + 2025/08/01 +
+ 8,125,100 + +
+
+
+ + 2025/08/01 +
+ 8,125,100 + +
+
+
+ + 2025/08/01 +
+ 8,125,100 + +
+
+
+ + 2025/08/01 +
+ 8,125,100 + +
+
+
+
+
+
+ + ); +}; \ 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 index d07322d..a80abcb 100644 --- a/src/entities/vat-return/ui/section/amount-section.tsx +++ b/src/entities/vat-return/ui/section/amount-section.tsx @@ -5,6 +5,7 @@ import { NumericFormat } from 'react-number-format'; import SlideDown from 'react-slidedown'; import 'react-slidedown/lib/slidedown.css'; import { useState } from 'react'; +import { EmailBottomSheet } from '@/entities/common/ui/email-bottom-sheet'; export interface AmountSectionProps { detail: VatReturnDetailResponse; @@ -13,12 +14,22 @@ export interface AmountSectionProps { export const AmountSection = ({ detail }: AmountSectionProps) => { - const [isOpen, setIsOpen] = useState(false); - + const [isOpen, setIsOpen] = useState(false); + const [downloadBottomSheetOn, setDownloadBottomSheetOn] = useState(false); + const openSection = () => { const status = !isOpen; setIsOpen(status); }; + + const onRequestDownload = (userEmail?: string) => { + + }; + + const onClickToOpenDownloadBottomSheet = () => { + + }; + return ( <>
@@ -76,10 +87,22 @@ export const AmountSection = ({ { moment(detail.issueDate).format('YYYY.MM.DD') }
- - +
+ { !!downloadBottomSheetOn && + + } ); }; \ No newline at end of file diff --git a/src/pages/transaction/billing/list-page.tsx b/src/pages/transaction/billing/list-page.tsx index 73def33..b1497e1 100644 --- a/src/pages/transaction/billing/list-page.tsx +++ b/src/pages/transaction/billing/list-page.tsx @@ -51,7 +51,7 @@ export const BillingListPage = () => { const [minAmount, setMinAmount] = useState(); const [maxAmount, setMaxAmount] = useState(); - const [emailBottomSheetOn, setEmailBottomSheetOn] = useState(false); + const [downloadBottomSheetOn, setDownloadBottomSheetOn] = useState(false); useSetHeaderTitle('빌링'); useSetHeaderType(HeaderType.LeftArrow); @@ -102,8 +102,8 @@ export const BillingListPage = () => { const onClickToOpenFilter = () => { setFilterOn(!filterOn); }; - const onClickToDownloadExcel = () => { - setEmailBottomSheetOn(true); + const onClickToOpenDownloadBottomSheet = () => { + setDownloadBottomSheetOn(true); }; const onClickToSort = (sort: SortTypeKeys) => { setSortType(sort); @@ -119,7 +119,7 @@ export const BillingListPage = () => { }); }; - const onRequestDownloadExcel = (userEmail?: string) => { + const onRequestDownload = (userEmail?: string) => { }; @@ -161,7 +161,7 @@ export const BillingListPage = () => { 다운로드 onClickToDownloadExcel() } + onClick={ () => onClickToOpenDownloadBottomSheet() } /> @@ -217,13 +217,13 @@ export const BillingListPage = () => { setMinAmount={ setMinAmount } setMaxAmount={ setMaxAmount } > - { !!emailBottomSheetOn && + { !!downloadBottomSheetOn && } diff --git a/src/pages/vat-return/detail-page.tsx b/src/pages/vat-return/detail-page.tsx index ffb9e57..58b0373 100644 --- a/src/pages/vat-return/detail-page.tsx +++ b/src/pages/vat-return/detail-page.tsx @@ -6,7 +6,9 @@ import { useVatReturnDetailMutation } from '@/entities/vat-return/api/use-vat-re import { HeaderType } from '@/entities/common/model/types'; import { VatReturnDetailParams, - VatReturnDetailResponse + VatReturnDetailResponse, + VatReturnTaxInvoiceParams, + VatReturnTaxInvoiceResponse } from '@/entities/vat-return/model/types'; import { useSetOnBack, @@ -18,6 +20,8 @@ import { SupplierSection } from '@/entities/vat-return/ui/section/supplier-secti 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'; +import { useVatReturnTaxInvoiceMutation } from '@/entities/vat-return/api/use-vat-return-tax-invoice-mutation'; +import { VatReturnListDetailBottomSheet } from '@/entities/vat-return/ui/list-detail-bottom-sheet'; export const DetailPage = () => { const { navigate } = useNavigate(); @@ -27,7 +31,8 @@ export const DetailPage = () => { taxInvoiceNumber = 'TAX202506300001'; const [openAmount, setOpenAmount] = useState(false); - const [detail, setDetail] = useState({}); + const [bottomSheetOn, setBottomSheetOn] = useState(false); + const [detail, setDetail] = useState({}); useSetHeaderTitle('세금계산서 상세'); useSetHeaderType(HeaderType.RightClose); @@ -35,10 +40,11 @@ export const DetailPage = () => { navigate(PATHS.vatReturn.list); }); useSetFooterMode(false); - + + const { mutateAsync: vatReturnTaxInvoice } = useVatReturnTaxInvoiceMutation(); const { mutateAsync: vatReturnDetail } = useVatReturnDetailMutation(); - const callDetail = () => { + const callTaxInvoice = () => { let params: VatReturnDetailParams = { taxInvoiceNumber: taxInvoiceNumber, }; @@ -46,8 +52,13 @@ export const DetailPage = () => { setDetail(rs); }); }; + + const onClickToOpenBottomSheet = () => { + setBottomSheetOn(true); + }; + useEffect(() => { - callDetail(); + callTaxInvoice(); }, []); return ( @@ -74,9 +85,21 @@ export const DetailPage = () => { > +
+ +
+ { !!bottomSheetOn && + + } ) }; \ No newline at end of file diff --git a/src/widgets/sub-layout/index.tsx b/src/widgets/sub-layout/index.tsx index 8c0a810..2f3b16a 100644 --- a/src/widgets/sub-layout/index.tsx +++ b/src/widgets/sub-layout/index.tsx @@ -18,11 +18,12 @@ 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 } from '@/entities/user/model/types'; +import { BusinessPropertyByMidParams, BusinessPropertyByMidResponse, LoginResponse, ShortcutUserParams, ShortcutUserResponse, UserFindAuthMethodParams, UserFindAuthMethodResponse } from '@/entities/user/model/types'; import { useCodesListByCodeClMutation } from '@/entities/common/api/use-codes-list-by-codeCl-mutaion'; 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 { useUserFindAuthMethodMutation } from '@/entities/user/api/use-user-find-authmethod-mutation'; export interface ContextType { setOnBack: (onBack: () => void) => void; @@ -65,6 +66,7 @@ export const SubLayout = () => { const { mutateAsync: shortcutUser } = useShortcutUserMutation(); const { mutateAsync: shortcutDefault } = useShortcutDefaultMutation(); const { mutateAsync: businessPropertyByMid } = useBusinessPropertyByMidMutation(); + const { mutateAsync: findAuthMethod } = useUserFindAuthMethodMutation(); const wrapperClassName = 'wrapper'; @@ -158,6 +160,34 @@ export const SubLayout = () => { } }; + + const callFindAuthMethod = () => { + let userInfo = useStore.getState().UserStore.userInfo; + if(!!userInfo.usrid && !! mid){ + let params: UserFindAuthMethodParams = { + usrid: userInfo.usrid, + mid: mid + }; + findAuthMethod(params).then((rs: any) => { + 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 { + name: value, + value: value + }; + }); + useStore.getState().UserStore.setSelectOptionsEmails(options); + if(!!emails[0]){ + useStore.getState().UserStore.setEmail(emails[0]); + } + }); + } + + }; const handleLogin = useCallback(async () => { let userParmas; @@ -221,6 +251,7 @@ export const SubLayout = () => { useEffect(() => { if(!!mid){ // callBusinessPropertyByMid(); + callFindAuthMethod(); } }, [mid]);