Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 292
0.00% covered (danger)
0.00%
0 / 42
CRAP
0.00% covered (danger)
0.00%
0 / 1
ClientManagementController
0.00% covered (danger)
0.00%
0 / 292
0.00% covered (danger)
0.00%
0 / 42
6972
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 test
0.00% covered (danger)
0.00%
0 / 9
0.00% covered (danger)
0.00%
0 / 1
2
 reporting_licenses
0.00% covered (danger)
0.00%
0 / 12
0.00% covered (danger)
0.00%
0 / 1
6
 reporting_roi_spotlight
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
12
 reporting_characters_typed_spotlight
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
12
 reporting_total_fly_grammar_spotlight
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
12
 reporting_total_fly_grammar_accepted_spotlight
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
12
 reporting_total_fly_grammar_autocorrect_spotlight
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
12
 reporting_total_fly_grammar_autocomplete_spotlight
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
12
 reporting_flymsg_coach_level
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
12
 reporting_flycuts_used
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
12
 reporting_flycuts_created
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
12
 reporting_flycuts_used_top_users
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 reporting_flycuts_created_top_users
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 reporting_flyplates_added
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
12
 reporting_flyplates_added_top_users
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 reporting_extension_usage
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
2
 reporting_characters_typed_saving_top_users
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 getTop5
0.00% covered (danger)
0.00%
0 / 24
0.00% covered (danger)
0.00%
0 / 1
30
 reporting_time_saving_top_users
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 reporting_cost_saving_top_users
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 reporting_fly_grammar_top_users
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 reporting_fly_grammar_accepted_top_users
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 reporting_fly_grammar_autocorrect_top_users
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 reporting_fly_grammar_autocomplete_top_users
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 reporting_productivity_spotlight
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
12
 reporting_get_columns
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
2
 reporting_user_details
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
2
 reporting_active_users
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
2
 reporting_sentence_rewrite_ai
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
12
 reporting_sentence_rewrite_ai_used_top_users
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 reporting_paragraph_rewrite_ai
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
12
 reporting_paragraph_rewrite_ai_used_top_users
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 reporting_flyengage_ai
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
12
 reporting_flyengage_ai_used_top_users
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 reporting_flypost_ai
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
12
 reporting_flypost_ai_used_top_users
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 export_csv_report
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
6
 export_csv_report_overview
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
2
 export_csv_report_usage
0.00% covered (danger)
0.00%
0 / 10
0.00% covered (danger)
0.00%
0 / 1
20
 getFiltersForReporting
