"use client" import * as React from "react" import { useState, useEffect } from "react" import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from "@/components/ui/dialog" import { Badge } from "@/components/ui/badge" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Separator } from "@/components/ui/separator" import { Skeleton } from "@/components/ui/skeleton" import { Clock, User, AlertCircle, Paperclip } from "lucide-react" import { formatDate } from "@/lib/utils" import { toast } from "sonner" import { Button } from "@/components/ui/button" import { updateSHIComment } from "@/lib/techsales-rfq/service"; interface QuotationAttachment { id: number quotationId: number revisionId: number fileName: string originalFileName: string fileSize: number fileType: string | null filePath: string description: string | null isVendorUpload: boolean createdAt: Date updatedAt: Date } interface QuotationSnapshot { currency: string | null totalPrice: string | null validUntil: Date | null remark: string | null status: string quotationVersion: number | null submittedAt: Date | null acceptedAt: Date | null updatedAt: Date | null } interface QuotationRevision { id: number version: number snapshot: QuotationSnapshot changeReason: string | null revisionNote: string | null revisedBy: number | null revisedAt: Date revisedByName: string | null attachments: QuotationAttachment[] } interface QuotationHistoryData { current: { id: number currency: string | null totalPrice: string | null validUntil: Date | null remark: string | null status: string quotationVersion: number | null submittedAt: Date | null acceptedAt: Date | null updatedAt: Date | null attachments: QuotationAttachment[] } revisions: QuotationRevision[] } interface QuotationHistoryDialogProps { open: boolean onOpenChange: (open: boolean) => void quotationId: number | null isInternal?: boolean // 내부 사용자인지 여부 (partners가 아니면 내부) } const statusConfig = { "Draft": { label: "초안", color: "bg-yellow-100 text-yellow-800" }, "Submitted": { label: "제출됨", color: "bg-blue-100 text-blue-800" }, "Revised": { label: "수정됨", color: "bg-purple-100 text-purple-800" }, "Accepted": { label: "승인됨", color: "bg-green-100 text-green-800" }, "Rejected": { label: "거절됨", color: "bg-red-100 text-red-800" }, } function QuotationCard({ data, version, isCurrent = false, revisedBy, revisedAt, attachments, revisionId, revisionNote, isInternal = false, }: { data: QuotationSnapshot | QuotationHistoryData["current"] version: number isCurrent?: boolean revisedBy?: string | null revisedAt?: Date attachments?: QuotationAttachment[] revisionId?: number revisionNote?: string | null isInternal?: boolean }) { const statusInfo = statusConfig[data.status as keyof typeof statusConfig] || { label: data.status || "알 수 없음", color: "bg-gray-100 text-gray-800" } const [editValue, setEditValue] = React.useState(revisionNote || ""); const [isSaving, setIsSaving] = React.useState(false); React.useEffect(() => { setEditValue(revisionNote || ""); }, [revisionNote]); const handleSave = async () => { if (!revisionId) return; setIsSaving(true); try { const result = await updateSHIComment(revisionId, editValue); if (result.error) { toast.error(result.error); } else { toast.success("저장 완료"); } } catch (error) { toast.error("저장 중 오류가 발생했습니다"); } finally { setIsSaving(false); } }; return (
버전 {version} {isCurrent && 현재} {statusInfo.label}

견적 금액

{data.totalPrice ? `${data.currency} ${Number(data.totalPrice).toLocaleString()}` : "미입력"}

유효 기한

{data.validUntil ? formatDate(data.validUntil) : "미설정"}

{data.remark && (

비고

{data.remark}

)} {revisionId && isInternal && (

SHI Comment