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