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 { try {
const { id } = await params const { id } = await params
const body = await request.json() const body = await request.json()
// @ts-ignore
if (body.targetId) { const survey = await prisma.SD_SURVEY_SALES_BASIC_INFO.update({
// @ts-ignore where: { ID: Number(id) },
const survey = await prisma.SD_SURVEY_SALES_BASIC_INFO.update({ data: {
where: { ID: Number(id) }, SUBMISSION_STATUS: true,
data: { SUBMISSION_DATE: new Date(),
SUBMISSION_STATUS: true, SUBMISSION_TARGET_ID: body.targetId,
SUBMISSION_DATE: new Date(), SUBMISSION_TARGET_NM: body.targetNm,
SUBMISSION_TARGET_ID: body.targetId, UPT_DT: new Date(),
SUBMISSION_TARGET_NM: body.targetNm, },
UPT_DT: new Date(), })
}, return NextResponse.json({ message: 'Survey confirmed successfully', data: survey })
})
return NextResponse.json({ message: 'Survey confirmed successfully', data: survey })
}
} catch (error) { } catch (error) {
console.error('Error updating survey:', error) console.error('Error updating survey:', error)
return NextResponse.json({ error: 'Failed to update survey' }, { status: 500 }) 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() { export default function SurveySaleDownloadPdf() {
const params = useParams() const params = useParams()
const id = params.id const id = params.id
const router = useRouter()
const { surveyDetail, isLoadingSurveyDetail } = useSurvey(Number(id)) const { surveyDetail, isLoadingSurveyDetail } = useSurvey(Number(id))
const { setIsShow } = useSpinnerStore() const { setIsShow } = useSpinnerStore()
@ -50,7 +49,7 @@ export default function SurveySaleDownloadPdf() {
generatePDF(targetRef, options).then(() => { generatePDF(targetRef, options).then(() => {
setIsShow(false) setIsShow(false)
router.push(`/survey-sale/${id}`) alert('PDFの生成が完了しました。 ポップアップウィンドウからダウンロードしてください。')
}) })
} }

View File

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

View File

@ -29,9 +29,6 @@ export default function ButtonForm(props: {
...props.data.basic, ...props.data.basic,
detailInfo: props.data.roof, 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 ( return (
<> <>
{mode === 'READ' && ( {mode === 'READ' && (

View File

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

View File

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

View File

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