-
-
Notifications
You must be signed in to change notification settings - Fork 339
Expand file tree
/
Copy pathActivitiesReport.php
More file actions
109 lines (91 loc) · 2.7 KB
/
ActivitiesReport.php
File metadata and controls
109 lines (91 loc) · 2.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
<?php
declare(strict_types=1);
namespace App\Filament\Widgets\Timesheet;
use App\Models\TicketHour;
use App\Models\User;
use Carbon\Carbon;
use Filament\Widgets\ChartWidget;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Support\Facades\DB;
class ActivitiesReport extends ChartWidget
{
protected int|string|array $columnSpan = [
'sm' => 1,
'md' => 6,
'lg' => 3
];
public ?string $filter = null;
public function mount(): void
{
$this->filter = (string) Carbon::now()->year;
parent::mount();
}
public function getHeading(): string
{
return __('Logged time by activity');
}
public function getType(): string
{
return 'bar';
}
public function getFilters(): ?array
{
$currentYear = (int) Carbon::now()->year;
$firstYear = (int) (TicketHour::min('created_at')
? Carbon::parse(TicketHour::min('created_at'))->year
: $currentYear);
$years = [];
for ($year = $firstYear; $year <= $currentYear; $year++) {
$years[(string) $year] = (string) $year;
}
return $years;
}
public function getData(): array
{
$collection = $this->filter(auth()->user(), [
'year' => $this->filter ?: Carbon::now()->year
]);
$datasets = $this->getDatasets($collection);
return [
'datasets' => [
[
'label' => __('Total time logged'),
'data' => $datasets['sets'],
'backgroundColor' => [
'rgba(54, 162, 235, .6)'
],
'borderColor' => [
'rgba(54, 162, 235, .8)'
],
],
],
'labels' => $datasets['labels'],
];
}
public function getDatasets(Collection $collection): array
{
$datasets = [
'sets' => [],
'labels' => []
];
foreach ($collection as $item) {
$datasets['sets'][] = $item->value;
$datasets['labels'][] = $item->activity?->name ?? __('No activity');
}
return $datasets;
}
public function filter(User $user, array $params): Collection
{
return TicketHour::with('activity')
->select([
'activity_id',
DB::raw('SUM(value) as value'),
])
->whereRaw(
DB::raw("YEAR(created_at)=" . (is_null($params['year']) ? Carbon::now()->format('Y') : $params['year']))
)
->where('user_id', $user->id)
->groupBy('activity_id')
->get();
}
}