refactor: update survey submission handling and improve data validation
This commit is contained in:
parent
46e6bc36f8
commit
749dd30ecb
@ -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 })
|
||||||
|
|||||||
@ -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の生成が完了しました。 ポップアップウィンドウからダウンロードしてください。')
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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' && (
|
||||||
|
|||||||
@ -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>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
},
|
},
|
||||||
|
|||||||
@ -44,7 +44,6 @@ const initialState: InitialState = {
|
|||||||
builderNm: null,
|
builderNm: null,
|
||||||
isLoggedIn: false,
|
isLoggedIn: false,
|
||||||
role: null,
|
role: null,
|
||||||
builderNm: null,
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user