"use client" import * as React from "react" import { format } from "date-fns" import { ko } from "date-fns/locale" import { Building2, User, Phone, Mail, FileText, Calendar } from "lucide-react" import { formatDate } from "../utils" import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from "@/components/ui/dialog" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Button } from "@/components/ui/button" import { Badge } from "@/components/ui/badge" import { toast } from "sonner" interface VendorInfo { id: number siteVisitRequestId: number factoryName: string factoryLocation: string factoryAddress: string factoryPicName: string factoryPicPhone: string factoryPicEmail: string factoryDirections: string | null accessProcedure: string | null hasAttachments: boolean otherInfo: string | null submittedAt: Date submittedBy: number createdAt: Date updatedAt: Date } interface Attachment { id: number siteVisitRequestId: number vendorSiteVisitInfoId: number | null fileName: string originalFileName: string | null filePath: string fileSize: number | null mimeType: string | null createdAt: Date updatedAt: Date } interface VendorInfoViewDialogProps { isOpen: boolean onClose: () => void siteVisitRequestId: number | null investigationId?: number | null // 실사 ID 추가 - 여러 확정정보 조회용 isReinspection?: boolean // 재실사 모드 플래그 } export function VendorInfoViewDialog({ isOpen, onClose, siteVisitRequestId, investigationId, }: VendorInfoViewDialogProps) { const [data, setData] = React.useState(null) const [attachments, setAttachments] = React.useState([]) const [allConfirmations, setAllConfirmations] = React.useState([]) // 여러 확정정보 const [isLoading, setIsLoading] = React.useState(false) // 데이터 로드 React.useEffect(() => { if (isOpen && (siteVisitRequestId || investigationId)) { loadData() } }, [isOpen, siteVisitRequestId, investigationId]) const loadData = async () => { if (!siteVisitRequestId && !investigationId) return setIsLoading(true) try { // 단일 확정정보 조회 (기존) if (siteVisitRequestId) { const { getVendorSiteVisitInfoAction } = await import("./service") const result = await getVendorSiteVisitInfoAction(siteVisitRequestId) if (result.success && result.data) { setData(result.data.vendorInfo) setAttachments(result.data.attachments || []) } else { toast.error("협력업체 정보를 불러올 수 없습니다.") } } // 여러 확정정보 조회 (신규 - 실사 ID로 모든 siteVisitRequests 조회) if (investigationId) { const { getAllSiteVisitRequestsForInvestigationAction } = await import("./service") const result = await getAllSiteVisitRequestsForInvestigationAction(investigationId) if (result.success) { setAllConfirmations(result.confirmations || []) } } } catch (error) { console.error("데이터 로드 오류:", error) toast.error("데이터를 불러오는 중 오류가 발생했습니다.") } finally { setIsLoading(false) } } return ( !open && onClose()}> 협력업체 방문실사 정보 협력업체가 입력한 방문실사 관련 정보를 확인할 수 있습니다. {isLoading ? (

협력업체 정보를 불러오는 중...

) : (data || allConfirmations.length > 0) ? (
{/* 협력업체 정보 - 단일 확정정보 조회 시에만 표시 */} {data && ( 협력업체 공장 정보

공장 기본 정보

공장명: {data.factoryName}
공장위치: {data.factoryLocation}
공장주소: {data.factoryAddress}

공장 담당자 정보

{data.factoryPicName}
{data.factoryPicPhone}
{data.factoryPicEmail}
{data.factoryDirections && (

공장 가는 법

{data.factoryDirections}

)} {data.accessProcedure && (

공장 출입절차

{data.accessProcedure}

)}
)} {/* 첨부파일 */} {attachments.length > 0 && ( 협력업체 첨부파일 ({attachments.length}개)
{attachments.map((attachment) => (
{attachment.originalFileName} ({Math.round((attachment.fileSize || 0) / 1024)}KB)
))}
)} {/* 실사 실시 확정정보 (복수 지원) */} {allConfirmations.length > 0 && (

실사 실시 확정정보

{allConfirmations.map((confirmation, index) => ( 실사 확정정보 #{index + 1} {confirmation.status === "COMPLETED" ? "완료" : "진행중"}
실사 기간: {confirmation.inspectionDuration}일
요청 시작일: {confirmation.requestedStartDate ? formatDate(confirmation.requestedStartDate, "kr") : "미정"}
요청 종료일: {confirmation.requestedEndDate ? formatDate(confirmation.requestedEndDate, "kr") : "미정"}
생성일: {formatDate(confirmation.createdAt, "kr")}
{confirmation.additionalRequests && (
추가 요청사항:
{confirmation.additionalRequests}
)}
))}
)} {/* 기타 정보 */} {data?.otherInfo && ( 기타 정보

{data?.otherInfo}

)} {/* 제출 정보 */} 제출 정보
제출일: {formatDate(data?.submittedAt, "kr")}
첨부파일: {data?.hasAttachments ? "있음" : "없음"}
) : (

협력업체가 아직 정보를 입력하지 않았습니다.

)}
) }