Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 83
0.00% covered (danger)
0.00%
0 / 1
CRAP
0.00% covered (danger)
0.00%
0 / 1
ReportingFlyPlatesAddedTopUsersRequest
0.00% covered (danger)
0.00%
0 / 83
0.00% covered (danger)
0.00%
0 / 1
110
0.00% covered (danger)
0.00%
0 / 1
 execute
0.00% covered (danger)
0.00%
0 / 83
0.00% covered (danger)
0.00%
0 / 1
110
1<?php
2
3namespace App\Actions;
4
5use App\DTO\ReportingTopUsersRequestDTO;
6use App\Http\Models\Auth\User;
7use App\Http\Models\Shortcut;
8use Illuminate\Support\Carbon;
9use Illuminate\Support\Facades\Log;
10use MongoDB\BSON\UTCDateTime;
11
12class ReportingFlyPlatesAddedTopUsersRequest
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        $start_date = $filter->fromDate;
33        $end_date = $filter->toDate;
34
35        if ($start_date && $end_date) {
36            $start_date = Carbon::parse($start_date);
37            $end_date = Carbon::parse($end_date);
38        } else {
39            $start_date = Carbon::now()->subMonths(12)->startOfMonth();
40            $end_date = Carbon::now()->endOfMonth();
41        }
42
43        $user_ids = explode(",", $filter->user_ids);
44        $user_ids = array_filter($user_ids, function ($value) {
45            return $value !== "";
46        });
47        if (count($user_ids) > 0) {
48            $users = $users->whereIn("_id", $user_ids);
49        }
50
51        $group_ids = explode(",", $filter->group_ids);
52        $group_ids = array_filter($group_ids, function ($value) {
53            return $value !== "";
54        });
55        if (count($group_ids) > 0) {
56            $users = $users->whereIn("company_group_id", $group_ids);
57        }
58
59        $subgroup_ids = explode(",", $filter->subgroup_ids);
60        $subgroup_ids = array_filter($subgroup_ids, function ($value) {
61            return $value !== "";
62        });
63        if (count($subgroup_ids) > 0) {
64            $users = $users->whereIn("company_group_id", $subgroup_ids);
65        }
66
67        $hasFilter = count($user_ids) || count($group_ids) || count($subgroup_ids);
68
69        $pipeline = [
70            [
71                '$match' => [
72                    'created_at' => [
73                        '$gte' => new UTCDateTime($start_date->getTimestamp() * 1000),
74                        '$lte' => new UTCDateTime($end_date->getTimestamp() * 1000),
75                    ],
76                    'user_defined' => [ '$eq' => false]
77                ]
78            ]
79        ];
80
81        if ($hasFilter) {
82            $users = $users->get();
83
84            $ids = $users->pluck("id")->toArray();
85
86            $pipeline[] = [
87                '$match' => [
88                    'user_id' => ['$in' => $ids],
89                ]
90            ];
91        }
92
93        $pipeline[] = [
94            '$group' => [
95                '_id' => '$user_id',
96                'count' => ['$sum' => 1],
97            ]
98        ];
99
100        $pipeline[] = [
101            '$sort' => [
102                'count' => -1,
103            ]
104        ];
105
106        $pipeline[] = [
107            '$limit' => 5,
108        ];
109
110        $user_usage_counts = Shortcut::withoutGlobalScopes()->raw(function ($collection) use ($pipeline) {
111            return $collection->aggregate($pipeline);
112        });
113
114        if (!$hasFilter) {
115            $users = $users->whereIn("id", collect($user_usage_counts)->pluck("id"))->get();
116        }
117
118        $top_5_users = collect($user_usage_counts)->map(function ($item) use ($users) {
119            $user = $users->firstWhere('id', $item->_id);
120            $full_name = $user->first_name . ' ' . $user->last_name;
121            return [
122                'name' => $full_name,
123                'count' => $item->count,
124                'image' => $user->avatar,
125            ];
126        });
127
128        return $top_5_users->values();
129    }
130}