70 lines
1.7 KiB
PHP
70 lines
1.7 KiB
PHP
<?php
|
|
|
|
namespace App\Filament\Widgets;
|
|
|
|
use App\Models\Order;
|
|
use Filament\Widgets\ChartWidget;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class RevenueChart extends ChartWidget
|
|
{
|
|
protected ?string $heading = 'Revenue (Last 7 Days)';
|
|
|
|
protected static ?int $sort = 3;
|
|
|
|
protected function getData(): array
|
|
{
|
|
$data = Order::where('payment_status', 'paid')
|
|
->where('created_at', '>=', now()->subDays(7))
|
|
->select(
|
|
DB::raw('DATE(created_at) as date'),
|
|
DB::raw('SUM(total) as revenue')
|
|
)
|
|
->groupBy('date')
|
|
->orderBy('date')
|
|
->get();
|
|
|
|
$labels = [];
|
|
$revenues = [];
|
|
|
|
// Fill in last 7 days
|
|
for ($i = 6; $i >= 0; $i--) {
|
|
$date = now()->subDays($i)->format('Y-m-d');
|
|
$dayName = now()->subDays($i)->format('D');
|
|
$labels[] = $dayName;
|
|
|
|
$dayData = $data->firstWhere('date', $date);
|
|
$revenues[] = $dayData ? $dayData->revenue : 0;
|
|
}
|
|
|
|
return [
|
|
'datasets' => [
|
|
[
|
|
'label' => 'Revenue (R)',
|
|
'data' => $revenues,
|
|
'backgroundColor' => 'rgba(59, 130, 246, 0.1)',
|
|
'borderColor' => 'rgb(59, 130, 246)',
|
|
'fill' => true,
|
|
],
|
|
],
|
|
'labels' => $labels,
|
|
];
|
|
}
|
|
|
|
protected function getType(): string
|
|
{
|
|
return 'line';
|
|
}
|
|
|
|
protected function getOptions(): array
|
|
{
|
|
return [
|
|
'scales' => [
|
|
'y' => [
|
|
'beginAtZero' => true,
|
|
],
|
|
],
|
|
];
|
|
}
|
|
}
|