Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 56
0.00% covered (danger)
0.00%
0 / 1
CRAP
0.00% covered (danger)
0.00%
0 / 1
FmsCoachLevelSpotlightAction
0.00% covered (danger)
0.00%
0 / 56
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 / 56
0.00% covered (danger)
0.00%
0 / 1
110
1<?php
2
3namespace App\Actions\AccountCenter\Reporting;
4
5use App\DTO\AccountCenter\Reporting\ReportingRequestDTO;
6use App\Helpers\CoachLevelHelper;
7use App\Http\Models\Auth\User;
8use App\Traits\AccountCenter\Reporting\ChartTrait;
9use Carbon\Carbon;
10use MongoDB\BSON\UTCDateTime;
11
12class FmsCoachLevelSpotlightAction extends AccountCenterReporting
13{
14    use ChartTrait;
15
16    public function execute(ReportingRequestDTO $filter)
17    {
18        $users = User::select([
19            '_id',
20            'id',
21            'first_name',
22            'last_name',
23            'company_group_id',
24            'company_id',
25            'created_at',
26            'avatar',
27        ]);
28
29        $start_date = $filter->fromDate;
30        $end_date = $filter->toDate;
31
32        if ($start_date && $end_date) {
33            $start_date = Carbon::parse($start_date)->startOfDay();
34            $end_date = Carbon::parse($end_date)->endOfDay();
35            $start_date = new UTCDateTime($start_date->getTimestamp() * 1000);
36            $end_date = new UTCDateTime($end_date->getTimestamp() * 1000);
37        }
38
39        $user_ids = explode(',', $filter->userIds);
40        $user_ids = array_filter($user_ids, function ($value) {
41            return $value !== '';
42        });
43        if (count($user_ids) > 0) {
44            $users = $users->whereIn('_id', $user_ids);
45        }
46
47        $hasNotAssignedGroup = in_array('-1', explode(',', $filter->groupIds));
48
49        if ($hasNotAssignedGroup) {
50            $users = $users->whereNull('company_group_id');
51        }
52
53        $group_ids = explode(',', $filter->groupIds);
54        $group_ids = array_filter($group_ids, function ($value) {
55            return $value !== '' && $value !== '-1';
56        });
57
58        if (count($group_ids) > 0) {
59            $users = $users->whereIn('company_group_id', $group_ids);
60        }
61
62        $subgroup_ids = explode(',', $filter->subgroupIds);
63        $subgroup_ids = array_filter($subgroup_ids, function ($value) {
64            return $value !== '';
65        });
66        if (count($subgroup_ids) > 0) {
67            $users = $users->whereIn('company_group_id', $subgroup_ids);
68        }
69
70        $users = $this->filterUsersByCompany($users, $filter->role, $group_ids, $filter->companyId, $filter->adminGroupIds);
71
72        $ids = $users->pluck('id')->toArray();
73
74        $characterUsages = $this->getTotalCharactersByUsersInPeriod($ids, $start_date, $end_date);
75
76        $coachLevels = CoachLevelHelper::categorizeCharacterUsage($characterUsages, count($ids));
77
78        // Step 3: Prepare the response data
79        $chart = [
80            $coachLevels->beginner,
81            $coachLevels->intermediate,
82            $coachLevels->proficient,
83            $coachLevels->advanced,
84            $coachLevels->expert,
85        ];
86
87        $percentage_expert_users = $coachLevels->expert > 0 ? ($coachLevels->expert / count($ids)) * 100 : 0;
88        $percentage_beginner_users = $coachLevels->beginner > 0 ? ($coachLevels->beginner / count($ids)) * 100 : 0;
89
90        return [
91            'chart' => $chart,
92            'expert_users' => round($percentage_expert_users, 2),
93            'beginner_users' => round($percentage_beginner_users, 2),
94        ];
95    }
96}