"use client"; import * as React from "react"; import { useState } from "react"; import { useSession } from "next-auth/react"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { Label } from "@/components/ui/label"; import { toast } from "sonner"; import { Plus, Loader2 } from "lucide-react"; import { MaterialGroupSelector } from "@/components/common/material/material-group-selector"; import { MaterialSearchItem } from "@/lib/material/material-group-service"; import { addConfirmedMaterial, VendorPossibleMaterial } from "../vendor-possible-material-service"; interface AddConfirmedMaterialProps { vendorId: number; existingConfirmedMaterials: VendorPossibleMaterial[]; onMaterialAdded?: () => void; } export function AddConfirmedMaterial({ vendorId, existingConfirmedMaterials, onMaterialAdded, }: AddConfirmedMaterialProps) { const { data: session } = useSession(); const [open, setOpen] = useState(false); const [isLoading, setIsLoading] = useState(false); const [selectedMaterials, setSelectedMaterials] = useState([]); // 이미 등록된 자재그룹코드들의 Set const existingMaterialCodes = new Set( existingConfirmedMaterials.map(material => material.itemCode).filter(Boolean) ); // 자재 선택 시 중복 체크 const handleMaterialsChange = (materials: MaterialSearchItem[]) => { // 이미 등록된 자재가 있는지 확인 const duplicatedMaterials = materials.filter(material => existingMaterialCodes.has(material.materialGroupCode) ); if (duplicatedMaterials.length > 0) { const duplicatedCodes = duplicatedMaterials.map(m => m.materialGroupCode).join(', '); toast.error(`이미 등록된 자재그룹코드입니다: ${duplicatedCodes}`); // 중복되지 않은 자재만 선택 const validMaterials = materials.filter(material => !existingMaterialCodes.has(material.materialGroupCode) ); setSelectedMaterials(validMaterials); } else { setSelectedMaterials(materials); } }; const handleSubmit = async () => { if (!session?.user) { toast.error("로그인이 필요합니다."); return; } if (selectedMaterials.length === 0) { toast.error("추가할 자재를 선택해주세요."); return; } setIsLoading(true); try { // 선택된 자재들을 각각 추가 for (const material of selectedMaterials) { const materialData = { itemCode: material.materialGroupCode, itemName: material.materialName, }; await addConfirmedMaterial( vendorId, materialData, Number(session.user.id), session.user.name || "알 수 없음" ); } toast.success(`${selectedMaterials.length}개의 자재가 확정정보에 추가되었습니다.`); // 폼 리셋 setSelectedMaterials([]); setOpen(false); // 부모 컴포넌트에 추가 완료 알림 onMaterialAdded?.(); } catch (error) { console.error("자재 추가 실패:", error); // 에러 메시지를 더 구체적으로 표시 if (error instanceof Error) { if (error.message.includes("이미 확정정보에 등록되어 있습니다")) { toast.error(error.message); } else { toast.error(`자재 추가 실패: ${error.message}`); } } else { toast.error("자재 추가 중 알 수 없는 오류가 발생했습니다."); } } finally { setIsLoading(false); } }; return ( 확정정보 자재 추가 구매담당자 권한으로 확정 공급품목을 추가합니다. 상세 정보는 I/F를 통해 업데이트됩니다.
{/* 자재 선택 */}
{existingMaterialCodes.size > 0 && (

💡 이미 등록된 자재그룹코드는 자동으로 제외됩니다.

)}

최대 10개까지 선택 가능합니다. 등록자는 현재 로그인한 사용자로 자동 설정됩니다.

); }