'use client' import { Button } from '@/components/ui/button' import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter } from '@/components/ui/dialog' import { formatCurrency, formatDate } from '@/lib/utils' import { CheckCircle2, AlertTriangle } from 'lucide-react' import type { TransactionWithInvoice } from './transaction-types' interface InvoiceMatchDialogProps { open: boolean onOpenChange: (open: boolean) => void transaction: TransactionWithInvoice | null isConfirming: boolean onConfirm: () => void } export default function InvoiceMatchDialog({ open, onOpenChange, transaction, isConfirming, onConfirm, }: InvoiceMatchDialogProps) { const isSupplierInvoice = !!transaction?.potential_supplier_invoice const isCustomerInvoice = !!transaction?.potential_invoice // The invoice candidate the dialog is about, normalized to a single shape. // Supplier invoices show the negative-amount paid-out match; customer // invoices show the positive-amount paid-in match. Each side carries its // own follow-up action language. const matchTitle = isSupplierInvoice ? 'Bekräfta leverantörsfakturamatchning' : 'Bekräfta fakturamatchning' const matchDescription = isSupplierInvoice ? 'Vill du koppla denna transaktion till leverantörsfakturan? Fakturan kommer att markeras som betald och en betalningsverifikation skapas.' : 'Vill du koppla denna transaktion till fakturan? Fakturan kommer att markeras som betald.' return ( {matchTitle} {matchDescription} {transaction && (isCustomerInvoice || isSupplierInvoice) && (
{/* Transaction details */}

Transaktion

{transaction.description}

{formatDate(transaction.date)} 0 ? 'text-success' : ''}`}> {transaction.amount > 0 ? '+' : ''} {formatCurrency(transaction.amount, transaction.currency)}
{/* Invoice details */} {isCustomerInvoice && (

Faktura

Faktura {transaction.potential_invoice!.invoice_number}

{transaction.potential_invoice!.customer?.name || 'Okänd kund'}

Förfaller: {formatDate(transaction.potential_invoice!.due_date)} {formatCurrency( transaction.potential_invoice!.total, transaction.potential_invoice!.currency, )}
)} {isSupplierInvoice && (

Leverantörsfaktura

Faktura {transaction.potential_supplier_invoice!.supplier_invoice_number}

Ankomstnr: {transaction.potential_supplier_invoice!.arrival_number}

Förfaller: {formatDate(transaction.potential_supplier_invoice!.due_date)} {formatCurrency( transaction.potential_supplier_invoice!.total, transaction.potential_supplier_invoice!.currency, )}
)} {/* Amount comparison */} {(() => { const txAbs = Math.abs(transaction.amount) const invTotal = isSupplierInvoice ? transaction.potential_supplier_invoice!.remaining_amount ?? transaction.potential_supplier_invoice!.total : transaction.potential_invoice!.total const invCurrency = isSupplierInvoice ? transaction.potential_supplier_invoice!.currency : transaction.potential_invoice!.currency const sameCurrency = transaction.currency === invCurrency const amountsMatch = sameCurrency && Math.abs(txAbs - invTotal) < 0.01 if (amountsMatch) { return (

Beloppen stämmer

) } const diff = Math.abs(txAbs - invTotal) return (

Beloppen skiljer sig

Differens: {formatCurrency(diff, transaction.currency)} {!sameCurrency && ' (olika valutor)'} {isSupplierInvoice && diff > 0.01 && sameCurrency && ' — fakturan blir delbetald.'}

) })()} {/* What will happen */}

Vid bekräftelse:

  • • Transaktionen kopplas till {isSupplierInvoice ? 'leverantörsfakturan' : 'fakturan'}
  • • {isSupplierInvoice ? 'Leverantörsfakturan markeras som betald' : 'Fakturan markeras som betald'}
  • • Bokföringsverifikation skapas automatiskt
)}
) }