Files
famous-ly4-ev/app-modules/payment/src/Filament/Widgets/PaymentFailureRateWidget.php
T

43 lines
1.3 KiB
PHP
Raw Normal View History

<?php
namespace Modules\Payment\Filament\Widgets;
use Filament\Widgets\StatsOverviewWidget as BaseWidget;
use Filament\Widgets\StatsOverviewWidget\Stat;
use Modules\Payment\Enums\PaymentStatus;
use Modules\Payment\Models\Payment;
/**
* Failure rate over the trailing 30 days, among payments that reached a
* terminal state (completed or failed) — pending attempts are excluded
* since they haven't resolved either way yet.
*/
class PaymentFailureRateWidget extends BaseWidget
{
protected static ?int $sort = 3;
protected function getStats(): array
{
$since = today()->subDays(30);
$completed = Payment::query()
->where('status', PaymentStatus::Completed)
->where('initiated_at', '>=', $since)
->count();
$failed = Payment::query()
->where('status', PaymentStatus::Failed)
->where('initiated_at', '>=', $since)
->count();
$resolved = $completed + $failed;
$rate = $resolved > 0 ? round(($failed / $resolved) * 100, 1) : 0.0;
return [
Stat::make('Payment Failure Rate', $rate.'%')
->description("{$failed} failed of {$resolved} resolved (last 30 days)")
->color($rate >= 20 ? 'danger' : ($rate > 0 ? 'warning' : 'success')),
];
}
}