"use client" import * as React from "react" import { zodResolver } from "@hookform/resolvers/zod" import { Check, ChevronsUpDown, Loader } from "lucide-react" import { useForm } from "react-hook-form" import { toast } from "sonner" import { z } from "zod" import { cn } from "@/lib/utils" import { Button } from "@/components/ui/button" import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, } from "@/components/ui/command" import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form" import { Input } from "@/components/ui/input" import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select" import { Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, } from "@/components/ui/sheet" import { Checkbox } from "@/components/ui/checkbox" import { ScrollArea } from "@/components/ui/scroll-area" import { RfqDetailView } from "./rfq-detail-column" import { updateRfqDetail } from "@/lib/procurement-rfqs/services" // 폼 유효성 검증 스키마 const updateRfqDetailSchema = z.object({ vendorId: z.string().min(1, "벤더를 선택해주세요"), currency: z.string().min(1, "통화를 선택해주세요"), paymentTermsCode: z.string().min(1, "지불 조건을 선택해주세요"), incotermsCode: z.string().min(1, "인코텀즈를 선택해주세요"), incotermsDetail: z.string().optional(), deliveryDate: z.string().optional(), taxCode: z.string().optional(), placeOfShipping: z.string().optional(), placeOfDestination: z.string().optional(), materialPriceRelatedYn: z.boolean().default(false), }) type UpdateRfqDetailFormValues = z.infer // 데이터 타입 정의 interface Vendor { id: number; vendorName: string; vendorCode: string; } interface Currency { code: string; name: string; } interface PaymentTerm { code: string; description: string; } interface Incoterm { code: string; description: string; } interface UpdateRfqDetailSheetProps extends React.ComponentPropsWithRef { detail: RfqDetailView | null; vendors: Vendor[]; currencies: Currency[]; paymentTerms: PaymentTerm[]; incoterms: Incoterm[]; onSuccess?: () => void; } export function UpdateRfqDetailSheet({ detail, vendors, currencies, paymentTerms, incoterms, onSuccess, ...props }: UpdateRfqDetailSheetProps) { const [isUpdatePending, startUpdateTransition] = React.useTransition() const [vendorOpen, setVendorOpen] = React.useState(false) const form = useForm({ resolver: zodResolver(updateRfqDetailSchema), defaultValues: { vendorId: detail?.vendorName ? String(vendors.find(v => v.vendorName === detail.vendorName)?.id || "") : "", currency: detail?.currency || "", paymentTermsCode: detail?.paymentTermsCode || "", incotermsCode: detail?.incotermsCode || "", incotermsDetail: detail?.incotermsDetail || "", deliveryDate: detail?.deliveryDate ? new Date(detail.deliveryDate).toISOString().split('T')[0] : "", taxCode: detail?.taxCode || "", placeOfShipping: detail?.placeOfShipping || "", placeOfDestination: detail?.placeOfDestination || "", materialPriceRelatedYn: detail?.materialPriceRelatedYn || false, }, }) // detail이 변경될 때 form 값 업데이트 React.useEffect(() => { if (detail) { const vendorId = vendors.find(v => v.vendorName === detail.vendorName)?.id form.reset({ vendorId: vendorId ? String(vendorId) : "", currency: detail.currency || "", paymentTermsCode: detail.paymentTermsCode || "", incotermsCode: detail.incotermsCode || "", incotermsDetail: detail.incotermsDetail || "", deliveryDate: detail.deliveryDate ? new Date(detail.deliveryDate).toISOString().split('T')[0] : "", taxCode: detail.taxCode || "", placeOfShipping: detail.placeOfShipping || "", placeOfDestination: detail.placeOfDestination || "", materialPriceRelatedYn: detail.materialPriceRelatedYn || false, }) } }, [detail, form, vendors]) function onSubmit(values: UpdateRfqDetailFormValues) { if (!detail) return startUpdateTransition(async () => { try { const result = await updateRfqDetail(detail.detailId, values) if (!result.success) { toast.error(result.message || "수정 중 오류가 발생했습니다") return } props.onOpenChange?.(false) toast.success("RFQ 벤더 정보가 수정되었습니다") onSuccess?.() } catch (error) { console.error("RFQ 벤더 수정 오류:", error) toast.error("수정 중 오류가 발생했습니다") } }) } return ( RFQ 벤더 정보 수정 벤더 정보를 수정하고 저장하세요
{/* 검색 가능한 벤더 선택 필드 */} ( 벤더 * 검색 결과가 없습니다 {vendors.map((vendor) => ( { form.setValue("vendorId", String(vendor.id), { shouldValidate: true, }) setVendorOpen(false) }} > {vendor.vendorName} ({vendor.vendorCode}) ))} )} /> ( 통화 * )} />
( 지불 조건 * )} /> ( 인코텀즈 * )} />
( 인코텀즈 세부사항 )} />
( 납품 예정일 )} /> ( 세금 코드 )} />
( 선적지 )} /> ( 도착지 )} />
(
하도급 대금 연동 여부
)} />
) }