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