From ba8cd44a0ed2c613a5f2cee06bfc9bd0f61f21c7 Mon Sep 17 00:00:00 2001 From: dujinkim Date: Fri, 7 Nov 2025 08:39:04 +0000 Subject: (최겸) 입찰/견적 수정사항 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/create-general-contract-dialog.tsx | 413 +++++++++++++++++++++ 1 file changed, 413 insertions(+) create mode 100644 lib/general-contracts_old/main/create-general-contract-dialog.tsx (limited to 'lib/general-contracts_old/main/create-general-contract-dialog.tsx') diff --git a/lib/general-contracts_old/main/create-general-contract-dialog.tsx b/lib/general-contracts_old/main/create-general-contract-dialog.tsx new file mode 100644 index 00000000..2c3fc8bc --- /dev/null +++ b/lib/general-contracts_old/main/create-general-contract-dialog.tsx @@ -0,0 +1,413 @@ +"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 + /> + + +
+
+
+ +