diff --git a/src/app/api/survey-sales/[id]/route.ts b/src/app/api/survey-sales/[id]/route.ts
index eb718f4..6cc460a 100644
--- a/src/app/api/survey-sales/[id]/route.ts
+++ b/src/app/api/survey-sales/[id]/route.ts
@@ -2,20 +2,96 @@ import { NextRequest, NextResponse } from 'next/server'
import { prisma } from '@/libs/prisma'
import { convertToSnakeCase } from '@/utils/common-utils'
+interface Survey {
+ SRL_NO: string
+ SUBMISSION_STATUS: boolean
+ SUBMISSION_TARGET_ID: string | null
+ STORE_ID: string | null
+ CONSTRUCTION_POINT_ID: string | null
+}
+
+interface SessionParams {
+ role: string | null
+ storeId: string | null
+ builderNo: string | null
+ isLoggedIn: string | null
+}
+
+const checkT01Role = (survey: Survey): boolean => survey.SRL_NO !== '一時保存'
+
+const checkAdminRole = (survey: Survey, storeId: string | null): boolean => {
+ if (!storeId) return false
+
+ if (survey.SUBMISSION_STATUS) {
+ return survey.SUBMISSION_TARGET_ID === storeId || survey.STORE_ID === storeId
+ }
+ return survey.STORE_ID === storeId
+}
+
+const checkAdminSubRole = (survey: Survey, storeId: string | null): boolean => {
+ if (!storeId) return false
+
+ if (survey.SUBMISSION_STATUS) {
+ return survey.SUBMISSION_TARGET_ID === storeId || (survey.STORE_ID === storeId && survey.CONSTRUCTION_POINT_ID === null)
+ }
+ return survey.STORE_ID === storeId && survey.CONSTRUCTION_POINT_ID === null
+}
+
+const checkPartnerOrBuilderRole = (survey: Survey, builderNo: string | null): boolean => {
+ if (!builderNo) return false
+ return survey.CONSTRUCTION_POINT_ID === builderNo
+}
+
+const checkRole = (survey: Survey, sessionParams: SessionParams): boolean => {
+ if (!survey || !sessionParams.role) return false
+
+ switch (sessionParams.role) {
+ case 'T01':
+ return checkT01Role(survey)
+ // T01 이외 1차점
+ case 'Admin':
+ return checkAdminRole(survey, sessionParams.storeId)
+ // 2차점
+ case 'Admin_Sub':
+ return checkAdminSubRole(survey, sessionParams.storeId)
+ // partner
+ case 'Partner':
+ // 2차점 시공권한 user
+ case 'Builder':
+ return checkPartnerOrBuilderRole(survey, sessionParams.builderNo)
+ default:
+ return false
+ }
+}
+
export async function GET(request: NextRequest, { params }: { params: Promise<{ id: string }> }) {
try {
const { id } = await params
+ const { searchParams } = new URL(request.url)
+
+ const sessionParams: SessionParams = {
+ role: searchParams.get('role'),
+ storeId: searchParams.get('storeId'),
+ builderNo: searchParams.get('builderNo'),
+ isLoggedIn: searchParams.get('isLoggedIn'),
+ }
// @ts-ignore
- const survey = await prisma.SD_SURVEY_SALES_BASIC_INFO.findUnique({
- where: { ID: Number(id) },
+ const survey = await prisma.SD_SURVEY_SALES_BASIC_INFO.findFirst({
+ where: {
+ ID: Number(id),
+ },
include: {
DETAIL_INFO: true,
},
})
- return NextResponse.json(survey)
- } catch (error) {
+ if (checkRole(survey, sessionParams)) {
+ return NextResponse.json(survey)
+ } else {
+ return NextResponse.json({ error: '権限がありません。' }, { status: 403 })
+ }
+ } catch (error: any) {
console.error('Error fetching survey:', error)
- return NextResponse.json({ error: 'Failed to fetch survey' }, { status: 500 })
+ return NextResponse.json({ error: 'データの取得に失敗しました。' }, { status: 500 })
}
}
@@ -115,20 +191,18 @@ export async function PATCH(request: NextRequest, { params }: { params: Promise<
try {
const { id } = await params
const body = await request.json()
-
- if (body.targetId) {
- // @ts-ignore
- const survey = await prisma.SD_SURVEY_SALES_BASIC_INFO.update({
- where: { ID: Number(id) },
- data: {
- SUBMISSION_STATUS: true,
- SUBMISSION_DATE: new Date(),
- SUBMISSION_TARGET_ID: body.targetId,
- UPT_DT: new Date(),
- },
- })
- return NextResponse.json({ message: 'Survey confirmed successfully', data: survey })
- }
+ // @ts-ignore
+ const survey = await prisma.SD_SURVEY_SALES_BASIC_INFO.update({
+ where: { ID: Number(id) },
+ data: {
+ SUBMISSION_STATUS: true,
+ SUBMISSION_DATE: new Date(),
+ SUBMISSION_TARGET_ID: body.targetId,
+ SUBMISSION_TARGET_NM: body.targetNm,
+ UPT_DT: new Date(),
+ },
+ })
+ return NextResponse.json({ message: 'Survey confirmed successfully', data: survey })
} catch (error) {
console.error('Error updating survey:', error)
return NextResponse.json({ error: 'Failed to update survey' }, { status: 500 })
diff --git a/src/app/api/survey-sales/route.ts b/src/app/api/survey-sales/route.ts
index a5d60c8..6d01bb0 100644
--- a/src/app/api/survey-sales/route.ts
+++ b/src/app/api/survey-sales/route.ts
@@ -11,7 +11,7 @@ type SearchParams = {
sort?: string | null // 정렬 방식
offset?: string | null
role?: string | null // 회원권한한
- store?: string | null // 판매점ID
+ storeId?: string | null // 판매점ID
builderNo?: string | null // 시공ID
}
@@ -25,8 +25,10 @@ type WhereCondition = {
const SEARCH_OPTIONS = [
'BUILDING_NAME', // 건물명
'REPRESENTATIVE', // 담당자
- 'STORE', // 판매점
- 'CONSTRUCTION_POINT', // 시공점
+ 'STORE', // 판매점명
+ 'STORE_ID', // 판매점ID
+ 'CONSTRUCTION_POINT', // 시공점명
+ 'CONSTRUCTION_POINT_ID', // 시공점ID
'CUSTOMER_NAME', // 고객명
'POST_CODE', // 우편번호
'ADDRESS', // 주소
@@ -75,11 +77,11 @@ const createMemberRoleCondition = (params: SearchParams): WhereCondition => {
where.OR = [
{
// 같은 판매점에서 작성한 제출/제출되지 않은 매물
- AND: [{ STORE_ID: { equals: params.store } }],
+ AND: [{ STORE_ID: { equals: params.storeId } }],
},
{
// MUSUBI (시공권한 X) 가 ORDER 에 제출한 매물
- AND: [{ SUBMISSION_TARGET_ID: { equals: params.store } }, { SUBMISSION_STATUS: { equals: true } }],
+ AND: [{ SUBMISSION_TARGET_ID: { equals: params.storeId } }, { SUBMISSION_STATUS: { equals: true } }],
},
]
break
@@ -88,19 +90,14 @@ const createMemberRoleCondition = (params: SearchParams): WhereCondition => {
where.OR = [
{
// MUSUBI (시공권한 X) 같은 판매점에서 작성한 제출/제출되지 않은 매물
- AND: [
- { STORE_ID: { equals: params.store } },
- {
- OR: [{ CONSTRUCTION_POINT: { equals: null } }, { CONSTRUCTION_POINT: { equals: '' } }],
- },
- ],
+ AND: [{ STORE_ID: { equals: params.storeId } }, { CONSTRUCTION_POINT_ID: { equals: params.builderNo } }],
},
{
// MUSUBI (시공권한 O) 가 MUSUBI 에 제출한 매물 + PARTNER 가 제출한 매물
AND: [
- { SUBMISSION_TARGET_ID: { equals: params.store } },
- { CONSTRUCTION_POINT: { not: null } },
- { CONSTRUCTION_POINT: { not: '' } },
+ { SUBMISSION_TARGET_ID: { equals: params.storeId } },
+ { CONSTRUCTION_POINT_ID: { not: null } },
+ { CONSTRUCTION_POINT_ID: { not: '' } },
{ SUBMISSION_STATUS: { equals: true } },
],
},
@@ -109,10 +106,9 @@ const createMemberRoleCondition = (params: SearchParams): WhereCondition => {
case 'Builder': // MUSUBI (시공권한 O)
case 'Partner': // PARTNER
- // 시공점이 있고 STORE_ID가 시공ID와 같은 매물
+ // 시공ID 같은 매물
where.AND?.push({
- CONSTRUCTION_POINT: { not: null },
- STORE_ID: { equals: params.builderNo },
+ CONSTRUCTION_POINT_ID: { equals: params.builderNo },
})
break
@@ -127,7 +123,7 @@ const createMemberRoleCondition = (params: SearchParams): WhereCondition => {
},
{
STORE_ID: {
- equals: params.store,
+ equals: params.storeId,
},
},
]
@@ -154,7 +150,7 @@ export async function GET(request: Request) {
sort: searchParams.get('sort'),
offset: searchParams.get('offset'),
role: searchParams.get('role'),
- store: searchParams.get('store'), //storeId
+ storeId: searchParams.get('storeId'), //storeId
builderNo: searchParams.get('builderNo'),
}
diff --git a/src/components/pdf/SurveySaleDownloadPdf.tsx b/src/components/pdf/SurveySaleDownloadPdf.tsx
index 02ba732..b987f04 100644
--- a/src/components/pdf/SurveySaleDownloadPdf.tsx
+++ b/src/components/pdf/SurveySaleDownloadPdf.tsx
@@ -10,7 +10,6 @@ import { useSpinnerStore } from '@/store/spinnerStore'
export default function SurveySaleDownloadPdf() {
const params = useParams()
const id = params.id
- const router = useRouter()
const { surveyDetail, isLoadingSurveyDetail } = useSurvey(Number(id))
const { setIsShow } = useSpinnerStore()
@@ -19,13 +18,13 @@ export default function SurveySaleDownloadPdf() {
const isGeneratedRef = useRef(false)
useEffect(() => {
- setIsShow(true)
if (isLoadingSurveyDetail || !surveyDetail || isGeneratedRef.current) return
isGeneratedRef.current = true
handleDownPdf()
}, [surveyDetail?.id, isLoadingSurveyDetail])
const handleDownPdf = () => {
+ setIsShow(true)
const options = {
method: 'open' as const,
resolution: Resolution.HIGH,
@@ -50,12 +49,9 @@ export default function SurveySaleDownloadPdf() {
generatePDF(targetRef, options).then(() => {
setIsShow(false)
- router.push(`/survey-sale/${id}`)
+ alert('PDFの生成が完了しました。 ポップアップウィンドウからダウンロードしてください。')
})
}
- const supplementList = supplementaryFacilities
- .filter((facility) => surveyDetail?.detailInfo?.supplementaryFacilities?.includes(facility.id.toString()))
- .map((facility) => facility.name)
return (
<>
@@ -249,11 +245,15 @@ export default function SurveySaleDownloadPdf() {
boxSizing: 'border-box',
}}
>
- {supplementList === null && surveyDetail?.detailInfo?.supplementaryFacilitiesEtc === null
- ? '-'
+ {surveyDetail?.detailInfo?.supplementaryFacilities
+ ? supplementaryFacilities
+ .filter((facility) => surveyDetail?.detailInfo?.supplementaryFacilities?.includes(facility.id.toString()))
+ .map((facility) => facility.name)
+ .join(', ') +
+ (surveyDetail?.detailInfo?.supplementaryFacilitiesEtc ? `, ${surveyDetail?.detailInfo?.supplementaryFacilitiesEtc}` : '')
: surveyDetail?.detailInfo?.supplementaryFacilitiesEtc
- ? `${supplementList.join(', ')}, ${surveyDetail?.detailInfo?.supplementaryFacilitiesEtc}`
- : supplementList.join(', ')}
+ ? `${surveyDetail?.detailInfo?.supplementaryFacilitiesEtc}`
+ : '-'}
@@ -330,7 +330,11 @@ export default function SurveySaleDownloadPdf() {
boxSizing: 'border-box',
}}
>
- {surveyDetail?.detailInfo?.constructionYear === '1' ? '新築' : `既築 (${surveyDetail?.detailInfo?.constructionYear}年)`}
+ {surveyDetail?.detailInfo?.constructionYear === '1'
+ ? '新築'
+ : surveyDetail?.detailInfo?.constructionYearEtc
+ ? `既築 (${surveyDetail?.detailInfo?.constructionYear}年)`
+ : '-'}
| ([])
-
const { getCommCode } = useCommCode()
+ const { surveyDetail } = useSurvey(Number(routeId))
+ const [submitData, setSubmitData] = useState({
+ saleBase: null,
+ targetId: null,
+ targetNm: null,
+ sender: '',
+ receiver: [],
+ reference: null,
+ title: '',
+ contents: '',
+ })
+
+ const [commCodeList, setCommCodeList] = useState([])
useEffect(() => {
- if (session?.isLoggedIn && session?.role === 'Admin') {
+ if (!session?.isLoggedIn || !surveyDetail?.id) return
+ if (session?.role === 'Admin') {
getCommCode('SALES_OFFICE_CD').then((codes) => {
setCommCodeList(codes)
})
}
- }, [session])
+ setSubmitData({
+ ...submitData,
+ targetId: session?.role === 'Builder' ? surveyDetail?.storeId ?? null : null,
+ targetNm: session?.role === 'Builder' ? surveyDetail?.store ?? null : null,
+ sender: session?.email ?? '',
+ title: '[HANASYS現地調査] 調査物件が提出. (' + surveyDetail?.srlNo + ')',
+ })
+ }, [session, surveyDetail])
const FORM_FIELDS: FormField[] = [
- { id: 'saleBase', name: '提出地点選択', required: session?.role === 'Admin' },
- { id: 'store', name: '提出販売店', required: true },
{ id: 'sender', name: '発送者', required: true },
+ { id: 'saleBase', name: '提出地点選択', required: session?.role === 'Admin' },
+ { id: 'targetNm', name: '提出販売店', required: session?.role !== 'Admin' },
{ id: 'receiver', name: '受信者', required: true },
{ id: 'reference', name: '参考', required: false },
{ id: 'title', name: 'タイトル', required: true },
- { id: 'contents', name: '内容', required: true },
+ { id: 'contents', name: '内容', required: false },
]
- const [submitData, setSubmitData] = useState({
- saleBase: null,
- store: '',
- sender: session?.email ?? '',
- receiver: [],
- reference: null,
- title: '[HANASYS現地調査] 調査物件が提出.',
- contents: '',
- })
-
const { submitSurvey, isSubmittingSurvey } = useSurvey(Number(routeId))
const handleInputChange = (field: keyof SubmitFormData, value: string) => {
@@ -74,7 +84,7 @@ export default function SurveySaleSubmitPopup() {
const requiredFields = FORM_FIELDS.filter((field) => field.required)
for (const field of requiredFields) {
- if (data[field.id]?.length === 0) {
+ if (data[field.id] === '' || data[field.id] === null || data[field.id]?.length === 0) {
alert(`${field.name}は必須入力項目です。`)
const element = document.getElementById(field.id)
if (element) {
@@ -86,32 +96,38 @@ export default function SurveySaleSubmitPopup() {
return true
}
+ // TODO: Admin_Sub 계정 매핑된 submit target id 추가!!!! && 메일 테스트트
const handleSubmit = () => {
if (validateData(submitData)) {
window.neoConfirm('送信しますか? 送信後は変更・修正することはできません。', () => {
setIsShow(true)
- submitSurvey({ targetId: submitData.store })
sendEmail({
to: submitData.receiver,
subject: submitData.title,
- content: submitData.contents,
+ content: contentsRef.current?.innerHTML ?? '',
})
.then(() => {
- if (!isSubmittingSurvey) {
- popupController.setSurveySaleSubmitPopup(false)
- }
- })
- .catch((error) => {
- console.error('Error sending email:', error)
- alert('メール送信に失敗しました。')
+ if (!isSubmittingSurvey) {
+ alert('提出が完了しました。')
+ // submitSurvey({ targetId: submitData.targetId, targetNm: submitData.targetNm })
+ popupController.setSurveySaleSubmitPopup(false)
+ }
+ })
+ .catch((error) => {
+ console.error('Error sending email:', error)
+ alert('メール送信に失敗しました。 再度送信してください。')
})
.finally(() => {
+ submitSurvey({ targetId: submitData.targetId, targetNm: submitData.targetNm })
setIsShow(false)
+ popupController.setSurveySaleSubmitPopup(false)
})
})
}
}
+ const contentsRef = useRef(null)
+
const handleClose = () => {
popupController.setSurveySaleSubmitPopup(false)
}
@@ -122,6 +138,9 @@ export default function SurveySaleSubmitPopup() {
if (field.id === 'saleBase' && session?.role !== 'Admin') {
return null
}
+ if (field.id === 'targetNm' && session?.role === 'Admin') {
+ return null
+ }
return (
@@ -130,12 +149,38 @@ export default function SurveySaleSubmitPopup() {
{field.id === 'contents' ? (
- |
))}
+ {addressInfo?.length === 0 && (
+
+ |
+ 조회된 데이터가 없습니다.
+ |
+
+ )}
diff --git a/src/components/survey-sale/detail/BasicForm.tsx b/src/components/survey-sale/detail/BasicForm.tsx
index 99814b1..10ce000 100644
--- a/src/components/survey-sale/detail/BasicForm.tsx
+++ b/src/components/survey-sale/detail/BasicForm.tsx
@@ -4,46 +4,38 @@ import { useEffect, useState } from 'react'
import { useSurveySaleTabState } from '@/store/surveySaleTabState'
import type { SurveyBasicRequest } from '@/types/Survey'
import type { Mode } from 'fs'
-import { useSessionStore } from '@/store/session'
import { usePopupController } from '@/store/popupController'
import { useAddressStore } from '@/store/addressStore'
+import { SessionData } from '@/types/Auth'
-export default function BasicForm(props: { basicInfo: SurveyBasicRequest; setBasicInfo: (basicInfo: SurveyBasicRequest) => void; mode: Mode }) {
- const { basicInfo, setBasicInfo, mode } = props
+interface BasicFormProps {
+ basicInfo: SurveyBasicRequest
+ setBasicInfo: (basicInfo: SurveyBasicRequest) => void
+ mode: Mode
+ session: SessionData
+}
+
+export default function BasicForm({ basicInfo, setBasicInfo, mode, session }: BasicFormProps) {
const { setBasicInfoSelected } = useSurveySaleTabState()
const [isFlip, setIsFlip] = useState(true)
-
- const { session } = useSessionStore()
const { addressData } = useAddressStore()
+ const popupController = usePopupController()
useEffect(() => {
setBasicInfoSelected()
}, [])
- // 시공권한 user(Builder), Partner 계정은 조사매물 등록 할 때 STORE_ID에 시공점ID가 들어감
- // 권한 별 목록 필터링 시 시공권한 user(Builder), Partner는 시공점ID가 같은 것들만 조회
+ // 주소 데이터가 변경될 때만 업데이트
useEffect(() => {
- if (session?.isLoggedIn) {
- setBasicInfo({
- ...basicInfo,
- representative: session.userNm ?? '',
- representativeId: session.userId ?? null,
- store: session.role === 'Partner' ? null : session.storeNm ?? null,
- storeId: session.role === 'Partner' || session.role === 'Builder' ? session.builderNo : session.storeId ?? null,
- constructionPoint: session.builderNo ?? null,
- })
- }
- if (addressData) {
- setBasicInfo({
- ...basicInfo,
- postCode: addressData.post_code,
- address: addressData.address,
- addressDetail: addressData.address_detail,
- })
- }
- }, [session, addressData])
+ if (!addressData) return
- const popupController = usePopupController()
+ setBasicInfo({
+ ...basicInfo,
+ postCode: addressData.post_code,
+ address: addressData.address,
+ addressDetail: addressData.address_detail,
+ })
+ }, [addressData])
return (
<>
@@ -67,29 +59,15 @@ export default function BasicForm(props: { basicInfo: SurveyBasicRequest; setBas
onChange={(e) => setBasicInfo({ ...basicInfo, representative: e.target.value })}
/>
- {(session?.role === 'Builder' || session?.role?.includes('Admin')) && (
-
-
販売店
-
setBasicInfo({ ...basicInfo, store: e.target.value })}
- />
-
- )}
- {(session?.role === 'Builder' || session?.role === 'Partner') && (
-
-
施工店
-
setBasicInfo({ ...basicInfo, constructionPoint: e.target.value })}
- />
-
+ {mode === 'READ' || session?.role === 'Builder' ? (
+ <>
+ {storeInput(basicInfo, setBasicInfo, mode)}
+ {builderInput(basicInfo, setBasicInfo, mode)}
+ >
+ ) : session?.role === 'Partner' ? (
+ <>{builderInput(basicInfo, setBasicInfo, mode)}>
+ ) : (
+ <>{storeInput(basicInfo, setBasicInfo, mode)}>
)}
@@ -169,3 +147,33 @@ export default function BasicForm(props: { basicInfo: SurveyBasicRequest; setBas
>
)
}
+
+const storeInput = (basicInfo: SurveyBasicRequest, setBasicInfo: (basicInfo: SurveyBasicRequest) => void, mode: Mode) => {
+ return (
+
+
販売店
+
setBasicInfo({ ...basicInfo, store: e.target.value })}
+ />
+
+ )
+}
+
+const builderInput = (basicInfo: SurveyBasicRequest, setBasicInfo: (basicInfo: SurveyBasicRequest) => void, mode: Mode) => {
+ return (
+
+
施工店
+
setBasicInfo({ ...basicInfo, constructionPoint: e.target.value })}
+ />
+
+ )
+}
diff --git a/src/components/survey-sale/detail/ButtonForm.tsx b/src/components/survey-sale/detail/ButtonForm.tsx
index db66b53..a6236f0 100644
--- a/src/components/survey-sale/detail/ButtonForm.tsx
+++ b/src/components/survey-sale/detail/ButtonForm.tsx
@@ -7,76 +7,88 @@ import { useParams, useRouter, useSearchParams } from 'next/navigation'
import { requiredFields, useSurvey } from '@/hooks/useSurvey'
import { usePopupController } from '@/store/popupController'
-export default function ButtonForm(props: {
+interface ButtonFormProps {
mode: Mode
setMode: (mode: Mode) => void
- data: { basic: SurveyBasicRequest; roof: SurveyDetailRequest }
-}) {
- // 라우터
- const router = useRouter()
- const { mode, setMode } = props
- const { session } = useSessionStore()
+ data: {
+ basic: SurveyBasicRequest
+ roof: SurveyDetailRequest
+ }
+}
+interface PermissionState {
+ isSubmiter: boolean
+ isWriter: boolean
+ isReceiver: boolean
+}
+
+interface SaveData extends SurveyBasicRequest {
+ detailInfo: SurveyDetailRequest
+}
+
+export default function ButtonForm({ mode, setMode, data }: ButtonFormProps) {
+ const router = useRouter()
+ const { session } = useSessionStore()
const searchParams = useSearchParams()
const idParam = searchParams.get('id')
-
const params = useParams()
const routeId = params.id
-
const popupController = usePopupController()
- // ------------------------------------------------------------
- const [saveData, setSaveData] = useState({
- ...props.data.basic,
- detailInfo: props.data.roof,
+
+ const [saveData, setSaveData] = useState({
+ ...data.basic,
+ detailInfo: data.roof,
})
- // --------------------------------------------------------------
- // 권한
- // 제출권한 ㅇ
- const [isSubmiter, setIsSubmiter] = useState(false)
- // 작성자
- const [isWriter, setIsWriter] = useState(false)
- const isSubmit = props.data.basic.submissionStatus
+ const [permissions, setPermissions] = useState({
+ isSubmiter: false,
+ isWriter: false,
+ isReceiver: false,
+ })
- useEffect(() => {
- if (session?.isLoggedIn) {
- switch (session?.role) {
- // T01 제출권한 없음
- case 'T01':
- setIsSubmiter(false)
- break
- // 1차 판매점(Order) + 2차 판매점(Musubi) => 같은 판매점 제출권한
- case 'Admin':
- case 'Admin_Sub':
- setIsSubmiter(session.storeNm === props.data.basic.store && session.builderNo === props.data.basic.constructionPoint)
- break
- // 시공권한 User(Musubi) + Partner => 같은 시공ID 제출권한
- case 'Builder':
- case 'Partner':
- setIsSubmiter(session.builderNo === props.data.basic.constructionPoint)
- break
- default:
- setIsSubmiter(false)
- break
- }
-
- setIsWriter(session.userNm === props.data.basic.representative)
- }
- setSaveData({
- ...props.data.basic,
- detailInfo: props.data.roof,
- })
- }, [session, props.data])
-
- // ------------------------------------------------------------
- // 저장/임시저장/수정
+ const isSubmit = data.basic.submissionStatus
const id = Number(routeId) ? Number(routeId) : Number(idParam)
- const { deleteSurvey, updateSurvey, isDeletingSurvey, isUpdatingSurvey } = useSurvey(Number(id))
+ const { deleteSurvey, updateSurvey, isDeletingSurvey, isUpdatingSurvey } = useSurvey(id)
const { validateSurveyDetail, createSurvey, isCreatingSurvey } = useSurvey()
- const handleSave = (isTemporary: boolean, isSubmitProcess = false) => {
- const emptyField = validateSurveyDetail(props.data.roof)
+ useEffect(() => {
+ if (!session?.isLoggedIn) return
+
+ const newPermissions = calculatePermissions(session, data.basic)
+ setPermissions(newPermissions)
+
+ setSaveData({
+ ...data.basic,
+ detailInfo: data.roof,
+ })
+ }, [session, data])
+
+ const calculatePermissions = (session: any, basicData: SurveyBasicRequest): PermissionState => {
+ const isSubmiter = calculateSubmitPermission(session, basicData)
+ const isWriter = session.userNm === basicData.representative
+ const isReceiver = session?.storeId === basicData.submissionTargetId
+
+ return { isSubmiter, isWriter, isReceiver }
+ }
+
+ const calculateSubmitPermission = (session: any, basicData: SurveyBasicRequest): boolean => {
+ switch (session?.role) {
+ case 'T01':
+ return false
+ case 'Admin':
+ case 'Admin_Sub':
+ return session.storeNm === basicData.store && session.builderNo === basicData.constructionPointId
+ case 'Builder':
+ case 'Partner':
+ return session.builderNo === basicData.constructionPointId
+ default:
+ return false
+ }
+ }
+
+ const handleSave = (isTemporary: boolean, isSubmitProcess: boolean) => {
+ const emptyField = validateSurveyDetail(data.roof)
const hasEmptyField = emptyField?.trim() !== ''
if (isTemporary) {
@@ -89,53 +101,65 @@ export default function ButtonForm(props: {
const tempSaveProcess = async () => {
if (idParam) {
await updateSurvey({ survey: saveData, isTemporary: true })
- router.push(`/survey-sale/${idParam}`)
+ if (!isUpdatingSurvey) {
+ router.push(`/survey-sale/${idParam}`)
+ }
} else {
const updatedData = {
...saveData,
srlNo: '一時保存',
}
const id = await createSurvey(updatedData)
- router.push(`/survey-sale/${id}`)
+ if (!isCreatingSurvey) {
+ router.push(`/survey-sale/${id}`)
+ }
}
alert('一時保存されました。')
}
const focusInput = (field: keyof SurveyDetailInfo) => {
const input = document.getElementById(field)
- if (input) {
- input.focus()
- }
+ input?.focus()
}
const saveProcess = async (emptyField: string | null, isSubmitProcess?: boolean) => {
if (emptyField?.trim() === '') {
- if (idParam) {
- await updateSurvey({ survey: saveData, isTemporary: false, storeId: session.storeId ?? '' })
- router.push(`/survey-sale/${idParam}`)
- } else {
- const id = await createSurvey(saveData)
- router.push(`/survey-sale/${id}`)
- }
- if (isSubmitProcess) {
- if (!isCreatingSurvey && !isUpdatingSurvey) {
- popupController.setSurveySaleSubmitPopup(true)
- }
- } else {
- alert('保存されました。')
- }
+ await handleSuccessfulSave(isSubmitProcess)
} else {
- if (emptyField?.includes('Unit')) {
- alert('電気契約容量の単位を入力してください。')
- focusInput(emptyField as keyof SurveyDetailInfo)
- } else {
- alert(requiredFields.find((field) => field.field === emptyField)?.name + ' 項目が空です。')
- focusInput(emptyField as keyof SurveyDetailInfo)
- }
+ handleFailedSave(emptyField)
}
}
- // ------------------------------------------------------------
- // 삭제/제출
+
+ const handleSuccessfulSave = async (isSubmitProcess?: boolean) => {
+ if (idParam) {
+ await updateSurvey({ survey: saveData, isTemporary: false, storeId: session.storeId ?? '' })
+ if (!isUpdatingSurvey) {
+ router.push(`/survey-sale/${idParam}`)
+ }
+ } else {
+ const id = await createSurvey(saveData)
+ if (!isCreatingSurvey) {
+ router.push(`/survey-sale/${id}`)
+ }
+ }
+
+ if (isSubmitProcess) {
+ if (!isCreatingSurvey && !isUpdatingSurvey) {
+ await popupController.setSurveySaleSubmitPopup(true)
+ }
+ } else {
+ alert('保存されました。')
+ }
+ }
+
+ const handleFailedSave = (emptyField: string | null) => {
+ if (emptyField?.includes('Unit')) {
+ alert('電気契約容量の単位を入力してください。')
+ } else {
+ alert(requiredFields.find((field) => field.field === emptyField)?.name + ' 項目が空です。')
+ }
+ focusInput(emptyField as keyof SurveyDetailInfo)
+ }
const handleDelete = async () => {
if (routeId) {
@@ -150,10 +174,11 @@ export default function ButtonForm(props: {
}
const handleSubmit = async () => {
- if (props.data.basic.srlNo?.startsWith('一時保存') && Number(routeId)) {
+ if (data.basic.srlNo?.startsWith('一時保存') && Number(routeId)) {
alert('一時保存されたデータは提出できません。')
return
}
+
if (Number(routeId)) {
window.neoConfirm('提出しますか?', async () => {
popupController.setSurveySaleSubmitPopup(true)
@@ -165,17 +190,15 @@ export default function ButtonForm(props: {
}
}
- // ------------------------------------------------------------
+ if (!session?.isLoggedIn) return null
- if (mode === 'READ' && isSubmit && isSubmiter) {
+ if (mode === 'READ' && isSubmit && permissions.isSubmiter) {
return (
- <>
-
-
-
-
+
)
}
@@ -185,9 +208,11 @@ export default function ButtonForm(props: {
-
- {(isWriter || !isSubmiter) && }
- {!isSubmit && isSubmiter && }
+ {(permissions.isWriter || permissions.isSubmiter || (permissions.isReceiver && isSubmit)) && (
+
+ )}
+ {(permissions.isWriter || (permissions.isReceiver && isSubmit)) && }
+ {!isSubmit && permissions.isSubmiter && }
)}
@@ -196,9 +221,9 @@ export default function ButtonForm(props: {
-
-
- {session?.role !== 'T01' && }
+ handleSave(true, false)} />
+ handleSave(false, false)} />
+ {session?.role === 'T01' || isSubmit ? null : }
)}
@@ -206,12 +231,11 @@ export default function ButtonForm(props: {
)
}
-// 목록 버튼
-function ListButton() {
+// Button Components
+const ListButton = () => {
const router = useRouter()
return (
- {/* 목록 */}
@@ -219,12 +243,10 @@ function ListButton() {
)
}
-function EditButton(props: { setMode: (mode: Mode) => void; id: string; mode: Mode }) {
- const { setMode, id, mode } = props
+const EditButton = ({ setMode, id }: { setMode: (mode: Mode) => void; id: string }) => {
const router = useRouter()
return (
- {/* 수정 */}