0.00% covered (danger)
0.00%
0 / 22
0.00% covered (danger)
0.00%
0 / 1
12
 getPeriod
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace App\Http\Controllers\v1\AdminPortal;
4
5use App\Actions\ReportingActiveUsersRequest;
6use App\Actions\ReportingCharactersTypedSavingTopUsersRequest;
7use App\Actions\ReportingCostSavedTopUsersRequest;
8use App\Actions\ReportingExtensionUsageRequest;
9use App\Actions\ReportingFlyPlatesAddedTopUsersRequest;
10use App\Actions\ReportingGetColumnsRequest;
11use App\Actions\ReportingTimeSavedTopUsersRequest;
12use App\Actions\ReportingUserDetailsRequest;
13use App\DTO\AccountCenter\Reporting\ReportingRequestDTO;
14use App\DTO\ReportingActiveUsersRequestDTO;
15use App\DTO\ReportingExtensionUsageRequestDTO;
16use App\DTO\ReportingUserDetailsRequestDTO;
17use App\Exports\AllUsersReportExport;
18use App\Exports\AllUsersReportOverviewExport;
19use App\Exports\AllUsersReportUsageExport;
20use App\Http\Controllers\Controller;
21use App\Http\Models\Auth\User;
22use App\Http\Requests\AdminReportingTopUsersRequest;
23use App\Http\Requests\ReportingFormRequest;
24use App\Http\Services\Admin\Reports\AccountCenterReportingService;
25use App\Http\Services\Admin\Reports\FindUsersOverviewFilter;
26use App\Http\Services\Admin\Reports\MgmtCenterReportingService;
27use App\Http\Services\CsvExportService;
28use Illuminate\Http\Request;
29use Illuminate\Support\Carbon;
30use Illuminate\Support\Facades\Log;
31
32class ClientManagementController extends Controller
33{
34    public function __construct(
35        private AccountCenterReportingService $accountCenterReportingService,
36        private MgmtCenterReportingService $mgmtCenterReportingService,
37        private CsvExportService $csvExportService,
38    ) {}
39
40    public function test()
41    {
42        return response()->json(data: [
43            'success' => true,
44            'licenses' => [
45                'inactive_users' => 123,
46                'activated' => 123,
47                'extensions_installed' => 123,
48                'extensions_uninstalled' => 123,
49            ],
50        ], status: 200);
51    }
52
53    public function reporting_licenses(ReportingFormRequest $request)
54    {
55        try {
56            $filters = $this->getFiltersForReporting($request);
57
58            $licenses = $this->mgmtCenterReportingService->findLicenseOverview($filters);
59
60            return response()->json(data: [
61                'success' => true,
62                'licenses' => $licenses,
63            ], status: 200);
64        } catch (\Exception $e) {
65            Log::error($e->getMessage());
66
67            return response()->json(data: [
68                'success' => false,
69                'message' => 'An error occurred while fetching licenses',
70            ], status: 500);
71        }
72    }
73
74    public function reporting_roi_spotlight(Request $request)
75    {
76        $from = $request->fromDate ? Carbon::parse($request->fromDate)->startOfDay() : null;
77        $to = $request->toDate ? Carbon::parse($request->toDate)->endOfDay() : null;
78
79        $data = $this->mgmtCenterReportingService->spotlight('cost_saved', $from, $to);
80
81        return response()->json(data: [
82            'success' => true,
83            'data' => $data,
84        ], status: 200);
85    }
86
87    public function reporting_characters_typed_spotlight(Request $request)
88    {
89        $from = $request->fromDate ? Carbon::parse($request->fromDate)->startOfDay() : null;
90        $to = $request->toDate ? Carbon::parse($request->toDate)->endOfDay() : null;
91
92        $data = $this->mgmtCenterReportingService->spotlight('characters_typed', $from, $to);
93
94        return response()->json(data: [
95            'success' => true,
96            'data' => $data,
97        ], status: 200);
98    }
99
100    public function reporting_total_fly_grammar_spotlight(Request $request)
101    {
102        $from = $request->fromDate ? Carbon::parse($request->fromDate)->startOfDay() : null;
103        $to = $request->toDate ? Carbon::parse($request->toDate)->endOfDay() : null;
104
105        $data = $this->mgmtCenterReportingService->spotlight('fly_grammar_actions', $from, $to);
106
107        return response()->json(data: [
108            'success' => true,
109            'data' => $data,
110        ], status: 200);
111    }
112
113    public function reporting_total_fly_grammar_accepted_spotlight(Request $request)
114    {
115        $from = $request->fromDate ? Carbon::parse($request->fromDate)->startOfDay() : null;
116        $to = $request->toDate ? Carbon::parse($request->toDate)->endOfDay() : null;
117
118        $data = $this->mgmtCenterReportingService->spotlight('fly_grammar_accepted', $from, $to);
119
120        return response()->json(data: [
121            'success' => true,
122            'data' => $data,
123        ], status: 200);
124    }
125
126    public function reporting_total_fly_grammar_autocorrect_spotlight(Request $request)
127    {
128        $from = $request->fromDate ? Carbon::parse($request->fromDate)->startOfDay() : null;
129        $to = $request->toDate ? Carbon::parse($request->toDate)->endOfDay() : null;
130
131        $data = $this->mgmtCenterReportingService->spotlight('fly_grammar_autocorrect', $from, $to);
132
133        return response()->json(data: [
134            'success' => true,
135            'data' => $data,
136        ], status: 200);
137    }
138
139    public function reporting_total_fly_grammar_autocomplete_spotlight(Request $request)
140    {
141        $from = $request->fromDate ? Carbon::parse($request->fromDate)->startOfDay() : null;
142        $to = $request->toDate ? Carbon::parse($request->toDate)->endOfDay() : null;
143
144        $data = $this->mgmtCenterReportingService->spotlight('fly_grammar_autocomplete', $from, $to);
145
146        return response()->json(data: [
147            'success' => true,
148            'data' => $data,
149        ], status: 200);
150    }
151
152    public function reporting_flymsg_coach_level(Request $request)
153    {
154        $from = $request->fromDate ? Carbon::parse($request->fromDate)->startOfDay() : null;
155        $to = $request->toDate ? Carbon::parse($request->toDate)->endOfDay() : null;
156
157        $data = $this->mgmtCenterReportingService->getFlyCutCoachLevels($from, $to);
158
159        return response()->json([
160            'success' => true,
161            'data' => $data,
162        ], 200);
163    }
164
165    public function reporting_flycuts_used(Request $request)
166    {
167        $from = $request->fromDate ? Carbon::parse($request->fromDate)->startOfDay() : null;
168        $to = $request->toDate ? Carbon::parse($request->toDate)->endOfDay() : null;
169
170        $data = $this->mgmtCenterReportingService->spotlight('flycut_count', $from, $to, true);
171
172        return response()->json(data: [
173            'success' => true,
174            'data' => $data,
175        ]);
176    }
177
178    public function reporting_flycuts_created(Request $request)
179    {
180        $from = $request->fromDate ? Carbon::parse($request->fromDate)->startOfDay() : null;
181        $to = $request->toDate ? Carbon::parse($request->toDate)->endOfDay() : null;
182
183        $data = $this->mgmtCenterReportingService->spotlight('flycuts_created', $from, $to, true);
184
185        return response()->json(data: [
186            'success' => true,
187            'data' => $data,
188        ]);
189    }
190
191    public function reporting_flycuts_used_top_users(Request $request)
192    {
193        return response()->json(data: [
194            'success' => true,
195            'users' => $this->getTop5($request, 'flycut_count'),
196        ]);
197    }
198
199    public function reporting_flycuts_created_top_users(Request $request)
200    {
201        return response()->json(data: [
202            'success' => true,
203            'users' => $this->getTop5($request, 'flycuts_created'),
204        ]);
205    }
206
207    public function reporting_flyplates_added(Request $request)
208    {
209        $from = $request->fromDate ? Carbon::parse($request->fromDate)->startOfDay() : null;
210        $to = $request->toDate ? Carbon::parse($request->toDate)->endOfDay() : null;
211
212        $data = $this->mgmtCenterReportingService->spotlight('flyplates_added', $from, $to, true);
213
214        return response()->json(data: [
215            'success' => true,
216            'data' => $data,
217        ]);
218    }
219
220    public function reporting_flyplates_added_top_users(Request $request, ReportingFlyPlatesAddedTopUsersRequest $reportingFlyPlatesAddedTopUsersService)
221    {
222        return response()->json(data: [
223            'success' => true,
224            'users' => $this->getTop5($request, 'flyplates_added'),
225        ]);
226    }
227
228    public function reporting_extension_usage(Request $request, ReportingExtensionUsageRequest $reportingExtensionUsageService)
229    {
230        $usersData = $reportingExtensionUsageService->execute(new ReportingExtensionUsageRequestDTO(
231            $request->fromDate,
232            $request->toDate,
233            $request->user_ids,
234            $request->group_ids,
235            $request->subgroup_ids
236        ));
237
238        return response()->json([
239            'success' => true,
240            'data' => $usersData,
241        ], 200);
242    }
243
244    public function reporting_characters_typed_saving_top_users(AdminReportingTopUsersRequest $request, ReportingCharactersTypedSavingTopUsersRequest $reportingCharactersTypedSavingTopUsersAction)
245    {
246        return response()->json(data: [
247            'success' => true,
248            'users' => $this->getTop5($request, 'characters_typed'),
249        ]);
250    }
251
252    private function getTop5(Request $request, string $property)
253    {
254        $filter = new ReportingRequestDTO(
255            fromDate: ! empty($request->fromDate) ? \Carbon\Carbon::parse($request->fromDate)->startOfDay() : null,
256            toDate: ! empty($request->toDate) ? Carbon::parse($request->toDate)->endOfDay() : null,
257            companyId: $request->company_id,
258            adminGroupIds: $request->admin_group_ids,
259            userIds: $request->user_ids,
260            groupIds: $request->group_ids,
261            subgroupIds: $request->subgroup_ids,
262            role: $request->current_role,
263            companyIds: $request->company_ids ? explode(',', $request->company_ids) : null,
264        );
265
266        $top5 = $this->accountCenterReportingService->getTop5Users($filter, $property);
267
268        // Get the top 5 users
269        $top_5_users = $top5->map(function ($top) use ($property) {
270            $user = User::firstWhere('_id', $top['user_id']);
271
272            if ($user) {
273                $full_name = $user->first_name.' '.$user->last_name;
274
275                return ['name' => $full_name, 'count' => number_format($top[$property], 0, '.', ','), 'image' => $user->avatar];
276            }
277
278            return [
279                'name' => 'Deleted User',
280                'count' => number_format($top[$property], 0, '.', ','),
281                'image' => '',
282            ];
283        });
284
285        return $top_5_users;
286    }
287
288    public function reporting_time_saving_top_users(AdminReportingTopUsersRequest $request, ReportingTimeSavedTopUsersRequest $reportingTimeSavedTopUsersRequestAction)
289    {
290        return response()->json(data: [
291            'success' => true,
292            'users' => $this->getTop5($request, 'time_saved'),
293        ]);
294    }
295
296    public function reporting_cost_saving_top_users(AdminReportingTopUsersRequest $request, ReportingCostSavedTopUsersRequest $reportingCostSavedTopUsersRequestAction)
297    {
298        return response()->json(data: [
299            'success' => true,
300            'users' => $this->getTop5($request, 'cost_savings'),
301        ]);
302    }
303
304    public function reporting_fly_grammar_top_users(AdminReportingTopUsersRequest $request, ReportingCostSavedTopUsersRequest $reportingCostSavedTopUsersRequestAction)
305    {
306        return response()->json(data: [
307            'success' => true,
308            'users' => $this->getTop5($request, 'fly_grammar_actions'),
309        ]);
310    }
311
312    public function reporting_fly_grammar_accepted_top_users(AdminReportingTopUsersRequest $request)
313    {
314        return response()->json(data: [
315            'success' => true,
316            'users' => $this->getTop5($request, 'fly_grammar_accepted'),
317        ]);
318    }
319
320    public function reporting_fly_grammar_autocorrect_top_users(AdminReportingTopUsersRequest $request)
321    {
322        return response()->json(data: [
323            'success' => true,
324            'users' => $this->getTop5($request, 'fly_grammar_autocorrect'),
325        ]);
326    }
327
328    public function reporting_fly_grammar_autocomplete_top_users(AdminReportingTopUsersRequest $request)
329    {
330        return response()->json(data: [
331            'success' => true,
332            'users' => $this->getTop5($request, 'fly_grammar_autocomplete'),
333        ]);
334    }
335
336    public function reporting_productivity_spotlight(Request $request)
337    {
338        $from = $request->fromDate ? Carbon::parse($request->fromDate)->startOfDay() : null;
339        $to = $request->toDate ? Carbon::parse($request->toDate)->endOfDay() : null;
340
341        $data = $this->mgmtCenterReportingService->spotlight('time_saved', $from, $to);
342
343        return response()->json(data: [
344            'success' => true,
345            'data' => $data,
346        ], status: 200);
347    }
348
349    public function reporting_get_columns(Request $request, ReportingGetColumnsRequest $reportingGetColumnsRequest)
350    {
351        $columns = $reportingGetColumnsRequest->execute($request);
352
353        return response()->json([
354            'success' => true,
355            'columns' => $columns,
356        ], 200);
357    }
358
359    public function reporting_user_details(Request $request, ReportingUserDetailsRequest $reportingUserDetailsRequest)
360    {
361        $usersData = $reportingUserDetailsRequest->execute(new ReportingUserDetailsRequestDTO(
362            $request->fromDate,
363            $request->toDate
364        ));
365
366        return response()->json([
367            'success' => true,
368            'users' => $usersData,
369        ], 200);
370    }
371
372    public function reporting_active_users(Request $request, ReportingActiveUsersRequest $reportingActiveUsersService)
373    {
374        $data = $reportingActiveUsersService->execute(new ReportingActiveUsersRequestDTO(
375            $request->fromDate,
376            $request->toDate,
377            $request->user_ids,
378            $request->group_ids,
379            $request->subgroup_ids
380        ));
381
382        return response()->json([
383            'success' => true,
384            'data' => $data,
385        ], 200);
386    }
387
388    public function reporting_sentence_rewrite_ai(Request $request)
389    {
390        $from = $request->fromDate ? Carbon::parse($request->fromDate)->startOfDay() : null;
391        $to = $request->toDate ? Carbon::parse($request->toDate)->endOfDay() : null;
392
393        $data = $this->mgmtCenterReportingService->spotlight('sentence_rewrite_count', $from, $to, true);
394
395        return response()->json(data: [
396            'success' => true,
397            'data' => $data,
398        ]);
399    }
400
401    public function reporting_sentence_rewrite_ai_used_top_users(Request $request)
402    {
403        return response()->json(data: [
404            'success' => true,
405            'users' => $this->getTop5($request, 'sentence_rewrite_count'),
406        ]);
407    }
408
409    public function reporting_paragraph_rewrite_ai(Request $request)
410    {
411        $from = $request->fromDate ? Carbon::parse($request->fromDate)->startOfDay() : null;
412        $to = $request->toDate ? Carbon::parse($request->toDate)->endOfDay() : null;
413
414        $data = $this->mgmtCenterReportingService->spotlight('paragraph_rewrite_count', $from, $to, true);
415
416        return response()->json(data: [
417            'success' => true,
418            'data' => $data,
419        ]);
420    }
421
422    public function reporting_paragraph_rewrite_ai_used_top_users(Request $request)
423    {
424        return response()->json(data: [
425            'success' => true,
426            'users' => $this->getTop5($request, 'paragraph_rewrite_count'),
427        ]);
428    }
429
430    public function reporting_flyengage_ai(Request $request)
431    {
432        $from = $request->fromDate ? Carbon::parse($request->fromDate)->startOfDay() : null;
433        $to = $request->toDate ? Carbon::parse($request->toDate)->endOfDay() : null;
434
435        $data = $this->mgmtCenterReportingService->spotlight('flyengage_count', $from, $to, true);
436
437        return response()->json(data: [
438            'success' => true,
439            'data' => $data,
440        ]);
441    }
442
443    public function reporting_flyengage_ai_used_top_users(Request $request)
444    {
445        return response()->json(data: [
446            'success' => true,
447            'users' => $this->getTop5($request, 'flyengage_count'),
448        ]);
449    }
450
451    public function reporting_flypost_ai(Request $request)
452    {
453        $from = $request->fromDate ? Carbon::parse($request->fromDate)->startOfDay() : null;
454        $to = $request->toDate ? Carbon::parse($request->toDate)->endOfDay() : null;
455
456        $data = $this->mgmtCenterReportingService->spotlight('flypost_count', $from, $to, true);
457
458        return response()->json(data: [
459            'success' => true,
460            'data' => $data,
461        ]);
462    }
463
464    public function reporting_flypost_ai_used_top_users(Request $request)
465    {
466        return response()->json(data: [
467            'success' => true,
468            'users' => $this->getTop5($request, 'flypost_count'),
469        ]);
470    }
471
472    public function export_csv_report(Request $request)
473    {
474        $filters = $request->filters;
475        $users_ids = $request->users ? explode(',', $request->users) : [];
476
477        return $this->csvExportService->downloadWithUserDelimiter(
478            auth()->user(),
479            fn () => (new AllUsersReportExport($filters, $users_ids))->download('reporting-details-export.csv')
480        );
481    }
482
483    public function export_csv_report_overview()
484    {
485        $admin = auth()->user();
486
487        return $this->csvExportService->downloadWithUserDelimiter(
488            $admin,
489            fn () => (new AllUsersReportOverviewExport($admin))->download('reporting-overview-export.csv')
490        );
491    }
492
493    public function export_csv_report_usage(Request $request)
494    {
495        $admin = auth()->user();
496        $from_date = $request->fromDate;
497        $to_date = $request->toDate;
498        $user_ids = $request->user_ids ? explode(',', $request->user_ids) : [];
499        $group_ids = $request->group_ids ? explode(',', $request->group_ids) : [];
500        $subgroup_ids = $request->subgroup_ids ? explode(',', $request->subgroup_ids) : [];
501
502        return $this->csvExportService->downloadWithUserDelimiter(
503            $admin,
504            fn () => (new AllUsersReportUsageExport($admin, $from_date, $to_date, $user_ids, $group_ids, $subgroup_ids))->download('reporting-usage-export.csv')
505        );
506    }
507
508    private function getFiltersForReporting(ReportingFormRequest $request)
509    {
510        $validated = $request->validated();
511        $period = $this->getPeriod($validated['month_period'] ?? 12);
512
513        return new FindUsersOverviewFilter(
514            fromDate: ($validated['fromDate'] ?? null) ? Carbon::parse($validated['fromDate']) : $period['startDate'],
515            toDate: ($validated['toDate'] ?? null) ? Carbon::parse($validated['toDate']) : $period['endDate'],
516            userIds: array_filter(explode(',', $request->users), function ($value) {
517                return $value !== '';
518            }),
519            groupIds: array_filter(explode(',', $request->groups), function ($value) {
520                return $value !== '';
521            }),
522            subgroupIds: array_filter(explode(',', $request->subgroups), function ($value) {
523                return $value !== '';
524            }),
525            companyIds: array_filter(explode(',', $request->companies), function ($value) {
526                return $value !== '';
527            }),
528            currentRole: $request->current_role,
529            companyId: null,
530            adminGroupIds: null,
531            monthPeriod: ($validated['month_period'] ?? null),
532        );
533    }
534
535    private function getPeriod($period)
536    {
537        $endDate = Carbon::now();
538
539        return match ($period) {
540            1 => ['startDate' => Carbon::now()->subMonths(1), 'endDate' => $endDate],
541            3 => ['startDate' => Carbon::now()->subMonths(3), 'endDate' => $endDate],
542            6 => ['startDate' => Carbon::now()->subMonths(6), 'endDate' => $endDate],
543            default => ['startDate' => Carbon::now()->subMonths(12), 'endDate' => $endDate],
544        };
545    }
546}