"use client" import * as React from "react" import { Building2, User, Phone, Mail, FileText, Calendar, ChevronRight } 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 SiteVisitRequest { id: number status: string inspectionDuration: number requestedStartDate: Date requestedEndDate: Date additionalRequests: string | null createdAt: Date updatedAt: Date vendorInfo: VendorInfo | null attachments: Attachment[] } interface VendorInfoViewDialogProps { isOpen: boolean onClose: () => void siteVisitRequestId: number | null investigationId?: number | null // 실사 ID 추가 - 여러 확정정보 조회용 isReinspection?: boolean // 재실사 모드 플래그 } // 상세 정보를 표시하는 내부 컴포넌트 function VendorDetailView({ vendorInfo, attachments, siteVisitRequest }: { vendorInfo: VendorInfo | null attachments: Attachment[] siteVisitRequest?: SiteVisitRequest }) { if (!vendorInfo) { return (

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

) } return (
{/* 협력업체 실사 장소 정보 */} 협력업체 실사 장소 정보

실사 장소 기본 정보

실사 장소명: {vendorInfo.factoryName}
실사 지역: {vendorInfo.factoryLocation}
실사 주소: {vendorInfo.factoryAddress}

실사 참석자 정보

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

실사 장소 이동 방법

{vendorInfo.factoryDirections}

)} {vendorInfo.accessProcedure && (

실사 장소 출입절차

{vendorInfo.accessProcedure}

)}
{/* 첨부파일 */} {attachments.length > 0 && ( 협력업체 첨부파일 ({attachments.length}개)
{attachments.map((attachment) => (
{attachment.originalFileName} ({Math.round((attachment.fileSize || 0) / 1024)}KB)
))}
)} {/* 실사 정보 */} {siteVisitRequest && ( 실사 정보
실사 기간: {siteVisitRequest.inspectionDuration}일
요청 시작일: {siteVisitRequest.requestedStartDate ? formatDate(siteVisitRequest.requestedStartDate, "kr") : "미정"}
요청 종료일: {siteVisitRequest.requestedEndDate ? formatDate(siteVisitRequest.requestedEndDate, "kr") : "미정"}
상태: {siteVisitRequest.status === "VENDOR_SUBMITTED" ? "제출완료" : siteVisitRequest.status === "SENT" ? "발송완료" : "요청됨"}
{siteVisitRequest.additionalRequests && (
추가 요청사항:
{siteVisitRequest.additionalRequests}
)}
)} {/* 기타 정보 */} {vendorInfo.otherInfo && ( 기타 정보

{vendorInfo.otherInfo}

)} {/* 제출 정보 */} 제출 정보
제출일:{" "} {vendorInfo.submittedAt ? formatDate(vendorInfo.submittedAt, "kr") : "-"}
첨부파일: {vendorInfo.hasAttachments ? "있음" : "없음"}
) } export function VendorInfoViewDialog({ isOpen, onClose, siteVisitRequestId, investigationId, }: VendorInfoViewDialogProps) { const [data, setData] = React.useState(null) const [attachments, setAttachments] = React.useState([]) const [siteVisitRequests, setSiteVisitRequests] = React.useState([]) const [isLoading, setIsLoading] = React.useState(false) const [selectedRequest, setSelectedRequest] = React.useState(null) const [detailDialogOpen, setDetailDialogOpen] = React.useState(false) // 데이터 로드 React.useEffect(() => { if (isOpen && (siteVisitRequestId || investigationId)) { loadData() } else { // Dialog가 닫힐 때 상태 초기화 setData(null) setAttachments([]) setSiteVisitRequests([]) setSelectedRequest(null) setDetailDialogOpen(false) } }, [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 { setData(null) setAttachments([]) } } // 여러 확정정보 조회 (investigationId 기준) if (investigationId) { const { getAllSiteVisitRequestsForInvestigationAction } = await import("./service") const result = await getAllSiteVisitRequestsForInvestigationAction(investigationId) if (result.success) { setSiteVisitRequests(result.requests || []) } else { setSiteVisitRequests([]) toast.error(result.error || "방문실사 정보를 불러올 수 없습니다.") } } } catch (error) { console.error("데이터 로드 오류:", error) toast.error("데이터를 불러오는 중 오류가 발생했습니다.") } finally { setIsLoading(false) } } const handleListItemClick = (request: SiteVisitRequest) => { setSelectedRequest(request) setDetailDialogOpen(true) } const handleCloseDetail = () => { setDetailDialogOpen(false) setSelectedRequest(null) } // investigationId가 있는 경우: 리스트 형태 표시 if (investigationId) { return ( <> !open && onClose()}> 협력업체 방문실사 정보 협력업체가 입력한 방문실사 관련 정보를 확인할 수 있습니다. {isLoading ? (

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

) : siteVisitRequests.length > 0 ? (
{siteVisitRequests.map((request, index) => ( handleListItemClick(request)} >

방문실사 정보 #{index + 1}

{request.vendorInfo ? (request.status === "VENDOR_SUBMITTED" ? "제출완료" : "발송완료") : "미제출" }
실사 장소명:{" "} {request.vendorInfo?.factoryName || "미입력"}
제출일:{" "} {request.vendorInfo?.submittedAt ? formatDate(request.vendorInfo.submittedAt, "kr") : "-" }
실사기간: {request.inspectionDuration}일
생성일: {formatDate(request.createdAt, "kr")}
))}
) : (

협력업체 방문실사 정보가 없습니다.

)}
{/* 상세 정보 Dialog */} !open && handleCloseDetail()}> 협력업체 방문실사 상세 정보 협력업체가 입력한 방문실사 관련 상세 정보를 확인할 수 있습니다. {selectedRequest && ( )} ) } // siteVisitRequestId가 있는 경우: 기존 방식 (단일 상세 정보 표시) return ( !open && onClose()}> 협력업체 방문실사 정보 협력업체가 입력한 방문실사 관련 정보를 확인할 수 있습니다. {isLoading ? (

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

) : ( )}
) }