validate([ 'role' => ['nullable', 'string'], 'status' => ['nullable', 'string'], 'tenant_id' => ['nullable', 'integer'], 'q' => ['nullable', 'string', 'max:100'], 'per_page' => ['nullable', 'integer', 'min:1', 'max:100'], ]); $perPage = (int) $request->input('per_page', 25); $users = User::query() ->with(['tenant']) ->when($request->filled('role'), fn ($q) => $q->where('role', $request->string('role'))) ->when($request->filled('status'), fn ($q) => $q->where('status', $request->string('status'))) ->when($request->filled('tenant_id'), fn ($q) => $q->where('tenant_id', $request->integer('tenant_id'))) ->when($request->filled('q'), function ($q) use ($request) { $term = '%'.$request->string('q').'%'; $q->where(function ($qq) use ($term) { $qq->where('email', 'like', $term) ->orWhere('phone', 'like', $term) ->orWhere('first_name', 'like', $term) ->orWhere('last_name', 'like', $term); }); }) ->orderByDesc('id') ->paginate($perPage); return $this->ok( SuperAdminUserResource::collection($users), null, [ 'page' => $users->currentPage(), 'per_page' => $users->perPage(), 'total' => $users->total(), 'last_page' => $users->lastPage(), ], ); } public function store(StoreSuperAdminUserRequest $request): JsonResponse { $data = $request->validated(); $user = DB::transaction(function () use ($data) { $user = User::create([ 'tenant_id' => $data['tenant_id'] ?? null, 'first_name' => $data['first_name'], 'middle_name' => $data['middle_name'] ?? null, 'last_name' => $data['last_name'], 'email' => $data['email'], 'phone' => $data['phone'], 'password' => Hash::make($data['password']), 'role' => $data['role'], 'status' => User::STATUS_PENDING, 'preferred_language' => $data['preferred_language'] ?? 'en', ]); $user->assignRole($data['role']); $profileClass = User::profileModelForRole($data['role']); if ($profileClass) { $profileClass::create(['user_id' => $user->id]); } NotificationPreference::create([ 'user_id' => $user->id, 'language' => $data['preferred_language'] ?? 'en', ]); // If store_partner, auto-create a shell store so they can access the dashboard if ($data['role'] === User::ROLE_STORE_PARTNER) { $store = PartnerStore::create([ 'tenant_id' => $user->tenant_id, 'owner_user_id' => $user->id, 'business_name' => $user->first_name."'s Store", 'status' => PartnerStore::STATUS_ACTIVE, 'commission_rate_percent' => 10, // Default 10% ]); StoreInventory::create([ 'store_id' => $store->id, 'current_code_balance' => 0, ]); } return $user; }); return $this->created( new SuperAdminUserResource($user->load(['tenant'])), 'User account created successfully in pending status' ); } public function show(User $user): JsonResponse { $user->load(['tenant']); return $this->ok(new SuperAdminUserResource($user)); } public function update(StoreSuperAdminUserRequest $request, User $user): JsonResponse { $data = $request->validated(); DB::transaction(function () use ($user, $data) { $updateData = [ 'first_name' => $data['first_name'], 'middle_name' => $data['middle_name'] ?? null, 'last_name' => $data['last_name'], 'email' => $data['email'], 'phone' => $data['phone'], 'role' => $data['role'], 'tenant_id' => $data['tenant_id'] ?? null, ]; if (! empty($data['password'])) { $updateData['password'] = Hash::make($data['password']); } $oldRole = $user->role; $user->update($updateData); if ($oldRole !== $data['role']) { $user->syncRoles([$data['role']]); // Delete old profile, create new profile if role changed $oldProfileClass = User::profileModelForRole($oldRole); if ($oldProfileClass) { $oldProfileClass::where('user_id', $user->id)->delete(); } $newProfileClass = User::profileModelForRole($data['role']); if ($newProfileClass) { $newProfileClass::create(['user_id' => $user->id]); } } }); return $this->ok(new SuperAdminUserResource($user->fresh()->load(['tenant'])), 'User updated successfully'); } public function destroy(User $user): JsonResponse { if ($user->id === auth()->id()) { return $this->fail('You cannot delete your own account.', null, 422); } $user->delete(); return $this->ok(null, 'User deleted successfully'); } }