import { RowActions } from '@/components/row-actions'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Card, CardContent } from '@/components/ui/card'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { useCan } from '@/hooks/use-can'; import type { PaperWidth } from '@/hooks/use-thermal-printer'; import { formatDateTime, formatNumber } from '@/lib/format'; import { formatCurrency } from '@/lib/utils'; import { CheckCircle, ChevronDown, Pencil, Printer, Send, Trash2, XCircle } from 'lucide-react'; import type { Transaction } from './columns'; const STATUS_BADGE_CLASSES: Record = { pending: 'bg-yellow-100 text-yellow-800 hover:bg-yellow-100', processing: 'bg-blue-100 text-blue-800 hover:bg-blue-100', completed: 'bg-green-100 text-green-800 hover:bg-green-100', cancelled: 'bg-red-100 text-red-800 hover:bg-red-100', refunded: 'bg-purple-100 text-purple-800 hover:bg-purple-100', }; export type TransactionCardRowParams = { transaction: Transaction; index: number; isExpanded: boolean; onToggleExpand: () => void; onEdit: (transaction: Transaction) => void; onDelete: (transaction: Transaction) => void; onUpdateStatus: (transaction: Transaction, status: string) => void; onPrint: (transaction: Transaction, paperWidth: PaperWidth) => void; }; export function TransactionCardRow({ transaction, index, isExpanded, onToggleExpand, onEdit, onDelete, onUpdateStatus, onPrint, }: TransactionCardRowParams) { const { can } = useCan(); const items = transaction.order_items ?? []; const variantCount = items.length; const productNames = [ ...new Set( items .map((item) => item.product_variant?.product?.name) .filter(Boolean), ), ]; const totalQty = items.reduce( (sum, item) => sum + Number(item.quantity), 0, ); const statusBadgeClass = STATUS_BADGE_CLASSES[transaction.status] ?? STATUS_BADGE_CLASSES.pending; return (
{index}.

{transaction.order_number}

{transaction.status_label} {transaction.payment_type_label} {transaction.tiktok_order_id || transaction.shopee_order_id ? ( {transaction.tiktok_order_id || transaction.shopee_order_id} ) : null}
{productNames.length > 0 && ( {productNames.join(', ')} )} {variantCount > 0 && ( ({variantCount} varian) )}
{formatDateTime(transaction.created_at)} Oleh:{' '} {transaction.created_by?.user_profile ?.full_name ?? '-'} {transaction.customer && ( Pelanggan:{' '} {transaction.customer.name} )} {transaction.notes && ( {transaction.notes} )}
Qty:{' '} {formatNumber(totalQty)} Channel:{' '} {transaction.channel_label} Harga:{' '} {transaction.price_type_label} Sub:{' '} {formatCurrency(transaction.subtotal)} {transaction.discount > 0 && ( Diskon:{' '} {formatCurrency(transaction.discount)} )} {transaction.nego_price != null && transaction.nego_price > 0 && ( Nego:{' '} {formatCurrency(transaction.nego_price)} )} Total:{' '} {formatCurrency(transaction.total_amount)} = 0 ? 'text-green-600' : 'text-red-600'}> Laba:{' '} {formatCurrency(transaction.profit)} HPP:{' '} {formatCurrency(transaction.cogs)}
onPrint(transaction, 58)} > Struk 58mm onPrint(transaction, 80)} > Struk 80mm , onClick: () => onUpdateStatus(transaction, 'processing'), }, ] : []), ...((transaction.status === 'pending' || transaction.status === 'processing') && can('orders.update') ? [ { label: 'Selesai', icon: , onClick: () => onUpdateStatus(transaction, 'completed'), }, { label: 'Dibatalkan', icon: , onClick: () => onUpdateStatus(transaction, 'cancelled'), }, ] : []), ...(transaction.status === 'completed' && can('orders.update') ? [ { label: 'Refund', icon: , onClick: () => onUpdateStatus(transaction, 'refunded'), }, ] : []), { label: 'Edit', icon: , show: can('orders.update'), onClick: () => onEdit(transaction), }, { label: 'Hapus', icon: ( ), show: can('orders.delete'), onClick: () => onDelete(transaction), }, ]} wrapperClassName="flex shrink-0 items-center gap-1" />
); }