Files
sembara/app/Filament/Widgets/DashboardStats.php
T

42 lines
1.6 KiB
PHP

<?php
namespace App\Filament\Widgets;
use App\Services\ComplaintService;
use App\Services\InsForge\InsForgeClient;
use App\Services\OrderService;
use App\Services\StockService;
use Filament\Widgets\StatsOverviewWidget;
use Filament\Widgets\StatsOverviewWidget\Stat;
class DashboardStats extends StatsOverviewWidget
{
protected static ?int $sort = 0;
protected ?string $heading = 'Ringkasan Operasional';
public function getStats(): array
{
$orderService = app(OrderService::class);
$counts = $orderService->countByStatus();
$openComplaints = app(InsForgeClient::class)->countRecords('complaints', [
'status' => ComplaintService::STATUS_OPEN,
]);
$critical = collect(app(StockService::class)->paginate(perPage: 100)->items())
->filter(fn (array $row): bool => (int) $row['quantity'] <= (int) data_get($row, 'products.stock_minimum', 0))
->count();
return [
Stat::make('Pending', (string) ($counts[OrderService::STATUS_PENDING] ?? 0))->color('gray'),
Stat::make('Diproses', (string) ($counts[OrderService::STATUS_PROCESSING] ?? 0))->color('info'),
Stat::make('Dikirim', (string) ($counts[OrderService::STATUS_DELIVERING] ?? 0))->color('warning'),
Stat::make('Selesai', (string) ($counts[OrderService::STATUS_COMPLETED] ?? 0))->color('success'),
Stat::make('Komplain Terbuka', (string) $openComplaints)->color($openComplaints > 0 ? 'danger' : 'success'),
Stat::make('Stok Kritis', (string) $critical)->color($critical > 0 ? 'danger' : 'success'),
];
}
}