Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
0.00% |
0 / 160 |
|
0.00% |
0 / 12 |
CRAP | |
0.00% |
0 / 1 |
ClientManagementCompaniesController | |
0.00% |
0 / 160 |
|
0.00% |
0 / 12 |
930 | |
0.00% |
0 / 1 |
__construct | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
2 | |||
companies_filter | |
0.00% |
0 / 5 |
|
0.00% |
0 / 1 |
2 | |||
companies | |
0.00% |
0 / 12 |
|
0.00% |
0 / 1 |
12 | |||
addCompany | |
0.00% |
0 / 7 |
|
0.00% |
0 / 1 |
2 | |||
validatePOCEmail | |
0.00% |
0 / 11 |
|
0.00% |
0 / 1 |
6 | |||
companyUsers | |
0.00% |
0 / 40 |
|
0.00% |
0 / 1 |
56 | |||
companyGroups | |
0.00% |
0 / 14 |
|
0.00% |
0 / 1 |
12 | |||
companyPocs | |
0.00% |
0 / 13 |
|
0.00% |
0 / 1 |
12 | |||
companyGroupUsers | |
0.00% |
0 / 32 |
|
0.00% |
0 / 1 |
6 | |||
deactivateCompany | |
0.00% |
0 / 7 |
|
0.00% |
0 / 1 |
6 | |||
reactivateCompany | |
0.00% |
0 / 15 |
|
0.00% |
0 / 1 |
12 | |||
exportCompaniesCsv | |
0.00% |
0 / 3 |
|
0.00% |
0 / 1 |
6 |
1 | <?php |
2 | |
3 | namespace App\Http\Controllers\v1\AdminPortal; |
4 | |
5 | use App\Http\Models\Plans; |
6 | use Illuminate\Http\Request; |
7 | use App\Helpers\FlyMSGLogger; |
8 | use App\Http\Models\Auth\Role; |
9 | use App\Http\Models\Auth\User; |
10 | use Illuminate\Validation\Rule; |
11 | use App\Exports\CompaniesExport; |
12 | use Illuminate\Http\JsonResponse; |
13 | use App\Http\Models\Admin\Company; |
14 | use App\Http\Models\Auth\UserRole; |
15 | use App\Http\Resources\CompanyInfo; |
16 | use App\Http\Controllers\Controller; |
17 | use App\Http\Models\Admin\CompanyGroup; |
18 | use App\Http\Resources\CompanyResource; |
19 | use App\Http\Models\Admin\CompanyLicenses; |
20 | use App\Http\Models\Admin\AdminUserInvitation; |
21 | use App\Http\Requests\CreateCompanyRequest; |
22 | use Illuminate\Validation\ValidationException; |
23 | use App\Http\Resources\ClientManagementUserResource; |
24 | use App\Http\Resources\ClientManagementGroupResource; |
25 | use App\Http\Models\Admin\CompanyPOC; |
26 | use App\Http\Requests\DeactivateCompaniesFormRequest; |
27 | use App\Http\Requests\ValidatePOCEmailRequest; |
28 | use App\Http\Resources\ClientManagementCompanyPocsResource; |
29 | use App\Http\Services\Admin\Companies\CompanyService; |
30 | use App\Http\Services\ClientManagementUsersService; |
31 | use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; |
32 | use Illuminate\Support\Str; |
33 | |
34 | class 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 | } |