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