Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 163
0.00% covered (danger)
0.00%
0 / 12
CRAP
0.00% covered (danger)
0.00%
0 / 1
ClientManagementCompaniesController
0.00% covered (danger)
0.00%
0 / 163
0.00% covered (danger)
0.00%
0 / 12
930
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
 companies_filter
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
2
 companies
0.00% covered (danger)
0.00%
0 / 12
0.00% covered (danger)
0.00%
0 / 1
12
 addCompany
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
2
 validatePOCEmail
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
6
 companyUsers
0.00% covered (danger)
0.00%
0 / 40
0.00% covered (danger)
0.00%
0 / 1
56
 companyGroups
0.00% covered (danger)
0.00%
0 / 14
0.00% covered (danger)
0.00%
0 / 1
12
 companyPocs
0.00% covered (danger)
0.00%
0 / 13
0.00% covered (danger)
0.00%
0 / 1
12
 companyGroupUsers
0.00% covered (danger)
0.00%
0 / 32
0.00% covered (danger)
0.00%
0 / 1
6
 deactivateCompany
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
6
 reactivateCompany
0.00% covered (danger)
0.00%
0 / 15
0.00% covered (danger)
0.00%
0 / 1
12
 exportCompaniesCsv
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2
3namespace App\Http\Controllers\v1\AdminPortal;
4
5use App\Exports\CompaniesExport;
6use App\Http\Controllers\Controller;
7use App\Http\Models\Admin\AdminUserInvitation;
8use App\Http\Models\Admin\Company;
9use App\Http\Models\Admin\CompanyGroup;
10use App\Http\Models\Admin\CompanyPOC;
11use App\Http\Models\Auth\Role;
12use App\Http\Models\Auth\User;
13use App\Http\Models\Auth\UserRole;
14use App\Http\Requests\CreateCompanyRequest;
15use App\Http\Requests\DeactivateCompaniesFormRequest;
16use App\Http\Requests\ValidatePOCEmailRequest;
17use App\Http\Resources\ClientManagementCompanyPocsResource;
18use App\Http\Resources\ClientManagementGroupResource;
19use App\Http\Resources\ClientManagementUserResource;
20use App\Http\Resources\CompanyResource;
21use App\Http\Services\Admin\Companies\CompanyService;
22use App\Http\Services\ClientManagementUsersService;
23use App\Http\Services\CsvExportService;
24use Illuminate\Http\JsonResponse;
25use Illuminate\Http\Request;
26use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
27
28class ClientManagementCompaniesController extends Controller
29{
30    public function __construct(
31        private CompanyService $companyService,
32        public ClientManagementUsersService $clientManagementUsersService,
33        private CsvExportService $csvExportService,
34    ) {}
35
36    public function companies_filter(): JsonResponse
37    {
38        $data = $this->clientManagementUsersService->getFiltersForReportings();
39
40        return response()->json([
41            'data' => $data,
42            'success' => true,
43        ]);
44    }
45
46    public function companies(Request $request): JsonResponse
47    {
48        $deactivated = $request->has('deactivated') && $request->deactivated == 'true';
49
50        $companiesQuery = Company::with(['licenses' => function ($query) {
51            $query->active();
52        }, 'groupsAndSubgroups' => function ($query) {
53            $query->whereNull('parent_id')->with('subgroups');
54        }]);
55
56        $companiesQuery = $companiesQuery->where('deactivated_at', $deactivated ? '!=' : '=', null);
57
58        $companies = $companiesQuery->orderBy('name')->get();
59
60        return response()->json([
61            'data' => CompanyResource::collection($companies),
62            'success' => true,
63        ]);
64    }
65
66    public function addCompany(CreateCompanyRequest $request): JsonResponse
67    {
68        $data = $request->validated();
69
70        $company = $this->companyService->addCompany($data);
71
72        return response()->json([
73            'success' => true,
74            'message' => 'New company added',
75            'data' => new CompanyResource($company),
76        ]);
77    }
78
79    public function validatePOCEmail(ValidatePOCEmailRequest $request): JsonResponse
80    {
81        $data = $request->validated();
82
83        $belongToAnotherCompany = User::where('email', $data['email'])->whereNotNull('company_id')->exists();
84
85        if ($belongToAnotherCompany) {
86            return response()->json([
87                'success' => false,
88                'message' => $data['email'].' is already associated with another company',
89            ]);
90        }
91
92        return response()->json([
93            'success' => true,
94            'message' => $data['email'].' is a valid email',
95        ]);
96    }
97
98    public function companyUsers(Request $request): JsonResponse
99    {
100        $onlyAdmins = $request->has('load_admins_only') && $request->load_admins_only == 'true';
101
102        $company = Company::firstWhere('slug', $request->slug);
103        $usersQuery = User::query()->where('company_id', $company->id);
104
105        if ($onlyAdmins) {
106            $roleIds = Role::whereIn('name', [
107                Role::VENGRESO_ADMIN,
108                Role::GLOBAL_ADMIN,
109                Role::GROUP_ADMIN,
110                Role::REPORTING_ADMIN,
111            ])->pluck('_id')->all();
112
113            $userIds = UserRole::whereIn('role_id', $roleIds)
114                ->pluck('user_id')
115                ->unique();
116
117            $usersQuery = $usersQuery->whereIn('_id', $userIds);
118        }
119
120        $users = $usersQuery->get();
121
122        $invitationsQuery = AdminUserInvitation::where('company_id', $company->id)->whereNotIn('email', $users->pluck('email'));
123
124        if ($onlyAdmins) {
125            $invitationsQuery = $invitationsQuery->whereIn('role_name', [
126                Role::REPORTING_ADMIN,
127                Role::GROUP_ADMIN,
128                Role::GLOBAL_ADMIN,
129                Role::VENGRESO_ADMIN,
130            ]);
131        }
132
133        $invitations = $invitationsQuery->get();
134
135        if ($onlyAdmins) {
136            foreach ($invitations as $key => $invitation) {
137                $user = User::where('email', $invitation->email)->first();
138
139                if ($user) {
140                    $invitations->forget($key);
141                    $user->role_name = $invitation->role_name;
142                    $users->push($user);
143                }
144            }
145        }
146
147        $users = $users->concat($invitations)->sortByDesc('created_at');
148
149        return response()->json([
150            'success' => true,
151            'data' => [
152                'users' => ClientManagementUserResource::collection($users),
153                'company_slug' => $company->slug,
154                'company_name' => $company->name,
155            ],
156        ]);
157    }
158
159    public function companyGroups(Request $request): JsonResponse
160    {
161        $company = Company::firstWhere('slug', $request->slug);
162
163        if (empty($company)) {
164            throw new \Exception('Company not found');
165        }
166
167        $groups = CompanyGroup::whereNull('parent_id')
168            ->where('company_id', $company->id)
169            ->with(['subgroups'])->get();
170
171        return response()->json([
172            'success' => true,
173            'data' => [
174                'groups' => filled($groups) ? ClientManagementGroupResource::collection($groups) : [],
175                'company_slug' => $company->slug,
176                'company_name' => $company->name,
177            ],
178        ]);
179    }
180
181    public function companyPocs(Request $request): JsonResponse
182    {
183        $company = Company::firstWhere('slug', $request->slug);
184
185        if (empty($company)) {
186            throw new NotFoundHttpException('Company not found');
187        }
188
189        $pocs = CompanyPOC::where('company_id', $company->id)
190            ->with(['user'])->get();
191
192        return response()->json([
193            'success' => true,
194            'data' => [
195                'pocs' => filled($pocs) ? ClientManagementCompanyPocsResource::collection($pocs) : [],
196                'company_slug' => $company->slug,
197                'company_name' => $company->name,
198            ],
199        ]);
200    }
201
202    public function companyGroupUsers(Request $request): JsonResponse
203    {
204        $company = Company::firstWhere('slug', $request->company_slug);
205
206        $group = CompanyGroup::where('company_id', $company->id)->whereRaw([
207            '$expr' => [
208                '$eq' => [
209                    $request->group_slug,
210                    [
211                        '$toLower' => [
212                            '$replaceAll' => [
213                                'input' => '$name',
214                                'find' => ' ',
215                                'replacement' => '-',
216                            ],
217                        ],
218                    ],
219                ],
220            ],
221        ])->with(['subgroups'])->first();
222
223        return response()->json([
224            'success' => true,
225            'data' => [
226                'group' => filled($group) ? [
227                    'id' => $group->id,
228                    'name' => $group->name,
229                    'slug' => $group->slug,
230                    'members' => $group->users->count(),
231                    'subgroups' => ClientManagementGroupResource::collection($group->subgroups),
232                    'users' => ClientManagementUserResource::collection($group->users),
233                ] : [],
234                'company_slug' => $company->slug,
235                'company_name' => $company->name,
236            ],
237        ]);
238    }
239
240    public function deactivateCompany(DeactivateCompaniesFormRequest $request): JsonResponse
241    {
242        $data = $request->validated();
243
244        $companyIds = $data['company_ids'];
245
246        $this->companyService->deactivateCompanies($companyIds, auth()->user()->id);
247
248        return response()->json([
249            'success' => true,
250            'message' => 'Compan'.count($companyIds) > 1 ? 'ies' : 'y'.'deactivated successfully',
251        ]);
252    }
253
254    public function reactivateCompany(Request $request): JsonResponse
255    {
256        $request->validate([
257            'company_ids' => 'required|array|min:1',
258            'company_ids.*' => 'required|exists:companies,_id',
259        ]);
260
261        $companyIds = $request->company_ids;
262
263        // $users = User::withTrashed()->whereIn('company_id', $companyIds)->get();
264
265        // so observer can trigger
266        // foreach ($users as $user) {
267        // $user->restore();
268        // }
269
270        $companies = Company::withTrashed()->whereIn('_id', $companyIds)->get();
271
272        foreach ($companies as $company) {
273            $company->restore();
274            $company->unset('deactivated_at');
275            $company->unset('deleted_at');
276            $company->save();
277        }
278
279        return response()->json([
280            'success' => true,
281            'message' => 'Compan'.count($companyIds) > 1 ? 'ies' : 'y'.'reactivated successfully',
282        ]);
283    }
284
285    public function exportCompaniesCsv(Request $request)
286    {
287        $companyIds = $request->company_ids ? explode(',', $request->company_ids) : [];
288        $deactivated = $request->deactivated == 'true';
289
290        return $this->csvExportService->downloadWithUserDelimiter(
291            auth()->user(),
292            fn () => (new CompaniesExport($companyIds, $deactivated))->download('Companies.csv')
293        );
294    }
295}