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