Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
0.00% |
0 / 178 |
|
0.00% |
0 / 7 |
CRAP | |
0.00% |
0 / 1 |
AccountCenterReporting | |
0.00% |
0 / 178 |
|
0.00% |
0 / 7 |
1806 | |
0.00% |
0 / 1 |
getFilteredQuery | |
0.00% |
0 / 37 |
|
0.00% |
0 / 1 |
110 | |||
getFilteredQueryPipeline | |
0.00% |
0 / 35 |
|
0.00% |
0 / 1 |
182 | |||
filterUsersByCompanyDaily | |
0.00% |
0 / 5 |
|
0.00% |
0 / 1 |
30 | |||
filterUsersByCompany | |
0.00% |
0 / 5 |
|
0.00% |
0 / 1 |
30 | |||
buildLineChartData | |
0.00% |
0 / 34 |
|
0.00% |
0 / 1 |
12 | |||
buildLineChartData2 | |
0.00% |
0 / 45 |
|
0.00% |
0 / 1 |
12 | |||
buildLineChartDataForCounts | |
0.00% |
0 / 17 |
|
0.00% |
0 / 1 |
12 |
1 | <?php |
2 | |
3 | namespace App\Actions\AccountCenter\Reporting; |
4 | |
5 | use App\DTO\AccountCenter\Reporting\ReportingRequestDTO; |
6 | use App\Http\Models\Auth\Role; |
7 | use App\Http\Models\Auth\User; |
8 | use App\Http\Models\FlyMsgUserDailyUsage; |
9 | use Carbon\Carbon; |
10 | use Illuminate\Database\Eloquent\Builder; |
11 | use Illuminate\Database\Eloquent\Collection; |
12 | use MongoDB\BSON\UTCDateTime; |
13 | |
14 | class AccountCenterReporting |
15 | { |
16 | protected function getFilteredQuery(ReportingRequestDTO $filter) |
17 | { |
18 | $query = FlyMsgUserDailyUsage::query(); |
19 | |
20 | if (!empty($filter->fromDate)) { |
21 | $start_date = Carbon::parse($filter->fromDate)->startOfDay(); |
22 | |
23 | $query = $query->where("created_at", ">=", new UTCDateTime($start_date->getTimestamp() * 1000)); |
24 | } |
25 | |
26 | if (!empty($filter->toDate)) { |
27 | $end_date = Carbon::parse($filter->toDate)->endOfDay(); |
28 | |
29 | $query = $query->where("created_at", "<=", new UTCDateTime($end_date->getTimestamp() * 1000)); |
30 | } |
31 | |
32 | $user_ids = explode(",", $filter->userIds); |
33 | $user_ids = array_filter($user_ids, function ($value) { |
34 | return $value !== ""; |
35 | }); |
36 | |
37 | if (count($user_ids) > 0) { |
38 | $query = $query->whereIn("user_id", $user_ids); |
39 | } |
40 | |
41 | $hasNotAssignedGroup = in_array("-1", explode(",", $filter->groupIds)); |
42 | |
43 | if ($hasNotAssignedGroup) { |
44 | $query = $query->whereNull("group_id"); |
45 | } |
46 | |
47 | $group_ids = explode(",", $filter->groupIds); |
48 | $group_ids = array_filter($group_ids, function ($value) { |
49 | return $value !== "" && $value !== "-1"; |
50 | }); |
51 | |
52 | if (count($group_ids) > 0) { |
53 | $query = $query->whereIn("group_id", $group_ids); |
54 | } |
55 | |
56 | $subgroup_ids = explode(",", $filter->subgroupIds); |
57 | $subgroup_ids = array_filter($subgroup_ids, function ($value) { |
58 | return $value !== ""; |
59 | }); |
60 | |
61 | if (count($subgroup_ids) > 0) { |
62 | $query = $query->whereIn("group_id", $subgroup_ids); |
63 | } |
64 | |
65 | $company_ids = $filter->companyIds ?? []; |
66 | $company_ids = array_filter($company_ids, function ($value) { |
67 | return $value !== ""; |
68 | }); |
69 | |
70 | if (count($company_ids) > 0) { |
71 | $query = $query->whereIn("company_id", $company_ids); |
72 | } |
73 | |
74 | if ($filter->companyId) { |
75 | $query = $this->filterUsersByCompanyDaily($query, $filter->role, $group_ids, $filter->companyId, $filter->adminGroupIds); |
76 | } |
77 | |
78 | return $query; |
79 | } |
80 | |
81 | protected function getFilteredQueryPipeline(ReportingRequestDTO $filter) |
82 | { |
83 | $filters = [ |
84 | 'deleted_at' => ['$exists' => false], |
85 | ]; |
86 | |
87 | if (!empty($filter->fromDate)) { |
88 | $start_date = Carbon::parse($filter->fromDate)->startOfDay(); |
89 | $filters['created_at']['$gte'] = new UTCDateTime($start_date->getTimestamp() * 1000); |
90 | } |
91 | |
92 | if (!empty($filter->toDate)) { |
93 | $end_date = Carbon::parse($filter->toDate)->endOfDay(); |
94 | $filters['created_at']['$lte'] = new UTCDateTime($end_date->getTimestamp() * 1000); |
95 | } |
96 | |
97 | $user_ids = array_values(array_filter(explode(",", $filter->userIds))); |
98 | if (count($user_ids) > 0) { |
99 | $filters['user_id']['$in'] = $user_ids; |
100 | } |
101 | |
102 | $hasNotAssignedGroup = in_array("-1", explode(",", $filter->groupIds)); |
103 | |
104 | if ($hasNotAssignedGroup) { |
105 | $filters['group_id'] = null; |
106 | } |
107 | |
108 | $group_ids = array_values(array_filter( |
109 | explode(",", $filter->groupIds), |
110 | fn($value) => $value !== "" && $value !== "-1" |
111 | )); |
112 | if (count($group_ids) > 0) { |
113 | $filters['group_id']['$in'] = $group_ids; |
114 | } |
115 | |
116 | $subgroup_ids = array_values(array_filter(explode(",", $filter->subgroupIds))); |
117 | if (count($subgroup_ids) > 0) { |
118 | $filters['group_id']['$in'] = $subgroup_ids; |
119 | } |
120 | |
121 | $company_ids = array_values(array_filter(explode(",", $filter->companyIds ?? ''))); |
122 | if (count($company_ids) > 0) { |
123 | $filters['company_id']['$in'] = $company_ids; |
124 | } |
125 | |
126 | if ($filter->companyId) { |
127 | if ($filter->role == Role::GLOBAL_ADMIN || $filter->role == Role::VENGRESO_ADMIN) { |
128 | $filters['company_id'] = $filter->companyId; |
129 | } elseif (empty($group_ids ?? [])) { |
130 | $filters['group_id']['$in'] = $filter->adminGroupIds ?? []; |
131 | } |
132 | } |
133 | |
134 | return [ |
135 | ['$match' => $filters] |
136 | ]; |
137 | } |
138 | |
139 | protected function filterUsersByCompanyDaily(Builder $query, string $role, array $groupIds, string $companyId, ?array $adminGroupIds, $global = false) |
140 | { |
141 | if ($role == Role::GLOBAL_ADMIN || $role == Role::VENGRESO_ADMIN || $global) { |
142 | return $query->where("company_id", "=", $companyId); |
143 | } elseif (empty($groupIds)) { |
144 | return $query->whereIn("group_id", $adminGroupIds ?? []); |
145 | } |
146 | |
147 | return $query; |
148 | } |
149 | |
150 | protected function filterUsersByCompany(Builder $query, string $role, array $groupIds, string $companyId, ?array $adminGroupIds, $global = false) |
151 | { |
152 | if ($role == Role::GLOBAL_ADMIN || $role == Role::VENGRESO_ADMIN || $global) { |
153 | return $query->where("company_id", "=", $companyId); |
154 | } elseif (empty($groupIds)) { |
155 | return $query->whereIn("company_group_id", $adminGroupIds ?? []); |
156 | } |
157 | |
158 | return $query; |
159 | } |
160 | |
161 | protected function buildLineChartData(Collection $flycutUsages, int $months) |
162 | { |
163 | // Initialize the line chart data array |
164 | $line_chart_data = []; |
165 | $current_date = Carbon::now()->setTimezone('UTC'); |
166 | for ($i = 0; $i < $months; $i++) { |
167 | $month_year = $current_date->subMonth()->format('M Y'); |
168 | $line_chart_data[$month_year] = [ |
169 | 'month_year' => $month_year, |
170 | 'flycuts_used' => 0, |
171 | 'characters_typed' => round(0, 2), |
172 | 'time_saved' => round(0, 2), |
173 | 'cost_saved' => round(0, 2), |
174 | 'issues_fixed' => round(0, 2), |
175 | ]; |
176 | } |
177 | |
178 | // Aggregate the data by month |
179 | $aggregated_data = $flycutUsages->groupBy(function ($date) { |
180 | return Carbon::parse($date->created_at)->setTimezone('UTC')->format('M Y'); |
181 | }); |
182 | |
183 | // Process the aggregated data |
184 | foreach ($aggregated_data as $month_year => $usages) { |
185 | $month = Carbon::parse($usages->first()->created_at)->setTimezone('UTC')->format('M Y'); |
186 | |
187 | $flycuts_used = $usages->count(); |
188 | $characters_typed = $usages->sum('characters_typed'); |
189 | $time_saved = $usages->sum('time_saved'); |
190 | $cost_saved = $usages->sum('cost_saved'); |
191 | $issues_fixed = $usages->sum('issues_fixed'); |
192 | |
193 | $line_chart_data[$month] = [ |
194 | 'month_year' => $month_year, |
195 | 'flycuts_used' => $flycuts_used, |
196 | 'characters_typed' => round($characters_typed, 2), |
197 | 'time_saved' => round($time_saved, 2), |
198 | 'cost_saved' => round($cost_saved, 2), |
199 | 'issues_fixed' => round($issues_fixed, 2), |
200 | ]; |
201 | } |
202 | |
203 | // Convert month-year strings to DateTime objects and sort by date |
204 | uksort($line_chart_data, function ($a, $b) { |
205 | return strtotime($a) - strtotime($b); |
206 | }); |
207 | |
208 | return $line_chart_data; |
209 | } |
210 | |
211 | protected function buildLineChartData2(Collection $flycutUsages, int $months) |
212 | { |
213 | // Initialize the line chart data array |
214 | $line_chart_data = []; |
215 | $current_date = Carbon::now()->setTimezone('UTC'); |
216 | for ($i = 0; $i < $months; $i++) { |
217 | $month_year = $current_date->subMonth()->format('M Y'); |
218 | $line_chart_data[$month_year] = [ |
219 | 'month_year' => $month_year, |
220 | 'flycuts_used' => 0, |
221 | 'characters_typed' => round(0, 2), |
222 | 'time_saved' => round(0, 2), |
223 | 'cost_saved' => round(0, 2), |
224 | 'issues_fixed' => round(0, 2), |
225 | 'issues_accepted' => round(0, 2), |
226 | 'issues_autocorrect' => round(0, 2), |
227 | 'paragraph_rewrite_count' => round(0, 2), |
228 | ]; |
229 | } |
230 | |
231 | // Aggregate the data by month |
232 | $aggregated_data = $flycutUsages->groupBy(function ($item) { |
233 | return $item->created_at->toDateTime()->format('M Y'); |
234 | }); |
235 | |
236 | // Process the aggregated data |
237 | foreach ($aggregated_data as $month_year => $usages) { |
238 | $month = $usages->first()->created_at->toDateTime()->format('M Y'); |
239 | |
240 | $flycuts_used = $usages->count(); |
241 | $characters_typed = $usages->sum('characters_typed'); |
242 | $time_saved = $usages->sum('time_saved'); |
243 | $cost_saved = $usages->sum('cost_savings'); |
244 | $issues_fixed = $usages->sum('fly_grammar_actions'); |
245 | $issues_accepted = $usages->sum('fly_grammar_accepted'); |
246 | $issues_autocorrect = $usages->sum('fly_grammar_autocorrect'); |
247 | $issues_autocomplete = $usages->sum('fly_grammar_autocomplete'); |
248 | $paragraph_rewrite_count = $usages->sum('paragraph_rewrite_count'); |
249 | |
250 | $line_chart_data[$month] = [ |
251 | 'month_year' => $month_year, |
252 | 'flycuts_used' => $flycuts_used, |
253 | 'characters_typed' => round($characters_typed, 2), |
254 | 'time_saved' => round($time_saved, 2), |
255 | 'cost_saved' => round($cost_saved, 2), |
256 | 'issues_fixed' => round($issues_fixed, 2), |
257 | 'issues_accepted' => round($issues_accepted, 2), |
258 | 'issues_autocorrect' => round($issues_autocorrect, 2), |
259 | 'issues_autocomplete' => round($issues_autocomplete, 2), |
260 | 'paragraph_rewrite_count' => round($paragraph_rewrite_count, 2), |
261 | ]; |
262 | } |
263 | |
264 | // Convert month-year strings to DateTime objects and sort by date |
265 | uksort($line_chart_data, function ($a, $b) { |
266 | return strtotime($a) - strtotime($b); |
267 | }); |
268 | |
269 | return $line_chart_data; |
270 | } |
271 | |
272 | protected function buildLineChartDataForCounts(Collection $shortcut, int $months, string $property) |
273 | { |
274 | $line_chart_data = []; |
275 | $current_date = Carbon::now(); |
276 | for ($i = 0; $i < $months; $i++) { |
277 | $month_year = $current_date->subMonth()->format('M Y'); |
278 | $line_chart_data[$month_year] = ['count' => 0]; |
279 | } |
280 | |
281 | // Reset the current date to now |
282 | $current_date = Carbon::now(); |
283 | |
284 | // Aggregate the data by month |
285 | $aggregated_data = $shortcut->groupBy(function ($item) { |
286 | return Carbon::parse($item->created_at)->format('Y-m'); |
287 | }); |
288 | |
289 | // Process the aggregated data and populate the line chart data array |
290 | foreach ($aggregated_data as $month_year => $usages) { |
291 | $month = Carbon::parse($usages->first()->created_at)->format('M Y'); |
292 | $flycuts_used = $usages->sum($property); |
293 | $line_chart_data[$month] = ['count' => $flycuts_used]; |
294 | } |
295 | |
296 | // Ensure the data is sorted by date keys |
297 | uksort($line_chart_data, function ($a, $b) { |
298 | return strtotime($a) - strtotime($b); |
299 | }); |
300 | |
301 | return $line_chart_data; |
302 | } |
303 | } |