"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 (
<>
{/* 상세 정보 Dialog */}
>
)
}
// siteVisitRequestId가 있는 경우: 기존 방식 (단일 상세 정보 표시)
return (
)
}