mtUtil = $mtUtil; } protected function authorizeAccess() { if (! auth()->user()->can('managementtools.access') || ! auth()->user()->can('managementtools.team_view')) { abort(403, 'Unauthorized action.'); } } public function index(Request $request) { $this->authorizeAccess(); $business_id = (int) $request->session()->get('user.business_id'); $users = User::where('business_id', $business_id) ->user() ->where('allow_login', 1) ->orderBy('first_name') ->get(['id', 'first_name', 'last_name', 'surname', 'email']); $user_skills = DB::table('mt_user_skill as us') ->join('mt_skills as s', 's.id', '=', 'us.skill_id') ->where('us.business_id', $business_id) ->select('us.user_id', 's.title', 'us.skill_level') ->get() ->groupBy('user_id'); $user_tools = DB::table('mt_user_tool as ut') ->join('mt_tools as t', 't.id', '=', 'ut.tool_id') ->where('ut.business_id', $business_id) ->select('ut.user_id', 't.title') ->get() ->groupBy('user_id'); $report_settings = MtUserReportSetting::where('business_id', $business_id) ->get() ->keyBy('user_id'); $skills = $this->mtUtil->getSkillsDropdown($business_id); $tools = $this->mtUtil->getToolsDropdown($business_id); return view('managementtools::team.index', compact('users', 'skills', 'tools', 'user_skills', 'user_tools', 'report_settings')); } public function edit($user_id) { $this->authorizeAccess(); $business_id = (int) request()->session()->get('user.business_id'); $user = User::where('business_id', $business_id)->where('id', $user_id)->firstOrFail(); $assigned_skills = $this->mtUtil->getUserAssignedSkills($business_id, (int) $user_id); $assigned_tools = DB::table('mt_user_tool') ->where('business_id', $business_id) ->where('user_id', $user_id) ->pluck('tool_id') ->toArray(); $skills = $this->mtUtil->getSkillsDropdown($business_id); $tools = $this->mtUtil->getToolsDropdown($business_id); $report_setting = MtUserReportSetting::resolveForUser($business_id, (int) $user_id); $report_modes = MtUserReportSetting::modes(); return view('managementtools::team.edit', compact('user', 'skills', 'tools', 'assigned_skills', 'assigned_tools', 'report_setting', 'report_modes')); } public function update(Request $request, $user_id) { $this->authorizeAccess(); $business_id = (int) $request->session()->get('user.business_id'); User::where('business_id', $business_id)->where('id', $user_id)->firstOrFail(); $request->validate([ 'skills' => 'nullable|array', 'skills.*' => 'integer|exists:mt_skills,id', 'skill_levels' => 'nullable|array', 'tools' => 'nullable|array', 'tools.*' => 'integer|exists:mt_tools,id', 'report_mode' => 'required|in:'.implode(',', array_keys(MtUserReportSetting::modes())), 'interval_minutes' => 'nullable|integer|min:1|max:1440', ]); $this->syncAssignments($request, $business_id, (int) $user_id); $this->syncReportSettings($request, $business_id, (int) $user_id); return response()->json(['success' => true, 'msg' => __('managementtools::lang.team_updated')]); } protected function syncAssignments(Request $request, int $business_id, int $user_id): void { $this->mtUtil->syncUserSkills( $business_id, $user_id, $request->input('skills', []), $request->input('skill_levels', []) ); $this->mtUtil->syncUserTools($business_id, $user_id, $request->input('tools', [])); } protected function syncReportSettings(Request $request, int $business_id, int $user_id): void { $mode = $request->input('report_mode', MtUserReportSetting::MODE_QUARTER); $minutes = (int) $request->input('interval_minutes', 15); if ($mode === MtUserReportSetting::MODE_HOURLY) { $minutes = 60; } elseif ($mode === MtUserReportSetting::MODE_QUARTER) { $minutes = 15; } elseif ($mode === MtUserReportSetting::MODE_GPS) { $minutes = 1; } elseif ($mode !== MtUserReportSetting::MODE_CUSTOM) { $minutes = 15; } MtUserReportSetting::updateOrCreate( ['business_id' => $business_id, 'user_id' => $user_id], ['report_mode' => $mode, 'interval_minutes' => $minutes] ); } }