"use client" import * as React from "react" import { useRouter } from "next/navigation" import { Plus } from "lucide-react" import { toast } from "sonner" import { Button } from "@/components/ui/button" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Textarea } from "@/components/ui/textarea" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Calendar } from "@/components/ui/calendar" import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover" import { CalendarIcon } from "lucide-react" import { format } from "date-fns" import { ko } from "date-fns/locale" import { cn } from "@/lib/utils" import { createContract, getVendors, getProjects } from "@/lib/general-contracts/service" import { GENERAL_CONTRACT_CATEGORIES, GENERAL_CONTRACT_TYPES, GENERAL_EXECUTION_METHODS } from "@/lib/general-contracts/types" import { useSession } from "next-auth/react" interface CreateContractForm { contractNumber: string name: string category: string type: string executionMethod: string vendorId: number | null projectId: number | null startDate: Date | undefined endDate: Date | undefined validityEndDate: Date | undefined notes: string } export function CreateGeneralContractDialog() { const router = useRouter() const { data: session } = useSession() const [open, setOpen] = React.useState(false) const [isLoading, setIsLoading] = React.useState(false) const [vendors, setVendors] = React.useState>([]) const [projects, setProjects] = React.useState>([]) const [form, setForm] = React.useState({ contractNumber: '', name: '', category: '', type: '', executionMethod: '', vendorId: null, projectId: null, startDate: undefined, endDate: undefined, validityEndDate: undefined, notes: '', }) // 업체 목록 조회 React.useEffect(() => { const fetchVendors = async () => { try { const vendorList = await getVendors() setVendors(vendorList) } catch (error) { console.error('Error fetching vendors:', error) } } fetchVendors() }, []) // 프로젝트 목록 조회 React.useEffect(() => { const fetchProjects = async () => { try { const projectList = await getProjects() console.log(projectList) setProjects(projectList) } catch (error) { console.error('Error fetching projects:', error) } } fetchProjects() }, []) const handleSubmit = async () => { // 필수 필드 검증 if (!form.name || !form.category || !form.type || !form.executionMethod || !form.vendorId || !form.startDate || !form.endDate) { toast.error("필수 항목을 모두 입력해주세요.") return } if (!form.validityEndDate) { setForm(prev => ({ ...prev, validityEndDate: form.endDate })) } try { setIsLoading(true) const contractData = { contractNumber: '', name: form.name, category: form.category, type: form.type, executionMethod: form.executionMethod, projectId: form.projectId, contractSourceType: 'manual', vendorId: form.vendorId!, startDate: form.startDate!.toISOString().split('T')[0], endDate: form.endDate!.toISOString().split('T')[0], validityEndDate: (form.validityEndDate || form.endDate!).toISOString().split('T')[0], status: 'Draft', registeredById: session?.user?.id || 1, lastUpdatedById: session?.user?.id || 1, notes: form.notes, } await createContract(contractData) toast.success("새 계약이 생성되었습니다.") setOpen(false) resetForm() // 상세 페이지로 이동 router.refresh() } catch (error) { console.error('Error creating contract:', error) toast.error("계약 생성 중 오류가 발생했습니다.") } finally { setIsLoading(false) } } const resetForm = () => { setForm({ contractNumber: '', name: '', category: '', type: '', executionMethod: '', vendorId: null, projectId: null, startDate: undefined, endDate: undefined, validityEndDate: undefined, notes: '', }) } return ( { setOpen(newOpen) if (!newOpen) resetForm() }}> 새 계약 등록 새로운 계약의 기본 정보를 입력하세요.
setForm(prev => ({ ...prev, name: e.target.value }))} placeholder="계약명을 입력하세요" />
setForm(prev => ({ ...prev, startDate: date }))} initialFocus />
setForm(prev => ({ ...prev, endDate: date }))} initialFocus />
setForm(prev => ({ ...prev, validityEndDate: date }))} initialFocus />