"use client" import * as React from "react" import type { ColumnDef, Row } from "@tanstack/react-table"; import { formatDate, formatDateTime } from "@/lib/utils" import { DataTableColumnHeaderSimple } from "@/components/data-table/data-table-column-simple-header" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { Ellipsis, MessageCircle, ExternalLink } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; export interface DataTableRowAction { row: Row; type: "delete" | "update" | "communicate"; // communicate 타입 추가 } // procurementRfqDetailsView 타입 정의 (DB 스키마에 맞게 조정 필요) export interface RfqDetailView { detailId: number rfqId: number rfqCode: string vendorId?: number | null // 벤더 ID 필드 추가 projectCode: string | null projectName: string | null vendorCountry: string | null itemCode: string | null itemName: string | null vendorName: string | null vendorCode: string | null currency: string | null paymentTermsCode: string | null paymentTermsDescription: string | null incotermsCode: string | null incotermsDescription: string | null incotermsDetail: string | null deliveryDate: Date | null taxCode: string | null placeOfShipping: string | null placeOfDestination: string | null materialPriceRelatedYn: boolean | null hasQuotation: boolean | null updatedByUserName: string | null quotationStatus: string | null updatedAt: Date | null prItemsCount: number majorItemsCount: number quotationVersion:number | null // 커뮤니케이션 관련 필드 추가 commentCount?: number // 전체 코멘트 수 unreadCount?: number // 읽지 않은 코멘트 수 lastCommentDate?: Date // 마지막 코멘트 날짜 } interface GetColumnsProps { setRowAction: React.Dispatch< React.SetStateAction | null> >; unreadMessages?: Record; // 벤더 ID별 읽지 않은 메시지 수 } export function getRfqDetailColumns({ setRowAction, unreadMessages = {}, }: GetColumnsProps): ColumnDef[] { return [ { accessorKey: "quotationStatus", header: ({ column }) => ( ), cell: ({ row }) =>
{row.getValue("quotationStatus")}
, meta: { excelHeader: "견적 상태" }, enableResizing: true, size: 120, }, { accessorKey: "quotationVersion", header: ({ column }) => ( ), cell: ({ row }) =>
{row.getValue("quotationVersion")}
, meta: { excelHeader: "견적 버전" }, enableResizing: true, size: 120, }, { accessorKey: "vendorCode", header: ({ column }) => ( ), cell: ({ row }) =>
{row.getValue("vendorCode")}
, meta: { excelHeader: "벤더 코드" }, enableResizing: true, size: 120, }, { accessorKey: "vendorName", header: ({ column }) => ( ), cell: ({ row }) => { const vendorName = row.getValue("vendorName") as string; const vendorId = row.original.vendorId; if (!vendorName || !vendorId) { return
{vendorName}
; } const handleVendorClick = () => { window.open(`/evcp/vendors/${vendorId}/info`, '_blank'); }; return ( ); }, meta: { excelHeader: "벤더명" }, enableResizing: true, size: 160, }, { accessorKey: "vendorType", header: ({ column }) => ( ), cell: ({ row }) =>
{row.original.vendorCountry === "KR"?"D":"F"}
, meta: { excelHeader: "내외자" }, enableResizing: true, size: 80, }, { accessorKey: "currency", header: ({ column }) => ( ), cell: ({ row }) =>
{row.getValue("currency")}
, meta: { excelHeader: "통화" }, enableResizing: true, size: 80, }, { accessorKey: "paymentTermsCode", header: ({ column }) => ( ), cell: ({ row }) =>
{row.getValue("paymentTermsCode")}
, meta: { excelHeader: "지불 조건 코드" }, enableResizing: true, size: 140, }, { accessorKey: "paymentTermsDescription", header: ({ column }) => ( ), cell: ({ row }) =>
{row.getValue("paymentTermsDescription")}
, meta: { excelHeader: "지불 조건" }, enableResizing: true, size: 160, }, { accessorKey: "incotermsCode", header: ({ column }) => ( ), cell: ({ row }) =>
{row.getValue("incotermsCode")}
, meta: { excelHeader: "인코텀스 코드" }, enableResizing: true, size: 140, }, { accessorKey: "incotermsDescription", header: ({ column }) => ( ), cell: ({ row }) =>
{row.getValue("incotermsDescription")}
, meta: { excelHeader: "인코텀스" }, enableResizing: true, size: 160, }, { accessorKey: "incotermsDetail", header: ({ column }) => ( ), cell: ({ row }) =>
{row.getValue("incotermsDetail")}
, meta: { excelHeader: "인코텀스 상세" }, enableResizing: true, size: 160, }, { accessorKey: "deliveryDate", header: ({ column }) => ( ), cell: ({ cell }) => { const value = cell.getValue(); return value ? formatDate(value as Date, "KR") : ""; }, meta: { excelHeader: "납품일" }, enableResizing: true, size: 120, }, { accessorKey: "taxCode", header: ({ column }) => ( ), cell: ({ row }) =>
{row.getValue("taxCode")}
, meta: { excelHeader: "세금 코드" }, enableResizing: true, size: 120, }, { accessorKey: "placeOfShipping", header: ({ column }) => ( ), cell: ({ row }) =>
{row.getValue("placeOfShipping")}
, meta: { excelHeader: "선적지" }, enableResizing: true, size: 140, }, { accessorKey: "placeOfDestination", header: ({ column }) => ( ), cell: ({ row }) =>
{row.getValue("placeOfDestination")}
, meta: { excelHeader: "도착지" }, enableResizing: true, size: 140, }, { accessorKey: "materialPriceRelatedYn", header: ({ column }) => ( ), cell: ({ row }) =>
{row.getValue("materialPriceRelatedYn") ? "Y" : "N"}
, meta: { excelHeader: "하도급대금 연동" }, enableResizing: true, size: 140, }, { accessorKey: "updatedByUserName", header: ({ column }) => ( ), cell: ({ row }) =>
{row.getValue("updatedByUserName")}
, meta: { excelHeader: "수정자" }, enableResizing: true, size: 120, }, { accessorKey: "updatedAt", header: ({ column }) => ( ), cell: ({ cell }) => { const value = cell.getValue(); return value ? formatDateTime(value as Date, "KR") : ""; }, meta: { excelHeader: "수정일시" }, enableResizing: true, size: 140, }, // 커뮤니케이션 컬럼 추가 { id: "communication", header: ({ column }) => ( ), cell: ({ row }) => { const vendorId = row.original.vendorId || 0; const unreadCount = unreadMessages[vendorId] || 0; return ( ); }, enableResizing: false, size: 80, }, { id: "actions", enableHiding: false, cell: function Cell({ row }) { const [isUpdatePending, startUpdateTransition] = React.useTransition() return ( setRowAction({ row, type: "update" })} > Edit setRowAction({ row, type: "delete" })} > Delete ⌘⌫ ) }, size: 40, } ] }