diff --git a/app/Http/Controllers/Admin/AdminPaymentController.php b/app/Http/Controllers/Admin/AdminPaymentController.php index ce4466bc6..8bdb2eadb 100644 --- a/app/Http/Controllers/Admin/AdminPaymentController.php +++ b/app/Http/Controllers/Admin/AdminPaymentController.php @@ -37,6 +37,8 @@ class AdminPaymentController extends BasePageController 'email' => $request->string('email')->trim()->value(), 'payment_status' => $request->string('payment_status')->trim()->value(), 'invoice_status' => $request->string('invoice_status')->trim()->value(), + 'start_date' => $request->string('start_date')->trim()->value(), + 'end_date' => $request->string('end_date')->trim()->value(), ]; $sort = $request->string('sort')->value(); @@ -52,11 +54,31 @@ class AdminPaymentController extends BasePageController ->paginate((int) config('nntmux.items_per_page')) ->withQueryString(); + $summary = Payment::query() + ->filter($filters) + ->selectRaw(" + COALESCE(NULLIF(payment_method, ''), 'Unknown') AS method, + COUNT(*) AS tx_count, + COALESCE(SUM(CAST(NULLIF(invoice_amount, '') AS DECIMAL(20,8))), 0) AS invoice_total, + COALESCE(SUM(CAST(NULLIF(payment_value, '') AS DECIMAL(20,8))), 0) AS value_total + ") + ->groupBy('method') + ->orderBy('method') + ->get(); + + $summaryTotals = [ + 'tx_count' => (int) $summary->sum('tx_count'), + 'invoice_total' => (float) $summary->sum(fn ($r) => (float) $r->invoice_total), + 'value_total' => (float) $summary->sum(fn ($r) => (float) $r->value_total), + ]; + $paymentStatuses = BtcPaymentController::paymentStatusesForAdminFilter(); $invoiceStatuses = BtcPaymentController::invoiceStatusesForAdminFilter(); $this->viewData = array_merge($this->viewData, [ 'payments' => $payments, + 'summary' => $summary, + 'summaryTotals' => $summaryTotals, 'filters' => $filters, 'sort' => $sort, 'order' => $order, diff --git a/app/Models/Payment.php b/app/Models/Payment.php index 67d188d74..600bc7cbe 100644 --- a/app/Models/Payment.php +++ b/app/Models/Payment.php @@ -7,6 +7,7 @@ namespace App\Models; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Carbon; class Payment extends Model { @@ -24,7 +25,7 @@ class Payment extends Model /** * @param Builder $query - * @param array{username?: string, email?: string, payment_status?: string, invoice_status?: string} $filters + * @param array{username?: string, email?: string, payment_status?: string, invoice_status?: string, start_date?: string, end_date?: string} $filters * @return Builder */ public function scopeFilter(Builder $query, array $filters): Builder @@ -52,6 +53,22 @@ class Payment extends Model } } + if (! empty($filters['start_date'])) { + try { + $query->where('created_at', '>=', Carbon::parse($filters['start_date'])->startOfDay()); + } catch (\Exception) { + // ignore invalid date input + } + } + + if (! empty($filters['end_date'])) { + try { + $query->where('created_at', '<=', Carbon::parse($filters['end_date'])->endOfDay()); + } catch (\Exception) { + // ignore invalid date input + } + } + return $query; } } diff --git a/resources/views/admin/payments/index.blade.php b/resources/views/admin/payments/index.blade.php index eab279f5f..a943f5976 100644 --- a/resources/views/admin/payments/index.blade.php +++ b/resources/views/admin/payments/index.blade.php @@ -47,6 +47,16 @@ @endforeach +
+ + +
+
+ + +
@@ -61,6 +71,53 @@
+ @if($summary->isNotEmpty()) +
+

+ + Summary by payment method + @if(!empty($filters['start_date']) || !empty($filters['end_date'])) + + ({{ $filters['start_date'] ?: '…' }} → {{ $filters['end_date'] ?: '…' }}) + + @endif +

+
+ + + + + + + + + + + @foreach($summary as $row) + + + + + + + @endforeach + + + + + + + + + +
MethodTransactionsInvoice amount totalPayment value total
{{ $row->method }}{{ number_format((int) $row->tx_count) }}{{ rtrim(rtrim(number_format((float) $row->invoice_total, 8, '.', ''), '0'), '.') ?: '0' }}{{ rtrim(rtrim(number_format((float) $row->value_total, 8, '.', ''), '0'), '.') ?: '0' }}
Total{{ number_format($summaryTotals['tx_count']) }}{{ rtrim(rtrim(number_format($summaryTotals['invoice_total'], 8, '.', ''), '0'), '.') ?: '0' }}{{ rtrim(rtrim(number_format($summaryTotals['value_total'], 8, '.', ''), '0'), '.') ?: '0' }}
+
+

+ Totals are summed across the currently filtered payments. Currency is implied by the payment method. +

+
+ @endif + @if($payments->count() > 0)