import type { ColumnDef } from '@tanstack/react-table'; import { ArrowUpDown, Eye, Lock, Unlock } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from '@/components/ui/tooltip'; import { formatCurrency } from '@/lib/utils'; import { Link } from '@inertiajs/react'; export type PayrollPeriod = { id: number; year: number; month: number; status: 'open' | 'closed'; closed_at: string | null; created_at: string; payrolls_count: number; paid_count: number; cancelled_count: number; payrolls_sum_total_amount: number | null; payrolls_sum_bonus_amount: number | null; payrolls_sum_deduction_amount: number | null; }; const MONTH_NAMES = [ '', 'Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni', 'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember', ]; function formatPeriod(period: PayrollPeriod): string { return `${MONTH_NAMES[period.month]} ${period.year}`; } function getStatusBadge(status: string) { const statusConfig: Record = { open: { label: 'Terbuka', className: 'bg-green-100 text-green-800 hover:bg-green-100', }, closed: { label: 'Ditutup', className: 'bg-gray-100 text-gray-800 hover:bg-gray-100', }, }; const config = statusConfig[status] ?? statusConfig.open; return ( {config.label} ); } type CreateColumnsParams = { showUrl: (id: number) => string; handleClose: (period: PayrollPeriod) => void; handleReopen: (period: PayrollPeriod) => void; }; export function createPayrollPeriodColumns( params: CreateColumnsParams, ): ColumnDef[] { const { showUrl, handleClose, handleReopen } = params; return [ { id: 'no', header: () => No, cell: ({ row }) => ( {row.index + 1} ), meta: { className: 'w-[50px] text-center', headerClassName: 'w-[50px] text-center', }, }, { accessorKey: 'year', header: ({ column }) => ( ), cell: ({ row }) => ( {formatPeriod(row.original)} ), }, { accessorKey: 'payrolls_count', header: () => Jumlah Karyawan, cell: ({ row }) => ( {row.getValue('payrolls_count') as number} ), }, { accessorKey: 'payrolls_sum_total_amount', header: ({ column }) => ( ), cell: ({ row }) => ( {formatCurrency( (row.getValue('payrolls_sum_total_amount') as number) ?? 0, )} ), }, { accessorKey: 'payrolls_sum_bonus_amount', header: ({ column }) => ( ), cell: ({ row }) => { const value = (row.getValue('payrolls_sum_bonus_amount') as number) ?? 0; return ( 0 ? 'font-medium text-green-600' : 'text-muted-foreground' } > {value > 0 ? '+ ' : ''} {formatCurrency(value)} ); }, }, { accessorKey: 'payrolls_sum_deduction_amount', header: ({ column }) => ( ), cell: ({ row }) => { const value = (row.getValue('payrolls_sum_deduction_amount') as number) ?? 0; return ( 0 ? 'font-medium text-red-600' : 'text-muted-foreground' } > {value > 0 ? '- ' : ''} {formatCurrency(value)} ); }, }, { id: 'payment_status', header: () => Status Bayar, cell: ({ row }) => { const period = row.original; const paid = period.paid_count ?? 0; const cancelled = period.cancelled_count ?? 0; const total = period.payrolls_count ?? 0; const unpaid = total - paid - cancelled; return (
{paid > 0 && ( {paid} dibayar )} {unpaid > 0 && ( {unpaid} menunggu )} {cancelled > 0 && ( {cancelled} dibatalkan )}
); }, }, { accessorKey: 'status', header: () => Status, cell: ({ row }) => ( {getStatusBadge(row.getValue('status') as string)} ), }, { id: 'actions', header: () => Aksi, meta: { className: 'w-[100px] text-center', headerClassName: 'w-[100px] text-center', }, cell: ({ row }) => { const period = row.original; return (
Lihat Detail {period.status === 'open' && ( Tutup Periode )} {period.status === 'closed' && ( Buka Periode )}
); }, }, ]; }