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 | } |