refactor: update survey submission handling and improve data validation

This commit is contained in:
Dayoung 2025-06-02 13:33:23 +09:00
parent 46e6bc36f8
commit 749dd30ecb
7 changed files with 50 additions and 46 deletions

View File

@ -115,21 +115,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,
SUBMISSION_TARGET_NM: body.targetNm,
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 })

View File

@ -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()
@ -50,7 +49,7 @@ export default function SurveySaleDownloadPdf() {
generatePDF(targetRef, options).then(() => {
setIsShow(false)
router.push(`/survey-sale/${id}`)
alert('PDFの生成が完了しました。 ポップアップウィンドウからダウンロードしてください。')
})
}

View File

@ -11,8 +11,8 @@ import { useSpinnerStore } from '@/store/spinnerStore'
interface SubmitFormData {
saleBase: string | null
targetId: string
targetNm: string
targetId: string | null
targetNm: string | null
sender: string
receiver: string[] | string
reference: string | null
@ -38,8 +38,8 @@ export default function SurveySaleSubmitPopup() {
const [submitData, setSubmitData] = useState<SubmitFormData>({
saleBase: null,
targetId: '',
targetNm: '',
targetId: null,
targetNm: null,
sender: '',
receiver: [],
reference: null,
@ -57,8 +57,8 @@ export default function SurveySaleSubmitPopup() {
}
setSubmitData({
...submitData,
targetId: session?.role === 'Builder' ? surveyDetail?.storeId ?? '' : '',
targetNm: session?.role === 'Builder' ? surveyDetail?.store ?? '' : '',
targetId: session?.role === 'Builder' ? surveyDetail?.storeId ?? null : null,
targetNm: session?.role === 'Builder' ? surveyDetail?.store ?? null : null,
sender: session?.email ?? '',
title: '[HANASYS現地調査] 調査物件が提出. (' + surveyDetail?.srlNo + ')',
})
@ -67,7 +67,7 @@ export default function SurveySaleSubmitPopup() {
const FORM_FIELDS: FormField[] = [
{ id: 'sender', name: '発送者', required: true },
{ id: 'saleBase', name: '提出地点選択', required: session?.role === 'Admin' },
{ id: 'targetNm', name: '提出販売店', required: session?.role === 'Admin_Sub' || session?.role === 'Builder' },
{ id: 'targetNm', name: '提出販売店', required: session?.role !== 'Admin' },
{ id: 'receiver', name: '受信者', required: true },
{ id: 'reference', name: '参考', required: false },
{ id: 'title', name: 'タイトル', required: true },
@ -77,9 +77,6 @@ export default function SurveySaleSubmitPopup() {
const { submitSurvey, isSubmittingSurvey } = useSurvey(Number(routeId))
const handleInputChange = (field: keyof SubmitFormData, value: string) => {
if (field === 'receiver' && session?.role === 'Partner') {
setSubmitData((prev) => ({ ...prev, targetNm: value }))
}
setSubmitData((prev) => ({ ...prev, [field]: value }))
}
@ -87,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) {
@ -110,16 +107,17 @@ export default function SurveySaleSubmitPopup() {
})
.then(() => {
if (!isSubmittingSurvey) {
submitSurvey({ targetId: submitData.targetId, targetNm: submitData.targetNm })
alert('提出が完了しました。')
// submitSurvey({ targetId: submitData.targetId, targetNm: submitData.targetNm })
popupController.setSurveySaleSubmitPopup(false)
}
})
.catch((error) => {
console.error('Error sending email:', error)
alert('メール送信に失敗しました。')
alert('メール送信に失敗しました。 再度送信してください。')
})
.finally(() => {
submitSurvey({ targetId: submitData.targetId, targetNm: submitData.targetNm })
setIsShow(false)
popupController.setSurveySaleSubmitPopup(false)
})
@ -139,7 +137,7 @@ export default function SurveySaleSubmitPopup() {
if (field.id === 'saleBase' && session?.role !== 'Admin') {
return null
}
if (field.id === 'targetNm' && (session?.role === 'Admin' || session?.role === 'Partner')) {
if (field.id === 'targetNm' && session?.role === 'Admin') {
return null
}

View File

@ -29,9 +29,6 @@ export default function ButtonForm(props: {
...props.data.basic,
detailInfo: props.data.roof,
})
console.log(session)
console.log(props.data.basic)
// --------------------------------------------------------------
// 권한
@ -190,6 +187,19 @@ export default function ButtonForm(props: {
)
}
//TODO: 추가확인 필요 (T01 계정이 어떤 조사매물을 수정/삭제 할 수 있는지)
if (mode === 'READ' && session?.role === 'T01' && (!isSubmit || props.data.basic.submissionTargetId !== session.storeId)) {
return (
<>
<div className="sale-form-btn-wrap">
<div className="btn-flex-wrap">
<ListButton />
</div>
</div>
</>
)
}
return (
<>
{mode === 'READ' && (

View File

@ -23,19 +23,23 @@ export default function DataTable() {
const { surveyDetail, isLoadingSurveyDetail } = useSurvey(Number(id))
if (isLoadingSurveyDetail) {
return <></>
return null
}
const submitStatus = () => {
if (session?.role === 'Admin') {
return <div>HWJ</div>
const { submissionTargetNm, submissionTargetId } = surveyDetail ?? {}
if (!submissionTargetNm) {
return null
}
if (session?.role === 'Partner') {
return <div>{surveyDetail?.submissionTargetNm}</div>
if (!submissionTargetId) {
return <div>{submissionTargetNm}</div>
}
return (
<div>
({surveyDetail?.submissionTargetNm} - {surveyDetail?.submissionTargetId})
({submissionTargetNm} - {submissionTargetId})
</div>
)
}

View File

@ -66,7 +66,7 @@ export function useSurvey(id?: number): {
createSurvey: (survey: SurveyRegistRequest) => Promise<number>
updateSurvey: ({ survey, isTemporary, storeId }: { survey: SurveyRegistRequest; isTemporary: boolean; storeId?: string }) => void
deleteSurvey: () => Promise<boolean>
submitSurvey: (params: { saveId?: number; targetId?: string; targetNm?: string; storeId?: string; srlNo?: string }) => void
submitSurvey: (params: { targetId?: string | null; targetNm?: string | null }) => void
validateSurveyDetail: (surveyDetail: SurveyDetailRequest) => string
getZipCode: (zipCode: string) => Promise<ZipCode[] | null>
refetchSurveyList: () => void
@ -163,14 +163,11 @@ export function useSurvey(id?: number): {
})
const { mutateAsync: submitSurvey, isPending: isSubmittingSurvey } = useMutation({
mutationFn: async ({ targetId, targetNm, storeId, srlNo }: { targetId?: string; targetNm?: string; storeId?: string; srlNo?: string }) => {
mutationFn: async ({ targetId, targetNm }: { targetId?: string | null; targetNm?: string | null }) => {
if (!id) throw new Error('id is required')
const resp = await axiosInstance(null).patch<boolean>(`/api/survey-sales/${id}`, {
targetId,
targetNm,
storeId,
srlNo,
role: session?.role ?? null,
})
return resp.data
},

View File

@ -44,7 +44,6 @@ const initialState: InitialState = {
builderNm: null,
isLoggedIn: false,
role: null,
builderNm: null,
},
}