ultimatepos/Modules/ManagementTools/Http/Controllers/TeamController.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]
);
}
}