Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 82
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
ReportingProductivitySpotlightRequest
0.00% covered (danger)
0.00%
0 / 82
0.00% covered (danger)
0.00%
0 / 2
182
0.00% covered (danger)
0.00%
0 / 1
 execute
0.00% covered (danger)
0.00%
0 / 67
0.00% covered (danger)
0.00%
0 / 1
110
 makeLineChartData
0.00% covered (danger)
0.00%
0 / 15
0.00% covered (danger)
0.00%
0 / 1
12
1<?php
2
3namespace App\Actions;
4
5use App\DTO\ReportingTopUsersRequestDTO;
6use App\Http\Models\Auth\User;
7use App\Http\Models\Chart;
8use Illuminate\Support\Carbon;
9use MongoDB\BSON\UTCDateTime;
10
11class ReportingProductivitySpotlightRequest
12{
13    /**
14     * Execute the action.
15     *
16     * @param  ReportingTopUsersRequestDTO $filter
17     * @return array
18     */
19    public function execute(ReportingTopUsersRequestDTO $filter)
20    {
21        $start_date = ($filter->fromDate ? Carbon::parse($filter->fromDate) : Carbon::now()->subMonths(12))->startOfMonth();
22        $end_date = ($filter->toDate ? Carbon::parse($filter->toDate) : Carbon::now())->endOfMonth();
23
24        $users = User::select([
25            "_id",
26            "first_name",
27            "last_name",
28            "company_group_id",
29            "company_id",
30            "created_at",
31            "avatar"
32        ]);
33
34        $user_ids = explode(",", $filter->user_ids);
35        $user_ids = array_filter($user_ids, function ($value) {
36            return $value !== "";
37        });
38        if (count($user_ids) > 0) {
39            $users = $users->whereIn("_id", $user_ids);
40        }
41
42        $group_ids = explode(",", $filter->group_ids);
43        $group_ids = array_filter($group_ids, function ($value) {
44            return $value !== "";
45        });
46        if (count($group_ids) > 0) {
47            $users = $users->whereIn("company_group_id", $group_ids);
48        }
49
50        $subgroup_ids = explode(",", $filter->subgroup_ids);
51        $subgroup_ids = array_filter($subgroup_ids, function ($value) {
52            return $value !== "";
53        });
54        if (count($subgroup_ids) > 0) {
55            $users = $users->whereIn("company_group_id", $subgroup_ids);
56        }
57
58        $hasFilter = count($user_ids) || count($group_ids) || count($subgroup_ids);
59
60        $pipeline = [
61            [
62                '$match' => [
63                    'created_at' => [
64                        '$gte' => new UTCDateTime($start_date->getTimestamp() * 1000),
65                        '$lte' => new UTCDateTime($end_date->getTimestamp() * 1000),
66                    ]
67                ]
68            ]
69        ];
70
71        if ($hasFilter) {
72            $users = $users->get();
73
74            $ids = $users->pluck("id")->toArray();
75
76            $pipeline[] = [
77                '$match' => [
78                    'user_id' => ['$in' => $ids],
79                ]
80            ];
81        }
82
83        $pipeline[] = [
84            '$group' => [
85                '_id' => '$month_year',
86                'time_saved' => ['$sum' => '$time_saved'],
87            ]
88        ];
89
90        $pipeline[] = ['$sort' => ['_id.month_year' => 1]];
91
92        $flycut_usages = Chart::withoutGlobalScopes()->raw(function ($collection) use ($pipeline) {
93            return $collection->aggregate($pipeline);
94        });
95
96        $chart = $this->makeLineChartData($flycut_usages, $start_date, $end_date);
97        $total_time_saved = array_sum(array_column($chart, 'time_saved'));
98        $total_users = count($chart);
99        $average_time_saved = $total_users > 0 ? $total_time_saved / $total_users : 0;
100
101        return [
102            "chart" => $chart,
103            "total_time_saved" => number_format($total_time_saved, 2, ".", ","),
104            "average_time_saved" => round($average_time_saved, 2)
105        ];
106    }
107
108    private function makeLineChartData($flycut_usages, $start_date, $end_date)
109    {
110        $line_chart_data = [];
111        $period = new \DatePeriod(
112            new \DateTime($start_date->format('Y-m-01')),
113            new \DateInterval('P1M'),
114            new \DateTime($end_date->format('Y-m-01'))
115        );
116
117        foreach ($period as $date) {
118            $month_year = $date->format('M Y');
119            $test = $flycut_usages->firstWhere('_id', $month_year);
120            $time_saved = $test ? round($test->time_saved, 2) : 0;
121
122            $line_chart_data[$month_year] = [
123                'month_year' => $month_year,
124                'time_saved' => round($time_saved, 2),
125            ];
126        }
127
128        return array_values($line_chart_data);
129    }
130}