Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 117
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
AllUsersReportOverviewExport
0.00% covered (danger)
0.00%
0 / 117
0.00% covered (danger)
0.00%
0 / 2
90
0.00% covered (danger)
0.00%
0 / 1
 array
0.00% covered (danger)
0.00%
0 / 102
0.00% covered (danger)
0.00%
0 / 1
72
 headings
0.00% covered (danger)
0.00%
0 / 15
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace App\Exports;
4
5use App\Http\Models\Admin\CompanyLicenses;
6use App\Http\Models\Auth\User;
7use App\Http\Models\Chart;
8use App\Http\Models\HubspotProperties;
9use App\Traits\AccountCenter\Reporting\ChartTrait;
10use Carbon\Carbon;
11use Carbon\CarbonPeriod;
12use MongoDB\BSON\UTCDateTime;
13use Vitorccs\LaravelCsv\Concerns\Exportable;
14use Vitorccs\LaravelCsv\Concerns\FromArray;
15use Vitorccs\LaravelCsv\Concerns\WithHeadings;
16
17class AllUsersReportOverviewExport implements FromArray, WithHeadings
18{
19    use ChartTrait;
20    use Exportable;
21
22    public function array(): array
23    {
24        $users = User::select([
25            'id',
26            'first_name',
27            'last_name',
28            'company_group_id',
29            'company_id',
30            'deleted_at',
31            'avatar',
32        ])->get();
33
34        $ids = $users->pluck('id')->toArray();
35
36        $period = CarbonPeriod::create(Carbon::now()->subMonths(12)->toDateString(), '1 month', Carbon::now()->toDateString());
37        $data = [];
38
39        foreach ($period as $date) {
40            $month_year = $date->format('M Y');
41            $flychart = Chart::whereIn('user_id', $ids)->where('month_year', $month_year)->get();
42
43            $purchased_licenses = 0;
44            $assigned_licenses = 0;
45            $activate_licenses = 0;
46            $extension_installed = 0;
47
48            $company_license = CompanyLicenses::active()
49                ->whereBetween('created_at', [
50                    new UTCDateTime(strtotime($date->startOfMonth()->toDateString()) * 1000),
51                    new UTCDateTime(strtotime($date->endOfMonth()->toDateString()) * 1000),
52                ])
53                ->first();
54
55            if ($company_license) {
56                $purchased_licenses = $company_license->total_number_of_licenses_available;
57                $assigned_licenses = $company_license->total_number_of_licenses_available - $company_license->total_number_of_licenses_remaining;
58            }
59
60            $user_ids = $ids;
61
62            $extension_installed = HubspotProperties::whereIn('flymsg_id', $user_ids)
63                ->where(function ($query) {
64                    $query->where(function ($subQuery) {
65                        $subQuery->where('flymsg_chrome_extension_installed', 'Yes')
66                            ->where('flymsg_chrome_extension_uninstalled', 'No');
67                    })->orWhere(function ($subQuery) {
68                        $subQuery->where('flymsg_edge_extension_installed', 'Yes')
69                            ->where('flymsg_edge_extension_uninstalled', 'No');
70                    });
71                })
72                ->whereBetween('created_at', [
73                    new UTCDateTime(strtotime($date->startOfMonth()->toDateString()) * 1000),
74                    new UTCDateTime(strtotime($date->endOfMonth()->toDateString()) * 1000),
75                ])
76                ->count();
77
78            $user_active_ids = User::select(['id'])
79                ->whereStatus('Active')
80                ->whereBetween('updated_at', [
81                    new UTCDateTime(strtotime($date->startOfMonth()->toDateString()) * 1000),
82                    new UTCDateTime(strtotime($date->endOfMonth()->toDateString()) * 1000),
83                ])
84                ->pluck('id');
85            $activate_licenses = count($user_active_ids);
86
87            $roi_spotlight = number_format($flychart->sum('cost_saved'), 2);
88            $productivity_spotlight = number_format($flychart->sum('time_saved'), 2);
89            $total_characters_typed = number_format($flychart->sum('characters_saved'), 0);
90
91            $coach_level_beginner = 0;
92            $coach_level_intermediate = 0;
93            $coach_level_proficient = 0;
94            $coach_level_advanced = 0;
95            $coach_level_expert = 0;
96
97            $start = new UTCDateTime(strtotime($date->startOfMonth()->toDateString()) * 1000);
98            $end = new UTCDateTime(strtotime($date->endOfMonth()->toDateString()) * 1000);
99
100            $characterUsages = $this->getTotalCharactersByUsersInPeriod($ids, $start, $end);
101
102            // Step 2: Categorize the users based on the total characters saved
103            $categories = [
104                'beginner' => 0,
105                'intermediate' => 0,
106                'proficient' => 0,
107                'advanced' => 0,
108                'expert' => 0,
109            ];
110
111            foreach ($characterUsages as $usage) {
112                $total_characters = $usage->total_characters;
113
114                if ($total_characters < 10000) {
115                    $categories['beginner']++;
116                } elseif ($total_characters < 25000) {
117                    $categories['intermediate']++;
118                } elseif ($total_characters < 50000) {
119                    $categories['proficient']++;
120                } elseif ($total_characters < 100000) {
121                    $categories['advanced']++;
122                } else {
123                    $categories['expert']++;
124                }
125            }
126
127            $coach_level_beginner = $categories['beginner'];
128            $coach_level_intermediate = $categories['intermediate'];
129            $coach_level_proficient = $categories['proficient'];
130            $coach_level_advanced = $categories['advanced'];
131            $coach_level_expert = $categories['expert'];
132
133            $data[$month_year] = [
134                'Month' => $month_year,
135                'Purchased Licenses' => $purchased_licenses,
136                'Assigned Licenses' => $assigned_licenses,
137                'Activate Licenses' => $activate_licenses,
138                'Extension Installed' => $extension_installed,
139                'ROI Spotlight' => $roi_spotlight,
140                'Productivity Spotlight' => $productivity_spotlight,
141                'Total Characters Typed' => $total_characters_typed,
142                'Coach Level Beginner' => $coach_level_beginner,
143                'Coach Level Intermediate' => $coach_level_intermediate,
144                'Coach Level Proficient' => $coach_level_proficient,
145                'Coach Level Advanced' => $coach_level_advanced,
146                'Coach Level Expert' => $coach_level_expert,
147            ];
148        }
149
150        return $data;
151    }
152
153    public function headings(): array
154    {
155        return [
156            'Months',
157            'Purchased Licenses',
158            'Assigned Licenses',
159            'Activate Licenses',
160            'Extension Installed',
161            'ROI Spotlight',
162            'Productivity Spotlight',
163            'Total Characters Typed',
164            'Coach Level Beginner',
165            'Coach Level Intermediate',
166            'Coach Level Proficient',
167            'Coach Level Advanced',
168            'Coach Level Expert',
169        ];
170    }
171}