authorizeTmsAccess('tms.drivers.view'); $business_id = $this->tmsUtil->getBusinessId(); if ($request->ajax()) { $query = Driver::where('business_id', $business_id) ->with('user:id,first_name,last_name') ->orderBy('name'); if ($request->boolean('active_only')) { $query->where('is_active', true); } return DataTables::of($query) ->addColumn('linked_user_name', function ($row) { if (! $row->user) { return '—'; } return trim($row->user->first_name.' '.($row->user->last_name ?? '')); }) ->editColumn('is_active', fn ($row) => $row->is_active ? __('tms::lang.active') : __('tms::lang.inactive')) ->addColumn('action', function ($row) { $html = '
'; if (auth()->user()->can('tms.drivers.update')) { $html .= ''; } if (auth()->user()->can('tms.drivers.delete')) { $html .= ' '; } $html .= '
'; return $html; }) ->rawColumns(['action']) ->make(true); } return view('tms::drivers.index'); } public function create() { $this->authorizeTmsAccess('tms.drivers.create'); $business_id = $this->tmsUtil->getBusinessId(); return view('tms::drivers.create', [ 'users' => $this->tmsUtil->getUsersDropdown($business_id), ]); } public function store(Request $request) { $this->authorizeTmsAccess('tms.drivers.create'); $business_id = $this->tmsUtil->getBusinessId(); $data = $request->validate([ 'name' => 'required|string|max:255', 'phone' => 'nullable|string|max:50', 'license_number' => 'nullable|string|max:100', 'user_id' => 'nullable|exists:users,id', 'contact_id' => 'nullable|exists:contacts,id', 'notes' => 'nullable|string', 'is_active' => 'sometimes|boolean', ]); Driver::create(array_merge($data, [ 'business_id' => $business_id, 'is_active' => $request->boolean('is_active', true), ])); if (! empty($data['user_id'])) { $this->assignDriverRole((int) $business_id, (int) $data['user_id']); } return $this->tmsUtil->jsonOrRedirect($request, true, __('tms::lang.driver_created')); } public function edit($id) { $this->authorizeTmsAccess('tms.drivers.update'); $business_id = $this->tmsUtil->getBusinessId(); $driver = Driver::where('business_id', $business_id)->findOrFail($id); return view('tms::drivers.edit', [ 'driver' => $driver, 'users' => $this->tmsUtil->getUsersDropdown($business_id), ]); } public function update(Request $request, $id) { $this->authorizeTmsAccess('tms.drivers.update'); $driver = Driver::where('business_id', $this->tmsUtil->getBusinessId())->findOrFail($id); $data = $request->validate([ 'name' => 'required|string|max:255', 'phone' => 'nullable|string|max:50', 'license_number' => 'nullable|string|max:100', 'user_id' => 'nullable|exists:users,id', 'contact_id' => 'nullable|exists:contacts,id', 'notes' => 'nullable|string', 'is_active' => 'sometimes|boolean', ]); $driver->update(array_merge($data, ['is_active' => $request->boolean('is_active')])); if (! empty($data['user_id'])) { $this->assignDriverRole((int) $driver->business_id, (int) $data['user_id']); } return $this->tmsUtil->jsonOrRedirect($request, true, __('tms::lang.driver_updated')); } public function destroy(Request $request, $id) { $this->authorizeTmsAccess('tms.drivers.delete'); $driver = Driver::where('business_id', $this->tmsUtil->getBusinessId())->findOrFail($id); $driver->delete(); return $this->tmsUtil->jsonOrRedirect($request, true, __('tms::lang.driver_deleted')); } protected function assignDriverRole(int $business_id, int $user_id): void { $roleName = 'Tms Driver#'.$business_id; $role = Role::firstOrCreate([ 'name' => $roleName, 'business_id' => $business_id, 'guard_name' => 'web', ], []); $permissions = ['tms.tracking.report', 'tms.shipments.view']; foreach ($permissions as $perm) { \Spatie\Permission\Models\Permission::firstOrCreate(['name' => $perm, 'guard_name' => 'web']); } if ($role->permissions->isEmpty()) { $role->syncPermissions($permissions); } $user = \App\User::find($user_id); if ($user && ! $user->hasRole($roleName)) { $user->assignRole($role); } } }