import Image from 'next/image' import { usePopupController } from '@/store/popupController' import { useParams } from 'next/navigation' import { useSurvey } from '@/hooks/useSurvey' import { useEffect, useRef, useState } from 'react' import { useSessionStore } from '@/store/session' import { useCommCode } from '@/hooks/useCommCode' import { CommCode } from '@/types/CommCode' import { sendEmail } from '@/libs/mailer' import { useSpinnerStore } from '@/store/spinnerStore' interface SubmitFormData { saleBase: string | null targetId: string | null targetNm: string | null sender: string receiver: string[] | string reference: string | null title: string contents: string | null } interface FormField { id: keyof SubmitFormData name: string required: boolean } export default function SurveySaleSubmitPopup() { const popupController = usePopupController() const { session } = useSessionStore() const params = useParams() const routeId = params.id const { setIsShow } = useSpinnerStore() 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 || !surveyDetail?.id) return if (session?.role === 'Admin') { getCommCode('SALES_OFFICE_CD').then((codes) => { setCommCodeList(codes) }) } 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: '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: false }, ] const { submitSurvey, isSubmittingSurvey } = useSurvey(Number(routeId)) const handleInputChange = (field: keyof SubmitFormData, value: string) => { setSubmitData((prev) => ({ ...prev, [field]: value })) } const validateData = (data: SubmitFormData): boolean => { const requiredFields = FORM_FIELDS.filter((field) => field.required) for (const field of requiredFields) { if (data[field.id] === '' || data[field.id] === null || data[field.id]?.length === 0) { alert(`${field.name}は必須入力項目です。`) const element = document.getElementById(field.id) if (element) { element.focus() } return false } } return true } // TODO: Admin_Sub 계정 매핑된 submit target id 추가!!!! && 메일 테스트트 const handleSubmit = () => { if (validateData(submitData)) { window.neoConfirm('送信しますか? 送信後は変更・修正することはできません。', () => { setIsShow(true) sendEmail({ to: submitData.receiver, subject: submitData.title, content: contentsRef.current?.innerHTML ?? '', }) .then(() => { 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) } const renderFormField = (field: FormField) => { const isReadOnly = false if (field.id === 'saleBase' && session?.role !== 'Admin') { return null } if (field.id === 'targetNm' && session?.role === 'Admin') { return null } return (
{field.name} {field.required && *}
{field.id === 'contents' ? (

HANASYS現地調査アプリを使用した現地調査結果が送信されました。

-担当者名: {surveyDetail?.representative}

-販売店名: {surveyDetail?.store} ({surveyDetail?.storeId})

-施工店名: {surveyDetail?.constructionPoint}

現地調査結果PDFダウンロード

※リンクをクリックしてローカル調査結果PDFをダウンロードできます。

) : ( <> {field.id === 'saleBase' && session?.role === 'Admin' ? ( ) : ( handleInputChange(field.id, e.target.value)} readOnly={isReadOnly} /> )} )}
) } return (
調査物件の提出
{FORM_FIELDS.map(renderFormField)}
) }