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\Helpers\CoachLevelHelper;
6use App\DTO\AccountCenter\Reporting\ReportingRequestDTO;
7use App\Http\Models\Auth\User;
8use Carbon\Carbon;
9use MongoDB\BSON\UTCDateTime;
10use App\Traits\AccountCenter\Reporting\ChartTrait;
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}