Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 48
0.00% covered (danger)
0.00%
0 / 1
CRAP
0.00% covered (danger)
0.00%
0 / 1
ReportingTimeSavedTopUsersRequest
0.00% covered (danger)
0.00%
0 / 48
0.00% covered (danger)
0.00%
0 / 1
90
0.00% covered (danger)
0.00%
0 / 1
 execute
0.00% covered (danger)
0.00%
0 / 48
0.00% covered (danger)
0.00%
0 / 1
90
1<?php
2
3namespace App\Actions;
4
5use App\DTO\ReportingTopUsersRequestDTO;
6use App\Http\Models\Auth\User;
7use App\Http\Models\FlyMsgUserDailyUsage;
8use Illuminate\Support\Carbon;
9use MongoDB\BSON\UTCDateTime;
10
11class ReportingTimeSavedTopUsersRequest
12{
13    /**
14     * Execute the action.
15     *
16     * @return array
17     */
18    public function execute(ReportingTopUsersRequestDTO $filter)
19    {
20        $users = User::select([
21            '_id',
22            'first_name',
23            'last_name',
24            'company_group_id',
25            'company_id',
26            'created_at',
27            'avatar',
28        ]);
29
30        $user_ids = explode(',', $filter->user_ids);
31        $user_ids = array_filter($user_ids, function ($value) {
32            return $value !== '';
33        });
34        if (count($user_ids) > 0) {
35            $users = $users->whereIn('_id', $user_ids);
36        }
37
38        $group_ids = explode(',', $filter->group_ids);
39        $group_ids = array_filter($group_ids, function ($value) {
40            return $value !== '';
41        });
42        if (count($group_ids) > 0) {
43            $users = $users->whereIn('company_group_id', $group_ids);
44        }
45
46        $subgroup_ids = explode(',', $filter->subgroup_ids);
47        $subgroup_ids = array_filter($subgroup_ids, function ($value) {
48            return $value !== '';
49        });
50        if (count($subgroup_ids) > 0) {
51            $users = $users->whereIn('company_group_id', $subgroup_ids);
52        }
53
54        $hasFilter = count($user_ids) || count($group_ids) || count($subgroup_ids);
55
56        $fromDate = $filter->fromDate ? Carbon::parse($filter->fromDate) : Carbon::now()->subMonths(12);
57        $toDate = $filter->toDate ? Carbon::parse($filter->toDate) : Carbon::now();
58
59        $query = FlyMsgUserDailyUsage::where('date', '>=', new UTCDateTime($fromDate->getTimestamp() * 1000))
60            ->where('date', '<=', new UTCDateTime($toDate->getTimestamp() * 1000));
61
62        if ($hasFilter) {
63            $query = $query->whereIn('user_id', $users->pluck('_id'));
64        }
65
66        $user_usage_counts = $query->groupBy('user_id')->get()->map(function ($userFlycuts) {
67            return [
68                'user_id' => $userFlycuts->first()->user_id,
69                'time_saved' => $userFlycuts->sum('time_saved'),
70            ];
71        })->sortByDesc('time_saved')->take(5);
72
73        $topUser = User::whereIn('_id', $user_usage_counts->pluck('user_id'))->get();
74
75        return $topUser->map(function ($user) use ($user_usage_counts) {
76            return [
77                'name' => $user->first_name.' '.$user->last_name,
78                'count' => collect($user_usage_counts)->where('user_id', $user->id)->first()->time_saved,
79                'image' => $user->avatar,
80            ];
81        })->values();
82    }
83}