'use client' import { motion } from 'framer-motion' import { Card, CardContent } from '@/components/ui/card' import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' import { Checkbox } from '@/components/ui/checkbox' import { formatCurrency, formatDate } from '@/lib/utils' import { ArrowUpRight, ArrowDownRight, FileText, Loader2, MessageSquareText, Paperclip } from 'lucide-react' import { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } from '@/components/ui/info-tooltip' import { formatAccountWithName } from '@/lib/bookkeeping/client-account-names' import { getTemplateById } from '@/lib/bookkeeping/booking-templates' import type { TransactionWithInvoice, CategorizeHandler } from './transaction-types' import type { SuggestedCategory, SuggestedTemplate } from '@/lib/transactions/category-suggestions' interface TransactionInboxCardProps { transaction: TransactionWithInvoice suggestions?: SuggestedCategory[] templateSuggestions?: SuggestedTemplate[] processingId: string | null isBatchMode: boolean isSelected: boolean entityType?: string onCategorize: CategorizeHandler onMarkPrivate: (id: string) => void onOpenMatchDialog: (transaction: TransactionWithInvoice) => void onOpenCategoryDialog: (transaction: TransactionWithInvoice) => void onOpenDescribe?: (transaction: TransactionWithInvoice) => void onOpenQuickReview?: (transaction: TransactionWithInvoice, suggestion: SuggestedCategory) => void onOpenTemplateReview?: (transaction: TransactionWithInvoice, templateId: string) => void onToggleSelect: (id: string) => void onAnimationComplete?: (id: string) => void } export default function TransactionInboxCard({ transaction, suggestions, templateSuggestions, processingId, isBatchMode, isSelected, entityType = 'enskild_firma', onCategorize, onMarkPrivate, onOpenMatchDialog, onOpenCategoryDialog, onOpenDescribe, onOpenQuickReview, onOpenTemplateReview, onToggleSelect, onAnimationComplete, }: TransactionInboxCardProps) { const isProcessing = processingId === transaction.id const isDisabled = processingId !== null && processingId !== transaction.id const isIncome = transaction.amount > 0 const hasInvoiceMatch = !!transaction.potential_invoice && !transaction.invoice_id const hasSupplierInvoiceMatch = !!transaction.potential_supplier_invoice && !transaction.supplier_invoice_id const topSuggestion = suggestions?.[0] const isUncategorized = transaction.is_business === null && !transaction.journal_entry_id const showCheckbox = isBatchMode && isUncategorized const hasDocumentMatch = !!transaction.matched_inbox_item function handleSuggestionClick(suggestion: SuggestedCategory) { if (onOpenQuickReview) { onOpenQuickReview(transaction, suggestion) } else { onCategorize(transaction.id, true, suggestion.category) } } return ( { // Only call on exit animation if (typeof definition === 'object' && 'opacity' in definition && definition.opacity === 0) { onAnimationComplete?.(transaction.id) } }} > onToggleSelect(transaction.id) : undefined} >
{/* Left: checkbox + icon + info */}
{showCheckbox && ( onToggleSelect(transaction.id)} onClick={(e) => e.stopPropagation()} className="mt-1" /> )}
{isIncome ? ( ) : ( )}

{transaction.description}

{formatDate(transaction.date)}

{hasDocumentMatch && ( {transaction.matched_inbox_item!.document_type === 'receipt' ? 'Kvitto' : transaction.matched_inbox_item!.document_type === 'supplier_invoice' ? 'Faktura' : 'Dokument'} )}
{/* Right: amount */}

{isIncome ? '+' : ''} {formatCurrency(transaction.amount, transaction.currency)}

{transaction.currency !== 'SEK' && transaction.amount_sek && (

{formatCurrency(transaction.amount_sek)}

)}
{/* Inline action buttons - only shown when not in batch mode */} {!isBatchMode && (
{/* Primary action: invoice match or top suggestion */} {hasInvoiceMatch ? ( ) : hasSupplierInvoiceMatch ? ( ) : templateSuggestions && templateSuggestions.length > 0 ? ( <> {templateSuggestions.slice(0, 2).map((ts, idx) => { const tmpl = getTemplateById(ts.template_id) return ( ) })} ) : topSuggestion ? ( ) : null} {/* Describe transaction */} {onOpenDescribe && ( )} {/* Open category dialog / template picker */}
)}
) }