139 lines
5.1 KiB
PHP
139 lines
5.1 KiB
PHP
<?php
|
|
|
|
namespace Modules\ManagementTools\Http\Controllers;
|
|
|
|
use App\User;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Routing\Controller;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Modules\ManagementTools\Entities\MtUserReportSetting;
|
|
use Modules\ManagementTools\Utils\ManagementToolsUtil;
|
|
|
|
class TeamController extends Controller
|
|
{
|
|
protected $mtUtil;
|
|
|
|
public function __construct(ManagementToolsUtil $mtUtil)
|
|
{
|
|
$this->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]
|
|
);
|
|
}
|
|
}
|