"use client" import * as React from "react" import { ColumnDef } from "@tanstack/react-table" import { formatDate } from "@/lib/utils" import { Checkbox } from "@/components/ui/checkbox" import { Badge } from "@/components/ui/badge" import { } from "@/components/ui/dropdown-menu" import { DataTableColumnHeaderSimple } from "@/components/data-table/data-table-column-simple-header" // RFQ 아이템 정보 타입 export interface RfqItemInfo { itemCode: string workType: string itemList: string subItemList: string shipTypes: string } // Accepted Quotation 타입 정의 export interface AcceptedQuotationItem { id: number rfqId: number vendorId: number quotationVersion: number | null totalPrice: string | null currency: string | null validUntil: Date | null status: string remark: string | null submittedAt: Date | null acceptedAt: Date | null createdAt: Date updatedAt: Date // RFQ 정보 rfqCode: string | null rfqType: string | null description: string | null dueDate: Date | null rfqStatus: string | null materialCode: string | null // Vendor 정보 vendorName: string vendorCode: string | null vendorEmail: string | null vendorCountry: string | null // Project 정보 projNm: string | null pspid: string | null sector: string | null // RFQ 아이템 정보 rfqItems: RfqItemInfo[] // 확장된 아이템 정보 itemIndex: number totalItems: number isExpanded: boolean itemCode: string workType: string itemList: string subItemList: string shipTypes: string } export function getColumns(): ColumnDef[] { // ---------------------------------------------------------------- // 1) select 컬럼 (체크박스) // ---------------------------------------------------------------- const selectColumn: ColumnDef = { id: "select", header: ({ table }) => ( table.toggleAllPageRowsSelected(!!value)} aria-label="Select all" className="translate-y-0.5" /> ), cell: ({ row }) => ( row.toggleSelected(!!value)} aria-label="Select row" className="translate-y-0.5" /> ), size: 40, enableSorting: false, enableHiding: false, } // ---------------------------------------------------------------- // 3) 데이터 컬럼들 정의 // ---------------------------------------------------------------- const dataColumns: ColumnDef[] = [ // 프로젝트 관련 컬럼 { accessorKey: "pspid", header: ({ column }) => ( ), cell: ({ row }) => (
{row.original.pspid || "-"}
), enableSorting: true, enableHiding: true, meta: { excelHeader: "프로젝트 코드", }, }, { accessorKey: "projNm", header: ({ column }) => ( ), cell: ({ row }) => (
{row.original.projNm || "-"}
), enableSorting: true, enableHiding: true, meta: { excelHeader: "프로젝트명", }, }, // RFQ quotation 관련 컬럼 { accessorKey: "rfqCode", header: ({ column }) => ( ), cell: ({ row }) => (
{row.original.rfqCode || "-"}
), enableSorting: true, enableHiding: true, meta: { excelHeader: "RFQ 코드", }, }, { accessorKey: "description", header: ({ column }) => ( ), cell: ({ row }) => (
{row.original.description || "-"}
), enableSorting: true, enableHiding: true, meta: { excelHeader: "RFQ 설명", }, }, { accessorKey: "rfqType", header: ({ column }) => ( ), cell: ({ row }) => (
{row.original.rfqType || "-"}
), enableSorting: true, enableHiding: true, meta: { excelHeader: "RFQ 타입", }, }, { accessorKey: "totalPrice", header: ({ column }) => ( ), cell: ({ row }) => { const price = row.original.totalPrice; const currency = row.original.currency || "USD"; return (
{price ? `${Number(price).toLocaleString()} ${currency}` : "-"}
); }, enableSorting: true, enableHiding: true, meta: { excelHeader: "총 금액", }, }, { accessorKey: "status", header: ({ column }) => ( ), cell: ({ row }) => ( {row.original.status} ), enableSorting: true, enableHiding: true, meta: { excelHeader: "상태", }, }, // 협력업체 관련 컬럼 { accessorKey: "vendorName", header: ({ column }) => ( ), cell: ({ row }) => (
{row.original.vendorName}
), enableSorting: true, enableHiding: true, meta: { excelHeader: "업체명", }, }, { accessorKey: "vendorCode", header: ({ column }) => ( ), cell: ({ row }) => (
{row.original.vendorCode || "-"}
), enableSorting: true, enableHiding: true, meta: { excelHeader: "업체 코드", }, }, { accessorKey: "vendorCountry", header: ({ column }) => ( ), cell: ({ row }) => (
{row.original.vendorCountry || "-"}
), enableSorting: true, enableHiding: true, meta: { excelHeader: "업체 국가", }, }, // 아이템 관련 컬럼 { accessorKey: "materialGroup", header: ({ column }) => ( ), cell: ({ row }) => { return (
{row.original.itemCode || "-"}
); }, enableSorting: false, enableHiding: true, meta: { excelHeader: "자재그룹", }, }, { accessorKey: "workType", header: ({ column }) => ( ), cell: ({ row }) => { return (
{row.original.workType || "-"}
); }, enableSorting: false, enableHiding: true, meta: { excelHeader: "공종", }, }, { accessorKey: "shipType", header: ({ column }) => ( ), cell: ({ row }) => { return (
{row.original.shipTypes || "-"}
); }, enableSorting: false, enableHiding: true, meta: { excelHeader: "선종", }, }, { accessorKey: "itemName", header: ({ column }) => ( ), cell: ({ row }) => { return (
{row.original.itemList || "-"}
); }, enableSorting: false, enableHiding: true, meta: { excelHeader: "자재명", }, }, { accessorKey: "itemDetail", header: ({ column }) => ( ), cell: ({ row }) => { return (
{row.original.subItemList || "-"}
); }, enableSorting: false, enableHiding: true, meta: { excelHeader: "자재명(상세)", }, }, // metadata 관련 컬럼 { accessorKey: "dueDate", header: ({ column }) => ( ), cell: ({ row }) => (
{row.original.dueDate ? formatDate(row.original.dueDate) : "-"}
), enableSorting: true, enableHiding: true, meta: { excelHeader: "RFQ 마감일", }, }, { accessorKey: "acceptedAt", header: ({ column }) => ( ), cell: ({ row }) => (
{row.original.acceptedAt ? formatDate(row.original.acceptedAt) : "-"}
), enableSorting: true, enableHiding: true, meta: { excelHeader: "RFQ 승인일", }, }, ] return [selectColumn, ...dataColumns] }