// components/purchase-requests/create-rfq-dialog.tsx "use client"; import * as React from "react"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Badge } from "@/components/ui/badge"; import { Alert, AlertDescription } from "@/components/ui/alert"; import { FileText, Package, AlertCircle, CheckCircle, User, Loader2, Info, X } from "lucide-react"; import { toast } from "sonner"; import type { PurchaseRequestView } from "@/db/schema"; import { approvePurchaseRequestsAndCreateRfqs } from "../service"; import { useRouter } from "next/navigation"; import { PurchaseGroupCodeSingleSelector, type PurchaseGroupCodeWithUser } from "@/components/common/selectors/purchase-group-code"; interface CreateRfqDialogProps { requests: PurchaseRequestView[]; open: boolean; onOpenChange: (open: boolean) => void; onSuccess?: () => void; } export function CreateRfqDialog({ requests, open, onOpenChange, onSuccess, }: CreateRfqDialogProps) { const [isLoading, setIsLoading] = React.useState(false); const [selectorOpen, setSelectorOpen] = React.useState(false); const [selectedPurchaseGroupCode, setSelectedPurchaseGroupCode] = React.useState(undefined); const router = useRouter(); // 유효한 요청만 필터링 (이미 RFQ 생성된 것 제외) const validRequests = requests.filter(r => r.status !== "RFQ생성완료"); const invalidRequests = requests.filter(r => r.status === "RFQ생성완료"); const handleSelectPurchaseGroupCode = (code: PurchaseGroupCodeWithUser) => { setSelectedPurchaseGroupCode(code); }; const handleSubmit = async () => { if (validRequests.length === 0) { toast.error("RFQ를 생성할 수 있는 구매 요청이 없습니다"); return; } try { setIsLoading(true); const requestIds = validRequests.map(r => r.id); const results = await approvePurchaseRequestsAndCreateRfqs( requestIds, selectedPurchaseGroupCode?.user?.id ) as Array<{ success?: boolean; skipped?: boolean; requestId: number; error?: string; message?: string; }>; const successCount = results.filter(r => r.success).length; const skipCount = results.filter(r => r.skipped).length; if (successCount > 0) { toast.success(`${successCount}개의 RFQ가 생성되었습니다`); } if (skipCount > 0) { toast.info(`${skipCount}개는 이미 RFQ가 생성되어 건너뛰었습니다`); } onOpenChange(false); onSuccess?.(); router.refresh() } catch (error) { console.error("RFQ 생성 오류:", error); toast.error("RFQ 생성 중 오류가 발생했습니다"); } finally { setIsLoading(false); } }; const handleClose = () => { if (!isLoading) { setSelectedPurchaseGroupCode(undefined); onOpenChange(false); } }; return ( RFQ 생성 선택한 구매 요청을 기반으로 RFQ를 생성합니다. {invalidRequests.length > 0 && " 이미 RFQ가 생성된 항목은 제외됩니다."}
{/* 경고 메시지 */} {invalidRequests.length > 0 && ( {invalidRequests.length}개 항목은 이미 RFQ가 생성되어 제외됩니다. )} {/* 구매 담당자 선택 */}
{selectedPurchaseGroupCode && ( )}

구매 담당자를 선택하지 않으면 나중에 지정할 수 있습니다

{/* 구매그룹코드 선택 다이얼로그 */} {/* RFQ 생성 대상 목록 */}
요청번호 요청제목 프로젝트 패키지 품목 첨부 {validRequests.length === 0 ? ( RFQ를 생성할 수 있는 구매 요청이 없습니다 ) : ( validRequests.map((request) => ( {request.requestCode}
{request.requestTitle}
{request.projectCode}
{request.packageNo}
{(request.itemCount ?? 0) > 0 && ( {request.itemCount} )} {(request.attachmentCount ?? 0) > 0 && ( {request.attachmentCount} )}
)) )}
{/* 안내 메시지 */}
  • RFQ 생성 시 구매 요청의 첨부파일이 자동으로 이관됩니다
  • 구매 요청 상태가 "RFQ생성완료"로 변경됩니다
  • 각 구매 요청별로 개별 RFQ가 생성됩니다
); }