"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, Check, ChevronsUpDown } from "lucide-react" import { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem } from "@/components/ui/command" import { format } from "date-fns" import { ko } from "date-fns/locale" import { cn } from "@/lib/utils" import { createContract, getVendors } 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 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 [vendorSearchTerm, setVendorSearchTerm] = React.useState("") const [vendorOpen, setVendorOpen] = React.useState(false) const [form, setForm] = React.useState({ contractNumber: '', name: '', category: '', type: '', executionMethod: '', vendorId: null, startDate: undefined, endDate: undefined, validityEndDate: undefined, notes: '', }) // 업체 목록 조회 React.useEffect(() => { const fetchData = async () => { try { const vendorList = await getVendors() console.log('vendorList', vendorList) setVendors(vendorList) } catch (error) { console.error('데이터 조회 오류:', error) toast.error('데이터를 불러오는데 실패했습니다') setVendors([]) } } fetchData() }, []) // 협력업체 검색 필터링 const filteredVendors = React.useMemo(() => { if (!vendorSearchTerm.trim()) return vendors const lowerSearch = vendorSearchTerm.toLowerCase() return vendors.filter( vendor => vendor.vendorName.toLowerCase().includes(lowerSearch) || (vendor.vendorCode && vendor.vendorCode.toLowerCase().includes(lowerSearch)) ) }, [vendors, vendorSearchTerm]) const handleSubmit = async () => { // 필수 필드 검증 const validationErrors: string[] = [] if (!form.name) validationErrors.push('계약명') if (!form.category) validationErrors.push('계약구분') if (!form.type) validationErrors.push('계약종류') if (!form.executionMethod) validationErrors.push('체결방식') if (!form.vendorId) validationErrors.push('협력업체') // AD, LO, OF 계약이 아닌 경우에만 계약기간 필수값 체크 if (!['AD', 'LO', 'OF'].includes(form.type)) { if (!form.startDate) validationErrors.push('계약시작일') if (!form.endDate) validationErrors.push('계약종료일') } // LO 계약인 경우 계약체결유효기간 필수값 체크 if (form.type === 'LO' && !form.validityEndDate) { validationErrors.push('유효기간') } if (validationErrors.length > 0) { toast.error(`다음 필수 항목을 입력해주세요: ${validationErrors.join(', ')}`) 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, 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, startDate: undefined, endDate: undefined, validityEndDate: undefined, notes: '', }) } return ( { setOpen(newOpen) if (!newOpen) resetForm() }}> 새 계약 등록 새로운 계약의 기본 정보를 입력하세요.
setForm(prev => ({ ...prev, name: e.target.value }))} placeholder="계약명을 입력하세요" />
검색 결과가 없습니다 {filteredVendors.map((vendor) => ( { setForm(prev => ({ ...prev, vendorId: vendor.id })) setVendorOpen(false) setVendorSearchTerm("") }} > {vendor.vendorName} {vendor.vendorCode && ( ({vendor.vendorCode}) )} ))}
setForm(prev => ({ ...prev, startDate: date }))} initialFocus />
setForm(prev => ({ ...prev, endDate: date }))} initialFocus />
setForm(prev => ({ ...prev, validityEndDate: date }))} initialFocus />