@extends('layouts.finance') @section('title', 'Transaction Detail') @section('subtitle', 'Full details for transaction #' . $transaction->id) @section('content') @php $txKind = $transaction->metadata['tx_kind'] ?? ($transaction->type === 'income' ? 'Deposit' : 'Payment'); $txCurrency = $transaction->bankAccount?->currency ?? $transaction->metadata['currency'] ?? 'USD'; $txStatus = $transaction->metadata['status'] ?? 'Cleared'; $displayConversionRate = $transaction->metadata['bank_fx_rate'] ?? $transaction->conversion_rate; $displayRateLabel = isset($transaction->metadata['bank_fx_rate']) ? 'Conversion Rate' : 'Conversion Rate'; $isIn = in_array($txKind, ['Deposit', 'Receipt'], true); $isOut = in_array($txKind, ['Withdrawal', 'Payment'], true); $amtColor = $isIn ? '#10b981' : ($isOut ? '#ef4444' : '#6b7280'); $sign = $isIn ? '+' : ($isOut ? '−' : ''); $statusPill = match($txStatus) { 'Cleared' => 'pill-green', 'Pending' => 'pill-amber', default => 'pill-red', }; $fmtAmount = number_format((float) $transaction->amount, 2); // Fee applied to this receipt (inline "+ Fee" or the edit form). The stored // amount is already net of it, so show gross → fee → net to explain the gap. $feeAmount = isset($transaction->metadata['fee_amount']) && is_numeric($transaction->metadata['fee_amount']) ? (float) $transaction->metadata['fee_amount'] : 0.0; $feeGross = isset($transaction->metadata['gross_amount']) && is_numeric($transaction->metadata['gross_amount']) ? (float) $transaction->metadata['gross_amount'] : (float) $transaction->amount; $feeBaseRate = isset($transaction->metadata['base_conversion_rate']) && is_numeric($transaction->metadata['base_conversion_rate']) ? (float) $transaction->metadata['base_conversion_rate'] : null; @endphp {{-- Breadcrumb --}}
Transactions
Transactions / Detail #{{ $transaction->id }}
{{-- Amount hero card — matches Figma gradient amount block --}}
Amount
{{ $sign }}{{ $txCurrency }} {{ $fmtAmount }}
{{ $txKind }} · {{ $txCurrency }}
@if($feeAmount > 0)
Received (gross): {{ $txCurrency }} {{ number_format($feeGross, 2) }}
Fee: − {{ $txCurrency }} {{ number_format($feeAmount, 2) }}
Net credited: {{ $txCurrency }} {{ $fmtAmount }} @if($feeBaseRate)
Rate before fee: {{ number_format($feeBaseRate, 4, '.', '') }} @endif
@endif
{{-- Detail card --}}
@php /** * Renders a detail row only when $value is non-empty. * All values are passed through Blade's {{ }} escaping — * never {!! !!} on user-supplied data. */ $detailRow = function(string $label, $value) { if ($value === null || $value === '' || $value === '—') { return ''; } return $label . '|||' . $value; }; $rows = array_filter([ ['Date', $transaction->transaction_date?->format('d M Y')], ['Type', $txKind], ['Transaction ID', $transaction->transaction_id], ['Account', $transaction->bankAccount ? $transaction->bankAccount->name . ' · ' . $transaction->bankAccount->bank_name : null], ['Currency', $txCurrency], [$displayRateLabel, $displayConversionRate !== null && $displayConversionRate !== '' ? number_format((float) $displayConversionRate, 2, '.', '') : null], ['Reference', $transaction->reference], ['Counterparty',$transaction->counterparty], ['Description', $transaction->description], ['Source', $transaction->source], ['Voucher', $transaction->voucherProduct?->name], ['Recorded by', $transaction->creator ? $transaction->creator->name . ' on ' . $transaction->created_at->format('d M Y H:i') : null], ], fn($r) => ! empty($r[1])); @endphp
@foreach($rows as [$label, $value])
{{ $label }}
{{ $value }}
@endforeach {{-- Status row --}}
Status
{{ $txStatus }}
{{-- Delete action — CSRF-protected form --}}
Back to list @if($txStatus === 'Pending')
@csrf @if($transaction->source === 'linked_bank_transfer' || $transaction->source === 'credit_card_payment') @endif
@endif
@csrf @method('DELETE')
@endsection