From 64d649be7fa5a52e770fcb70dddb4a2f69b23d36 Mon Sep 17 00:00:00 2001 From: Daniel Meltzer Date: Tue, 24 Jul 2018 22:35:26 -0400 Subject: [PATCH] Monster: Cleanup/Refactor http controllers. (#5916) * Extract a handlesimages trait to centralize logic for parsing/storing images on upload in create/edit methods. * Use same image upload/layout in accessories as consum+components. * Monster: Cleanup/Refactor http controllers. This cleans up docblocks, pulls most non-crudy actions into their own controllers, and does general cleanup/logic refactoring. There /should/ be no functional changes, but we all know how should works.. Extract checkin/checkout functions to a separate controller for accessories. Move controllers to subdirectory. Cleanup AssetModelsController Extract component checkin/checkout Assorted cleanups/doc/formatting in controllers. Refactor LicenseController. Refactor UsersController Update viewassetscontroller. * Codacy cleanups * More codacy cleanups. Extract a LicenseCheckout Form request as well. * A bit more refactor/cleaning of the license checkout method. * Review Related Cleanups * Fix most of the item_not_found translations. In many cases, the string being generated did not even use the id parameter. Where it does, pass it as id instead of as a different value. * Remove some old $data arrays from when we manually sent emails from the controllers. This has been superseeded by the notification system (yay!) * Bugfix: Only log the checkin of an accessory if the checkin completes sucessfully. --- .../Accessories/AccessoriesController.php | 198 ++++++ .../AccessoryCheckinController.php | 71 ++ .../AccessoryCheckoutController.php | 87 +++ .../Controllers/AccessoriesController.php | 400 ----------- app/Http/Controllers/Api/AssetsController.php | 6 +- .../Controllers/Api/ConsumablesController.php | 2 +- .../Controllers/AssetModelsController.php | 363 +++------- .../{ => Assets}/AssetCheckinController.php | 38 +- .../{ => Assets}/AssetCheckoutController.php | 4 +- .../{ => Assets}/AssetFilesController.php | 41 +- .../{ => Assets}/AssetsController.php | 12 +- .../{ => Assets}/BulkAssetsController.php | 12 +- .../Controllers/BulkAssetModelsController.php | 138 ++++ app/Http/Controllers/CategoriesController.php | 147 ++-- app/Http/Controllers/CheckInOutRequest.php | 1 + app/Http/Controllers/CompaniesController.php | 135 ++-- .../Components/ComponentCheckinController.php | 111 +++ .../ComponentCheckoutController.php | 92 +++ .../Components/ComponentsController.php | 188 +++++ app/Http/Controllers/ComponentsController.php | 397 ----------- .../ConsumableCheckoutController.php | 76 ++ .../Consumables/ConsumablesController.php | 197 ++++++ .../Controllers/ConsumablesController.php | 286 -------- .../Controllers/CustomFieldsController.php | 126 ++-- .../Controllers/CustomFieldsetsController.php | 108 +-- .../Controllers/DepartmentsController.php | 70 +- .../Controllers/DepreciationsController.php | 56 +- app/Http/Controllers/GroupsController.php | 28 +- app/Http/Controllers/ImportsController.php | 8 +- .../Licenses/LicenseCheckinController.php | 102 +++ .../Licenses/LicenseCheckoutController.php | 110 +++ .../Licenses/LicenseFilesController.php | 146 ++++ .../Licenses/LicensesController.php | 273 ++++++++ app/Http/Controllers/LicensesController.php | 649 ------------------ app/Http/Controllers/LocationsController.php | 168 ++--- .../Controllers/ManufacturersController.php | 148 ++-- .../Controllers/StatuslabelsController.php | 36 +- app/Http/Controllers/SuppliersController.php | 74 +- .../Controllers/Users/BulkUsersController.php | 204 ++++++ .../Users/LDAPImportController.php | 61 ++ .../Controllers/Users/UserFilesController.php | 130 ++++ .../{ => Users}/UsersController.php | 582 +++------------- app/Http/Controllers/ViewAssetsController.php | 91 ++- app/Http/Requests/AssetFileRequest.php | 8 +- app/Http/Requests/ImageUploadRequest.php | 44 +- app/Http/Requests/LicenseCheckoutRequest.php | 53 ++ app/Models/LicenseSeat.php | 2 + .../CheckoutConsumableNotification.php | 2 + .../lang/en/admin/accessories/message.php | 2 +- resources/views/accessories/edit.blade.php | 21 +- resources/views/users/view.blade.php | 15 +- routes/web.php | 7 - routes/web/accessories.php | 10 +- routes/web/components.php | 10 +- routes/web/consumables.php | 6 +- routes/web/hardware.php | 54 +- routes/web/licenses.php | 21 +- routes/web/models.php | 6 +- routes/web/users.php | 30 +- 59 files changed, 3098 insertions(+), 3365 deletions(-) create mode 100755 app/Http/Controllers/Accessories/AccessoriesController.php create mode 100644 app/Http/Controllers/Accessories/AccessoryCheckinController.php create mode 100644 app/Http/Controllers/Accessories/AccessoryCheckoutController.php delete mode 100755 app/Http/Controllers/AccessoriesController.php rename app/Http/Controllers/{ => Assets}/AssetCheckinController.php (72%) rename app/Http/Controllers/{ => Assets}/AssetCheckoutController.php (97%) rename app/Http/Controllers/{ => Assets}/AssetFilesController.php (85%) rename app/Http/Controllers/{ => Assets}/AssetsController.php (99%) rename app/Http/Controllers/{ => Assets}/BulkAssetsController.php (96%) create mode 100644 app/Http/Controllers/BulkAssetModelsController.php create mode 100644 app/Http/Controllers/Components/ComponentCheckinController.php create mode 100644 app/Http/Controllers/Components/ComponentCheckoutController.php create mode 100644 app/Http/Controllers/Components/ComponentsController.php delete mode 100644 app/Http/Controllers/ComponentsController.php create mode 100644 app/Http/Controllers/Consumables/ConsumableCheckoutController.php create mode 100644 app/Http/Controllers/Consumables/ConsumablesController.php delete mode 100644 app/Http/Controllers/ConsumablesController.php create mode 100644 app/Http/Controllers/Licenses/LicenseCheckinController.php create mode 100644 app/Http/Controllers/Licenses/LicenseCheckoutController.php create mode 100644 app/Http/Controllers/Licenses/LicenseFilesController.php create mode 100755 app/Http/Controllers/Licenses/LicensesController.php delete mode 100755 app/Http/Controllers/LicensesController.php create mode 100644 app/Http/Controllers/Users/BulkUsersController.php create mode 100644 app/Http/Controllers/Users/LDAPImportController.php create mode 100644 app/Http/Controllers/Users/UserFilesController.php rename app/Http/Controllers/{ => Users}/UsersController.php (50%) create mode 100644 app/Http/Requests/LicenseCheckoutRequest.php diff --git a/app/Http/Controllers/Accessories/AccessoriesController.php b/app/Http/Controllers/Accessories/AccessoriesController.php new file mode 100755 index 0000000000..53cceb46ac --- /dev/null +++ b/app/Http/Controllers/Accessories/AccessoriesController.php @@ -0,0 +1,198 @@ +] + * @see AccessoriesController::getDatatable() method that generates the JSON response + * @since [v1.0] + * @return View + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function index() + { + $this->authorize('index', Accessory::class); + return view('accessories/index'); + } + + + /** + * Returns a view with a form to create a new Accessory. + * + * @author [A. Gianotto] [] + * @return View + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function create() + { + $this->authorize('create', Accessory::class); + $category_type = 'accessory'; + return view('accessories/edit')->with('category_type', $category_type) + ->with('item', new Accessory); + } + + + /** + * Validate and save new Accessory from form post + * + * @author [A. Gianotto] [] + * @param ImageUploadRequest $request + * @return Redirect + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function store(ImageUploadRequest $request) + { + $this->authorize(Accessory::class); + // create a new model instance + $accessory = new Accessory(); + + // Update the accessory data + $accessory->name = request('name'); + $accessory->category_id = request('category_id'); + $accessory->location_id = request('location_id'); + $accessory->min_amt = request('min_amt'); + $accessory->company_id = Company::getIdForCurrentUser(request('company_id')); + $accessory->order_number = request('order_number'); + $accessory->manufacturer_id = request('manufacturer_id'); + $accessory->model_number = request('model_number'); + $accessory->purchase_date = request('purchase_date'); + $accessory->purchase_cost = Helper::ParseFloat(request('purchase_cost')); + $accessory->qty = request('qty'); + $accessory->user_id = Auth::user()->id; + $accessory->supplier_id = request('supplier_id'); + + $accessory = $request->handleImages($accessory); + + // Was the accessory created? + if ($accessory->save()) { + // Redirect to the new accessory page + return redirect()->route('accessories.index')->with('success', trans('admin/accessories/message.create.success')); + } + return redirect()->back()->withInput()->withErrors($accessory->getErrors()); + } + + /** + * Return view for the Accessory update form, prepopulated with existing data + * + * @author [A. Gianotto] [] + * @param int $accessoryId + * @return View + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function edit($accessoryId = null) + { + + if ($item = Accessory::find($accessoryId)) { + $this->authorize($item); + return view('accessories/edit', compact('item'))->with('category_type', 'accessory'); + } + + return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.does_not_exist')); + + } + + + /** + * Save edited Accessory from form post + * + * @author [A. Gianotto] [] + * @param ImageUploadRequest $request + * @param int $accessoryId + * @return Redirect + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function update(ImageUploadRequest $request, $accessoryId = null) + { + if (is_null($accessory = Accessory::find($accessoryId))) { + return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.does_not_exist')); + } + + $this->authorize($accessory); + + // Update the accessory data + $accessory->name = request('name'); + $accessory->location_id = request('location_id'); + $accessory->min_amt = request('min_amt'); + $accessory->category_id = request('category_id'); + $accessory->company_id = Company::getIdForCurrentUser(request('company_id')); + $accessory->manufacturer_id = request('manufacturer_id'); + $accessory->order_number = request('order_number'); + $accessory->model_number = request('model_number'); + $accessory->purchase_date = request('purchase_date'); + $accessory->purchase_cost = request('purchase_cost'); + $accessory->qty = request('qty'); + $accessory->supplier_id = request('supplier_id'); + + $accessory = $request->handleImages($accessory); + + // Was the accessory updated? + if ($accessory->save()) { + return redirect()->route('accessories.index')->with('success', trans('admin/accessories/message.update.success')); + } + return redirect()->back()->withInput()->withErrors($accessory->getErrors()); + } + + /** + * Delete the given accessory. + * + * @author [A. Gianotto] [] + * @param int $accessoryId + * @return Redirect + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function destroy($accessoryId) + { + if (is_null($accessory = Accessory::find($accessoryId))) { + return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.not_found')); + } + + $this->authorize($accessory); + + + if ($accessory->hasUsers() > 0) { + return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.assoc_users', array('count'=> $accessory->hasUsers()))); + } + $accessory->delete(); + return redirect()->route('accessories.index')->with('success', trans('admin/accessories/message.delete.success')); + } + + + /** + * Returns a view that invokes the ajax table which contains + * the content for the accessory detail view, which is generated in getDataView. + * + * @author [A. Gianotto] [] + * @param int $accessoryID + * @see AccessoriesController::getDataView() method that generates the JSON response + * @since [v1.0] + * @return View + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function show($accessoryID = null) + { + $accessory = Accessory::find($accessoryID); + $this->authorize('view', $accessory); + if (isset($accessory->id)) { + return view('accessories/view', compact('accessory')); + } + return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.does_not_exist', ['id' => $accessoryID])); + } +} diff --git a/app/Http/Controllers/Accessories/AccessoryCheckinController.php b/app/Http/Controllers/Accessories/AccessoryCheckinController.php new file mode 100644 index 0000000000..83d59ab774 --- /dev/null +++ b/app/Http/Controllers/Accessories/AccessoryCheckinController.php @@ -0,0 +1,71 @@ +] + * @param Request $request + * @param integer $accessoryUserId + * @param string $backto + * @return View + * @internal param int $accessoryId + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function create($accessoryUserId = null, $backto = null) + { + // Check if the accessory exists + if (is_null($accessory_user = DB::table('accessories_users')->find($accessoryUserId))) { + // Redirect to the accessory management page with error + return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.not_found')); + } + + $accessory = Accessory::find($accessory_user->accessory_id); + $this->authorize('checkin', $accessory); + return view('accessories/checkin', compact('accessory'))->with('backto', $backto); + } + + /** + * Check in the item so that it can be checked out again to someone else + * + * @uses Accessory::checkin_email() to determine if an email can and should be sent + * @author [A. Gianotto] [] + * @param null $accessoryUserId + * @param string $backto + * @return Redirect + * @throws \Illuminate\Auth\Access\AuthorizationException + * @internal param int $accessoryId + */ + public function store($accessoryUserId = null, $backto = null) + { + // Check if the accessory exists + if (is_null($accessory_user = DB::table('accessories_users')->find($accessoryUserId))) { + // Redirect to the accessory management page with error + return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.does_not_exist')); + } + + $accessory = Accessory::find($accessory_user->accessory_id); + + $this->authorize('checkin', $accessory); + + // Was the accessory updated? + if (DB::table('accessories_users')->where('id', '=', $accessory_user->id)->delete()) { + $return_to = e($accessory_user->assigned_to); + $accessory->logCheckin(User::find($return_to), e(Input::get('note'))); + + return redirect()->route("accessories.show", $accessory->id)->with('success', trans('admin/accessories/message.checkin.success')); + } + // Redirect to the accessory management page with error + return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.checkin.error')); + } +} diff --git a/app/Http/Controllers/Accessories/AccessoryCheckoutController.php b/app/Http/Controllers/Accessories/AccessoryCheckoutController.php new file mode 100644 index 0000000000..50c174f0c1 --- /dev/null +++ b/app/Http/Controllers/Accessories/AccessoryCheckoutController.php @@ -0,0 +1,87 @@ +] + * @param int $accessoryId + * @return View + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function create($accessoryId) + { + // Check if the accessory exists + if (is_null($accessory = Accessory::find($accessoryId))) { + // Redirect to the accessory management page with error + return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.not_found')); + } + + if ($accessory->category) { + + $this->authorize('checkout', $accessory); + + // Get the dropdown of users and then pass it to the checkout view + return view('accessories/checkout', compact('accessory')); + } + + return redirect()->back()->with('error', 'The category type for this accessory is not valid. Edit the accessory and select a valid accessory category.'); + } + + /** + * Save the Accessory checkout information. + * + * If Slack is enabled and/or asset acceptance is enabled, it will also + * trigger a Slack message and send an email. + * + * @author [A. Gianotto] [] + * @param Request $request + * @param int $accessoryId + * @return Redirect + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function store(Request $request, $accessoryId) + { + // Check if the accessory exists + if (is_null($accessory = Accessory::find($accessoryId))) { + // Redirect to the accessory management page with error + return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.user_not_found')); + } + + $this->authorize('checkout', $accessory); + + if (!$user = User::find(Input::get('assigned_to'))) { + return redirect()->route('checkout/accessory', $accessory->id)->with('error', trans('admin/accessories/message.checkout.user_does_not_exist')); + } + + // Update the accessory data + $accessory->assigned_to = e(Input::get('assigned_to')); + + $accessory->users()->attach($accessory->id, [ + 'accessory_id' => $accessory->id, + 'created_at' => Carbon::now(), + 'user_id' => Auth::id(), + 'assigned_to' => $request->get('assigned_to') + ]); + + $accessory->logCheckout(e(Input::get('note')), $user); + + DB::table('accessories_users')->where('assigned_to', '=', $accessory->assigned_to)->where('accessory_id', '=', $accessory->id)->first(); + + // Redirect to the new accessory page + return redirect()->route('accessories.index')->with('success', trans('admin/accessories/message.checkout.success')); + } +} diff --git a/app/Http/Controllers/AccessoriesController.php b/app/Http/Controllers/AccessoriesController.php deleted file mode 100755 index c98b739ab0..0000000000 --- a/app/Http/Controllers/AccessoriesController.php +++ /dev/null @@ -1,400 +0,0 @@ -] - * @see AccessoriesController::getDatatable() method that generates the JSON response - * @since [v1.0] - * @return View - */ - public function index(Request $request) - { - $this->authorize('index', Accessory::class); - return view('accessories/index'); - } - - - /** - * Returns a view with a form to create a new Accessory. - * - * @author [A. Gianotto] [] - * @return View - */ - public function create(Request $request) - { - $this->authorize('create', Accessory::class); - $category_type = 'accessory'; - return view('accessories/edit')->with('category_type', $category_type) - ->with('item', new Accessory); - } - - - /** - * Validate and save new Accessory from form post - * - * @author [A. Gianotto] [] - * @return Redirect - */ - public function store(ImageUploadRequest $request) - { - $this->authorize(Accessory::class); - // create a new model instance - $accessory = new Accessory(); - - // Update the accessory data - $accessory->name = request('name'); - $accessory->category_id = request('category_id'); - $accessory->location_id = request('location_id'); - $accessory->min_amt = request('min_amt'); - $accessory->company_id = Company::getIdForCurrentUser(request('company_id')); - $accessory->order_number = request('order_number'); - $accessory->manufacturer_id = request('manufacturer_id'); - $accessory->model_number = request('model_number'); - $accessory->purchase_date = request('purchase_date'); - $accessory->purchase_cost = Helper::ParseFloat(request('purchase_cost')); - $accessory->qty = request('qty'); - $accessory->user_id = Auth::user()->id; - $accessory->supplier_id = request('supplier_id'); - - if ($request->hasFile('image')) { - - if (!config('app.lock_passwords')) { - $image = $request->file('image'); - $ext = $image->getClientOriginalExtension(); - $file_name = "accessory-".str_random(18).'.'.$ext; - $path = public_path('/uploads/accessories'); - if ($image->getClientOriginalExtension()!='svg') { - Image::make($image->getRealPath())->resize(null, 250, function ($constraint) { - $constraint->aspectRatio(); - $constraint->upsize(); - })->save($path.'/'.$file_name); - } else { - $image->move($path, $file_name); - } - $accessory->image = $file_name; - } - } - - - - // Was the accessory created? - if ($accessory->save()) { - // Redirect to the new accessory page - return redirect()->route('accessories.index')->with('success', trans('admin/accessories/message.create.success')); - } - return redirect()->back()->withInput()->withErrors($accessory->getErrors()); - } - - /** - * Return view for the Accessory update form, prepopulated with existing data - * - * @author [A. Gianotto] [] - * @param int $accessoryId - * @return View - */ - public function edit(Request $request, $accessoryId = null) - { - - if ($item = Accessory::find($accessoryId)) { - $this->authorize($item); - $category_type = 'accessory'; - return view('accessories/edit', compact('item'))->with('category_type', $category_type); - } - - return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.does_not_exist')); - - } - - - /** - * Save edited Accessory from form post - * - * @author [A. Gianotto] [] - * @param int $accessoryId - * @return Redirect - */ - public function update(ImageUploadRequest $request, $accessoryId = null) - { - if (is_null($accessory = Accessory::find($accessoryId))) { - return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.does_not_exist')); - } - - $this->authorize($accessory); - - // Update the accessory data - $accessory->name = request('name'); - $accessory->location_id = request('location_id'); - $accessory->min_amt = request('min_amt'); - $accessory->category_id = request('category_id'); - $accessory->company_id = Company::getIdForCurrentUser(request('company_id')); - $accessory->manufacturer_id = request('manufacturer_id'); - $accessory->order_number = request('order_number'); - $accessory->model_number = request('model_number'); - $accessory->purchase_date = request('purchase_date'); - $accessory->purchase_cost = request('purchase_cost'); - $accessory->qty = request('qty'); - $accessory->supplier_id = request('supplier_id'); - - if ($request->hasFile('image')) { - - if (!config('app.lock_passwords')) { - $image = $request->file('image'); - $ext = $image->getClientOriginalExtension(); - $file_name = "accessory-".str_random(18).'.'.$ext; - $path = public_path('/uploads/accessories'); - if ($image->getClientOriginalExtension()!='svg') { - Image::make($image->getRealPath())->resize(null, 250, function ($constraint) { - $constraint->aspectRatio(); - $constraint->upsize(); - })->save($path.'/'.$file_name); - } else { - $image->move($path, $file_name); - } - if (($accessory->image) && (file_exists($path.'/'.$accessory->image))) { - unlink($path.'/'.$accessory->image); - } - - $accessory->image = $file_name; - } - } - - - // Was the accessory updated? - if ($accessory->save()) { - return redirect()->route('accessories.index')->with('success', trans('admin/accessories/message.update.success')); - } - return redirect()->back()->withInput()->withErrors($accessory->getErrors()); - } - - /** - * Delete the given accessory. - * - * @author [A. Gianotto] [] - * @param int $accessoryId - * @return Redirect - */ - public function destroy(Request $request, $accessoryId) - { - if (is_null($accessory = Accessory::find($accessoryId))) { - return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.not_found')); - } - - $this->authorize($accessory); - - - if ($accessory->hasUsers() > 0) { - return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.assoc_users', array('count'=> $accessory->hasUsers()))); - } - $accessory->delete(); - return redirect()->route('accessories.index')->with('success', trans('admin/accessories/message.delete.success')); - } - - - - /** - * Returns a view that invokes the ajax table which contains - * the content for the accessory detail view, which is generated in getDataView. - * - * @author [A. Gianotto] [] - * @param int $accessoryID - * @see AccessoriesController::getDataView() method that generates the JSON response - * @since [v1.0] - * @return View - */ - public function show(Request $request, $accessoryID = null) - { - $accessory = Accessory::find($accessoryID); - $this->authorize('view', $accessory); - if (isset($accessory->id)) { - return view('accessories/view', compact('accessory')); - } - return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.does_not_exist', compact('id'))); - } - - /** - * Return the form to checkout an Accessory to a user. - * - * @author [A. Gianotto] [] - * @param int $accessoryId - * @return View - */ - public function getCheckout(Request $request, $accessoryId) - { - // Check if the accessory exists - if (is_null($accessory = Accessory::find($accessoryId))) { - // Redirect to the accessory management page with error - return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.not_found')); - } - - if ($accessory->category) { - - $this->authorize('checkout', $accessory); - - // Get the dropdown of users and then pass it to the checkout view - return view('accessories/checkout', compact('accessory')); - } - - return redirect()->back()->with('error', 'The category type for this accessory is not valid. Edit the accessory and select a valid accessory category.'); - - - - } - - /** - * Save the Accessory checkout information. - * - * If Slack is enabled and/or asset acceptance is enabled, it will also - * trigger a Slack message and send an email. - * - * @author [A. Gianotto] [] - * @param int $accessoryId - * @return Redirect - */ - public function postCheckout(Request $request, $accessoryId) - { - // Check if the accessory exists - if (is_null($accessory = Accessory::find($accessoryId))) { - // Redirect to the accessory management page with error - return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.user_not_found')); - } - - $this->authorize('checkout', $accessory); - - if (!$user = User::find(Input::get('assigned_to'))) { - return redirect()->route('checkout/accessory', $accessory->id)->with('error', trans('admin/accessories/message.checkout.user_does_not_exist')); - } - - // Update the accessory data - $accessory->assigned_to = e(Input::get('assigned_to')); - - $accessory->users()->attach($accessory->id, [ - 'accessory_id' => $accessory->id, - 'created_at' => Carbon::now(), - 'user_id' => Auth::id(), - 'assigned_to' => $request->get('assigned_to') - ]); - - $logaction = $accessory->logCheckout(e(Input::get('note')), $user); - - DB::table('accessories_users')->where('assigned_to', '=', $accessory->assigned_to)->where('accessory_id', '=', $accessory->id)->first(); - - $data['log_id'] = $logaction->id; - $data['eula'] = $accessory->getEula(); - $data['first_name'] = $user->first_name; - $data['item_name'] = $accessory->name; - $data['checkout_date'] = $logaction->created_at; - $data['item_tag'] = ''; - $data['expected_checkin'] = ''; - $data['note'] = $logaction->note; - $data['require_acceptance'] = $accessory->requireAcceptance(); - - // Redirect to the new accessory page - return redirect()->route('accessories.index')->with('success', trans('admin/accessories/message.checkout.success')); - } - - - /** - * Check the accessory back into inventory - * - * @author [A. Gianotto] [] - * @param Request $request - * @param integer $accessoryUserId - * @param string $backto - * @return View - * @internal param int $accessoryId - */ - public function getCheckin(Request $request, $accessoryUserId = null, $backto = null) - { - // Check if the accessory exists - if (is_null($accessory_user = DB::table('accessories_users')->find($accessoryUserId))) { - // Redirect to the accessory management page with error - return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.not_found')); - } - - $accessory = Accessory::find($accessory_user->accessory_id); - $this->authorize('checkin', $accessory); - return view('accessories/checkin', compact('accessory'))->with('backto', $backto); - } - - - /** - * Check in the item so that it can be checked out again to someone else - * - * @uses Accessory::checkin_email() to determine if an email can and should be sent - * @author [A. Gianotto] [] - * @param Request $request - * @param integer $accessoryUserId - * @param string $backto - * @return Redirect - * @internal param int $accessoryId - */ - public function postCheckin(Request $request, $accessoryUserId = null, $backto = null) - { - // Check if the accessory exists - if (is_null($accessory_user = DB::table('accessories_users')->find($accessoryUserId))) { - // Redirect to the accessory management page with error - return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.does_not_exist')); - } - - $accessory = Accessory::find($accessory_user->accessory_id); - - $this->authorize('checkin', $accessory); - - $return_to = e($accessory_user->assigned_to); - $logaction = $accessory->logCheckin(User::find($return_to), e(Input::get('note'))); - - // Was the accessory updated? - if (DB::table('accessories_users')->where('id', '=', $accessory_user->id)->delete()) { - if (!is_null($accessory_user->assigned_to)) { - $user = User::find($accessory_user->assigned_to); - } - - $data['log_id'] = $logaction->id; - $data['first_name'] = e($user->first_name); - $data['last_name'] = e($user->last_name); - $data['item_name'] = e($accessory->name); - $data['checkin_date'] = e($logaction->created_at); - $data['item_tag'] = ''; - $data['note'] = e($logaction->note); - - if ($backto=='user') { - return redirect()->route("users.show", $return_to)->with('success', trans('admin/accessories/message.checkin.success')); - } - return redirect()->route("accessories.show", $accessory->id)->with('success', trans('admin/accessories/message.checkin.success')); - } - // Redirect to the accessory management page with error - return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.checkin.error')); - } - - -} diff --git a/app/Http/Controllers/Api/AssetsController.php b/app/Http/Controllers/Api/AssetsController.php index 64237ce132..63e7ac0f37 100644 --- a/app/Http/Controllers/Api/AssetsController.php +++ b/app/Http/Controllers/Api/AssetsController.php @@ -233,8 +233,8 @@ class AssetsController extends Controller // This handles all of the pivot sorting (versus the assets.* fields // in the allowed_columns array) $column_sort = in_array($sort_override, $allowed_columns) ? $sort_override : 'assets.created_at'; - - +// dd($column_sort); + switch ($sort_override) { case 'model': $assets->OrderModels($order); @@ -270,9 +270,9 @@ class AssetsController extends Controller break; } - $total = $assets->count(); $assets = $assets->skip($offset)->take($limit)->get(); + // dd($assets); return (new AssetsTransformer)->transformAssets($assets, $total); } diff --git a/app/Http/Controllers/Api/ConsumablesController.php b/app/Http/Controllers/Api/ConsumablesController.php index faf485f882..879d4f5fa7 100644 --- a/app/Http/Controllers/Api/ConsumablesController.php +++ b/app/Http/Controllers/Api/ConsumablesController.php @@ -152,7 +152,7 @@ class ConsumablesController extends Controller * Returns a JSON response containing details on the users associated with this consumable. * * @author [A. Gianotto] [] - * @see ConsumablesController::getView() method that returns the form. + * @see \App\Http\Controllers\Consumables\ConsumablesController::getView() method that returns the form. * @since [v1.0] * @param int $consumableId * @return array diff --git a/app/Http/Controllers/AssetModelsController.php b/app/Http/Controllers/AssetModelsController.php index 0ae3c59e88..d97c36e137 100755 --- a/app/Http/Controllers/AssetModelsController.php +++ b/app/Http/Controllers/AssetModelsController.php @@ -1,26 +1,15 @@ ] - * @since [v1.0] - * @return View - */ + * Returns a view that invokes the ajax tables which actually contains + * the content for the accessories listing, which is generated in getDatatable. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return View + * @throws \Illuminate\Auth\Access\AuthorizationException + */ public function index() { $this->authorize('index', AssetModel::class); @@ -45,29 +35,31 @@ class AssetModelsController extends Controller } /** - * Returns a view containing the asset model creation form. - * - * @author [A. Gianotto] [] - * @since [v1.0] - * @return View - */ + * Returns a view containing the asset model creation form. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return View + * @throws \Illuminate\Auth\Access\AuthorizationException + */ public function create() { $this->authorize('create', AssetModel::class); - $category_type = 'asset'; - return view('models/edit')->with('category_type',$category_type) - ->with('depreciation_list', Helper::depreciationList()) - ->with('item', new AssetModel); + return view('models/edit')->with('category_type', 'asset') + ->with('depreciation_list', Helper::depreciationList()) + ->with('item', new AssetModel); } /** - * Validate and process the new Asset Model data. - * - * @author [A. Gianotto] [] - * @since [v1.0] - * @return Redirect - */ + * Validate and process the new Asset Model data. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @param ImageUploadRequest $request + * @return Redirect + * @throws \Illuminate\Auth\Access\AuthorizationException + */ public function store(ImageUploadRequest $request) { @@ -90,23 +82,7 @@ class AssetModelsController extends Controller $model->fieldset_id = e($request->input('custom_fieldset')); } - if (Input::file('image')) { - - $image = Input::file('image'); - $file_name = str_slug($image->getClientOriginalName()) . "." . $image->getClientOriginalExtension(); - $path = app('models_upload_path'); - - if ($image->getClientOriginalExtension()!='svg') { - Image::make($image->getRealPath())->resize(500, null, function ($constraint) { - $constraint->aspectRatio(); - $constraint->upsize(); - })->save($path.'/'.$file_name); - } else { - $image->move($path, $file_name); - } - $model->image = $file_name; - - } + $model = $request->handleImages($model, app('models_upload_path')); // Was it created? if ($model->save()) { @@ -121,13 +97,14 @@ class AssetModelsController extends Controller } /** - * Returns a view containing the asset model edit form. - * - * @author [A. Gianotto] [] - * @since [v1.0] - * @param int $modelId - * @return View - */ + * Returns a view containing the asset model edit form. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @param int $modelId + * @return View + * @throws \Illuminate\Auth\Access\AuthorizationException + */ public function edit($modelId = null) { $this->authorize('update', AssetModel::class); @@ -144,14 +121,16 @@ class AssetModelsController extends Controller /** - * Validates and processes form data from the edit - * Asset Model form based on the model ID passed. - * - * @author [A. Gianotto] [] - * @since [v1.0] - * @param int $modelId - * @return Redirect - */ + * Validates and processes form data from the edit + * Asset Model form based on the model ID passed. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @param ImageUploadRequest $request + * @param int $modelId + * @return Redirect + * @throws \Illuminate\Auth\Access\AuthorizationException + */ public function update(ImageUploadRequest $request, $modelId = null) { $this->authorize('update', AssetModel::class); @@ -182,37 +161,7 @@ class AssetModelsController extends Controller } } - $old_image = $model->image; - - // Set the model's image property to null if the image is being deleted - if ($request->input('image_delete') == 1) { - $model->image = null; - } - - if ($request->file('image')) { - $image = $request->file('image'); - $file_name = $model->id.'-'.str_slug($image->getClientOriginalName()) . "." . $image->getClientOriginalExtension(); - - if ($image->getClientOriginalExtension()!='svg') { - Image::make($image->getRealPath())->resize(500, null, function ($constraint) { - $constraint->aspectRatio(); - $constraint->upsize(); - })->save(app('models_upload_path').$file_name); - } else { - $image->move(app('models_upload_path'), $file_name); - } - $model->image = $file_name; - - } - - if ((($request->file('image')) && (isset($old_image)) && ($old_image!='')) || ($request->input('image_delete') == 1)) { - try { - unlink(app('models_upload_path').$old_image); - } catch (\Exception $e) { - \Log::error($e); - } - } - + $model = $request->handleImages($model, app('models_upload_path')); if ($model->save()) { return redirect()->route("models.index")->with('success', trans('admin/models/message.update.success')); @@ -221,14 +170,15 @@ class AssetModelsController extends Controller } /** - * Validate and delete the given Asset Model. An Asset Model - * cannot be deleted if there are associated assets. - * - * @author [A. Gianotto] [] - * @since [v1.0] - * @param int $modelId - * @return Redirect - */ + * Validate and delete the given Asset Model. An Asset Model + * cannot be deleted if there are associated assets. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @param int $modelId + * @return Redirect + * @throws \Illuminate\Auth\Access\AuthorizationException + */ public function destroy($modelId) { $this->authorize('delete', AssetModel::class); @@ -259,13 +209,14 @@ class AssetModelsController extends Controller /** - * Restore a given Asset Model (mark as un-deleted) - * - * @author [A. Gianotto] [] - * @since [v1.0] - * @param int $modelId - * @return Redirect - */ + * Restore a given Asset Model (mark as un-deleted) + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @param int $modelId + * @return Redirect + * @throws \Illuminate\Auth\Access\AuthorizationException + */ public function getRestore($modelId = null) { $this->authorize('create', AssetModel::class); @@ -273,16 +224,8 @@ class AssetModelsController extends Controller $model = AssetModel::withTrashed()->find($modelId); if (isset($model->id)) { - - // Restore the model $model->restore(); - - // Prepare the success message - $success = trans('admin/models/message.restore.success'); - - // Redirect back - return redirect()->route('models.index')->with('success', $success); - + return redirect()->route('models.index')->with('success', trans('admin/models/message.restore.success')); } return redirect()->back()->with('error', trans('admin/models/message.not_found')); @@ -290,13 +233,14 @@ class AssetModelsController extends Controller /** - * Get the model information to present to the model view page - * - * @author [A. Gianotto] [] - * @since [v1.0] - * @param int $modelId - * @return View - */ + * Get the model information to present to the model view page + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @param int $modelId + * @return View + * @throws \Illuminate\Auth\Access\AuthorizationException + */ public function show($modelId = null) { $this->authorize('view', AssetModel::class); @@ -305,11 +249,8 @@ class AssetModelsController extends Controller if (isset($model->id)) { return view('models/view', compact('model')); } - // Prepare the error message - $error = trans('admin/models/message.does_not_exist', compact('id')); - // Redirect to the user management page - return redirect()->route('models.index')->with('error', $error); + return redirect()->route('models.index')->with('error', trans('admin/models/message.does_not_exist')); } /** @@ -331,12 +272,10 @@ class AssetModelsController extends Controller $model->id = null; // Show the page - $view = View::make('models/edit'); - $view->with('depreciation_list', Helper::depreciationList()); - $view->with('item', $model); - $view->with('clone_model', $model_to_clone); - return $view; - + return view('models/edit') + ->with('depreciation_list', Helper::depreciationList()) + ->with('item', $model) + ->with('clone_model', $model_to_clone); } @@ -350,150 +289,10 @@ class AssetModelsController extends Controller */ public function getCustomFields($modelId) { - $model = AssetModel::find($modelId); - return view("models.custom_fields_form")->with("model", $model); + return view("models.custom_fields_form")->with("model", AssetModel::find($modelId)); } - - - /** - * Returns a view that allows the user to bulk edit model attrbutes - * - * @author [A. Gianotto] [] - * @since [v1.7] - * @return \Illuminate\Contracts\View\View - */ - public function postBulkEdit(Request $request) - { - - $models_raw_array = Input::get('ids'); - - // Make sure some IDs have been selected - if ((is_array($models_raw_array)) && (count($models_raw_array) > 0)) { - - - $models = AssetModel::whereIn('id', $models_raw_array)->withCount('assets')->orderBy('assets_count', 'ASC')->get(); - - // If deleting.... - if ($request->input('bulk_actions')=='delete') { - $valid_count = 0; - foreach ($models as $model) { - if ($model->assets_count == 0) { - $valid_count++; - } - } - return view('models/bulk-delete', compact('models'))->with('valid_count', $valid_count); - - // Otherwise display the bulk edit screen - } else { - - $nochange = ['NC' => 'No Change']; - $fieldset_list = $nochange + Helper::customFieldsetList(); - $depreciation_list = $nochange + Helper::depreciationList(); - - return view('models/bulk-edit', compact('models')) - ->with('fieldset_list', $fieldset_list) - ->with('depreciation_list', $depreciation_list); - } - - } - - return redirect()->route('models.index') - ->with('error', 'You must select at least one model to edit.'); - - } - - - - /** - * Returns a view that allows the user to bulk edit model attrbutes - * - * @author [A. Gianotto] [] - * @since [v1.7] - * @return \Illuminate\Contracts\View\View - */ - public function postBulkEditSave(Request $request) - { - - $models_raw_array = Input::get('ids'); - $update_array = array(); - - - if (($request->has('manufacturer_id') && ($request->input('manufacturer_id')!='NC'))) { - $update_array['manufacturer_id'] = $request->input('manufacturer_id'); - } - if (($request->has('category_id') && ($request->input('category_id')!='NC'))) { - $update_array['category_id'] = $request->input('category_id'); - } - if ($request->input('fieldset_id')!='NC') { - $update_array['fieldset_id'] = $request->input('fieldset_id'); - } - if ($request->input('depreciation_id')!='NC') { - $update_array['depreciation_id'] = $request->input('depreciation_id'); - } - - - - if (count($update_array) > 0) { - AssetModel::whereIn('id', $models_raw_array)->update($update_array); - return redirect()->route('models.index') - ->with('success', trans('admin/models/message.bulkedit.success')); - } - - return redirect()->route('models.index') - ->with('warning', trans('admin/models/message.bulkedit.error')); - - } - - /** - * Validate and delete the given Asset Models. An Asset Model - * cannot be deleted if there are associated assets. - * - * @author [A. Gianotto] [] - * @since [v1.0] - * @param int $modelId - * @return Redirect - */ - public function postBulkDelete(Request $request) - { - $models_raw_array = Input::get('ids'); - - if ((is_array($models_raw_array)) && (count($models_raw_array) > 0)) { - - $models = AssetModel::whereIn('id', $models_raw_array)->withCount('assets')->get(); - - $del_error_count = 0; - $del_count = 0; - - foreach ($models as $model) { - \Log::debug($model->id); - - if ($model->assets_count > 0) { - $del_error_count++; - } else { - $model->delete(); - $del_count++; - } - } - - \Log::debug($del_count); - \Log::debug($del_error_count); - - if ($del_error_count == 0) { - return redirect()->route('models.index') - ->with('success', trans('admin/models/message.bulkdelete.success',['success_count'=> $del_count] )); - } - - return redirect()->route('models.index') - ->with('warning', trans('admin/models/message.bulkdelete.success_partial', ['fail_count'=>$del_error_count, 'success_count'=> $del_count])); - } - - return redirect()->route('models.index') - ->with('error', trans('admin/models/message.bulkdelete.error')); - - } - /** * Returns true if a fieldset is set, 'add default values' is ticked and if * any default values were entered into the form. diff --git a/app/Http/Controllers/AssetCheckinController.php b/app/Http/Controllers/Assets/AssetCheckinController.php similarity index 72% rename from app/Http/Controllers/AssetCheckinController.php rename to app/Http/Controllers/Assets/AssetCheckinController.php index e03ea8b529..31068f408d 100644 --- a/app/Http/Controllers/AssetCheckinController.php +++ b/app/Http/Controllers/Assets/AssetCheckinController.php @@ -1,25 +1,27 @@ ] - * @param int $assetId - * @param string $backto - * @since [v1.0] - * @return View - */ + * Returns a view that presents a form to check an asset back into inventory. + * + * @author [A. Gianotto] [] + * @param int $assetId + * @param string $backto + * @return View + * @throws \Illuminate\Auth\Access\AuthorizationException + * @since [v1.0] + */ public function create($assetId, $backto = null) { // Check if the asset exists @@ -40,6 +42,7 @@ class AssetCheckinController extends Controller * @param int $assetId * @param null $backto * @return Redirect + * @throws \Illuminate\Auth\Access\AuthorizationException * @since [v1.0] */ public function store(AssetCheckinRequest $request, $assetId = null, $backto = null) @@ -79,19 +82,8 @@ class AssetCheckinController extends Controller // Was the asset updated? if ($asset->save()) { - $logaction = $asset->logCheckin($target, e(request('note'))); + $asset->logCheckin($target, e(request('note'))); - $data['log_id'] = $logaction->id; - $data['first_name'] = get_class($target) == User::class ? $target->first_name : ''; - $data['last_name'] = get_class($target) == User::class ? $target->last_name : ''; - $data['item_name'] = $asset->present()->name(); - $data['checkin_date'] = $logaction->created_at; - $data['item_tag'] = $asset->asset_tag; - $data['item_serial'] = $asset->serial; - $data['note'] = $logaction->note; - $data['manufacturer_name'] = $asset->model->manufacturer->name; - $data['model_name'] = $asset->model->name; - $data['model_number'] = $asset->model->model_number; if ($backto=='user') { return redirect()->route("users.show", $user->id)->with('success', trans('admin/hardware/message.checkin.success')); diff --git a/app/Http/Controllers/AssetCheckoutController.php b/app/Http/Controllers/Assets/AssetCheckoutController.php similarity index 97% rename from app/Http/Controllers/AssetCheckoutController.php rename to app/Http/Controllers/Assets/AssetCheckoutController.php index 7220c35fa5..2226ff7c1b 100644 --- a/app/Http/Controllers/AssetCheckoutController.php +++ b/app/Http/Controllers/Assets/AssetCheckoutController.php @@ -1,9 +1,11 @@ ] - * @param int $assetId - * @param int $fileId - * @since [v1.0] - * @return View - */ + * Check for permissions and display the file. + * + * @author [A. Gianotto] [] + * @param int $assetId + * @param int $fileId + * @since [v1.0] + * @return View + * @throws \Illuminate\Auth\Access\AuthorizationException + */ public function show($assetId = null, $fileId = null, $download = true) { $asset = Asset::find($assetId); @@ -92,14 +94,15 @@ class AssetFilesController extends Controller } /** - * Delete the associated file - * - * @author [A. Gianotto] [] - * @param int $assetId - * @param int $fileId - * @since [v1.0] - * @return View - */ + * Delete the associated file + * + * @author [A. Gianotto] [] + * @param int $assetId + * @param int $fileId + * @since [v1.0] + * @return View + * @throws \Illuminate\Auth\Access\AuthorizationException + */ public function destroy($assetId = null, $fileId = null) { $asset = Asset::find($assetId); diff --git a/app/Http/Controllers/AssetsController.php b/app/Http/Controllers/Assets/AssetsController.php similarity index 99% rename from app/Http/Controllers/AssetsController.php rename to app/Http/Controllers/Assets/AssetsController.php index fab283e540..f94d574212 100755 --- a/app/Http/Controllers/AssetsController.php +++ b/app/Http/Controllers/Assets/AssetsController.php @@ -1,18 +1,13 @@ ] * @see AssetController::getDatatable() method that generates the JSON response * @since [v1.0] + * @param Request $request * @return View + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function index(Request $request) { diff --git a/app/Http/Controllers/BulkAssetsController.php b/app/Http/Controllers/Assets/BulkAssetsController.php similarity index 96% rename from app/Http/Controllers/BulkAssetsController.php rename to app/Http/Controllers/Assets/BulkAssetsController.php index cec9adf7f8..71aad33f5e 100644 --- a/app/Http/Controllers/BulkAssetsController.php +++ b/app/Http/Controllers/Assets/BulkAssetsController.php @@ -1,9 +1,10 @@ ] + * @param Request $request * @return View + * @throws \Illuminate\Auth\Access\AuthorizationException * @internal param array $assets * @since [v2.0] */ diff --git a/app/Http/Controllers/BulkAssetModelsController.php b/app/Http/Controllers/BulkAssetModelsController.php new file mode 100644 index 0000000000..2d1e949653 --- /dev/null +++ b/app/Http/Controllers/BulkAssetModelsController.php @@ -0,0 +1,138 @@ +] + * @since [v1.7] + * @param Request $request + * @return \Illuminate\Contracts\View\View + */ + public function edit(Request $request) + { + $models_raw_array = Input::get('ids'); + + // Make sure some IDs have been selected + if ((is_array($models_raw_array)) && (count($models_raw_array) > 0)) { + + $models = AssetModel::whereIn('id', $models_raw_array) + ->withCount('assets') + ->orderBy('assets_count', 'ASC') + ->get(); + + // If deleting.... + if ($request->input('bulk_actions')=='delete') { + $valid_count = 0; + foreach ($models as $model) { + if ($model->assets_count == 0) { + $valid_count++; + } + } + return view('models/bulk-delete', compact('models'))->with('valid_count', $valid_count); + + // Otherwise display the bulk edit screen + } + + $nochange = ['NC' => 'No Change']; + return view('models/bulk-edit', compact('models')) + ->with('fieldset_list', $nochange + Helper::customFieldsetList()) + ->with('depreciation_list', $nochange + Helper::depreciationList()); + } + + return redirect()->route('models.index') + ->with('error', 'You must select at least one model to edit.'); + } + + /** + * Returns a view that allows the user to bulk edit model attrbutes + * + * @author [A. Gianotto] [] + * @since [v1.7] + * @param Request $request + * @return \Illuminate\Contracts\View\View + */ + public function update(Request $request) + { + + $models_raw_array = Input::get('ids'); + $update_array = array(); + + if (($request->has('manufacturer_id') && ($request->input('manufacturer_id')!='NC'))) { + $update_array['manufacturer_id'] = $request->input('manufacturer_id'); + } + if (($request->has('category_id') && ($request->input('category_id')!='NC'))) { + $update_array['category_id'] = $request->input('category_id'); + } + if ($request->input('fieldset_id')!='NC') { + $update_array['fieldset_id'] = $request->input('fieldset_id'); + } + if ($request->input('depreciation_id')!='NC') { + $update_array['depreciation_id'] = $request->input('depreciation_id'); + } + + + + if (count($update_array) > 0) { + AssetModel::whereIn('id', $models_raw_array)->update($update_array); + return redirect()->route('models.index') + ->with('success', trans('admin/models/message.bulkedit.success')); + } + + return redirect()->route('models.index') + ->with('warning', trans('admin/models/message.bulkedit.error')); + + } + + /** + * Validate and delete the given Asset Models. An Asset Model + * cannot be deleted if there are associated assets. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return Redirect + */ + public function destroy() + { + $models_raw_array = Input::get('ids'); + + if ((is_array($models_raw_array)) && (count($models_raw_array) > 0)) { + + $models = AssetModel::whereIn('id', $models_raw_array)->withCount('assets')->get(); + + $del_error_count = 0; + $del_count = 0; + + foreach ($models as $model) { + if ($model->assets_count > 0) { + $del_error_count++; + } else { + $model->delete(); + $del_count++; + } + } + + if ($del_error_count == 0) { + return redirect()->route('models.index') + ->with('success', trans('admin/models/message.bulkdelete.success',['success_count'=> $del_count] )); + } + + return redirect()->route('models.index') + ->with('warning', trans('admin/models/message.bulkdelete.success_partial', ['fail_count'=>$del_error_count, 'success_count'=> $del_count])); + } + + return redirect()->route('models.index') + ->with('error', trans('admin/models/message.bulkdelete.error')); + + } + +} diff --git a/app/Http/Controllers/CategoriesController.php b/app/Http/Controllers/CategoriesController.php index 74b83acac3..4745fc747f 100755 --- a/app/Http/Controllers/CategoriesController.php +++ b/app/Http/Controllers/CategoriesController.php @@ -29,13 +29,14 @@ class CategoriesController extends Controller { /** - * Returns a view that invokes the ajax tables which actually contains - * the content for the categories listing, which is generated in getDatatable. - * - * @author [A. Gianotto] [] - * @see CategoriesController::getDatatable() method that generates the JSON response - * @since [v1.0] - * @return \Illuminate\Contracts\View\View + * Returns a view that invokes the ajax tables which actually contains + * the content for the categories listing, which is generated in getDatatable. + * + * @author [A. Gianotto] [] + * @see CategoriesController::getDatatable() method that generates the JSON response + * @since [v1.0] + * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function index() { @@ -46,30 +47,32 @@ class CategoriesController extends Controller /** - * Returns a form view to create a new category. - * - * @author [A. Gianotto] [] - * @see CategoriesController::store() method that stores the data - * @since [v1.0] - * @return \Illuminate\Contracts\View\View + * Returns a form view to create a new category. + * + * @author [A. Gianotto] [] + * @see CategoriesController::store() method that stores the data + * @since [v1.0] + * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function create() { // Show the page $this->authorize('create', Category::class); - $category_types= Helper::categoryTypeList(); return view('categories/edit')->with('item', new Category) - ->with('category_types', $category_types); + ->with('category_types', Helper::categoryTypeList()); } /** - * Validates and stores the new category data. - * - * @author [A. Gianotto] [] - * @see CategoriesController::create() method that makes the form. - * @since [v1.0] - * @return \Illuminate\Http\RedirectResponse + * Validates and stores the new category data. + * + * @author [A. Gianotto] [] + * @see CategoriesController::create() method that makes the form. + * @since [v1.0] + * @param ImageUploadRequest $request + * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function store(ImageUploadRequest $request) { @@ -83,17 +86,7 @@ class CategoriesController extends Controller $category->checkin_email = $request->input('checkin_email', '0'); $category->user_id = Auth::id(); - if ($request->file('image')) { - $image = $request->file('image'); - $file_name = str_random(25).".".$image->getClientOriginalExtension(); - $path = public_path('uploads/categories/'.$file_name); - Image::make($image->getRealPath())->resize(200, null, function ($constraint) { - $constraint->aspectRatio(); - $constraint->upsize(); - })->save($path); - $category->image = $file_name; - } - + $category = $request->handleImages($category); if ($category->save()) { return redirect()->route('categories.index')->with('success', trans('admin/categories/message.create.success')); @@ -103,13 +96,14 @@ class CategoriesController extends Controller } /** - * Returns a view that makes a form to update a category. - * - * @author [A. Gianotto] [] - * @see CategoriesController::postEdit() method saves the data - * @param int $categoryId - * @since [v1.0] - * @return \Illuminate\Contracts\View\View + * Returns a view that makes a form to update a category. + * + * @author [A. Gianotto] [] + * @see CategoriesController::postEdit() method saves the data + * @param int $categoryId + * @since [v1.0] + * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function edit($categoryId = null) { @@ -117,10 +111,8 @@ class CategoriesController extends Controller if (is_null($item = Category::find($categoryId))) { return redirect()->route('categories.index')->with('error', trans('admin/categories/message.does_not_exist')); } - $category_types= Helper::categoryTypeList(); - return view('categories/edit', compact('item')) - ->with('category_types', $category_types); + ->with('category_types', Helper::categoryTypeList()); } @@ -129,9 +121,10 @@ class CategoriesController extends Controller * * @author [A. Gianotto] [] * @see CategoriesController::getEdit() method that makes the form. - * @param Request $request + * @param ImageUploadRequest $request * @param int $categoryId * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException * @since [v1.0] */ public function update(ImageUploadRequest $request, $categoryId = null) @@ -152,37 +145,7 @@ class CategoriesController extends Controller $category->require_acceptance = $request->input('require_acceptance', '0'); $category->checkin_email = $request->input('checkin_email', '0'); - $old_image = $category->image; - - // Set the model's image property to null if the image is being deleted - if ($request->input('image_delete') == 1) { - $category->image = null; - } - - if ($request->file('image')) { - $image = $request->file('image'); - $file_name = $category->id.'-'.str_slug($image->getClientOriginalName()) . "." . $image->getClientOriginalExtension(); - - if ($image->getClientOriginalExtension()!='svg') { - Image::make($image->getRealPath())->resize(500, null, function ($constraint) { - $constraint->aspectRatio(); - $constraint->upsize(); - })->save(app('categories_upload_path').$file_name); - } else { - $image->move(app('categories_upload_path'), $file_name); - } - $category->image = $file_name; - - } - - if ((($request->file('image')) && (isset($old_image)) && ($old_image!='')) || ($request->input('image_delete') == 1)) { - try { - unlink(app('categories_upload_path').$old_image); - } catch (\Exception $e) { - \Log::error($e); - } - } - + $category = $request->handleImages($category); if ($category->save()) { // Redirect to the new category page @@ -193,12 +156,13 @@ class CategoriesController extends Controller } /** - * Validates and marks a category as deleted. - * - * @author [A. Gianotto] [] - * @since [v1.0] - * @param int $categoryId - * @return \Illuminate\Http\RedirectResponse + * Validates and marks a category as deleted. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @param int $categoryId + * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function destroy($categoryId) { @@ -225,14 +189,15 @@ class CategoriesController extends Controller /** - * Returns a view that invokes the ajax tables which actually contains - * the content for the categories detail view, which is generated in getDataView. - * - * @author [A. Gianotto] [] - * @see CategoriesController::getDataView() method that generates the JSON response - * @param int $categoryId - * @since [v1.8] - * @return \Illuminate\Contracts\View\View + * Returns a view that invokes the ajax tables which actually contains + * the content for the categories detail view, which is generated in getDataView. + * + * @author [A. Gianotto] [] + * @see CategoriesController::getDataView() method that generates the JSON response + * @param $id + * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException + * @since [v1.8] */ public function show($id) { @@ -255,10 +220,8 @@ class CategoriesController extends Controller } // Prepare the error message - $error = trans('admin/categories/message.does_not_exist', compact('id')); // Redirect to the user management page - return redirect()->route('categories.index')->with('error', $error); + return redirect()->route('categories.index') + ->with('error', trans('admin/categories/message.does_not_exist')); } - - } diff --git a/app/Http/Controllers/CheckInOutRequest.php b/app/Http/Controllers/CheckInOutRequest.php index f88d6acda7..484b6e49db 100644 --- a/app/Http/Controllers/CheckInOutRequest.php +++ b/app/Http/Controllers/CheckInOutRequest.php @@ -4,6 +4,7 @@ namespace App\Http\Controllers; use App\Exceptions\CheckoutNotAllowed; use App\Models\Asset; use App\Models\Location; +use App\Models\SnipeModel; use App\Models\User; trait CheckInOutRequest diff --git a/app/Http/Controllers/CompaniesController.php b/app/Http/Controllers/CompaniesController.php index aae2975493..2ca0d15499 100644 --- a/app/Http/Controllers/CompaniesController.php +++ b/app/Http/Controllers/CompaniesController.php @@ -2,10 +2,6 @@ namespace App\Http\Controllers; use App\Models\Company; -use Input; -use Lang; -use Redirect; -use View; use Illuminate\Http\Request; use Image; use App\Http\Requests\ImageUploadRequest; @@ -21,11 +17,12 @@ final class CompaniesController extends Controller { /** - * Returns view to display listing of companies. - * - * @author [Abdullah Alansari] [] - * @since [v1.8] - * @return \Illuminate\Contracts\View\View + * Returns view to display listing of companies. + * + * @author [Abdullah Alansari] [] + * @since [v1.8] + * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function index() { @@ -35,11 +32,12 @@ final class CompaniesController extends Controller } /** - * Returns view to create a new company. - * - * @author [Abdullah Alansari] [] - * @since [v1.8] - * @return \Illuminate\Contracts\View\View + * Returns view to create a new company. + * + * @author [Abdullah Alansari] [] + * @since [v1.8] + * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function create() { @@ -55,6 +53,7 @@ final class CompaniesController extends Controller * @since [v1.8] * @param Request $request * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function store(ImageUploadRequest $request) { @@ -63,16 +62,7 @@ final class CompaniesController extends Controller $company = new Company; $company->name = $request->input('name'); - if ($request->file('image')) { - $image = $request->file('image'); - $file_name = str_random(25).".".$image->getClientOriginalExtension(); - $path = public_path('uploads/companies/'.$file_name); - Image::make($image->getRealPath())->resize(200, null, function ($constraint) { - $constraint->aspectRatio(); - $constraint->upsize(); - })->save($path); - $company->image = $file_name; - } + $company = $request->handleImages($company); if ($company->save()) { return redirect()->route('companies.index') @@ -83,12 +73,13 @@ final class CompaniesController extends Controller /** - * Return form to edit existing company. - * - * @author [Abdullah Alansari] [] - * @since [v1.8] - * @param int $companyId - * @return \Illuminate\Contracts\View\View + * Return form to edit existing company. + * + * @author [Abdullah Alansari] [] + * @since [v1.8] + * @param int $companyId + * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function edit($companyId) { @@ -107,9 +98,10 @@ final class CompaniesController extends Controller * * @author [Abdullah Alansari] [] * @since [v1.8] - * @param Request $request + * @param ImageUploadRequest $request * @param int $companyId * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function update(ImageUploadRequest $request, $companyId) { @@ -121,37 +113,7 @@ final class CompaniesController extends Controller $company->name = $request->input('name'); - $old_image = $company->image; - - // Set the model's image property to null if the image is being deleted - if ($request->input('image_delete') == 1) { - $company->image = null; - } - - if ($request->file('image')) { - $image = $request->file('image'); - $file_name = $company->id.'-'.str_slug($image->getClientOriginalName()) . "." . $image->getClientOriginalExtension(); - - if ($image->getClientOriginalExtension()!='svg') { - Image::make($image->getRealPath())->resize(500, null, function ($constraint) { - $constraint->aspectRatio(); - $constraint->upsize(); - })->save(app('companies_upload_path').$file_name); - } else { - $image->move(app('companies_upload_path'), $file_name); - } - $company->image = $file_name; - - } - - if ((($request->file('image')) && (isset($old_image)) && ($old_image!='')) || ($request->input('image_delete') == 1)) { - try { - unlink(app('companies_upload_path').$old_image); - } catch (\Exception $e) { - \Log::error($e); - } - } - + $company = $request->handleImages($company); if ($company->save()) { return redirect()->route('companies.index') @@ -162,38 +124,38 @@ final class CompaniesController extends Controller } /** - * Delete company - * - * @author [Abdullah Alansari] [] - * @since [v1.8] - * @param int $companyId - * @return \Illuminate\Http\RedirectResponse + * Delete company + * + * @author [Abdullah Alansari] [] + * @since [v1.8] + * @param int $companyId + * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function destroy($companyId) { + $this->authorize('delete', $company); + if (is_null($company = Company::find($companyId))) { return redirect()->route('companies.index') ->with('error', trans('admin/companies/message.not_found')); - } else { + } - $this->authorize('delete', $company); - - try { - $company->delete(); + try { + $company->delete(); + return redirect()->route('companies.index') + ->with('success', trans('admin/companies/message.delete.success')); + } catch (\Illuminate\Database\QueryException $exception) { + /* + * NOTE: This happens when there's a foreign key constraint violation + * For example when rows in other tables are referencing this company + */ + if ($exception->getCode() == 23000) { return redirect()->route('companies.index') - ->with('success', trans('admin/companies/message.delete.success')); - } catch (\Illuminate\Database\QueryException $exception) { - /* - * NOTE: This happens when there's a foreign key constraint violation - * For example when rows in other tables are referencing this company - */ - if ($exception->getCode() == 23000) { - return redirect()->route('companies.index') - ->with('error', trans('admin/companies/message.assoc_users')); - } else { - throw $exception; - } + ->with('error', trans('admin/companies/message.assoc_users')); } + + throw $exception; } } @@ -203,9 +165,8 @@ final class CompaniesController extends Controller if (is_null($company = Company::find($id))) { return redirect()->route('companies.index') ->with('error', trans('admin/companies/message.not_found')); - } else { - return view('companies/view')->with('company',$company); } + return view('companies/view')->with('company',$company); } } diff --git a/app/Http/Controllers/Components/ComponentCheckinController.php b/app/Http/Controllers/Components/ComponentCheckinController.php new file mode 100644 index 0000000000..89eab1f5fa --- /dev/null +++ b/app/Http/Controllers/Components/ComponentCheckinController.php @@ -0,0 +1,111 @@ +] + * @see ComponentCheckinController::store() method that stores the data. + * @since [v4.1.4] + * @param $component_asset_id + * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function create($component_asset_id) + { + + // This could probably be done more cleanly but I am very tired. - @snipe + if ($component_assets = DB::table('components_assets')->find($component_asset_id)) { + if (is_null($component = Component::find($component_assets->component_id))) { + return redirect()->route('components.index')->with('error', trans('admin/components/messages.not_found')); + } + if (is_null($asset = Asset::find($component_assets->asset_id))) { + return redirect()->route('components.index')->with('error', + trans('admin/components/message.not_found')); + } + $this->authorize('checkin', $component); + return view('components/checkin', compact('component_assets','component','asset')); + } + + return redirect()->route('components.index')->with('error', trans('admin/components/messages.not_found')); + + } + + + /** + * Validate and store checkin data. + * + * @author [A. Gianotto] [] + * @see ComponentCheckinController::create() method that returns the form. + * @since [v4.1.4] + * @param Request $request + * @param $component_asset_id + * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function store(Request $request, $component_asset_id) + { + if ($component_assets = DB::table('components_assets')->find($component_asset_id)) { + if (is_null($component = Component::find($component_assets->component_id))) { + return redirect()->route('components.index')->with('error', + trans('admin/components/message.not_found')); + } + + + $this->authorize('checkin', $component); + + $max_to_checkin = $component_assets->assigned_qty; + $validator = Validator::make($request->all(), [ + "checkin_qty" => "required|numeric|between:1,$max_to_checkin" + ]); + + if ($validator->fails()) { + return redirect()->back() + ->withErrors($validator) + ->withInput(); + } + + // Validation passed, so let's figure out what we have to do here. + $qty_remaining_in_checkout = ($component_assets->assigned_qty - (int)$request->input('checkin_qty')); + + // We have to modify the record to reflect the new qty that's + // actually checked out. + $component_assets->assigned_qty = $qty_remaining_in_checkout; + DB::table('components_assets')->where('id', + $component_asset_id)->update(['assigned_qty' => $qty_remaining_in_checkout]); + + $log = new Actionlog(); + $log->user_id = auth()->id(); + $log->action_type = 'checkin from'; + $log->target_type = Asset::class; + $log->target_id = $component_assets->asset_id; + $log->item_id = $component_assets->component_id; + $log->item_type = Component::class; + $log->note = $request->input('note'); + $log->save(); + + // If the checked-in qty is exactly the same as the assigned_qty, + // we can simply delete the associated components_assets record + if ($qty_remaining_in_checkout == 0) { + DB::table('components_assets')->where('id', '=', $component_asset_id)->delete(); + } + + return redirect()->route('components.index')->with('success', + trans('admin/components/message.checkout.success')); + } + return redirect()->route('components.index')->with('error', trans('admin/components/message.not_found')); + } + +} diff --git a/app/Http/Controllers/Components/ComponentCheckoutController.php b/app/Http/Controllers/Components/ComponentCheckoutController.php new file mode 100644 index 0000000000..8922317faf --- /dev/null +++ b/app/Http/Controllers/Components/ComponentCheckoutController.php @@ -0,0 +1,92 @@ +] + * @see ComponentCheckoutController::store() method that stores the data. + * @since [v3.0] + * @param int $componentId + * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function create($componentId) + { + // Check if the component exists + if (is_null($component = Component::find($componentId))) { + // Redirect to the component management page with error + return redirect()->route('components.index')->with('error', trans('admin/components/message.not_found')); + } + $this->authorize('checkout', $component); + return view('components/checkout', compact('component')); + } + + /** + * Validate and store checkout data. + * + * @author [A. Gianotto] [] + * @see ComponentCheckoutController::create() method that returns the form. + * @since [v3.0] + * @param Request $request + * @param int $componentId + * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function store(Request $request, $componentId) + { + // Check if the component exists + if (is_null($component = Component::find($componentId))) { + // Redirect to the component management page with error + return redirect()->route('components.index')->with('error', trans('admin/components/message.not_found')); + } + + $this->authorize('checkout', $component); + + $max_to_checkout = $component->numRemaining(); + $validator = Validator::make($request->all(), [ + "asset_id" => "required", + "assigned_qty" => "required|numeric|between:1,$max_to_checkout" + ]); + + if ($validator->fails()) { + return redirect()->back() + ->withErrors($validator) + ->withInput(); + } + + $admin_user = Auth::user(); + $asset_id = e(Input::get('asset_id')); + + // Check if the user exists + if (is_null($asset = Asset::find($asset_id))) { + // Redirect to the component management page with error + return redirect()->route('components.index')->with('error', trans('admin/components/message.asset_does_not_exist')); + } + + // Update the component data + $component->asset_id = $asset_id; + + $component->assets()->attach($component->id, [ + 'component_id' => $component->id, + 'user_id' => $admin_user->id, + 'created_at' => date('Y-m-d H:i:s'), + 'assigned_qty' => Input::get('assigned_qty'), + 'asset_id' => $asset_id + ]); + + $component->logCheckout(e(Input::get('note')), $asset); + return redirect()->route('components.index')->with('success', trans('admin/components/message.checkout.success')); + } +} diff --git a/app/Http/Controllers/Components/ComponentsController.php b/app/Http/Controllers/Components/ComponentsController.php new file mode 100644 index 0000000000..9e7d5d5a3a --- /dev/null +++ b/app/Http/Controllers/Components/ComponentsController.php @@ -0,0 +1,188 @@ +] + * @see ComponentsController::getDatatable() method that generates the JSON response + * @since [v3.0] + * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function index() + { + $this->authorize('view', Component::class); + return view('components/index'); + } + + + /** + * Returns a form to create a new component. + * + * @author [A. Gianotto] [] + * @see ComponentsController::postCreate() method that stores the data + * @since [v3.0] + * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function create() + { + $this->authorize('create', Component::class); + return view('components/edit')->with('category_type', 'component') + ->with('item', new Component); + } + + + /** + * Validate and store data for new component. + * + * @author [A. Gianotto] [] + * @see ComponentsController::getCreate() method that generates the view + * @since [v3.0] + * @param ImageUploadRequest $request + * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function store(ImageUploadRequest $request) + { + $this->authorize('create', Component::class); + $component = new Component(); + $component->name = $request->input('name'); + $component->category_id = $request->input('category_id'); + $component->location_id = $request->input('location_id'); + $component->company_id = Company::getIdForCurrentUser($request->input('company_id')); + $component->order_number = $request->input('order_number', null); + $component->min_amt = $request->input('min_amt', null); + $component->serial = $request->input('serial', null); + $component->purchase_date = $request->input('purchase_date', null); + $component->purchase_cost = $request->input('purchase_cost', null); + $component->qty = $request->input('qty'); + $component->user_id = Auth::id(); + + $component = $request->handleImages($component); + + if ($component->save()) { + return redirect()->route('components.index')->with('success', trans('admin/components/message.create.success')); + } + return redirect()->back()->withInput()->withErrors($component->getErrors()); + } + + /** + * Return a view to edit a component. + * + * @author [A. Gianotto] [] + * @see ComponentsController::postEdit() method that stores the data. + * @since [v3.0] + * @param int $componentId + * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function edit($componentId = null) + { + if ($item = Component::find($componentId)) { + $this->authorize('update', $item); + return view('components/edit', compact('item'))->with('category_type', 'component'); + } + return redirect()->route('components.index')->with('error', trans('admin/components/message.does_not_exist')); + } + + + /** + * Return a view to edit a component. + * + * @author [A. Gianotto] [] + * @see ComponentsController::getEdit() method presents the form. + * @param ImageUploadRequest $request + * @param int $componentId + * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException + * @since [v3.0] + */ + public function update(ImageUploadRequest $request, $componentId = null) + { + if (is_null($component = Component::find($componentId))) { + return redirect()->route('components.index')->with('error', trans('admin/components/message.does_not_exist')); + } + + $this->authorize('update', $component); + + // Update the component data + $component->name = Input::get('name'); + $component->category_id = Input::get('category_id'); + $component->location_id = Input::get('location_id'); + $component->company_id = Company::getIdForCurrentUser(Input::get('company_id')); + $component->order_number = Input::get('order_number'); + $component->min_amt = Input::get('min_amt'); + $component->serial = Input::get('serial'); + $component->purchase_date = Input::get('purchase_date'); + $component->purchase_cost = request('purchase_cost'); + $component->qty = Input::get('qty'); + + $component = $request->handleImages($component); + + if ($component->save()) { + return redirect()->route('components.index')->with('success', trans('admin/components/message.update.success')); + } + return redirect()->back()->withInput()->withErrors($component->getErrors()); + } + + /** + * Delete a component. + * + * @author [A. Gianotto] [] + * @since [v3.0] + * @param int $componentId + * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function destroy($componentId) + { + if (is_null($component = Component::find($componentId))) { + return redirect()->route('components.index')->with('error', trans('admin/components/message.does_not_exist')); + } + + $this->authorize('delete', $component); + $component->delete(); + return redirect()->route('components.index')->with('success', trans('admin/components/message.delete.success')); + } + + /** + * Return a view to display component information. + * + * @author [A. Gianotto] [] + * @see ComponentsController::getDataView() method that generates the JSON response + * @since [v3.0] + * @param int $componentId + * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function show($componentId = null) + { + $component = Component::find($componentId); + + if (isset($component->id)) { + $this->authorize('view', $component); + return view('components/view', compact('component')); + } + // Redirect to the user management page + return redirect()->route('components.index') + ->with('error', trans('admin/components/message.does_not_exist')); + } +} diff --git a/app/Http/Controllers/ComponentsController.php b/app/Http/Controllers/ComponentsController.php deleted file mode 100644 index a73a951363..0000000000 --- a/app/Http/Controllers/ComponentsController.php +++ /dev/null @@ -1,397 +0,0 @@ -] - * @see ComponentsController::getDatatable() method that generates the JSON response - * @since [v3.0] - * @return \Illuminate\Contracts\View\View - */ - public function index() - { - $this->authorize('view', Component::class); - return view('components/index'); - } - - - /** - * Returns a form to create a new component. - * - * @author [A. Gianotto] [] - * @see ComponentsController::postCreate() method that stores the data - * @since [v3.0] - * @return \Illuminate\Contracts\View\View - */ - public function create() - { - $this->authorize('create', Component::class); - $category_type = 'component'; - return view('components/edit')->with('category_type',$category_type) - ->with('item', new Component); - } - - - /** - * Validate and store data for new component. - * - * @author [A. Gianotto] [] - * @see ComponentsController::getCreate() method that generates the view - * @since [v3.0] - * @return \Illuminate\Http\RedirectResponse - */ - public function store(ImageUploadRequest $request) - { - $this->authorize('create', Component::class); - $component = new Component(); - $component->name = $request->input('name'); - $component->category_id = $request->input('category_id'); - $component->location_id = $request->input('location_id'); - $component->company_id = Company::getIdForCurrentUser($request->input('company_id')); - $component->order_number = $request->input('order_number', null); - $component->min_amt = $request->input('min_amt', null); - $component->serial = $request->input('serial', null); - $component->purchase_date = $request->input('purchase_date', null); - $component->purchase_cost = $request->input('purchase_cost', null); - $component->qty = $request->input('qty'); - $component->user_id = Auth::id(); - - - if ($request->file('image')) { - $image = $request->file('image'); - $file_name = str_random(25).".".$image->getClientOriginalExtension(); - $path = public_path('uploads/components/'.$file_name); - Image::make($image->getRealPath())->resize(200, null, function ($constraint) { - $constraint->aspectRatio(); - $constraint->upsize(); - })->save($path); - $component->image = $file_name; - } - - if ($component->save()) { - return redirect()->route('components.index')->with('success', trans('admin/components/message.create.success')); - } - return redirect()->back()->withInput()->withErrors($component->getErrors()); - } - - /** - * Return a view to edit a component. - * - * @author [A. Gianotto] [] - * @see ComponentsController::postEdit() method that stores the data. - * @since [v3.0] - * @param int $componentId - * @return \Illuminate\Contracts\View\View - */ - public function edit($componentId = null) - { - - - if ($item = Component::find($componentId)) { - $this->authorize('update', $item); - $category_type = 'component'; - return view('components/edit', compact('item'))->with('category_type', $category_type); - } - return redirect()->route('components.index')->with('error', trans('admin/components/message.does_not_exist')); - - - - - } - - - /** - * Return a view to edit a component. - * - * @author [A. Gianotto] [] - * @see ComponentsController::getEdit() method presents the form. - * @param int $componentId - * @since [v3.0] - * @return \Illuminate\Http\RedirectResponse - */ - public function update(ImageUploadRequest $request, $componentId = null) - { - if (is_null($component = Component::find($componentId))) { - return redirect()->route('components.index')->with('error', trans('admin/components/message.does_not_exist')); - } - - $this->authorize('update', $component); - - - // Update the component data - $component->name = Input::get('name'); - $component->category_id = Input::get('category_id'); - $component->location_id = Input::get('location_id'); - $component->company_id = Company::getIdForCurrentUser(Input::get('company_id')); - $component->order_number = Input::get('order_number'); - $component->min_amt = Input::get('min_amt'); - $component->serial = Input::get('serial'); - $component->purchase_date = Input::get('purchase_date'); - $component->purchase_cost = request('purchase_cost'); - $component->qty = Input::get('qty'); - - if ($request->file('image')) { - $image = $request->file('image'); - $file_name = str_random(25).".".$image->getClientOriginalExtension(); - $path = public_path('uploads/components/'.$file_name); - Image::make($image->getRealPath())->resize(200, null, function ($constraint) { - $constraint->aspectRatio(); - $constraint->upsize(); - })->save($path); - $component->image = $file_name; - } elseif ($request->input('image_delete')=='1') { - $component->image = null; - } - - if ($component->save()) { - return redirect()->route('components.index')->with('success', trans('admin/components/message.update.success')); - } - return redirect()->back()->withInput()->withErrors($component->getErrors()); - } - - /** - * Delete a component. - * - * @author [A. Gianotto] [] - * @since [v3.0] - * @param int $componentId - * @return \Illuminate\Http\RedirectResponse - */ - public function destroy($componentId) - { - if (is_null($component = Component::find($componentId))) { - return redirect()->route('components.index')->with('error', trans('admin/components/message.does_not_exist')); - } - - $this->authorize('delete', $component); - $component->delete(); - return redirect()->route('components.index')->with('success', trans('admin/components/message.delete.success')); - } - - /** - * Return a view to display component information. - * - * @author [A. Gianotto] [] - * @see ComponentsController::getDataView() method that generates the JSON response - * @since [v3.0] - * @param int $componentId - * @return \Illuminate\Contracts\View\View - */ - public function show($componentId = null) - { - $component = Component::find($componentId); - - if (isset($component->id)) { - $this->authorize('view', $component); - return view('components/view', compact('component')); - } - // Prepare the error message - $error = trans('admin/components/message.does_not_exist', compact('id')); - // Redirect to the user management page - return redirect()->route('components.index')->with('error', $error); - } - - /** - * Returns a view that allows the checkout of a component to an asset. - * - * @author [A. Gianotto] [] - * @see ComponentsController::postCheckout() method that stores the data. - * @since [v3.0] - * @param int $componentId - * @return \Illuminate\Contracts\View\View - */ - public function getCheckout($componentId) - { - // Check if the component exists - if (is_null($component = Component::find($componentId))) { - // Redirect to the component management page with error - return redirect()->route('components.index')->with('error', trans('admin/components/message.not_found')); - } - $this->authorize('checkout', $component); - return view('components/checkout', compact('component')); - } - - /** - * Validate and store checkout data. - * - * @author [A. Gianotto] [] - * @see ComponentsController::getCheckout() method that returns the form. - * @since [v3.0] - * @param Request $request - * @param int $componentId - * @return \Illuminate\Http\RedirectResponse - */ - public function postCheckout(Request $request, $componentId) - { - // Check if the component exists - if (is_null($component = Component::find($componentId))) { - // Redirect to the component management page with error - return redirect()->route('components.index')->with('error', trans('admin/components/message.not_found')); - } - - $this->authorize('checkout', $component); - - $max_to_checkout = $component->numRemaining(); - $validator = Validator::make($request->all(), [ - "asset_id" => "required", - "assigned_qty" => "required|numeric|between:1,$max_to_checkout" - ]); - - if ($validator->fails()) { - return redirect()->back() - ->withErrors($validator) - ->withInput(); - } - - $admin_user = Auth::user(); - $asset_id = e(Input::get('asset_id')); - - // Check if the user exists - if (is_null($asset = Asset::find($asset_id))) { - // Redirect to the component management page with error - return redirect()->route('components.index')->with('error', trans('admin/components/message.asset_does_not_exist')); - } - - // Update the component data - $component->asset_id = $asset_id; - - $component->assets()->attach($component->id, [ - 'component_id' => $component->id, - 'user_id' => $admin_user->id, - 'created_at' => date('Y-m-d H:i:s'), - 'assigned_qty' => Input::get('assigned_qty'), - 'asset_id' => $asset_id - ]); - - $component->logCheckout(e(Input::get('note')), $asset); - return redirect()->route('components.index')->with('success', trans('admin/components/message.checkout.success')); - } - - /** - * Returns a view that allows the checkin of a component from an asset. - * - * @author [A. Gianotto] [] - * @see ComponentsController::postCheckout() method that stores the data. - * @since [v4.1.4] - * @param int $componentId - * @return \Illuminate\Contracts\View\View - */ - public function getCheckin($component_asset_id) - { - - // This could probably be done more cleanly but I am very tired. - @snipe - if ($component_assets = DB::table('components_assets')->find($component_asset_id)) { - if (is_null($component = Component::find($component_assets->component_id))) { - return redirect()->route('components.index')->with('error', trans('admin/components/messages.not_found')); - } - if (is_null($asset = Asset::find($component_assets->asset_id))) { - return redirect()->route('components.index')->with('error', - trans('admin/components/message.not_found')); - } - $this->authorize('checkin', $component); - return view('components/checkin', compact('component_assets','component','asset')); - } - - return redirect()->route('components.index')->with('error', trans('admin/components/messages.not_found')); - - } - - /** - * Validate and store checkin data. - * - * @author [A. Gianotto] [] - * @see ComponentsController::getCheckout() method that returns the form. - * @since [v4.1.4] - * @param Request $request - * @param int $componentId - * @return \Illuminate\Http\RedirectResponse - */ - public function postCheckin(Request $request, $component_asset_id) - { - if ($component_assets = DB::table('components_assets')->find($component_asset_id)) { - if (is_null($component = Component::find($component_assets->component_id))) { - return redirect()->route('components.index')->with('error', - trans('admin/components/message.not_found')); - } - - - $this->authorize('checkin', $component); - - $max_to_checkin = $component_assets->assigned_qty; - $validator = Validator::make($request->all(), [ - "checkin_qty" => "required|numeric|between:1,$max_to_checkin" - ]); - - if ($validator->fails()) { - return redirect()->back() - ->withErrors($validator) - ->withInput(); - } - - // Validation passed, so let's figure out what we have to do here. - $qty_remaining_in_checkout = ($component_assets->assigned_qty - (int)$request->input('checkin_qty')); - - // We have to modify the record to reflect the new qty that's - // actually checked out. - $component_assets->assigned_qty = $qty_remaining_in_checkout; - DB::table('components_assets')->where('id', - $component_asset_id)->update(['assigned_qty' => $qty_remaining_in_checkout]); - - $log = new Actionlog(); - $log->user_id = Auth::user()->id; - $log->action_type = 'checkin from'; - $log->target_type = Asset::class; - $log->target_id = $component_assets->asset_id; - $log->item_id = $component_assets->component_id; - $log->item_type = Component::class; - $log->note = $request->input('note'); - $log->save(); - - // If the checked-in qty is exactly the same as the assigned_qty, - // we can simply delete the associated components_assets record - if ($qty_remaining_in_checkout == 0) { - DB::table('components_assets')->where('id', '=', $component_asset_id)->delete(); - } - - return redirect()->route('components.index')->with('success', - trans('admin/components/message.checkout.success')); - } - return redirect()->route('components.index')->with('error', trans('admin/components/message.not_found')); - } - - -} diff --git a/app/Http/Controllers/Consumables/ConsumableCheckoutController.php b/app/Http/Controllers/Consumables/ConsumableCheckoutController.php new file mode 100644 index 0000000000..6de35ff9e1 --- /dev/null +++ b/app/Http/Controllers/Consumables/ConsumableCheckoutController.php @@ -0,0 +1,76 @@ +] + * @see ConsumableCheckoutController::store() method that stores the data. + * @since [v1.0] + * @param int $consumableId + * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function create($consumableId) + { + if (is_null($consumable = Consumable::find($consumableId))) { + return redirect()->route('consumables.index')->with('error', trans('admin/consumables/message.does_not_exist')); + } + $this->authorize('checkout', $consumable); + return view('consumables/checkout', compact('consumable')); + } + + /** + * Saves the checkout information + * + * @author [A. Gianotto] [] + * @see ConsumableCheckoutController::create() method that returns the form. + * @since [v1.0] + * @param int $consumableId + * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function store($consumableId) + { + if (is_null($consumable = Consumable::find($consumableId))) { + return redirect()->route('consumables.index')->with('error', trans('admin/consumables/message.not_found')); + } + + $this->authorize('checkout', $consumable); + + $admin_user = Auth::user(); + $assigned_to = e(Input::get('assigned_to')); + + // Check if the user exists + if (is_null($user = User::find($assigned_to))) { + // Redirect to the consumable management page with error + return redirect()->route('checkout/consumable', $consumable)->with('error', trans('admin/consumables/message.checkout.user_does_not_exist')); + } + + // Update the consumable data + $consumable->assigned_to = e(Input::get('assigned_to')); + + $consumable->users()->attach($consumable->id, [ + 'consumable_id' => $consumable->id, + 'user_id' => $admin_user->id, + 'assigned_to' => e(Input::get('assigned_to')) + ]); + + $consumable->logCheckout(e(Input::get('note')), $user); + + // Redirect to the new consumable page + return redirect()->route('consumables.index')->with('success', trans('admin/consumables/message.checkout.success')); + + } +} diff --git a/app/Http/Controllers/Consumables/ConsumablesController.php b/app/Http/Controllers/Consumables/ConsumablesController.php new file mode 100644 index 0000000000..9bb9318ca4 --- /dev/null +++ b/app/Http/Controllers/Consumables/ConsumablesController.php @@ -0,0 +1,197 @@ +] + * @see ConsumablesController::getDatatable() method that generates the JSON response + * @since [v1.0] + * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function index() + { + $this->authorize('index', Consumable::class); + return view('consumables/index'); + } + + + /** + * Return a view to display the form view to create a new consumable + * + * @author [A. Gianotto] [] + * @see ConsumablesController::postCreate() method that stores the form data + * @since [v1.0] + * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function create() + { + $this->authorize('create', Consumable::class); + return view('consumables/edit')->with('category_type', 'consumable') + ->with('item', new Consumable); + } + + + /** + * Validate and store new consumable data. + * + * @author [A. Gianotto] [] + * @see ConsumablesController::getCreate() method that returns the form view + * @since [v1.0] + * @param ImageUploadRequest $request + * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function store(ImageUploadRequest $request) + { + $this->authorize('create', Consumable::class); + $consumable = new Consumable(); + $consumable->name = $request->input('name'); + $consumable->category_id = $request->input('category_id'); + $consumable->location_id = $request->input('location_id'); + $consumable->company_id = Company::getIdForCurrentUser($request->input('company_id')); + $consumable->order_number = $request->input('order_number'); + $consumable->min_amt = $request->input('min_amt'); + $consumable->manufacturer_id = $request->input('manufacturer_id'); + $consumable->model_number = $request->input('model_number'); + $consumable->item_no = $request->input('item_no'); + $consumable->purchase_date = $request->input('purchase_date'); + $consumable->purchase_cost = Helper::ParseFloat($request->input('purchase_cost')); + $consumable->qty = $request->input('qty'); + $consumable->user_id = Auth::id(); + + + $consumable = $request->handleImages($consumable); + + if ($consumable->save()) { + return redirect()->route('consumables.index')->with('success', trans('admin/consumables/message.create.success')); + } + + return redirect()->back()->withInput()->withErrors($consumable->getErrors()); + + } + + /** + * Returns a form view to edit a consumable. + * + * @author [A. Gianotto] [] + * @param int $consumableId + * @see ConsumablesController::postEdit() method that stores the form data. + * @since [v1.0] + * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function edit($consumableId = null) + { + if ($item = Consumable::find($consumableId)) { + $this->authorize($item); + return view('consumables/edit', compact('item'))->with('category_type', 'consumable'); + } + + return redirect()->route('consumables.index')->with('error', trans('admin/consumables/message.does_not_exist')); + + } + + + /** + * Returns a form view to edit a consumable. + * + * @author [A. Gianotto] [] + * @param ImageUploadRequest $request + * @param int $consumableId + * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException + * @see ConsumablesController::getEdit() method that stores the form data. + * @since [v1.0] + */ + public function update(ImageUploadRequest $request, $consumableId = null) + { + if (is_null($consumable = Consumable::find($consumableId))) { + return redirect()->route('consumables.index')->with('error', trans('admin/consumables/message.does_not_exist')); + } + + $this->authorize($consumable); + + $consumable->name = $request->input('name'); + $consumable->category_id = $request->input('category_id'); + $consumable->location_id = $request->input('location_id'); + $consumable->company_id = Company::getIdForCurrentUser($request->input('company_id')); + $consumable->order_number = $request->input('order_number'); + $consumable->min_amt = $request->input('min_amt'); + $consumable->manufacturer_id = $request->input('manufacturer_id'); + $consumable->model_number = $request->input('model_number'); + $consumable->item_no = $request->input('item_no'); + $consumable->purchase_date = $request->input('purchase_date'); + $consumable->purchase_cost = Helper::ParseFloat(Input::get('purchase_cost')); + $consumable->qty = Helper::ParseFloat(Input::get('qty')); + + $consumable = $request->handleImages($consumable); + + if ($consumable->save()) { + return redirect()->route('consumables.index')->with('success', trans('admin/consumables/message.update.success')); + } + return redirect()->back()->withInput()->withErrors($consumable->getErrors()); + } + + /** + * Delete a consumable. + * + * @author [A. Gianotto] [] + * @param int $consumableId + * @since [v1.0] + * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function destroy($consumableId) + { + if (is_null($consumable = Consumable::find($consumableId))) { + return redirect()->route('consumables.index')->with('error', trans('admin/consumables/message.not_found')); + } + $this->authorize($consumable); + $consumable->delete(); + // Redirect to the locations management page + return redirect()->route('consumables.index')->with('success', trans('admin/consumables/message.delete.success')); + } + + /** + * Return a view to display component information. + * + * @author [A. Gianotto] [] + * @see ConsumablesController::getDataView() method that generates the JSON response + * @since [v1.0] + * @param int $consumableId + * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function show($consumableId = null) + { + $consumable = Consumable::find($consumableId); + $this->authorize($consumable); + if (isset($consumable->id)) { + return view('consumables/view', compact('consumable')); + } + return redirect()->route('consumables.index') + ->with('error', trans('admin/consumables/message.does_not_exist')); + } + +} diff --git a/app/Http/Controllers/ConsumablesController.php b/app/Http/Controllers/ConsumablesController.php deleted file mode 100644 index 92f3752968..0000000000 --- a/app/Http/Controllers/ConsumablesController.php +++ /dev/null @@ -1,286 +0,0 @@ -] - * @see ConsumablesController::getDatatable() method that generates the JSON response - * @since [v1.0] - * @return \Illuminate\Contracts\View\View - */ - public function index() - { - $this->authorize('index', Consumable::class); - return view('consumables/index'); - } - - - /** - * Return a view to display the form view to create a new consumable - * - * @author [A. Gianotto] [] - * @see ConsumablesController::postCreate() method that stores the form data - * @since [v1.0] - * @return \Illuminate\Contracts\View\View - */ - public function create() - { - $this->authorize('create', Consumable::class); - $category_type = 'consumable'; - return view('consumables/edit')->with('category_type', $category_type) - ->with('item', new Consumable); - } - - - /** - * Validate and store new consumable data. - * - * @author [A. Gianotto] [] - * @see ConsumablesController::getCreate() method that returns the form view - * @since [v1.0] - * @return \Illuminate\Http\RedirectResponse - */ - public function store(ImageUploadRequest $request) - { - $this->authorize('create', Consumable::class); - $consumable = new Consumable(); - $consumable->name = $request->input('name'); - $consumable->category_id = $request->input('category_id'); - $consumable->location_id = $request->input('location_id'); - $consumable->company_id = Company::getIdForCurrentUser($request->input('company_id')); - $consumable->order_number = $request->input('order_number'); - $consumable->min_amt = $request->input('min_amt'); - $consumable->manufacturer_id = $request->input('manufacturer_id'); - $consumable->model_number = $request->input('model_number'); - $consumable->item_no = $request->input('item_no'); - $consumable->purchase_date = $request->input('purchase_date'); - $consumable->purchase_cost = Helper::ParseFloat($request->input('purchase_cost')); - $consumable->qty = $request->input('qty'); - $consumable->user_id = Auth::id(); - - - if ($request->file('image')) { - $image = $request->file('image'); - $file_name = str_random(25).".".$image->getClientOriginalExtension(); - $path = public_path('uploads/consumables/'.$file_name); - Image::make($image->getRealPath())->resize(200, null, function ($constraint) { - $constraint->aspectRatio(); - $constraint->upsize(); - })->save($path); - $consumable->image = $file_name; - } - - if ($consumable->save()) { - return redirect()->route('consumables.index')->with('success', trans('admin/consumables/message.create.success')); - } - - return redirect()->back()->withInput()->withErrors($consumable->getErrors()); - - } - - /** - * Returns a form view to edit a consumable. - * - * @author [A. Gianotto] [] - * @param int $consumableId - * @see ConsumablesController::postEdit() method that stores the form data. - * @since [v1.0] - * @return \Illuminate\Contracts\View\View - */ - public function edit($consumableId = null) - { - if ($item = Consumable::find($consumableId)) { - $this->authorize($item); - $category_type = 'consumable'; - return view('consumables/edit', compact('item'))->with('category_type', $category_type); - } - - return redirect()->route('consumables.index')->with('error', trans('admin/consumables/message.does_not_exist')); - - } - - - /** - * Returns a form view to edit a consumable. - * - * @author [A. Gianotto] [] - * @param int $consumableId - * @see ConsumablesController::getEdit() method that stores the form data. - * @since [v1.0] - * @return \Illuminate\Http\RedirectResponse - */ - public function update(ImageUploadRequest $request, $consumableId = null) - { - if (is_null($consumable = Consumable::find($consumableId))) { - return redirect()->route('consumables.index')->with('error', trans('admin/consumables/message.does_not_exist')); - } - - $this->authorize($consumable); - - $consumable->name = $request->input('name'); - $consumable->category_id = $request->input('category_id'); - $consumable->location_id = $request->input('location_id'); - $consumable->company_id = Company::getIdForCurrentUser($request->input('company_id')); - $consumable->order_number = $request->input('order_number'); - $consumable->min_amt = $request->input('min_amt'); - $consumable->manufacturer_id = $request->input('manufacturer_id'); - $consumable->model_number = $request->input('model_number'); - $consumable->item_no = $request->input('item_no'); - $consumable->purchase_date = $request->input('purchase_date'); - $consumable->purchase_cost = Helper::ParseFloat(Input::get('purchase_cost')); - $consumable->qty = Helper::ParseFloat(Input::get('qty')); - - if ($request->file('image')) { - $image = $request->file('image'); - $file_name = str_random(25).".".$image->getClientOriginalExtension(); - $path = public_path('uploads/consumables/'.$file_name); - Image::make($image->getRealPath())->resize(200, null, function ($constraint) { - $constraint->aspectRatio(); - $constraint->upsize(); - })->save($path); - $consumable->image = $file_name; - } elseif ($request->input('image_delete')=='1') { - $consumable->image = null; - } - - if ($consumable->save()) { - return redirect()->route('consumables.index')->with('success', trans('admin/consumables/message.update.success')); - } - return redirect()->back()->withInput()->withErrors($consumable->getErrors()); - } - - /** - * Delete a consumable. - * - * @author [A. Gianotto] [] - * @param int $consumableId - * @since [v1.0] - * @return \Illuminate\Http\RedirectResponse - */ - public function destroy($consumableId) - { - if (is_null($consumable = Consumable::find($consumableId))) { - return redirect()->route('consumables.index')->with('error', trans('admin/consumables/message.not_found')); - } - $this->authorize($consumable); - $consumable->delete(); - // Redirect to the locations management page - return redirect()->route('consumables.index')->with('success', trans('admin/consumables/message.delete.success')); - } - - /** - * Return a view to display component information. - * - * @author [A. Gianotto] [] - * @see ConsumablesController::getDataView() method that generates the JSON response - * @since [v1.0] - * @param int $consumableId - * @return \Illuminate\Contracts\View\View - */ - public function show($consumableId = null) - { - $consumable = Consumable::find($consumableId); - $this->authorize($consumable); - if (isset($consumable->id)) { - return view('consumables/view', compact('consumable')); - } - return redirect()->route('consumables.index')->with('error', trans('admin/consumables/message.does_not_exist', compact('id'))); - } - - /** - * Return a view to checkout a consumable to a user. - * - * @author [A. Gianotto] [] - * @see ConsumablesController::postCheckout() method that stores the data. - * @since [v1.0] - * @param int $consumableId - * @return \Illuminate\Contracts\View\View - */ - public function getCheckout($consumableId) - { - if (is_null($consumable = Consumable::find($consumableId))) { - return redirect()->route('consumables.index')->with('error', trans('admin/consumables/message.does_not_exist')); - } - $this->authorize('checkout', $consumable); - return view('consumables/checkout', compact('consumable')); - } - - /** - * Saves the checkout information - * - * @author [A. Gianotto] [] - * @see ConsumablesController::getCheckout() method that returns the form. - * @since [v1.0] - * @param int $consumableId - * @return \Illuminate\Http\RedirectResponse - */ - public function postCheckout($consumableId) - { - if (is_null($consumable = Consumable::find($consumableId))) { - return redirect()->route('consumables.index')->with('error', trans('admin/consumables/message.not_found')); - } - - $this->authorize('checkout', $consumable); - - $admin_user = Auth::user(); - $assigned_to = e(Input::get('assigned_to')); - - // Check if the user exists - if (is_null($user = User::find($assigned_to))) { - // Redirect to the consumable management page with error - return redirect()->route('checkout/consumable', $consumable)->with('error', trans('admin/consumables/message.checkout.user_does_not_exist')); - } - - // Update the consumable data - $consumable->assigned_to = e(Input::get('assigned_to')); - - $consumable->users()->attach($consumable->id, [ - 'consumable_id' => $consumable->id, - 'user_id' => $admin_user->id, - 'assigned_to' => e(Input::get('assigned_to')) - ]); - - $logaction = $consumable->logCheckout(e(Input::get('note')), $user); - $data['log_id'] = $logaction->id; - $data['eula'] = $consumable->getEula(); - $data['first_name'] = $user->first_name; - $data['item_name'] = $consumable->name; - $data['checkout_date'] = $logaction->created_at; - $data['note'] = $logaction->note; - $data['require_acceptance'] = $consumable->requireAcceptance(); - - - // Redirect to the new consumable page - return redirect()->route('consumables.index')->with('success', trans('admin/consumables/message.checkout.success')); - - } - -} diff --git a/app/Http/Controllers/CustomFieldsController.php b/app/Http/Controllers/CustomFieldsController.php index 62f2cf32f7..af0370ea5e 100644 --- a/app/Http/Controllers/CustomFieldsController.php +++ b/app/Http/Controllers/CustomFieldsController.php @@ -2,18 +2,12 @@ namespace App\Http\Controllers; use App\Http\Requests\CustomFieldRequest; -use View; use App\Models\CustomFieldset; use App\Models\CustomField; -use Input; -use Validator; +use Illuminate\Support\Facades\Input; use Redirect; -use App\Models\AssetModel; -use Lang; -use Auth; -use Illuminate\Http\Request; -use App\Helpers\Helper; -use Log; +use Illuminate\Support\Facades\Auth; + /** * This controller handles all actions related to Custom Asset Fields for @@ -29,12 +23,13 @@ class CustomFieldsController extends Controller { /** - * Returns a view with a listing of custom fields. - * - * @author [Brady Wetherington] [] - * @since [v1.8] - * @return View - */ + * Returns a view with a listing of custom fields. + * + * @author [Brady Wetherington] [] + * @since [v1.8] + * @return \Illuminate\Support\Facades\View + * @throws \Illuminate\Auth\Access\AuthorizationException + */ public function index() { $this->authorize('view', CustomField::class); @@ -45,17 +40,15 @@ class CustomFieldsController extends Controller } - - - /** - * Returns a view with a form to create a new custom field. - * - * @see CustomFieldsController::storeField() - * @author [Brady Wetherington] [] - * @since [v1.8] - * @return View - */ + * Returns a view with a form to create a new custom field. + * + * @see CustomFieldsController::storeField() + * @author [Brady Wetherington] [] + * @since [v1.8] + * @return \Illuminate\Support\Facades\View + * @throws \Illuminate\Auth\Access\AuthorizationException + */ public function create() { $this->authorize('create', CustomField::class); @@ -65,13 +58,14 @@ class CustomFieldsController extends Controller /** - * Validates and stores a new custom field. - * - * @see CustomFieldsController::createField() - * @author [Brady Wetherington] [] - * @since [v1.8] - * @return Redirect - */ + * Validates and stores a new custom field. + * + * @see CustomFieldsController::createField() + * @author [Brady Wetherington] [] + * @since [v1.8] + * @return Redirect + * @throws \Illuminate\Auth\Access\AuthorizationException + */ public function store(CustomFieldRequest $request) { $this->authorize('create', CustomField::class); @@ -83,7 +77,7 @@ class CustomFieldsController extends Controller "field_values" => $request->get("field_values"), "field_encrypted" => $request->get("field_encrypted", 0), "show_in_email" => $request->get("show_in_email", 0), - "user_id" => Auth::user()->id + "user_id" => Auth::id() ]); @@ -94,11 +88,13 @@ class CustomFieldsController extends Controller } if ($field->save()) { + return redirect()->route("fields.index")->with("success", trans('admin/custom_fields/message.field.create.success')); - } else { - return redirect()->back()->withInput()->with('error', trans('admin/custom_fields/message.field.create.error')); } + return redirect()->back()->withInput() + ->with('error', trans('admin/custom_fields/message.field.create.error')); + } @@ -108,6 +104,7 @@ class CustomFieldsController extends Controller * @author [A. Gianotto] [] * @since [v3.0] * @return Redirect + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function deleteFieldFromFieldset($field_id, $fieldset_id) { @@ -116,19 +113,21 @@ class CustomFieldsController extends Controller $this->authorize('update', $field); if ($field->fieldset()->detach($fieldset_id)) { - return redirect()->route('fieldsets.show', ['fieldset' => $fieldset_id])->with("success", trans('admin/custom_fields/message.field.delete.success')); + return redirect()->route('fieldsets.show', ['fieldset' => $fieldset_id]) + ->with("success", trans('admin/custom_fields/message.field.delete.success')); } return redirect()->back()->withErrors(['message' => "Field is in-use"]); } /** - * Delete a custom field. - * - * @author [Brady Wetherington] [] - * @since [v1.8] - * @return Redirect - */ + * Delete a custom field. + * + * @author [Brady Wetherington] [] + * @since [v1.8] + * @return Redirect + * @throws \Illuminate\Auth\Access\AuthorizationException + */ public function destroy($field_id) { $field = CustomField::find($field_id); @@ -137,22 +136,22 @@ class CustomFieldsController extends Controller if ($field->fieldset->count()>0) { return redirect()->back()->withErrors(['message' => "Field is in-use"]); - } else { - $field->delete(); - return redirect()->route("fields.index")->with("success", trans('admin/custom_fields/message.field.delete.success')); } + $field->delete(); + return redirect()->route("fields.index") + ->with("success", trans('admin/custom_fields/message.field.delete.success')); } - /** - * Return a view to edit a custom field - * - * @author [A. Gianotto] [] - * @param int $id - * @since [v4.0] - * @return View - */ + * Return a view to edit a custom field + * + * @author [A. Gianotto] [] + * @param int $id + * @since [v4.0] + * @return \Illuminate\Support\Facades\View + * @throws \Illuminate\Auth\Access\AuthorizationException + */ public function edit($id) { $field = CustomField::find($id); @@ -164,15 +163,16 @@ class CustomFieldsController extends Controller /** - * Store the updated field - * - * @todo Allow encrypting/decrypting if encryption status changes - * - * @author [A. Gianotto] [] - * @param int $id - * @since [v4.0] - * @return Redirect - */ + * Store the updated field + * + * @todo Allow encrypting/decrypting if encryption status changes + * + * @author [A. Gianotto] [] + * @param int $id + * @since [v4.0] + * @return Redirect + * @throws \Illuminate\Auth\Access\AuthorizationException + */ public function update(CustomFieldRequest $request, $id) { $field = CustomField::find($id); @@ -182,7 +182,7 @@ class CustomFieldsController extends Controller $field->name = e($request->get("name")); $field->element = e($request->get("element")); $field->field_values = e($request->get("field_values")); - $field->user_id = Auth::user()->id; + $field->user_id = Auth::id(); $field->help_text = $request->get("help_text"); $field->show_in_email = $request->get("show_in_email", 0); diff --git a/app/Http/Controllers/CustomFieldsetsController.php b/app/Http/Controllers/CustomFieldsetsController.php index fa46263487..c035e130ea 100644 --- a/app/Http/Controllers/CustomFieldsetsController.php +++ b/app/Http/Controllers/CustomFieldsetsController.php @@ -1,17 +1,14 @@ ] - * @param int $id - * @since [v1.8] - * @return View - */ + /** + * Validates and stores a new custom field. + * + * @author [Brady Wetherington] [] + * @param int $id + * @return \Illuminate\Support\Facades\View + * @throws \Illuminate\Auth\Access\AuthorizationException + * @since [v1.8] + */ public function show($id) { - $cfset = CustomFieldset::with('fields')->where('id', '=', $id)->orderBy('id', 'ASC')->first(); + $cfset = CustomFieldset::with('fields') + ->where('id', '=', $id)->orderBy('id', 'ASC')->first(); $this->authorize('view', $cfset); @@ -53,21 +52,26 @@ class CustomFieldsetsController extends Controller } } - return view("custom_fields.fieldsets.view")->with("custom_fieldset", $cfset)->with("maxid", $maxid+1)->with("custom_fields_list", $custom_fields_list); + return view("custom_fields.fieldsets.view") + ->with("custom_fieldset", $cfset) + ->with("maxid", $maxid+1) + ->with("custom_fields_list", $custom_fields_list); } - return redirect()->route("fields.index")->with("error", trans('admin/custom_fields/message.fieldset.does_not_exist')); + return redirect()->route("fields.index") + ->with("error", trans('admin/custom_fields/message.fieldset.does_not_exist')); } /** - * Returns a view with a form for creating a new custom fieldset. - * - * @author [Brady Wetherington] [] - * @since [v1.8] - * @return View - */ + * Returns a view with a form for creating a new custom fieldset. + * + * @author [Brady Wetherington] [] + * @since [v1.8] + * @return \Illuminate\Support\Facades\View + * @throws \Illuminate\Auth\Access\AuthorizationException + */ public function create() { $this->authorize('create', CustomFieldset::class); @@ -77,29 +81,30 @@ class CustomFieldsetsController extends Controller /** - * Validates and stores a new custom fieldset. - * - * @author [Brady Wetherington] [] - * @since [v1.8] - * @return Redirect - */ + * Validates and stores a new custom fieldset. + * + * @author [Brady Wetherington] [] + * @since [v1.8] + * @param Request $request + * @return Redirect + * @throws \Illuminate\Auth\Access\AuthorizationException + */ public function store(Request $request) { $this->authorize('create', CustomFieldset::class); - $cfset = new CustomFieldset( - [ + $cfset = new CustomFieldset([ "name" => e($request->get("name")), - "user_id" => Auth::user()->id] - ); + "user_id" => Auth::user()->id + ]); $validator = Validator::make(Input::all(), $cfset->rules); if ($validator->passes()) { $cfset->save(); - return redirect()->route("fieldsets.show", [$cfset->id])->with('success', trans('admin/custom_fields/message.fieldset.create.success')); - } else { - return redirect()->back()->withInput()->withErrors($validator); + return redirect()->route("fieldsets.show", [$cfset->id]) + ->with('success', trans('admin/custom_fields/message.fieldset.create.success')); } + return redirect()->back()->withInput()->withErrors($validator); } @@ -136,13 +141,14 @@ class CustomFieldsetsController extends Controller /** - * Validates a custom fieldset and then deletes if it has no models associated. - * - * @author [Brady Wetherington] [] - * @param int $id - * @since [v1.8] - * @return View - */ + * Validates a custom fieldset and then deletes if it has no models associated. + * + * @author [Brady Wetherington] [] + * @param int $id + * @since [v1.8] + * @return View + * @throws \Illuminate\Auth\Access\AuthorizationException + */ public function destroy($id) { $fieldset = CustomFieldset::find($id); @@ -154,9 +160,8 @@ class CustomFieldsetsController extends Controller if ($models->count() == 0) { $fieldset->delete(); return redirect()->route("fields.index")->with("success", trans('admin/custom_fields/message.fieldset.delete.success')); - } else { - return redirect()->route("fields.index")->with("error", trans('admin/custom_fields/message.fieldset.delete.in_use')); } + return redirect()->route("fields.index")->with("error", trans('admin/custom_fields/message.fieldset.delete.in_use')); } return redirect()->route("fields.index")->with("error", trans('admin/custom_fields/message.fieldset.does_not_exist')); @@ -166,12 +171,13 @@ class CustomFieldsetsController extends Controller /** - * Associate the custom field with a custom fieldset. - * - * @author [Brady Wetherington] [] - * @since [v1.8] - * @return View - */ + * Associate the custom field with a custom fieldset. + * + * @author [Brady Wetherington] [] + * @since [v1.8] + * @return View + * @throws \Illuminate\Auth\Access\AuthorizationException + */ public function associate($id) { diff --git a/app/Http/Controllers/DepartmentsController.php b/app/Http/Controllers/DepartmentsController.php index 49375d8cdb..3606ec725c 100644 --- a/app/Http/Controllers/DepartmentsController.php +++ b/app/Http/Controllers/DepartmentsController.php @@ -4,8 +4,7 @@ namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\Department; -use App\Helpers\Helper; -use Auth; +use Illuminate\Support\Facades\Auth; use Image; use App\Http\Requests\ImageUploadRequest; @@ -24,7 +23,9 @@ class DepartmentsController extends Controller * @author [A. Gianotto] [] * @see AssetController::getDatatable() method that generates the JSON response * @since [v4.0] - * @return View + * @param Request $request + * @return \Illuminate\Support\Facades\View + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function index(Request $request) { @@ -42,27 +43,19 @@ class DepartmentsController extends Controller * * @author [A. Gianotto] [] * @since [v4.0] - * @param \Illuminate\Http\Request $request + * @param ImageUploadRequest $request * @return \Illuminate\Http\Response + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function store(ImageUploadRequest $request) { $this->authorize('create', Department::class); $department = new Department; $department->fill($request->all()); - $department->user_id = Auth::user()->id; - $department->manager_id = ($request->has('manager_id' ) ? $request->input('manager_id') : null); + $department->user_id = Auth::id(); + $department->manager_id = $request->input('manager_id', null); - if ($request->file('image')) { - $image = $request->file('image'); - $file_name = str_random(25).".".$image->getClientOriginalExtension(); - $path = public_path('uploads/departments/'.$file_name); - Image::make($image->getRealPath())->resize(200, null, function ($constraint) { - $constraint->aspectRatio(); - $constraint->upsize(); - })->save($path); - $department->image = $file_name; - } + $department = $request->handleImages($department); if ($department->save()) { return redirect()->route("departments.index")->with('success', trans('admin/departments/message.create.success')); @@ -78,6 +71,7 @@ class DepartmentsController extends Controller * @param int $id * @since [v4.0] * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function show($id) { @@ -88,7 +82,7 @@ class DepartmentsController extends Controller if (isset($department->id)) { return view('departments/view', compact('department')); } - return redirect()->route('departments.index')->with('error', trans('admin/departments/message.does_not_exist', compact('id'))); + return redirect()->route('departments.index')->with('error', trans('admin/departments/message.does_not_exist')); } @@ -99,6 +93,7 @@ class DepartmentsController extends Controller * @see DepartmentsController::postCreate() method that validates and stores the data * @since [v4.0] * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function create() { @@ -115,6 +110,7 @@ class DepartmentsController extends Controller * @param int $locationId * @since [v4.0] * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function destroy($id) { @@ -134,17 +130,18 @@ class DepartmentsController extends Controller } /** - * Makes a form view to edit location information. + * Makes a form view to edit Department information. * * @author [A. Gianotto] [] * @see LocationsController::postCreate() method that validates and stores - * @param int $locationId + * @param int $departmentId * @since [v1.0] * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException */ - public function edit($id = null) + public function edit($departmentId = null) { - if (is_null($item = Department::find($id))) { + if (is_null($item = Department::find($departmentId))) { return redirect()->back()->with('error', trans('admin/locations/message.does_not_exist')); } @@ -164,36 +161,7 @@ class DepartmentsController extends Controller $department->fill($request->all()); $department->manager_id = ($request->has('manager_id' ) ? $request->input('manager_id') : null); - $old_image = $department->image; - - // Set the model's image property to null if the image is being deleted - if ($request->input('image_delete') == 1) { - $department->image = null; - } - - if ($request->file('image')) { - $image = $request->file('image'); - $file_name = $department->id.'-'.str_slug($image->getClientOriginalName()) . "." . $image->getClientOriginalExtension(); - - if ($image->getClientOriginalExtension()!='svg') { - Image::make($image->getRealPath())->resize(500, null, function ($constraint) { - $constraint->aspectRatio(); - $constraint->upsize(); - })->save(app('departments_upload_path').$file_name); - } else { - $image->move(app('departments_upload_path'), $file_name); - } - $department->image = $file_name; - - } - - if ((($request->file('image')) && (isset($old_image)) && ($old_image!='')) || ($request->input('image_delete') == 1)) { - try { - unlink(app('departments_upload_path').$old_image); - } catch (\Exception $e) { - \Log::error($e); - } - } + $department = $request->handleImages($department); if ($department->save()) { return redirect()->route("departments.index")->with('success', trans('admin/departments/message.update.success')); diff --git a/app/Http/Controllers/DepreciationsController.php b/app/Http/Controllers/DepreciationsController.php index ececded3fe..91b168aca0 100755 --- a/app/Http/Controllers/DepreciationsController.php +++ b/app/Http/Controllers/DepreciationsController.php @@ -1,15 +1,8 @@ route('groups')->with('error', trans('admin/groups/message.group_not_found', compact('id'))); } @@ -126,13 +119,14 @@ class GroupsController extends Controller } /** - * Validates and deletes the User Group. - * - * @author [A. Gianotto] [] - * @param int $locationId - * @since [v4.0.11] + * @param $id * @return \Illuminate\Contracts\View\View + * @since [v4.0.11] */ public function show($id) { diff --git a/app/Http/Controllers/ImportsController.php b/app/Http/Controllers/ImportsController.php index 1331b7dd86..30f397ca08 100644 --- a/app/Http/Controllers/ImportsController.php +++ b/app/Http/Controllers/ImportsController.php @@ -4,17 +4,19 @@ namespace App\Http\Controllers; use App\Http\Transformers\ImportsTransformer; use App\Models\Import; -use Illuminate\Http\Request; use App\Models\Asset; class ImportsController extends Controller { + /** + * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException + */ public function index() { $this->authorize('create', Asset::class); - $imports = Import::latest()->get(); - $imports = (new ImportsTransformer)->transformImports($imports); + $imports = (new ImportsTransformer)->transformImports(Import::latest()->get()); return view('importer/import')->with('imports', $imports); } } diff --git a/app/Http/Controllers/Licenses/LicenseCheckinController.php b/app/Http/Controllers/Licenses/LicenseCheckinController.php new file mode 100644 index 0000000000..f942aa1e7e --- /dev/null +++ b/app/Http/Controllers/Licenses/LicenseCheckinController.php @@ -0,0 +1,102 @@ +] + * @since [v1.0] + * @param int $seatId + * @param string $backTo + * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function create($seatId = null, $backTo = null) + { + // Check if the asset exists + if (is_null($licenseSeat = LicenseSeat::find($seatId)) || is_null($license = License::find($licenseSeat->license_id))) { + // Redirect to the asset management page with error + return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.not_found')); + } + + $this->authorize('checkout', $license); + return view('licenses/checkin', compact('licenseSeat'))->with('backto', $backTo); + } + + + /** + * Validates and stores the license checkin action. + * + * @author [A. Gianotto] [] + * @see LicenseCheckinController::create() method that provides the form view + * @since [v1.0] + * @param int $seatId + * @param string $backTo + * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function store($seatId = null, $backTo = null) + { + // Check if the asset exists + if (is_null($licenseSeat = LicenseSeat::find($seatId))) { + // Redirect to the asset management page with error + return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.not_found')); + } + + $license = License::find($licenseSeat->license_id); + $this->authorize('checkout', $license); + + if (!$license->reassignable) { + // Not allowed to checkin + Session::flash('error', 'License not reassignable.'); + return redirect()->back()->withInput(); + } + + // Declare the rules for the form validation + $rules = [ + 'note' => 'string', + 'notes' => 'string', + ]; + + // Create a new validator instance from our validation rules + $validator = Validator::make(Input::all(), $rules); + + // If validation fails, we'll exit the operation now. + if ($validator->fails()) { + // Ooops.. something went wrong + return redirect()->back()->withInput()->withErrors($validator); + } + $return_to = User::find($licenseSeat->assigned_to); + + // Update the asset data + $licenseSeat->assigned_to = null; + $licenseSeat->asset_id = null; + + // Was the asset updated? + if ($licenseSeat->save()) { + $licenseSeat->logCheckin($return_to, e(request('note'))); + if ($backTo=='user') { + return redirect()->route("users.show", $return_to->id)->with('success', trans('admin/licenses/message.checkin.success')); + } + return redirect()->route("licenses.show", $licenseSeat->license_id)->with('success', trans('admin/licenses/message.checkin.success')); + } + + // Redirect to the license page with error + return redirect()->route("licenses.index")->with('error', trans('admin/licenses/message.checkin.error')); + } + +} diff --git a/app/Http/Controllers/Licenses/LicenseCheckoutController.php b/app/Http/Controllers/Licenses/LicenseCheckoutController.php new file mode 100644 index 0000000000..947ff1544a --- /dev/null +++ b/app/Http/Controllers/Licenses/LicenseCheckoutController.php @@ -0,0 +1,110 @@ +] + * @since [v1.0] + * @param $licenceId + * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function create($licenceId) + { + // Check that the license is valid + if ($license = License::find($licenseId)) { + + // If the license is valid, check that there is an available seat + if ($license->avail_seats_count < 1) { + return redirect()->route('licenses.index')->with('error', 'There are no available seats for this license'); + } + } + + $this->authorize('checkout', $license); + return view('licenses/checkout', compact('license')); + } + + + /** + * Validates and stores the license checkout action. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @param LicenseCheckoutRequest $request + * @param $licenseId + * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + + public function store(LicenseCheckoutRequest $request, $licenseId, $seatId = null) + { + $license = License::find($licenseId); + if (!$license) { + return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.not_found')); + } + + $this->authorize('checkout', $license); + + $licenseSeat = $request->findLicenseSeatToCheckout($license, $seatId); + + $licenseSeat->user_id = Auth::id(); + $checkoutMethod = 'checkoutTo'.ucwords(request('checkout_to_type')); + + if ($this->$checkoutMethod($licenseSeat)) { + return redirect()->route("licenses.index")->with('success', trans('admin/licenses/message.checkout.success')); + } + return redirect()->route("licenses.index")->with('error', trans('Something went wrong handling this checkout.')); + } + + protected function checkoutToAsset($licenseSeat) + { + if (is_null($target = Asset::find(request('asset_id')))) { + return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.asset_does_not_exist')); + } + $licenseSeat->asset_id = request('asset_id'); + + // Override asset's assigned user if available + if ($target->checkedOutToUser()) { + $licenseSeat->assigned_to = $target->assigned_to; + } + + if ($licenseSeat->save()) { + $licenseSeat->logCheckout(request('note'), $target); + return true; + } + return false; + } + + protected function checkoutToUser($licenseSeat) + { + // Fetch the target and set the license user + if (is_null($target = User::find(request('assigned_to')))) { + return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.user_does_not_exist')); + } + $licenseSeat->assigned_to = request('assigned_to'); + + if ($licenseSeat->save()) { + $licenseSeat->logCheckout(request('note'), $target); + return true; + } + return false; + } +} diff --git a/app/Http/Controllers/Licenses/LicenseFilesController.php b/app/Http/Controllers/Licenses/LicenseFilesController.php new file mode 100644 index 0000000000..786fc24d23 --- /dev/null +++ b/app/Http/Controllers/Licenses/LicenseFilesController.php @@ -0,0 +1,146 @@ +] + * @since [v1.0] + * @param AssetFileRequest $request + * @param int $licenseId + * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function store(AssetFileRequest $request, $licenseId = null) + { + $license = License::find($licenseId); + // the license is valid + $destinationPath = config('app.private_uploads').'/licenses'; + + if (isset($license->id)) { + $this->authorize('update', $license); + + if (Input::hasFile('file')) { + $upload_success = false; + foreach (Input::file('file') as $file) { + $extension = $file->getClientOriginalExtension(); + $filename = 'license-'.$license->id.'-'.str_random(8).'-'.str_slug(basename($file->getClientOriginalName(), '.'.$extension)).'.'.$extension; + $upload_success = $file->move($destinationPath, $filename); + + //Log the upload to the log + $license->logUpload($filename, e($request->input('notes'))); + } + // This being called from a modal seems to confuse redirect()->back() + // It thinks we should go to the dashboard. As this is only used + // from the modal at present, hardcode the redirect. Longterm + // maybe we evaluate something else. + if ($upload_success) { + return redirect()->route('licenses.show', $license->id)->with('success', trans('admin/licenses/message.upload.success')); + } + return redirect()->route('licenses.show', $license->id)->with('error', trans('admin/licenses/message.upload.error')); + } + return redirect()->route('licenses.show', $license->id)->with('error', trans('admin/licenses/message.upload.nofiles')); + } + // Prepare the error message + return redirect()->route('licenses.index') + ->with('error', trans('admin/licenses/message.does_not_exist')); + } + + + /** + * Deletes the selected license file. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @param int $licenseId + * @param int $fileId + * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function destroy($licenseId = null, $fileId = null) + { + $license = License::find($licenseId); + $destinationPath = config('app.private_uploads').'/licenses'; + + // the license is valid + if (isset($license->id)) { + $this->authorize('edit', $license); + $log = Actionlog::find($fileId); + $full_filename = $destinationPath.'/'.$log->filename; + if (file_exists($full_filename)) { + unlink($destinationPath.'/'.$log->filename); + } + $log->delete(); + return redirect()->back()->with('success', trans('admin/licenses/message.deletefile.success')); + } + + // Redirect to the licence management page + return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.does_not_exist')); + } + + + + /** + * Allows the selected file to be viewed. + * + * @author [A. Gianotto] [] + * @since [v1.4] + * @param int $licenseId + * @param int $fileId + * @return \Symfony\Component\HttpFoundation\Response + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function show($licenseId = null, $fileId = null, $download = true) + { + + $license = License::find($licenseId); + + // the license is valid + if (isset($license->id)) { + $this->authorize('view', $license); + $log = Actionlog::find($fileId); + $file = $log->get_src('licenses'); + + + if ($file =='') { + return response('File not found on server', 404) + ->header('Content-Type', 'text/plain'); + } + + $mimetype = \File::mimeType($file); + + + if (!file_exists($file)) { + return response('File '.$file.' not found on server', 404) + ->header('Content-Type', 'text/plain'); + } + + if ($download != 'true') { + if ($contents = file_get_contents($file)) { + return Response::make($contents)->header('Content-Type', $mimetype); + } + return JsonResponse::create(["error" => "Failed validation: "], 500); + } + return Response::download($file); + } + + + return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.does_not_exist')); + } + + + +} diff --git a/app/Http/Controllers/Licenses/LicensesController.php b/app/Http/Controllers/Licenses/LicensesController.php new file mode 100755 index 0000000000..1e6f926c1b --- /dev/null +++ b/app/Http/Controllers/Licenses/LicensesController.php @@ -0,0 +1,273 @@ +] + * @see LicensesController::getDatatable() method that generates the JSON response + * @since [v1.0] + * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function index() + { + $this->authorize('view', License::class); + return view('licenses/index'); + } + + + /** + * Returns a form view that allows an admin to create a new licence. + * + * @author [A. Gianotto] [] + * @see AccessoriesController::getDatatable() method that generates the JSON response + * @since [v1.0] + * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function create() + { + $this->authorize('create', License::class); + $maintained_list = [ + '' => 'Maintained', + '1' => 'Yes', + '0' => 'No' + ]; + + return view('licenses/edit') + ->with('depreciation_list', Helper::depreciationList()) + ->with('maintained_list', $maintained_list) + ->with('item', new License); + + } + + + /** + * Validates and stores the license form data submitted from the new + * license form. + * + * @author [A. Gianotto] [] + * @see LicensesController::getCreate() method that provides the form view + * @since [v1.0] + * @param Request $request + * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function store(Request $request) + { + $this->authorize('create', License::class); + // create a new model instance + $license = new License(); + // Save the license data + $license->company_id = Company::getIdForCurrentUser($request->input('company_id')); + $license->depreciation_id = $request->input('depreciation_id'); + $license->expiration_date = $request->input('expiration_date'); + $license->license_email = $request->input('license_email'); + $license->license_name = $request->input('license_name'); + $license->maintained = $request->input('maintained', 0); + $license->manufacturer_id = $request->input('manufacturer_id'); + $license->name = $request->input('name'); + $license->notes = $request->input('notes'); + $license->order_number = $request->input('order_number'); + $license->purchase_cost = $request->input('purchase_cost'); + $license->purchase_date = $request->input('purchase_date'); + $license->purchase_order = $request->input('purchase_order'); + $license->purchase_order = $request->input('purchase_order'); + $license->reassignable = $request->input('reassignable', 0); + $license->seats = $request->input('seats'); + $license->serial = $request->input('serial'); + $license->supplier_id = $request->input('supplier_id'); + $license->category_id = $request->input('category_id'); + $license->termination_date = $request->input('termination_date'); + $license->user_id = Auth::id(); + + if ($license->save()) { + return redirect()->route("licenses.index")->with('success', trans('admin/licenses/message.create.success')); + } + return redirect()->back()->withInput()->withErrors($license->getErrors()); + } + + /** + * Returns a form with existing license data to allow an admin to + * update license information. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @param int $licenseId + * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function edit($licenseId = null) + { + if (is_null($item = License::find($licenseId))) { + return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.does_not_exist')); + } + + $this->authorize('update', $item); + + $maintained_list = [ + '' => 'Maintained', + '1' => 'Yes', + '0' => 'No' + ]; + + return view('licenses/edit', compact('item')) + ->with('depreciation_list', Helper::depreciationList()) + ->with('maintained_list', $maintained_list); + } + + + /** + * Validates and stores the license form data submitted from the edit + * license form. + * + * @author [A. Gianotto] [] + * @see LicensesController::getEdit() method that provides the form view + * @since [v1.0] + * @param Request $request + * @param int $licenseId + * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function update(Request $request, $licenseId = null) + { + if (is_null($license = License::find($licenseId))) { + return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.does_not_exist')); + } + + $this->authorize('update', $license); + + $license->company_id = Company::getIdForCurrentUser($request->input('company_id')); + $license->depreciation_id = $request->input('depreciation_id'); + $license->expiration_date = $request->input('expiration_date'); + $license->license_email = $request->input('license_email'); + $license->license_name = $request->input('license_name'); + $license->maintained = $request->input('maintained',0); + $license->name = $request->input('name'); + $license->notes = $request->input('notes'); + $license->order_number = $request->input('order_number'); + $license->purchase_cost = $request->input('purchase_cost'); + $license->purchase_date = $request->input('purchase_date'); + $license->purchase_order = $request->input('purchase_order'); + $license->reassignable = $request->input('reassignable', 0); + $license->serial = $request->input('serial'); + $license->termination_date = $request->input('termination_date'); + $license->seats = e($request->input('seats')); + $license->manufacturer_id = $request->input('manufacturer_id'); + $license->supplier_id = $request->input('supplier_id'); + $license->category_id = $request->input('category_id'); + + if ($license->save()) { + return redirect()->route('licenses.show', ['license' => $licenseId])->with('success', trans('admin/licenses/message.update.success')); + } + // If we can't adjust the number of seats, the error is flashed to the session by the event handler in License.php + return redirect()->back()->withInput()->withErrors($license->getErrors()); + } + + /** + * Checks to see whether the selected license can be deleted, and + * if it can, marks it as deleted. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @param int $licenseId + * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function destroy($licenseId) + { + // Check if the license exists + if (is_null($license = License::find($licenseId))) { + // Redirect to the license management page + return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.not_found')); + } + + $this->authorize('delete', $license); + + if ($license->assigned_seats_count == 0) { + // Delete the license and the associated license seats + DB::table('license_seats') + ->where('id', $license->id) + ->update(array('assigned_to' => null,'asset_id' => null)); + + $licenseSeats = $license->licenseseats(); + $licenseSeats->delete(); + $license->delete(); + + // Redirect to the licenses management page + return redirect()->route('licenses.index')->with('success', trans('admin/licenses/message.delete.success')); + // Redirect to the license management page + } + // There are still licenses in use. + return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.assoc_users')); + + } + + + /** + * Makes the license detail page. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @param int $licenseId + * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function show($licenseId = null) + { + + $license = License::with('assignedusers', 'licenseSeats.user', 'licenseSeats.asset')->find($licenseId); + + if ($license) { + $this->authorize('view', $license); + return view('licenses/view', compact('license')); + } + return redirect()->route('licenses.index') + ->with('error', trans('admin/licenses/message.does_not_exist')); + } + + + public function getClone($licenseId = null) + { + if (is_null($license_to_clone = License::find($licenseId))) { + return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.does_not_exist')); + } + + $this->authorize('create', License::class); + + $maintained_list = [ + '' => 'Maintained', + '1' => 'Yes', + '0' => 'No' + ]; + //clone the orig + $license = clone $license_to_clone; + $license->id = null; + $license->serial = null; + + // Show the page + return view('licenses/edit') + ->with('depreciation_list', Helper::depreciationList()) + ->with('item', $license) + ->with('maintained_list', $maintained_list); + } +} diff --git a/app/Http/Controllers/LicensesController.php b/app/Http/Controllers/LicensesController.php deleted file mode 100755 index 98a946197c..0000000000 --- a/app/Http/Controllers/LicensesController.php +++ /dev/null @@ -1,649 +0,0 @@ -] - * @see LicensesController::getDatatable() method that generates the JSON response - * @since [v1.0] - * @return \Illuminate\Contracts\View\View - */ - public function index() - { - $this->authorize('view', License::class); - return view('licenses/index'); - } - - - /** - * Returns a form view that allows an admin to create a new licence. - * - * @author [A. Gianotto] [] - * @see AccessoriesController::getDatatable() method that generates the JSON response - * @since [v1.0] - * @return \Illuminate\Contracts\View\View - */ - public function create() - { - $this->authorize('create', License::class); - $maintained_list = [ - '' => 'Maintained', - '1' => 'Yes', - '0' => 'No' - ]; - - return view('licenses/edit') - //->with('license_options',$license_options) - ->with('depreciation_list', Helper::depreciationList()) - ->with('maintained_list', $maintained_list) - ->with('item', new License); - - } - - - /** - * Validates and stores the license form data submitted from the new - * license form. - * - * @author [A. Gianotto] [] - * @see LicensesController::getCreate() method that provides the form view - * @since [v1.0] - * @param Request $request - * @return \Illuminate\Http\RedirectResponse - */ - public function store(Request $request) - { - $this->authorize('create', License::class); - // create a new model instance - $license = new License(); - // Save the license data - $license->company_id = Company::getIdForCurrentUser($request->input('company_id')); - $license->depreciation_id = $request->input('depreciation_id'); - $license->expiration_date = $request->input('expiration_date'); - $license->license_email = $request->input('license_email'); - $license->license_name = $request->input('license_name'); - $license->maintained = $request->input('maintained', 0); - $license->manufacturer_id = $request->input('manufacturer_id'); - $license->name = $request->input('name'); - $license->notes = $request->input('notes'); - $license->order_number = $request->input('order_number'); - $license->purchase_cost = $request->input('purchase_cost'); - $license->purchase_date = $request->input('purchase_date'); - $license->purchase_order = $request->input('purchase_order'); - $license->purchase_order = $request->input('purchase_order'); - $license->reassignable = $request->input('reassignable', 0); - $license->seats = $request->input('seats'); - $license->serial = $request->input('serial'); - $license->supplier_id = $request->input('supplier_id'); - $license->category_id = $request->input('category_id'); - $license->termination_date = $request->input('termination_date'); - $license->user_id = Auth::id(); - - if ($license->save()) { - return redirect()->route("licenses.index")->with('success', trans('admin/licenses/message.create.success')); - } - return redirect()->back()->withInput()->withErrors($license->getErrors()); - } - - /** - * Returns a form with existing license data to allow an admin to - * update license information. - * - * @author [A. Gianotto] [] - * @since [v1.0] - * @param int $licenseId - * @return \Illuminate\Contracts\View\View - */ - public function edit($licenseId = null) - { - if (is_null($item = License::find($licenseId))) { - return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.does_not_exist')); - } - - $this->authorize('update', $item); - - $maintained_list = [ - '' => 'Maintained', - '1' => 'Yes', - '0' => 'No' - ]; - - return view('licenses/edit', compact('item')) - ->with('depreciation_list', Helper::depreciationList()) - ->with('maintained_list', $maintained_list); - } - - - /** - * Validates and stores the license form data submitted from the edit - * license form. - * - * @author [A. Gianotto] [] - * @see LicensesController::getEdit() method that provides the form view - * @since [v1.0] - * @param Request $request - * @param int $licenseId - * @return \Illuminate\Http\RedirectResponse - */ - public function update(Request $request, $licenseId = null) - { - if (is_null($license = License::find($licenseId))) { - return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.does_not_exist')); - } - - $this->authorize('update', $license); - - $license->company_id = Company::getIdForCurrentUser($request->input('company_id')); - $license->depreciation_id = $request->input('depreciation_id'); - $license->expiration_date = $request->input('expiration_date'); - $license->license_email = $request->input('license_email'); - $license->license_name = $request->input('license_name'); - $license->maintained = $request->input('maintained',0); - $license->name = $request->input('name'); - $license->notes = $request->input('notes'); - $license->order_number = $request->input('order_number'); - $license->purchase_cost = $request->input('purchase_cost'); - $license->purchase_date = $request->input('purchase_date'); - $license->purchase_order = $request->input('purchase_order'); - $license->reassignable = $request->input('reassignable', 0); - $license->serial = $request->input('serial'); - $license->termination_date = $request->input('termination_date'); - $license->seats = e($request->input('seats')); - $license->manufacturer_id = $request->input('manufacturer_id'); - $license->supplier_id = $request->input('supplier_id'); - $license->category_id = $request->input('category_id'); - - if ($license->save()) { - return redirect()->route('licenses.show', ['license' => $licenseId])->with('success', trans('admin/licenses/message.update.success')); - } - // If we can't adjust the number of seats, the error is flashed to the session by the event handler in License.php - return redirect()->back()->withInput()->withErrors($license->getErrors()); - } - - /** - * Checks to see whether the selected license can be deleted, and - * if it can, marks it as deleted. - * - * @author [A. Gianotto] [] - * @since [v1.0] - * @param int $licenseId - * @return \Illuminate\Http\RedirectResponse - */ - public function destroy($licenseId) - { - // Check if the license exists - if (is_null($license = License::find($licenseId))) { - // Redirect to the license management page - return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.not_found')); - } - - $this->authorize('delete', $license); - - if ($license->assigned_seats_count == 0) { - // Delete the license and the associated license seats - DB::table('license_seats') - ->where('id', $license->id) - ->update(array('assigned_to' => null,'asset_id' => null)); - - $licenseSeats = $license->licenseseats(); - $licenseSeats->delete(); - $license->delete(); - - // Redirect to the licenses management page - return redirect()->route('licenses.index')->with('success', trans('admin/licenses/message.delete.success')); - // Redirect to the license management page - } - // There are still licenses in use. - return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.assoc_users')); - - } - - /** - * Provides the form view for checking out a license to a user. - * Here we pass the license seat ID instead of the license ID, - * because licenses themselves are never checked out to anyone, - * only the seats associated with them. - * - * @author [A. Gianotto] [] - * @since [v1.0] - * @param int $seatId - * @return \Illuminate\Contracts\View\View - */ - public function getCheckout($licenceId) - { - // Check that the license is valid - if ($license = License::where('id',$licenceId)->first()) { - - // If the license is valid, check that there is an available seat - if ($license->getAvailSeatsCountAttribute() < 1) { - return redirect()->route('licenses.index')->with('error', 'There are no available seats for this license'); - } - } - - $this->authorize('checkout', $license); - return view('licenses/checkout', compact('license')); - } - - - /** - * Validates and stores the license checkout action. - * - * @todo Switch to using a FormRequest for validation here. - * @author [A. Gianotto] [] - * @since [v1.0] - * @param Request $request - * @param int $licenseId - * @param int $seatId - * @return \Illuminate\Http\RedirectResponse - */ - public function postCheckout(Request $request, $licenseId, $seatId = null) - { - - // Check that the license is valid - if ($license = License::where('id', $licenseId)->first()) { - - // If the license is valid, check that there is an available seat - if ($license->getAvailSeatsCountAttribute() < 1) { - return redirect()->route('licenses.index')->with('error', 'There are no available seats for this license'); - } - if (!$seatId) { - // Get the next available seat for this license - $next = $license->freeSeat(); - if (!$next) { - return redirect()->route('licenses.index')->with('error', 'There are no available seats for this license'); - } - if (!$licenseSeat = LicenseSeat::where('id', '=', $next->id)->first()) { - return redirect()->route('licenses.index')->with('error', 'There are no available seats for this license'); - } - } else { - $licenseSeat = LicenseSeat::where('id', '=', $seatId)->first(); - if (!$licenseSeat) { - return redirect()->route('licenses.index')->with('error', 'License seat is not available for checkout'); - } - } - - - - - - - $this->authorize('checkout', $license); - - // Declare the rules for the form validation - $rules = [ - 'note' => 'string|nullable', - 'asset_id' => 'required_without:assigned_to', - ]; - - // Create a new validator instance from our validation rules - $validator = Validator::make(Input::all(), $rules); - - // If validation fails, we'll exit the operation now. - if ($validator->fails()) { - // Ooops.. something went wrong - return redirect()->back()->withInput()->withErrors($validator); - } - $target = null; - - - // This item is checked out to a an asset - if (request('checkout_to_type')=='asset') { - if (is_null($target = Asset::find(request('asset_id')))) { - return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.asset_does_not_exist')); - } - $licenseSeat->asset_id = $request->input('asset_id'); - - // Override asset's assigned user if available - if ($target->checkedOutToUser()) { - $licenseSeat->assigned_to = $target->assigned_to; - } - - } else { - - // Fetch the target and set the license user - if (is_null($target = User::find(request('assigned_to')))) { - return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.user_does_not_exist')); - } - $licenseSeat->assigned_to = request('assigned_to'); - } - - $licenseSeat->user_id = Auth::user()->id; - - - if ($licenseSeat->save()) { - $licenseSeat->logCheckout($request->input('note'), $target); - return redirect()->route("licenses.index")->with('success', trans('admin/licenses/message.checkout.success')); - } - - } - return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.not_found')); - - - - - return redirect()->route("licenses.index")->with('error', trans('admin/licenses/message.checkout.error')); - } - - - /** - * Makes the form view to check a license seat back into inventory. - * - * @author [A. Gianotto] [] - * @since [v1.0] - * @param int $seatId - * @param string $backTo - * @return \Illuminate\Contracts\View\View - */ - public function getCheckin($seatId = null, $backTo = null) - { - // Check if the asset exists - if (is_null($licenseSeat = LicenseSeat::find($seatId))) { - // Redirect to the asset management page with error - return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.not_found')); - } - - if (is_null($license = License::find($licenseSeat->license_id))) { - // Redirect to the asset management page with error - return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.not_found')); - } - - - $this->authorize('checkout', $license); - return view('licenses/checkin', compact('licenseSeat'))->with('backto', $backTo); - } - - - /** - * Validates and stores the license checkin action. - * - * @author [A. Gianotto] [] - * @see LicensesController::getCheckin() method that provides the form view - * @since [v1.0] - * @param int $seatId - * @param string $backTo - * @return \Illuminate\Http\RedirectResponse - */ - public function postCheckin($seatId = null, $backTo = null) - { - // Check if the asset exists - if (is_null($licenseSeat = LicenseSeat::find($seatId))) { - // Redirect to the asset management page with error - return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.not_found')); - } - - $license = License::find($licenseSeat->license_id); - $this->authorize('checkout', $license); - - if (!$license->reassignable) { - // Not allowed to checkin - Session::flash('error', 'License not reassignable.'); - return redirect()->back()->withInput(); - } - - // Declare the rules for the form validation - $rules = array( - 'note' => 'string', - 'notes' => 'string', - ); - - // Create a new validator instance from our validation rules - $validator = Validator::make(Input::all(), $rules); - - // If validation fails, we'll exit the operation now. - if ($validator->fails()) { - // Ooops.. something went wrong - return redirect()->back()->withInput()->withErrors($validator); - } - $return_to = User::find($licenseSeat->assigned_to); - if (!$return_to) { - $return_to = Asset::find($licenseSeat->asset_id); - } - - // Update the asset data - $licenseSeat->assigned_to = null; - $licenseSeat->asset_id = null; - - // Was the asset updated? - if ($licenseSeat->save()) { - $licenseSeat->logCheckin($return_to, e(request('note'))); - if ($backTo=='user') { - return redirect()->route("users.show", $return_to->id)->with('success', trans('admin/licenses/message.checkin.success')); - } - return redirect()->route("licenses.show", $licenseSeat->license_id)->with('success', trans('admin/licenses/message.checkin.success')); - } - - // Redirect to the license page with error - return redirect()->route("licenses.index")->with('error', trans('admin/licenses/message.checkin.error')); - } - - /** - * Makes the license detail page. - * - * @author [A. Gianotto] [] - * @since [v1.0] - * @param int $licenseId - * @return \Illuminate\Contracts\View\View - */ - public function show($licenseId = null) - { - - $license = License::with('assignedusers', 'licenseSeats.user', 'licenseSeats.asset')->find($licenseId); - - if ($license) { - $this->authorize('view', $license); - return view('licenses/view', compact('license')); - } - return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.does_not_exist', compact('id'))); - } - - - public function getClone($licenseId = null) - { - if (is_null($license_to_clone = License::find($licenseId))) { - return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.does_not_exist')); - } - - $this->authorize('create', License::class); - - $maintained_list = [ - '' => 'Maintained', - '1' => 'Yes', - '0' => 'No' - ]; - //clone the orig - $license = clone $license_to_clone; - $license->id = null; - $license->serial = null; - - // Show the page - return view('licenses/edit') - ->with('depreciation_list', Helper::depreciationList()) - ->with('item', $license) - ->with('maintained_list', $maintained_list); - } - - - /** - * Validates and stores files associated with a license. - * - * @todo Switch to using the AssetFileRequest form request validator. - * @author [A. Gianotto] [] - * @since [v1.0] - * @param int $licenseId - * @return \Illuminate\Http\RedirectResponse - */ - public function postUpload(AssetFileRequest $request, $licenseId = null) - { - $license = License::find($licenseId); - // the license is valid - $destinationPath = config('app.private_uploads').'/licenses'; - - if (isset($license->id)) { - $this->authorize('update', $license); - - if (Input::hasFile('file')) { - - foreach (Input::file('file') as $file) { - $extension = $file->getClientOriginalExtension(); - $filename = 'license-'.$license->id.'-'.str_random(8).'-'.str_slug(basename($file->getClientOriginalName(), '.'.$extension)).'.'.$extension; - $upload_success = $file->move($destinationPath, $filename); - - //Log the upload to the log - $license->logUpload($filename, e($request->input('notes'))); - } - // This being called from a modal seems to confuse redirect()->back() - // It thinks we should go to the dashboard. As this is only used - // from the modal at present, hardcode the redirect. Longterm - // maybe we evaluate something else. - if ($upload_success) { - return redirect()->route('licenses.show', $license->id)->with('success', trans('admin/licenses/message.upload.success')); - } - return redirect()->route('licenses.show', $license->id)->with('error', trans('admin/licenses/message.upload.error')); - } - return redirect()->route('licenses.show', $license->id)->with('error', trans('admin/licenses/message.upload.nofiles')); - } - // Prepare the error message - $error = trans('admin/licenses/message.does_not_exist', compact('id')); - return redirect()->route('licenses.index')->with('error', $error); - } - - - /** - * Deletes the selected license file. - * - * @author [A. Gianotto] [] - * @since [v1.0] - * @param int $licenseId - * @param int $fileId - * @return \Illuminate\Http\RedirectResponse - */ - public function getDeleteFile($licenseId = null, $fileId = null) - { - $license = License::find($licenseId); - $destinationPath = config('app.private_uploads').'/licenses'; - - // the license is valid - if (isset($license->id)) { - $this->authorize('edit', $license); - $log = Actionlog::find($fileId); - $full_filename = $destinationPath.'/'.$log->filename; - if (file_exists($full_filename)) { - unlink($destinationPath.'/'.$log->filename); - } - $log->delete(); - return redirect()->back()->with('success', trans('admin/licenses/message.deletefile.success')); - } - // Prepare the error message - $error = trans('admin/licenses/message.does_not_exist', compact('id')); - - // Redirect to the licence management page - return redirect()->route('licenses.index')->with('error', $error); - } - - - - /** - * Allows the selected file to be viewed. - * - * @author [A. Gianotto] [] - * @since [v1.4] - * @param int $licenseId - * @param int $fileId - * @return \Symfony\Component\HttpFoundation\BinaryFileResponse - */ - public function displayFile($licenseId = null, $fileId = null, $download = true) - { - - $license = License::find($licenseId); - - // the license is valid - if (isset($license->id)) { - $this->authorize('view', $license); - $log = Actionlog::find($fileId); - $file = $log->get_src('licenses'); - - - if ($file =='') { - return response('File not found on server', 404) - ->header('Content-Type', 'text/plain'); - } - - $mimetype = \File::mimeType($file); - - - if (!file_exists($file)) { - return response('File '.$file.' not found on server', 404) - ->header('Content-Type', 'text/plain'); - } - - if ($download != 'true') { - if ($contents = file_get_contents($file)) { - return Response::make($contents)->header('Content-Type', $mimetype); - } - return JsonResponse::create(["error" => "Failed validation: "], 500); - } - return Response::download($file); - } - - - return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.does_not_exist', compact('id'))); - } - - - - /** - * Generates the next free seat ID for checkout. - * - * @todo This is a dumb way to solve this problem. - * Author should refactor. And go hide in a hole and - * think about what she's done. And perhaps find a new - * line of work. And get in the sea. - * - * @author [A. Gianotto] [] - * @since [v1.0] - * @param int $licenseId - * @return \Illuminate\Http\RedirectResponse - */ - public function getFreeLicense($licenseId) - { - $this->authorize('checkout', License::class); - if (is_null($license = License::find($licenseId))) { - return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.not_found')); - } - $seatId = $license->freeSeat($licenseId); - return redirect()->route('licenses.checkout', $seatId); - } -} diff --git a/app/Http/Controllers/LocationsController.php b/app/Http/Controllers/LocationsController.php index 5f3de56fb8..87ff779eb4 100755 --- a/app/Http/Controllers/LocationsController.php +++ b/app/Http/Controllers/LocationsController.php @@ -1,21 +1,9 @@ ] - * @see LocationsController::getDatatable() method that generates the JSON response - * @since [v1.0] - * @return \Illuminate\Contracts\View\View + * Returns a view that invokes the ajax tables which actually contains + * the content for the locations listing, which is generated in getDatatable. + * + * @author [A. Gianotto] [] + * @see LocationsController::getDatatable() method that generates the JSON response + * @since [v1.0] + * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function index() { @@ -49,12 +38,13 @@ class LocationsController extends Controller /** - * Returns a form view used to create a new location. - * - * @author [A. Gianotto] [] - * @see LocationsController::postCreate() method that validates and stores the data - * @since [v1.0] - * @return \Illuminate\Contracts\View\View + * Returns a form view used to create a new location. + * + * @author [A. Gianotto] [] + * @see LocationsController::postCreate() method that validates and stores the data + * @since [v1.0] + * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function create() { @@ -72,13 +62,15 @@ class LocationsController extends Controller /** - * Validates and stores a new location. - * - * @todo Check if a Form Request would work better here. - * @author [A. Gianotto] [] - * @see LocationsController::getCreate() method that makes the form - * @since [v1.0] - * @return \Illuminate\Http\RedirectResponse + * Validates and stores a new location. + * + * @todo Check if a Form Request would work better here. + * @author [A. Gianotto] [] + * @see LocationsController::getCreate() method that makes the form + * @since [v1.0] + * @param ImageUploadRequest $request + * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function store(ImageUploadRequest $request) { @@ -97,16 +89,7 @@ class LocationsController extends Controller $location->manager_id = $request->input('manager_id'); $location->user_id = Auth::id(); - if ($request->file('image')) { - $image = $request->file('image'); - $file_name = str_random(25).".".$image->getClientOriginalExtension(); - $path = public_path('uploads/locations/'.$file_name); - Image::make($image->getRealPath())->resize(600, null, function ($constraint) { - $constraint->aspectRatio(); - $constraint->upsize(); - })->save($path); - $location->image = $file_name; - } + $location = $request->handleImages($location); if ($location->save()) { return redirect()->route("locations.index")->with('success', trans('admin/locations/message.create.success')); @@ -116,13 +99,14 @@ class LocationsController extends Controller /** - * Makes a form view to edit location information. - * - * @author [A. Gianotto] [] - * @see LocationsController::postCreate() method that validates and stores - * @param int $locationId - * @since [v1.0] - * @return \Illuminate\Contracts\View\View + * Makes a form view to edit location information. + * + * @author [A. Gianotto] [] + * @see LocationsController::postCreate() method that validates and stores + * @param int $locationId + * @since [v1.0] + * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function edit($locationId = null) { @@ -144,13 +128,15 @@ class LocationsController extends Controller /** - * Validates and stores updated location data from edit form. - * - * @author [A. Gianotto] [] - * @see LocationsController::getEdit() method that makes the form view - * @param int $locationId - * @since [v1.0] - * @return \Illuminate\Http\RedirectResponse + * Validates and stores updated location data from edit form. + * + * @author [A. Gianotto] [] + * @see LocationsController::getEdit() method that makes the form view + * @param ImageUploadRequest $request + * @param int $locationId + * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException + * @since [v1.0] */ public function update(ImageUploadRequest $request, $locationId = null) { @@ -173,36 +159,7 @@ class LocationsController extends Controller $location->ldap_ou = $request->input('ldap_ou'); $location->manager_id = $request->input('manager_id'); - $old_image = $location->image; - - // Set the model's image property to null if the image is being deleted - if ($request->input('image_delete') == 1) { - $location->image = null; - } - - if ($request->file('image')) { - $image = $request->file('image'); - $file_name = $location->id.'-'.str_slug($image->getClientOriginalName()) . "." . $image->getClientOriginalExtension(); - - if ($image->getClientOriginalExtension()!='svg') { - Image::make($image->getRealPath())->resize(600, null, function ($constraint) { - $constraint->aspectRatio(); - $constraint->upsize(); - })->save(app('locations_upload_path').$file_name); - } else { - $image->move(app('locations_upload_path'), $file_name); - } - $location->image = $file_name; - - } - - if ((($request->file('image')) && (isset($old_image)) && ($old_image!='')) || ($request->input('image_delete') == 1)) { - try { - unlink(app('locations_upload_path').$old_image); - } catch (\Exception $e) { - \Log::error($e); - } - } + $location = $request->handleImages($location); if ($location->save()) { @@ -212,12 +169,13 @@ class LocationsController extends Controller } /** - * Validates and deletes selected location. - * - * @author [A. Gianotto] [] - * @param int $locationId - * @since [v1.0] - * @return \Illuminate\Http\RedirectResponse + * Validates and deletes selected location. + * + * @author [A. Gianotto] [] + * @param int $locationId + * @since [v1.0] + * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function destroy($locationId) { @@ -226,22 +184,22 @@ class LocationsController extends Controller return redirect()->to(route('locations.index'))->with('error', trans('admin/locations/message.not_found')); } - if ($location->users->count() > 0) { + if ($location->users()->count() > 0) { return redirect()->to(route('locations.index'))->with('error', trans('admin/locations/message.assoc_users')); - } elseif ($location->childLocations->count() > 0) { + } elseif ($location->childLocations()->count() > 0) { return redirect()->to(route('locations.index'))->with('error', trans('admin/locations/message.assoc_child_loc')); - } elseif ($location->assets->count() > 0) { + } elseif ($location->assets()->count() > 0) { return redirect()->to(route('locations.index'))->with('error', trans('admin/locations/message.assoc_assets')); - } elseif ($location->assignedassets->count() > 0) { + } elseif ($location->assignedassets()->count() > 0) { return redirect()->to(route('locations.index'))->with('error', trans('admin/locations/message.assoc_assets')); - } else { - $location->delete(); - return redirect()->to(route('locations.index'))->with('success', trans('admin/locations/message.delete.success')); } + + $location->delete(); + return redirect()->to(route('locations.index'))->with('success', trans('admin/locations/message.delete.success')); } @@ -250,19 +208,19 @@ class LocationsController extends Controller * the content for the locations detail page. * * @author [A. Gianotto] [] - * @param int $locationId + * @param int $id * @since [v1.0] * @return \Illuminate\Contracts\View\View */ - public function show($locationId = null) + public function show($id = null) { - $location = Location::find($locationId); + $location = Location::find($id); if (isset($location->id)) { return view('locations/view', compact('location')); } - return redirect()->route('locations.index')->with('error', trans('admin/locations/message.does_not_exist', compact('id'))); + return redirect()->route('locations.index')->with('error', trans('admin/locations/message.does_not_exist')); } } diff --git a/app/Http/Controllers/ManufacturersController.php b/app/Http/Controllers/ManufacturersController.php index 1d84fa37d2..d28a1411f1 100755 --- a/app/Http/Controllers/ManufacturersController.php +++ b/app/Http/Controllers/ManufacturersController.php @@ -1,18 +1,10 @@ ] - * @see Api\ManufacturersController::index() method that generates the JSON response - * @since [v1.0] - * @return \Illuminate\Contracts\View\View + * Returns a view that invokes the ajax tables which actually contains + * the content for the manufacturers listing, which is generated in getDatatable. + * + * @author [A. Gianotto] [] + * @see Api\ManufacturersController::index() method that generates the JSON response + * @since [v1.0] + * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function index() { @@ -41,12 +34,13 @@ class ManufacturersController extends Controller /** - * Returns a view that displays a form to create a new manufacturer. - * - * @author [A. Gianotto] [] - * @see ManufacturersController::store() - * @since [v1.0] - * @return \Illuminate\Contracts\View\View + * Returns a view that displays a form to create a new manufacturer. + * + * @author [A. Gianotto] [] + * @see ManufacturersController::store() + * @since [v1.0] + * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function create() { @@ -61,32 +55,24 @@ class ManufacturersController extends Controller * @author [A. Gianotto] [] * @see ManufacturersController::create() * @since [v1.0] - * @param Request $request + * @param ImageUploadRequest $request * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function store(ImageUploadRequest $request) { $this->authorize('create', Manufacturer::class); $manufacturer = new Manufacturer; - $manufacturer->name = $request->input('name'); - $manufacturer->user_id = Auth::user()->id; - $manufacturer->url = $request->input('url'); - $manufacturer->support_url = $request->input('support_url'); + $manufacturer->name = $request->input('name'); + $manufacturer->user_id = Auth::id(); + $manufacturer->url = $request->input('url'); + $manufacturer->support_url = $request->input('support_url'); $manufacturer->support_phone = $request->input('support_phone'); $manufacturer->support_email = $request->input('support_email'); - if ($request->file('image')) { - $image = $request->file('image'); - $file_name = str_slug($image->getClientOriginalName()).".".$image->getClientOriginalExtension(); - $path = public_path('uploads/manufacturers/'.$file_name); - Image::make($image->getRealPath())->resize(200, null, function ($constraint) { - $constraint->aspectRatio(); - $constraint->upsize(); - })->save($path); - $manufacturer->image = $file_name; - } + $manufacturer = $request->handleImages($manufacturer); @@ -97,19 +83,20 @@ class ManufacturersController extends Controller } /** - * Returns a view that displays a form to edit a manufacturer. - * - * @author [A. Gianotto] [] - * @see ManufacturersController::update() - * @param int $manufacturerId - * @since [v1.0] - * @return \Illuminate\Contracts\View\View + * Returns a view that displays a form to edit a manufacturer. + * + * @author [A. Gianotto] [] + * @see ManufacturersController::update() + * @param int $manufacturerId + * @since [v1.0] + * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException */ - public function edit($id = null) + public function edit($manufacturerId = null) { $this->authorize('edit', Manufacturer::class); // Check if the manufacturer exists - if (is_null($item = Manufacturer::find($id))) { + if (is_null($item = Manufacturer::find($manufacturerId))) { return redirect()->route('manufacturers.index')->with('error', trans('admin/manufacturers/message.does_not_exist')); } // Show the page @@ -126,6 +113,7 @@ class ManufacturersController extends Controller * @param int $manufacturerId * @return \Illuminate\Http\RedirectResponse * @since [v1.0] + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function update(ImageUploadRequest $request, $manufacturerId = null) { @@ -137,42 +125,13 @@ class ManufacturersController extends Controller } // Save the data - $manufacturer->name = $request->input('name'); - $manufacturer->url = $request->input('url'); - $manufacturer->support_url = $request->input('support_url'); + $manufacturer->name = $request->input('name'); + $manufacturer->url = $request->input('url'); + $manufacturer->support_url = $request->input('support_url'); $manufacturer->support_phone = $request->input('support_phone'); $manufacturer->support_email = $request->input('support_email'); - $old_image = $manufacturer->image; - - // Set the model's image property to null if the image is being deleted - if ($request->input('image_delete') == 1) { - $manufacturer->image = null; - } - - if ($request->file('image')) { - $image = $request->file('image'); - $file_name = $manufacturer->id.'-'.str_slug($image->getClientOriginalName()) . "." . $image->getClientOriginalExtension(); - - if ($image->getClientOriginalExtension()!='svg') { - Image::make($image->getRealPath())->resize(500, null, function ($constraint) { - $constraint->aspectRatio(); - $constraint->upsize(); - })->save(app('manufacturers_upload_path').$file_name); - } else { - $image->move(app('manufacturers_upload_path'), $file_name); - } - $manufacturer->image = $file_name; - - } - - if ((($request->file('image')) && (isset($old_image)) && ($old_image!='')) || ($request->input('image_delete') == 1)) { - try { - unlink(app('manufacturers_upload_path').$old_image); - } catch (\Exception $e) { - \Log::error($e); - } - } + $manufacturer = $request->handleImages($manufacturer); if ($manufacturer->save()) { @@ -182,12 +141,13 @@ class ManufacturersController extends Controller } /** - * Deletes a manufacturer. - * - * @author [A. Gianotto] [] - * @param int $manufacturerId - * @since [v1.0] - * @return \Illuminate\Http\RedirectResponse + * Deletes a manufacturer. + * + * @author [A. Gianotto] [] + * @param int $manufacturerId + * @since [v1.0] + * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function destroy($manufacturerId) { @@ -219,14 +179,15 @@ class ManufacturersController extends Controller } /** - * Returns a view that invokes the ajax tables which actually contains - * the content for the manufacturers detail listing, which is generated via API. - * This data contains a listing of all assets that belong to that manufacturer. - * - * @author [A. Gianotto] [] - * @param int $manufacturerId - * @since [v1.0] - * @return \Illuminate\Contracts\View\View + * Returns a view that invokes the ajax tables which actually contains + * the content for the manufacturers detail listing, which is generated via API. + * This data contains a listing of all assets that belong to that manufacturer. + * + * @author [A. Gianotto] [] + * @param int $manufacturerId + * @since [v1.0] + * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function show($manufacturerId = null) { @@ -249,6 +210,7 @@ class ManufacturersController extends Controller * @since [v4.1.15] * @param int $manufacturers_id * @return Redirect + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function restore($manufacturers_id) { diff --git a/app/Http/Controllers/StatuslabelsController.php b/app/Http/Controllers/StatuslabelsController.php index 9c609ebb96..30a73fd070 100755 --- a/app/Http/Controllers/StatuslabelsController.php +++ b/app/Http/Controllers/StatuslabelsController.php @@ -1,21 +1,12 @@ with('statuslabel', $statuslabel); } - return redirect()->route('statuslabels.index')->with('error', trans('admin/statuslabels/message.does_not_exist', compact('id'))); + return redirect()->route('statuslabels.index')->with('error', trans('admin/statuslabels/message.does_not_exist')); } - /** * Statuslabel create. * * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function create() { // Show the page $this->authorize('create', Statuslabel::class); - $item = new Statuslabel; - $use_statuslabel_type = $item->getStatuslabelType(); - $statuslabel_types = Helper::statusTypeList(); - return view('statuslabels/edit', compact('statuslabel_types', 'item'))->with('use_statuslabel_type', $use_statuslabel_type); + return view('statuslabels/edit') + ->with('item', new Statuslabel) + ->with('statuslabel_types', Helper::statusTypeList()) + ->with('use_statuslabel_type', (new Statuslabel)->getStatuslabelType()); } @@ -70,6 +62,7 @@ class StatuslabelsController extends Controller * * @param Request $request * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function store(Request $request) { @@ -106,8 +99,9 @@ class StatuslabelsController extends Controller /** * Statuslabel update. * - * @param int $statuslabelId + * @param int $statuslabelId * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function edit($statuslabelId = null) { @@ -129,8 +123,9 @@ class StatuslabelsController extends Controller /** * Statuslabel update form processing page. * - * @param int $statuslabelId + * @param int $statuslabelId * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function update(Request $request, $statuslabelId = null) { @@ -169,8 +164,9 @@ class StatuslabelsController extends Controller /** * Delete the given Statuslabel. * - * @param int $statuslabelId + * @param int $statuslabelId * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function destroy($statuslabelId) { diff --git a/app/Http/Controllers/SuppliersController.php b/app/Http/Controllers/SuppliersController.php index ce7de94f35..434b72a9c6 100755 --- a/app/Http/Controllers/SuppliersController.php +++ b/app/Http/Controllers/SuppliersController.php @@ -1,22 +1,12 @@ url = $supplier->addhttp(request('url')); $supplier->user_id = Auth::id(); - if ($request->file('image')) { - $image = $request->file('image'); - $file_name = str_random(25).".".$image->getClientOriginalExtension(); - $path = public_path('uploads/suppliers/'.$file_name); - Image::make($image->getRealPath())->resize(200, null, function ($constraint) { - $constraint->aspectRatio(); - $constraint->upsize(); - })->save($path); - $supplier->image = $file_name; - } + $supplier = $request->handleImages($supplier); if ($supplier->save()) { return redirect()->route('suppliers.index')->with('success', trans('admin/suppliers/message.create.success')); @@ -100,8 +84,9 @@ class SuppliersController extends Controller /** * Supplier update. * - * @param int $supplierId + * @param int $supplierId * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function edit($supplierId = null) { @@ -120,8 +105,9 @@ class SuppliersController extends Controller /** * Supplier update form processing page. * - * @param int $supplierId + * @param int $supplierId * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function update($supplierId = null, ImageUploadRequest $request) { @@ -147,37 +133,7 @@ class SuppliersController extends Controller $supplier->url = $supplier->addhttp(request('url')); $supplier->notes = request('notes'); - - $old_image = $supplier->image; - - // Set the model's image property to null if the image is being deleted - if ($request->input('image_delete') == 1) { - $supplier->image = null; - } - - if ($request->file('image')) { - $image = $request->file('image'); - $file_name = $supplier->id.'-'.str_slug($image->getClientOriginalName()) . "." . $image->getClientOriginalExtension(); - - if ($image->getClientOriginalExtension()!='svg') { - Image::make($image->getRealPath())->resize(500, null, function ($constraint) { - $constraint->aspectRatio(); - $constraint->upsize(); - })->save(app('suppliers_upload_path').$file_name); - } else { - $image->move(app('suppliers_upload_path'), $file_name); - } - $supplier->image = $file_name; - - } - - if ((($request->file('image')) && (isset($old_image)) && ($old_image!='')) || ($request->input('image_delete') == 1)) { - try { - unlink(app('suppliers_upload_path').$old_image); - } catch (\Exception $e) { - \Log::error($e); - } - } + $supplier = $request->handleImages($supplier); if ($supplier->save()) { @@ -191,8 +147,9 @@ class SuppliersController extends Controller /** * Delete the given supplier. * - * @param int $supplierId + * @param int $supplierId * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function destroy($supplierId) { @@ -237,11 +194,8 @@ class SuppliersController extends Controller if (isset($supplier->id)) { return view('suppliers/view', compact('supplier')); } - // Prepare the error message - $error = trans('admin/suppliers/message.does_not_exist', compact('id')); - // Redirect to the user management page - return redirect()->route('suppliers.index')->with('error', $error); + return redirect()->route('suppliers.index')->with('error', trans('admin/suppliers/message.does_not_exist')); } } diff --git a/app/Http/Controllers/Users/BulkUsersController.php b/app/Http/Controllers/Users/BulkUsersController.php new file mode 100644 index 0000000000..ad1a556dee --- /dev/null +++ b/app/Http/Controllers/Users/BulkUsersController.php @@ -0,0 +1,204 @@ +] + * @since [v1.7] + * @param Request $request + * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function edit(Request $request) + { + $this->authorize('update', User::class); + + if (($request->has('ids')) && (count($request->input('ids')) > 0)) { + $statuslabel_list = Helper::statusLabelList(); + $users = User::whereIn('id', array_keys(request('ids'))) + ->with('groups', 'assets', 'licenses', 'accessories')->get(); + if ($request->input('bulk_actions') == 'edit') { + return view('users/bulk-edit', compact('users')) + ->with('groups', Group::pluck('name', 'id')); + } + return view('users/confirm-bulk-delete', compact('users', 'statuslabel_list')); + } + + return redirect()->back()->with('error', 'No users selected'); + } + + + /** + * Save bulk-edited users + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @param Request $request + * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function update(Request $request) + { + $this->authorize('update', User::class); + + if((!$request->has('ids')) || $request->input('ids') <= 0) { + return redirect()->back()->with('error', 'No users selected'); + } + $user_raw_array = $request->input('ids'); + + // Remove the user from any updates. + $user_raw_array = array_diff($user_raw_array, [Auth::id()]); + $manager_conflict = false; + $users = User::whereIn('id', $user_raw_array)->where('id', '!=', Auth::user()->id)->get(); + + $return_array = [ + 'success' => trans('admin/users/message.success.update_bulk') + ]; + + + $this->conditionallyAddItem('location_id') + ->conditionallyAddItem('department_id') + ->conditionallyAddItem('company_id') + ->conditionallyAddItem('locale') + ->conditionallyAddItem('activated') +; + // If the manager_id is one of the users being updated, generate a warning. + if (array_search($request->input('manager_id'), $user_raw_array)) { + $manager_conflict = true; + $return_array = [ + 'warning' => trans('admin/users/message.bulk_manager_warn') + ]; + } + if (!$manager_conflict) { + $this->conditionallyAddItem('manager_id'); + } + + + // Save the updated info + User::whereIn('id', $user_raw_array) + ->where('id', '!=', Auth::id())->update($this->update_array); + + // Only sync groups if groups were selected + if ($request->has('groups')) { + foreach ($users as $user) { + $user->groups()->sync($request->input('groups')); + } + } + + return redirect()->route('users.index') + ->with($return_array); + } + + /** + * Array to store update data per item + * @var Array + */ + private $update_array = []; + + /** + * Adds parameter to update array for an item if it exists in request + * @param String $field field name + * @return BulkUsersController Model for Chaining + */ + protected function conditionallyAddItem($field) + { + if(request()->has($field)) { + $this->update_array[$field] = request()->input($field); + } + return $this; + } + + /** + * Soft-delete bulk users + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @param Request $request + * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function destroy(Request $request) + { + $this->authorize('update', User::class); + + if ((!$request->has('ids')) || (count($request->input('ids')) == 0)) { + return redirect()->back()->with('error', 'No users selected'); + } + if ((!$request->has('status_id')) || ($request->input('status_id')=='')) { + return redirect()->route('users.index')->with('error', 'No status selected'); + } + + if (config('app.lock_passwords')) { + return redirect()->route('users.index')->with('error', 'Bulk delete is not enabled in this installation'); + } + $user_raw_array = request('ids'); + + if (($key = array_search(Auth::id(), $user_raw_array)) !== false) { + unset($user_raw_array[$key]); + } + + $users = User::whereIn('id', $user_raw_array)->get(); + $assets = Asset::whereIn('assigned_to', $user_raw_array)->get(); + $accessories = DB::table('accessories_users')->whereIn('assigned_to', $user_raw_array)->get(); + $licenses = DB::table('license_seats')->whereIn('assigned_to', $user_raw_array)->get(); + + + $this->logItemCheckinAndDelete($assets, Asset::class); + $this->logItemCheckinAndDelete($accessories, Accessory::class); + $this->logItemCheckinAndDelete($licenses, LicenseSeat::class); + + Asset::whereIn('id', $assets->pluck('id'))->update([ + 'status_id' => e(request('status_id')), + 'assigned_to' => null, + 'assigned_type' => null, + ]); + + + LicenseSeat::whereIn('id', $licenses->pluck('id'))->update(['assigned_to' => null]); + + foreach ($users as $user) { + $user->accessories()->sync([]); + $user->delete(); + } + + return redirect()->route('users.index')->with('success', 'Your selected users have been deleted and their assets have been updated.'); + } + + /** + * Generate an action log entry for each of a group of items. + * @param $items + * @param $itemType string name of items being passed. + */ + protected function logItemCheckinAndDelete($items, $itemType) { + + foreach($items as $item) { + $logAction = new Actionlog(); + $logAction->item_id = $item->id; + // We can't rely on get_class here because the licenses/accessories fetched above are not eloquent models, but simply arrays. + $logAction->item_type = $itemType; + $logAction->target_id = $item->assigned_to; + $logAction->target_type = User::class; + $logAction->user_id = Auth::id(); + $logAction->note = 'Bulk checkin items and delete user'; + $logAction->logaction('checkin from'); + } + } + +} diff --git a/app/Http/Controllers/Users/LDAPImportController.php b/app/Http/Controllers/Users/LDAPImportController.php new file mode 100644 index 0000000000..4c91d0c8ae --- /dev/null +++ b/app/Http/Controllers/Users/LDAPImportController.php @@ -0,0 +1,61 @@ +authorize('update', User::class); + try { + $ldapconn = Ldap::connectToLdap(); + Ldap::bindAdminToLdap($ldapconn); + + } catch (\Exception $e) { + return redirect()->route('users.index')->with('error', $e->getMessage()); + } + + return view('users/ldap'); + } + + + /** + * LDAP form processing. + * + * @author Aladin Alaily + * @since [v1.8] + * @return \Illuminate\Http\RedirectResponse + */ + public function store(Request $request) + { + // Call Artisan LDAP import command. + $location_id = $request->input('location_id'); + Artisan::call('snipeit:ldap-sync', ['--location_id' => $location_id, '--json_summary' => true]); + + // Collect and parse JSON summary. + $ldap_results_json = Artisan::output(); + $ldap_results = json_decode($ldap_results_json, true); + + // Direct user to appropriate status page. + if ($ldap_results['error']) { + return redirect()->back()->withInput()->with('error', $ldap_results['error_message']); + } + return redirect()->route('ldap/user') + ->with('success', "LDAP Import successful.") + ->with('summary', $ldap_results['summary']); + } +} diff --git a/app/Http/Controllers/Users/UserFilesController.php b/app/Http/Controllers/Users/UserFilesController.php new file mode 100644 index 0000000000..db812e1072 --- /dev/null +++ b/app/Http/Controllers/Users/UserFilesController.php @@ -0,0 +1,130 @@ +] + * @since [v1.6] + * @param AssetFileRequest $request + * @param int $userId + * @return string JSON + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function store(AssetFileRequest $request, $userId = null) + { + $user = User::find($userId); + $destinationPath = config('app.private_uploads') . '/users'; + + if (isset($user->id)) { + $this->authorize('update', $user); + + $logActions = []; + $files = $request->file('file'); + foreach($files as $file) { + $extension = $file->getClientOriginalExtension(); + $filename = 'user-' . $user->id . '-' . str_random(8); + $filename .= '-' . str_slug($file->getClientOriginalName()) . '.' . $extension; + if (!$file->move($destinationPath, $filename)) { + return JsonResponse::create(["error" => "Unabled to move file"], 500); + } + //Log the uploaded file to the log + $logAction = new Actionlog(); + $logAction->item_id = $user->id; + $logAction->item_type = User::class; + $logAction->user_id = Auth::id(); + $logAction->note = e(Input::get('notes')); + $logAction->target_id = null; + $logAction->created_at = date("Y-m-d H:i:s"); + $logAction->filename = $filename; + $logAction->action_type = 'uploaded'; + + if (!$logAction->save()) { + return JsonResponse::create(["error" => "Failed validation: " . print_r($logAction->getErrors(), true)], 500); + + } + $logActions[] = $logAction; + } +// dd($logActions); + return JsonResponse::create($logActions); + } + return JsonResponse::create(["error" => "No User associated with this request"], 500); + + } + + + /** + * Delete file + * + * @author [A. Gianotto] [] + * @since [v1.6] + * @param int $userId + * @param int $fileId + * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function destroy($userId = null, $fileId = null) + { + $user = User::find($userId); + $destinationPath = config('app.private_uploads').'/users'; + + if (isset($user->id)) { + $this->authorize('update', $user); + $log = Actionlog::find($fileId); + $full_filename = $destinationPath . '/' . $log->filename; + if (file_exists($full_filename)) { + unlink($destinationPath . '/' . $log->filename); + } + $log->delete(); + return redirect()->back()->with('success', trans('admin/users/message.deletefile.success')); + } + // Prepare the error message + $error = trans('admin/users/message.user_not_found', ['id' => $userId]); + // Redirect to the licence management page + return redirect()->route('users.index')->with('error', $error); + + } + + /** + * Display/download the uploaded file + * + * @author [A. Gianotto] [] + * @since [v1.6] + * @param int $userId + * @param int $fileId + * @return mixed + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function show($userId = null, $fileId = null) + { + $user = User::find($userId); + + // the license is valid + if (isset($user->id)) { + $this->authorize('view', $user); + + $log = Actionlog::find($fileId); + $file = $log->get_src('users'); + return Response::download($file); + } + // Prepare the error message + $error = trans('admin/users/message.user_not_found', ['id' => $userId]); + + // Redirect to the licence management page + return redirect()->route('users.index')->with('error', $error); + } + +} diff --git a/app/Http/Controllers/UsersController.php b/app/Http/Controllers/Users/UsersController.php similarity index 50% rename from app/Http/Controllers/UsersController.php rename to app/Http/Controllers/Users/UsersController.php index 53036414b6..9121dc55cf 100755 --- a/app/Http/Controllers/UsersController.php +++ b/app/Http/Controllers/Users/UsersController.php @@ -1,7 +1,9 @@ ] - * @see UsersController::getDatatable() method that generates the JSON response - * @since [v1.0] - * @return \Illuminate\Contracts\View\View + * Returns a view that invokes the ajax tables which actually contains + * the content for the users listing, which is generated in getDatatable(). + * + * @author [A. Gianotto] [] + * @see UsersController::getDatatable() method that generates the JSON response + * @since [v1.0] + * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function index() { @@ -65,21 +68,22 @@ class UsersController extends Controller } /** - * Returns a view that displays the user creation form. - * - * @author [A. Gianotto] [] - * @since [v1.0] - * @return \Illuminate\Contracts\View\View + * Returns a view that displays the user creation form. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function create() { $this->authorize('create', User::class); $groups = Group::pluck('name', 'id'); + $userGroups = collect(); + if (Input::old('groups')) { $userGroups = Group::whereIn('id', Input::old('groups'))->pluck('name', 'id'); - } else { - $userGroups = collect(); } $permissions = config('permissions'); @@ -87,26 +91,27 @@ class UsersController extends Controller $permissions = $this->filterDisplayable($permissions); return view('users/edit', compact('groups', 'userGroups', 'permissions', 'userPermissions')) - ->with('user', new User); + ->with('user', new User); } /** - * Validate and store the new user data, or return an error. - * - * @author [A. Gianotto] [] - * @since [v1.0] - * @return \Illuminate\Http\RedirectResponse + * Validate and store the new user data, or return an error. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @param SaveUserRequest $request + * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function store(SaveUserRequest $request) { $this->authorize('create', User::class); $user = new User; //Username, email, and password need to be handled specially because the need to respect config values on an edit. - $user->email = $data['email'] = e($request->input('email')); - $user->username = $data['username'] = e($request->input('username')); + $user->email = e($request->input('email')); + $user->username = e($request->input('username')); if ($request->has('password')) { $user->password = bcrypt($request->input('password')); - $data['password'] = $request->input('password'); } $user->first_name = $request->input('first_name'); $user->last_name = $request->input('last_name'); @@ -152,12 +157,6 @@ class UsersController extends Controller $data['password'] = e($request->input('password')); $user->notify(new WelcomeNotification($data)); - -/* Mail::send('emails.send-login', $data, function ($m) use ($user) { - $m->to($user->email, $user->first_name . ' ' . $user->last_name); - $m->replyTo(config('mail.reply_to.address'), config('mail.reply_to.name')); - $m->subject(trans('mail.welcome', ['name' => $user->first_name])); - });*/ } return redirect::route('users.index')->with('success', trans('admin/users/message.success.create')); } @@ -185,6 +184,7 @@ class UsersController extends Controller * @param $permissions * @return View * @internal param int $id + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function edit($id) { @@ -215,9 +215,10 @@ class UsersController extends Controller * * @author [A. Gianotto] [] * @since [v1.0] - * @param UpdateUserRequest $request + * @param SaveUserRequest $request * @param int $id * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function update(SaveUserRequest $request, $id = null) { @@ -232,7 +233,7 @@ class UsersController extends Controller try { - $user = User::find($id); + $user = User::findOrFail($id); if ($user->id == $request->input('manager_id')) { return redirect()->back()->withInput()->with('error', 'You cannot be your own manager.'); @@ -248,6 +249,7 @@ class UsersController extends Controller } + } catch (ModelNotFoundException $e) { return redirect()->route('users.index') ->with('error', trans('admin/users/message.user_not_found', compact('id'))); @@ -292,16 +294,17 @@ class UsersController extends Controller // Update the location of any assets checked out to this user Asset::where('assigned_type', User::class) - ->where('assigned_to', $user->id)->update(['location_id' => $request->input('location_id', null)]); + ->where('assigned_to', $user->id) + ->update(['location_id' => $request->input('location_id', null)]); // Do we want to update the user password? if ($request->has('password')) { $user->password = bcrypt($request->input('password')); } - // Strip out the superuser permission if the user isn't a superadmin $permissions_array = $request->input('permission'); + // Strip out the superuser permission if the user isn't a superadmin if (!Auth::user()->isSuperUser()) { unset($permissions_array['superuser']); $permissions_array['superuser'] = $orig_superuser; @@ -311,21 +314,21 @@ class UsersController extends Controller // Was the user updated? if ($user->save()) { - // Prepare the success message - $success = trans('admin/users/message.success.update'); // Redirect to the user page - return redirect()->route('users.index')->with('success', $success); + return redirect()->route('users.index') + ->with('success', trans('admin/users/message.success.update')); } return redirect()->back()->withInput()->withErrors($user->getErrors()); } /** - * Delete a user - * - * @author [A. Gianotto] [] - * @since [v1.0] - * @param int $id - * @return \Illuminate\Http\RedirectResponse + * Delete a user + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @param int $id + * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function destroy($id = null) { @@ -336,247 +339,58 @@ class UsersController extends Controller $this->authorize('delete', User::class); // Check if we are not trying to delete ourselves - if ($user->id === Auth::user()->id) { + if ($user->id === Auth::id()) { // Redirect to the user management page - return redirect()->route('users.index')->with('error', 'This user still has ' . $user->assets()->count() . ' assets associated with them.'); + return redirect()->route('users.index') + ->with('error', 'We would feel really bad if you deleted yourself, please reconsider.'); } - if ($user->assets->count() > 0) { + if (($assetsCount = $user->assets()->count()) > 0) { // Redirect to the user management page - return redirect()->route('users.index')->with('error', 'This user still has ' . count($user->assets->count()) . ' assets associated with them.'); + return redirect()->route('users.index') + ->with('error', 'This user still has ' . $assetsCount . ' assets associated with them.'); } - if ($user->licenses()->count() > 0) { + if (($licensesCount = $user->licenses()->count()) > 0) { // Redirect to the user management page - return redirect()->route('users.index')->with('error', 'This user still has ' . $user->assets()->count() . ' assets associated with them.'); + return redirect()->route('users.index') + ->with('error', 'This user still has ' . $licensesCount . ' licenses associated with them.'); } - if ($user->accessories()->count() > 0) { + if (($accessoriesCount = $user->accessories()->count()) > 0) { // Redirect to the user management page - return redirect()->route('users.index')->with('error', 'This user still has ' . $user->accessories()->count() . ' accessories associated with them.'); + return redirect()->route('users.index') + ->with('error', 'This user still has ' . $accessoriesCount . ' accessories associated with them.'); } - if ($user->managedLocations()->count() > 0) { + if (($managedLocationsCount = $user->managedLocations()->count()) > 0) { // Redirect to the user management page - return redirect()->route('users.index')->with('error', 'This user still has ' . $user->managedLocations()->count() . ' locations that they manage.'); + return redirect()->route('users.index') + ->with('error', 'This user still has ' . $managedLocationsCount . ' locations that they manage.'); } // Delete the user $user->delete(); // Prepare the success message - $success = trans('admin/users/message.success.delete'); - // Redirect to the user management page - return redirect()->route('users.index')->with('success', $success); + return redirect()->route('users.index')->with('success', trans('admin/users/message.success.delete')); } catch (ModelNotFoundException $e) { // Prepare the error message - $error = trans('admin/users/message.user_not_found', compact('id')); // Redirect to the user management page - return redirect()->route('users.index')->with('error', $error); + return redirect()->route('users.index') + ->with('error', trans('admin/users/message.user_not_found', compact('id'))); } } /** - * Returns a view that confirms the user's a bulk delete will be applied to. - * - * @author [A. Gianotto] [] - * @since [v1.7] - * @return \Illuminate\Contracts\View\View - */ - public function postBulkEdit(Request $request) - { - $this->authorize('update', User::class); - - if (($request->has('ids')) && (count($request->input('ids')) > 0)) { - $statuslabel_list = Helper::statusLabelList(); - $user_raw_array = array_keys(Input::get('ids')); - $users = User::whereIn('id', $user_raw_array)->with('groups', 'assets', 'licenses', 'accessories')->get(); - if ($request->input('bulk_actions') == 'edit') { - return view('users/bulk-edit', compact('users')) - ->with('groups', Group::pluck('name', 'id')); - } - return view('users/confirm-bulk-delete', compact('users', 'statuslabel_list')); - } - - return redirect()->back()->with('error', 'No users selected'); - } - - - /** - * Save bulk-edited users + * Restore a deleted user * * @author [A. Gianotto] [] * @since [v1.0] + * @param int $id * @return \Illuminate\Http\RedirectResponse - */ - public function postBulkEditSave(Request $request) - { - $this->authorize('update', User::class); - - if (($request->has('ids')) && (count($request->input('ids')) > 0)) { - - $user_raw_array = $request->input('ids'); - $update_array = array(); - $manager_conflict = false; - $users = User::whereIn('id', $user_raw_array)->where('id', '!=', Auth::user()->id)->get(); - - if ($request->has('location_id')) { - $update_array['location_id'] = $request->input('location_id'); - } - if ($request->has('department_id')) { - $update_array['department_id'] = $request->input('department_id'); - } - if ($request->has('company_id')) { - $update_array['company_id'] = $request->input('company_id'); - } - if ($request->has('locale')) { - $update_array['locale'] = $request->input('locale'); - } - - - if ($request->has('manager_id')) { - - // Do not allow a manager update if the selected manager is one of the users being - // edited. - if (!array_key_exists($request->input('manager_id'), $user_raw_array)) { - $update_array['manager_id'] = $request->input('manager_id'); - } else { - $manager_conflict = true; - } - - } - if ($request->has('activated')) { - $update_array['activated'] = $request->input('activated'); - } - - // Save the updated info - if (count($update_array) > 0) { - User::whereIn('id', $user_raw_array)->where('id', '!=', Auth::user()->id)->update($update_array); - } - - // Only sync groups if groups were selected - if ($request->has('groups')) { - foreach ($users as $user) { - $user->groups()->sync($request->input('groups')); - } - } - - if ($manager_conflict) { - return redirect()->route('users.index') - ->with('warning', trans('admin/users/message.bulk_manager_warn')); - } - - return redirect()->route('users.index') - ->with('success', trans('admin/users/message.success.update_bulk')); - } - - return redirect()->back()->with('error', 'No users selected'); - - - - } - - /** - * Soft-delete bulk users - * - * @author [A. Gianotto] [] - * @since [v1.0] - * @return \Illuminate\Http\RedirectResponse - */ - public function postBulkSave(Request $request) - { - $this->authorize('update', User::class); - - if ((!$request->has('ids')) || (count($request->input('ids')) == 0)) { - return redirect()->back()->with('error', 'No users selected'); - } elseif ((!$request->has('status_id')) || ($request->input('status_id')=='')) { - return redirect()->route('users.index')->with('error', 'No status selected'); - } else { - - $user_raw_array = Input::get('ids'); - $asset_array = array(); - - if (($key = array_search(Auth::user()->id, $user_raw_array)) !== false) { - unset($user_raw_array[$key]); - } - - - if (!config('app.lock_passwords')) { - - $users = User::whereIn('id', $user_raw_array)->get(); - $assets = Asset::whereIn('assigned_to', $user_raw_array)->get(); - $accessories = DB::table('accessories_users')->whereIn('assigned_to', $user_raw_array)->get(); - $licenses = DB::table('license_seats')->whereIn('assigned_to', $user_raw_array)->get(); - $license_array = array(); - $accessory_array = array(); - - foreach ($assets as $asset) { - - $asset_array[] = $asset->id; - - // Update the asset log - $logAction = new Actionlog(); - $logAction->item_id = $asset->id; - $logAction->item_type = Asset::class; - $logAction->target_id = $asset->assigned_to; - $logAction->target_type = User::class; - $logAction->user_id = Auth::user()->id; - $logAction->note = 'Bulk checkin asset and delete user'; - $logAction->logaction('checkin from'); - - Asset::whereIn('id', $asset_array)->update([ - 'status_id' => e(Input::get('status_id')), - 'assigned_to' => null, - ]); - } - - foreach ($accessories as $accessory) { - $accessory_array[] = $accessory->accessory_id; - // Update the asset log - $logAction = new Actionlog(); - $logAction->item_id = $accessory->id; - $logAction->item_type = Accessory::class; - $logAction->target_id = $accessory->assigned_to; - $logAction->target_type = User::class; - $logAction->user_id = Auth::user()->id; - $logAction->note = 'Bulk checkin accessory and delete user'; - $logAction->logaction('checkin from'); - } - - foreach ($licenses as $license) { - $license_array[] = $license->id; - // Update the asset log - $logAction = new Actionlog(); - $logAction->item_id = $license->id; - $logAction->item_type = License::class; - $logAction->target_id = $license->assigned_to; - $logAction->target_type = User::class; - $logAction->user_id = Auth::user()->id; - $logAction->note = 'Bulk checkin license and delete user'; - $logAction->logaction('checkin from'); - } - - LicenseSeat::whereIn('id', $license_array)->update(['assigned_to' => null]); - - foreach ($users as $user) { - $user->accessories()->sync(array()); - $user->delete(); - } - - return redirect()->route('users.index')->with('success', 'Your selected users have been deleted and their assets have been updated.'); - } - return redirect()->route('users.index')->with('error', 'Bulk delete is not enabled in this installation'); - } - } - - /** - * Restore a deleted user - * - * @author [A. Gianotto] [] - * @since [v1.0] - * @param int $id - * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function getRestore($id = null) { @@ -595,46 +409,46 @@ class UsersController extends Controller /** - * Return a view with user detail - * - * @author [A. Gianotto] [] - * @since [v1.0] - * @param int $userId - * @return \Illuminate\Contracts\View\View + * Return a view with user detail + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @param int $userId + * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function show($userId = null) { if(!$user = User::with('assets', 'assets.model', 'consumables', 'accessories', 'licenses', 'userloc')->withTrashed()->find($userId)) { - $error = trans('admin/users/message.user_not_found', compact('id')); // Redirect to the user management page - return redirect()->route('users.index')->with('error', $error); + return redirect()->route('users.index') + ->with('error', trans('admin/users/message.user_not_found', ['id' => $userId])); } $userlog = $user->userlog->load('item'); - if (isset($user->id)) { - $this->authorize('view', $user); - return view('users/view', compact('user', 'userlog')); - } + $this->authorize('view', $user); + return view('users/view', compact('user', 'userlog')); } /** - * Unsuspend a user. - * - * @author [A. Gianotto] [] - * @since [v1.0] - * @param int $id - * @return Redirect - */ + * Unsuspend a user. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @param int $id + * @return Redirect + * @throws \Illuminate\Auth\Access\AuthorizationException + */ public function getUnsuspend($id = null) { try { // Get user information - $user = User::find($id); + $user = User::findOrFail($id); $this->authorize('edit', $user); // Check if we are not trying to unsuspend ourselves - if ($user->id === Auth::user()->id) { + if ($user->id === Auth::id()) { // Prepare the error message $error = trans('admin/users/message.error.unsuspend'); // Redirect to the user management page @@ -647,27 +461,25 @@ class UsersController extends Controller return redirect()->route('users.index')->with('error', 'Insufficient permissions!'); } - // Prepare the success message - $success = trans('admin/users/message.success.unsuspend'); // Redirect to the user management page - return redirect()->route('users.index')->with('success', $success); - } catch (UserNotFoundException $e) { - // Prepare the error message - $error = trans('admin/users/message.user_not_found', compact('id')); + return redirect()->route('users.index')->with('success', trans('admin/users/message.success.unsuspend')); + } catch (ModelNotFoundException $e) { // Redirect to the user management page - return redirect()->route('users.index')->with('error', $error); + return redirect()->route('users.index') + ->with('error', trans('admin/users/message.user_not_found', compact('id'))); } } /** - * Return a view containing a pre-populated new user form, - * populated with some fields from an existing user. - * - * @author [A. Gianotto] [] - * @since [v1.0] - * @param int $id - * @return \Illuminate\Contracts\View\View + * Return a view containing a pre-populated new user form, + * populated with some fields from an existing user. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @param int $id + * @return \Illuminate\Contracts\View\View + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function getClone($id = null) { @@ -675,7 +487,6 @@ class UsersController extends Controller // We need to reverse the UI specific logic for our // permissions here before we update the user. $permissions = Input::get('permissions', array()); - //$this->decodePermissions($permissions); app('request')->request->set('permissions', $permissions); @@ -695,7 +506,7 @@ class UsersController extends Controller $permissions = config('permissions'); $clonedPermissions = $user_to_clone->decodePermissions(); - $userPermissions =Helper::selectedPermissionsArray($permissions, $clonedPermissions); + $userPermissions = Helper::selectedPermissionsArray($permissions, $clonedPermissions); // Show the page return view('users/edit', compact('permissions', 'userPermissions')) @@ -703,187 +514,14 @@ class UsersController extends Controller ->with('groups', Group::pluck('name', 'id')) ->with('userGroups', $userGroups) ->with('clone_user', $user_to_clone); - } catch (UserNotFoundException $e) { + } catch (ModelNotFoundException $e) { // Prepare the error message - $error = trans('admin/users/message.user_not_found', compact('id')); // Redirect to the user management page - return redirect()->route('users.index')->with('error', $error); + return redirect()->route('users.index') + ->with('error', trans('admin/users/message.user_not_found', compact('id'))); } } - /** - * Return JSON response with a list of user details for the getIndex() view. - * - * @author [A. Gianotto] [] - * @since [v1.6] - * @param AssetFileRequest $request - * @param int $userId - * @return string JSON - */ - public function postUpload(AssetFileRequest $request, $userId = null) - { - - $user = User::find($userId); - $destinationPath = config('app.private_uploads') . '/users'; - - if (isset($user->id)) { - $this->authorize('update', $user); - - foreach (Input::file('file') as $file) { - - $extension = $file->getClientOriginalExtension(); - $filename = 'user-' . $user->id . '-' . str_random(8); - $filename .= '-' . str_slug($file->getClientOriginalName()) . '.' . $extension; - $upload_success = $file->move($destinationPath, $filename); - - //Log the uploaded file to the log - $logAction = new Actionlog(); - $logAction->item_id = $user->id; - $logAction->item_type = User::class; - $logAction->user_id = Auth::user()->id; - $logAction->note = e(Input::get('notes')); - $logAction->target_id = null; - $logAction->created_at = date("Y-m-d H:i:s"); - $logAction->filename = $filename; - $logAction->action_type = 'uploaded'; - $logAction->save(); - - } - return JsonResponse::create($logAction); - - } - return JsonResponse::create(["error" => "Failed validation: ".print_r($logAction->getErrors(), true)], 500); - } - - - /** - * Delete file - * - * @author [A. Gianotto] [] - * @since [v1.6] - * @param int $userId - * @param int $fileId - * @return \Illuminate\Http\RedirectResponse - */ - public function getDeleteFile($userId = null, $fileId = null) - { - $user = User::find($userId); - $destinationPath = config('app.private_uploads').'/users'; - - if (isset($user->id)) { - $this->authorize('update', $user); - $log = Actionlog::find($fileId); - $full_filename = $destinationPath . '/' . $log->filename; - if (file_exists($full_filename)) { - unlink($destinationPath . '/' . $log->filename); - } - $log->delete(); - return redirect()->back()->with('success', trans('admin/users/message.deletefile.success')); - } - // Prepare the error message - $error = trans('admin/users/message.does_not_exist', compact('id')); - // Redirect to the licence management page - return redirect()->route('users.index')->with('error', $error); - - } - - /** - * Display/download the uploaded file - * - * @author [A. Gianotto] [] - * @since [v1.6] - * @param int $userId - * @param int $fileId - * @return mixed - */ - public function displayFile($userId = null, $fileId = null) - { - $user = User::find($userId); - - // the license is valid - if (isset($user->id)) { - $this->authorize('view', $user); - - $log = Actionlog::find($fileId); - $file = $log->get_src('users'); - return Response::download($file); - } - // Prepare the error message - $error = trans('admin/users/message.does_not_exist', compact('id')); - - // Redirect to the licence management page - return redirect()->route('users.index')->with('error', $error); - } - - /** - * Return view for LDAP import - * - * @author Aladin Alaily - * @since [v1.8] - * @return \Illuminate\Contracts\View\View - */ - public function getLDAP() - { - $this->authorize('update', User::class); - try { - $ldapconn = Ldap::connectToLdap(); - } catch (\Exception $e) { - return redirect()->route('users.index')->with('error', $e->getMessage()); - } - - try { - Ldap::bindAdminToLdap($ldapconn); - } catch (\Exception $e) { - return redirect()->route('users.index')->with('error', $e->getMessage()); - } - - return view('users/ldap'); - } - - - /** - * Declare the rules for the ldap fields validation. - * - * @author Aladin Alaily - * @since [v1.8] - * @var array - * @deprecated 3.0 - * @todo remove this method in favor of other validation - * @var array - */ - - protected $ldapValidationRules = array( - 'firstname' => 'required|string|min:2', - 'employee_number' => 'string', - 'username' => 'required|min:2|unique:users,username', - 'email' => 'email|unique:users,email', - ); - - /** - * LDAP form processing. - * - * @author Aladin Alaily - * @since [v1.8] - * @return \Illuminate\Http\RedirectResponse - */ - public function postLDAP(Request $request) - { - // Call Artisan LDAP import command. - $location_id = $request->input('location_id'); - Artisan::call('snipeit:ldap-sync', ['--location_id' => $location_id, '--json_summary' => true]); - - // Collect and parse JSON summary. - $ldap_results_json = Artisan::output(); - $ldap_results = json_decode($ldap_results_json, true); - - // Direct user to appropriate status page. - if ($ldap_results['error']) { - return redirect()->back()->withInput()->with('error', $ldap_results['error_message']); - } else { - return redirect()->route('ldap/user')->with('success', "LDAP Import successful.")->with('summary', $ldap_results['summary']); - } - } - /** * Exports users to CSV @@ -891,6 +529,7 @@ class UsersController extends Controller * @author [A. Gianotto] [] * @since [v3.5] * @return StreamedResponse + * @throws \Illuminate\Auth\Access\AuthorizationException */ public function getExportUserCsv() { @@ -902,7 +541,9 @@ class UsersController extends Controller // Open output stream $handle = fopen('php://output', 'w'); - User::with('assets', 'accessories', 'consumables', 'department', 'licenses', 'manager', 'groups', 'userloc', 'company','throttle')->orderBy('created_at', 'DESC')->chunk(500, function($users) use($handle) { + User::with('assets', 'accessories', 'consumables', 'department', 'licenses', 'manager', 'groups', 'userloc', 'company','throttle') + ->orderBy('created_at', 'DESC') + ->chunk(500, function($users) use($handle) { $headers=[ // strtolower to prevent Excel from trying to open it as a SYLK file strtolower(trans('general.id')), @@ -984,10 +625,13 @@ class UsersController extends Controller $show_user = User::where('id',$id)->withTrashed()->first(); $assets = Asset::where('assigned_to', $id)->where('assigned_type', User::class)->with('model', 'model.category')->get(); - $licenses = $show_user->licenses()->get(); $accessories = $show_user->accessories()->get(); $consumables = $show_user->consumables()->get(); - return view('users/print')->with('assets', $assets)->with('licenses',$licenses)->with('accessories', $accessories)->with('consumables', $consumables)->with('show_user', $show_user); + return view('users/print')->with('assets', $assets) + ->with('licenses', $show_user->licenses()->get()) + ->with('accessories', $accessories) + ->with('consumables', $consumables) + ->with('show_user', $show_user); } diff --git a/app/Http/Controllers/ViewAssetsController.php b/app/Http/Controllers/ViewAssetsController.php index af7626765e..3f75bc2867 100755 --- a/app/Http/Controllers/ViewAssetsController.php +++ b/app/Http/Controllers/ViewAssetsController.php @@ -1,29 +1,18 @@ withTrashed()->find(Auth::user()->id); + )->withTrashed()->find(Auth::id()); $userlog = $user->userlog->load('item', 'user', 'target'); if (isset($user->id)) { return view('account/view-assets', compact('user', 'userlog')); - } else { - // Prepare the error message - $error = trans('admin/users/message.user_not_found', compact('id')); - - // Redirect to the user management page - return redirect()->route('users.index')->with('error', $error); } + // Redirect to the user management page + return redirect()->route('users.index') + ->with('error', trans('admin/users/message.user_not_found', $user->id)); } + /** + * Returns view of requestable items for a user. + * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View + */ public function getRequestableIndex() { @@ -129,24 +119,23 @@ class ViewAssetsController extends Controller return redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.canceled')); - } else { - $item->request(); - if (($settings->alert_email!='') && ($settings->alerts_enabled=='1') && (!config('app.lock_passwords'))) { - $logaction->logaction('requested'); - $settings->notify(new RequestAssetNotification($data)); - } - - - - return redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.success')); } + $item->request(); + if (($settings->alert_email!='') && ($settings->alerts_enabled=='1') && (!config('app.lock_passwords'))) { + $logaction->logaction('requested'); + $settings->notify(new RequestAssetNotification($data)); + } + + + return redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.success')); } - - - - + /** + * Process a specific requested asset + * @param null $assetId + * @return \Illuminate\Http\RedirectResponse + */ public function getRequestAsset($assetId = null) { @@ -156,7 +145,8 @@ class ViewAssetsController extends Controller if (is_null($asset = Asset::RequestableAssets()->find($assetId))) { return redirect()->route('requestable-assets') ->with('error', trans('admin/hardware/message.does_not_exist_or_not_requestable')); - } elseif (!Company::isCurrentUserHasAccess($asset)) { + } + if (!Company::isCurrentUserHasAccess($asset)) { return redirect()->route('requestable-assets') ->with('error', trans('general.insufficient_permissions')); } @@ -187,17 +177,16 @@ class ViewAssetsController extends Controller $settings->notify(new RequestAssetCancelationNotification($data)); return redirect()->route('requestable-assets') ->with('success')->with('success', trans('admin/hardware/message.requests.cancel-success')); - } else { - - $logaction->logaction('requested'); - $asset->request(); - $asset->increment('requests_counter', 1); - $settings->notify(new RequestAssetNotification($data)); - - - return redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.success')); } + $logaction->logaction('requested'); + $asset->request(); + $asset->increment('requests_counter', 1); + $settings->notify(new RequestAssetNotification($data)); + + + return redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.success')); + } @@ -236,11 +225,11 @@ class ViewAssetsController extends Controller if (is_null($item)) { // Redirect to the asset management page return redirect()->to('account')->with('error', trans('admin/hardware/message.does_not_exist')); - } elseif (!Company::isCurrentUserHasAccess($item)) { - return redirect()->route('requestable-assets')->with('error', trans('general.insufficient_permissions')); - } else { - return view('account/accept-asset', compact('item'))->with('findlog', $findlog)->with('item', $item); } + if (!Company::isCurrentUserHasAccess($item)) { + return redirect()->route('requestable-assets')->with('error', trans('general.insufficient_permissions')); + } + return view('account/accept-asset', compact('item'))->with('findlog', $findlog)->with('item', $item); } // Save the acceptance @@ -326,8 +315,8 @@ class ViewAssetsController extends Controller if ($update_checkout) { return redirect()->to('account/view-assets')->with('success', $return_msg); - } else { - return redirect()->to('account/view-assets')->with('error', 'Something went wrong '); } + return redirect()->to('account/view-assets')->with('error', 'Something went wrong '); + } } diff --git a/app/Http/Requests/AssetFileRequest.php b/app/Http/Requests/AssetFileRequest.php index 5d3c72f6cb..3de5af6df1 100644 --- a/app/Http/Requests/AssetFileRequest.php +++ b/app/Http/Requests/AssetFileRequest.php @@ -2,7 +2,8 @@ namespace App\Http\Requests; -use App\Http\Requests\Request; + +use Symfony\Component\HttpFoundation\JsonResponse; class AssetFileRequest extends Request { @@ -28,9 +29,4 @@ class AssetFileRequest extends Request 'file.*' => 'required|mimes:png,gif,jpg,svg,jpeg,doc,docx,pdf,txt,zip,rar,xls,lic|max:'.$max_file_size, ]; } - - public function response(array $errors) - { - return $this->redirector->back()->withInput()->withErrors($errors, $this->errorBag); - } } diff --git a/app/Http/Requests/ImageUploadRequest.php b/app/Http/Requests/ImageUploadRequest.php index deaecfa61d..a01df7b4f5 100644 --- a/app/Http/Requests/ImageUploadRequest.php +++ b/app/Http/Requests/ImageUploadRequest.php @@ -2,7 +2,8 @@ namespace App\Http\Requests; -use App\Http\Requests\Request; +use App\Models\SnipeModel; +use Intervention\Image\Facades\Image; class ImageUploadRequest extends Request { @@ -33,4 +34,45 @@ class ImageUploadRequest extends Request { return $this->redirector->back()->withInput()->withErrors($errors, $this->errorBag); } + + /** + * Handle and store any images attached to request + * @param SnipeModel $item Item the image is associated with + * @param String $path location for uploaded images, defaults to uploads/plural of item type. + * @return SnipeModel Target asset is being checked out to. + */ + public function handleImages($item, $path = null) + { + + if ($this->hasFile('image')) { + if (!config('app.lock_passwords')) { + if(is_null($path)) { + $type = strtolower(class_basename(get_class($item))); + $plural = str_plural($type); + $path = public_path('/uploads/'.$plural); + } + $image = $this->file('image'); + $ext = $image->getClientOriginalExtension(); + $file_name = $type.'-'.str_random(18).'.'.$ext; + if ($image->getClientOriginalExtension()!='svg') { + Image::make($image->getRealPath())->resize(null, 250, function ($constraint) { + $constraint->aspectRatio(); + $constraint->upsize(); + })->save($path.'/'.$file_name); + } else { + $image->move($path, $file_name); + } + + // Remove Current image if exists. + if (($item->image) && (file_exists($path.'/'.$item->image))) { + unlink($path.'/'.$item->image); + } + + $item->image = $file_name; + } + } elseif ($this->input('image_delete')=='1') { + $item->image = null; + } + return $item; + } } diff --git a/app/Http/Requests/LicenseCheckoutRequest.php b/app/Http/Requests/LicenseCheckoutRequest.php new file mode 100644 index 0000000000..6ec5cfe62d --- /dev/null +++ b/app/Http/Requests/LicenseCheckoutRequest.php @@ -0,0 +1,53 @@ + 'string|nullable', + 'asset_id' => 'required_without:assigned_to', + ]; + } + + public function findLicenseSeatToCheckout($license, $seatId) + { + // This returns null if seatId is null + if (!$licenseSeat = LicenseSeat::find($seatId)) { + $licenseSeat = $license->freeSeat(); + } + + if (!$licenseSeat) { + if ($seatId) { + return redirect()->route('licenses.index')->with('error', 'This Seat is not available for checkout.'); + } + return redirect()->route('licenses.index')->with('error', 'There are no available seats for this license'); + } + + if(!$licenseSeat->license->is($license)) { + return redirect()->route('licenses.index')->with('error', 'The license seat provided does not match the license.'); + } + + return $licenseSeat; + } +} diff --git a/app/Models/LicenseSeat.php b/app/Models/LicenseSeat.php index 17703ad2c6..22f159b806 100755 --- a/app/Models/LicenseSeat.php +++ b/app/Models/LicenseSeat.php @@ -55,4 +55,6 @@ class LicenseSeat extends Model implements ICompanyableChild return false; } + + } diff --git a/app/Notifications/CheckoutConsumableNotification.php b/app/Notifications/CheckoutConsumableNotification.php index 1811c70401..d9a80bfc3c 100644 --- a/app/Notifications/CheckoutConsumableNotification.php +++ b/app/Notifications/CheckoutConsumableNotification.php @@ -80,7 +80,9 @@ class CheckoutConsumableNotification extends Notification /** * Send an email if an email should be sent at checkin/checkout */ + if ((method_exists($this->item, 'checkin_email')) && ($this->item->checkin_email())) { + $notifyBy[1] = 'mail'; } diff --git a/resources/lang/en/admin/accessories/message.php b/resources/lang/en/admin/accessories/message.php index 92998a4e14..a356463064 100644 --- a/resources/lang/en/admin/accessories/message.php +++ b/resources/lang/en/admin/accessories/message.php @@ -2,7 +2,7 @@ return array( - 'does_not_exist' => 'The accessory does not exist.', + 'does_not_exist' => 'The accessory [:id] does not exist.', 'assoc_users' => 'This accessory currently has :count items checked out to users. Please check in the accessories and and try again. ', 'create' => array( diff --git a/resources/views/accessories/edit.blade.php b/resources/views/accessories/edit.blade.php index 05ed21e1fb..6b2065a089 100755 --- a/resources/views/accessories/edit.blade.php +++ b/resources/views/accessories/edit.blade.php @@ -24,18 +24,17 @@ -
- -
- -

Accepted filetypes are jpg, png, gif and svg

- {!! $errors->first('image', ':message') !!} +@if ($item->image) +
+ +
+ {{ Form::checkbox('image_delete') }} + + {!! $errors->first('image_delete', ':message') !!} +
-
- +@endif +@include ('partials.forms.edit.image-upload') @stop diff --git a/resources/views/users/view.blade.php b/resources/views/users/view.blade.php index 1cfe22cf7f..593805308f 100755 --- a/resources/views/users/view.blade.php +++ b/resources/views/users/view.blade.php @@ -391,7 +391,7 @@
-

{{ trans('admin/hardware/general.filetype_info') }}

+

{{ trans('admin/users/general.filetype_info') }}

@@ -427,7 +427,7 @@
- +
@@ -560,23 +560,22 @@ $(function () { done: function (e, data) { console.dir(data); - // We use this instead of the fail option, since our API // returns a 200 OK status which always shows as "success" - if (data && data.jqXHR.responseJSON.error && data.jqXHR.responseJSON && data.jqXHR.responseJSON.error) { - $('#progress-bar-text').html(data.jqXHR.responseJSON.error); + if (data && data.jqXHR && data.jqXHR.responseJSON && data.jqXHR.responseJSON.status === "error") { + var errorMessage = data.jqXHR.responseJSON.messages["file.0"]; + $('#progress-bar-text').html(errorMessage[0]); $('.progress-bar').removeClass('progress-bar-warning').addClass('progress-bar-danger').css('width','100%'); $('.progress-checkmark').fadeIn('fast').html(''); - console.log(data.jqXHR.responseJSON.error); } else { $('.progress-bar').removeClass('progress-bar-warning').addClass('progress-bar-success').css('width','100%'); $('.progress-checkmark').fadeIn('fast'); $('#progress-container').delay(950).css('visibility', 'visible'); $('.progress-bar-text').html('Finished!'); $('.progress-checkmark').fadeIn('fast').html(''); - $.each(data.result.file, function (index, file) { - $('<').prependTo("#upload-table > tbody"); + $.each(data.result, function (index, file) { + $('<').prependTo("#files-table > tbody"); }); } $('#progress').removeClass('active'); diff --git a/routes/web.php b/routes/web.php index aa96314757..7ee5f6f3d0 100644 --- a/routes/web.php +++ b/routes/web.php @@ -58,13 +58,6 @@ Route::group(['middleware' => 'auth'], function () { ]); - /* - * Status Labels - */ - Route::resource('components', 'ComponentsController', [ - 'parameters' => ['component' => 'component_id'] - ]); - /* * Departments */ diff --git a/routes/web/accessories.php b/routes/web/accessories.php index d9ab3b35cf..1f1a70fa6f 100644 --- a/routes/web/accessories.php +++ b/routes/web/accessories.php @@ -7,25 +7,25 @@ Route::group([ 'prefix' => 'accessories', 'middleware' => ['auth']], function () Route::get( '{accessoryID}/checkout', - [ 'as' => 'checkout/accessory', 'uses' => 'AccessoriesController@getCheckout' ] + [ 'as' => 'checkout/accessory', 'uses' => 'Accessories\AccessoryCheckoutController@create' ] ); Route::post( '{accessoryID}/checkout', - [ 'as' => 'checkout/accessory', 'uses' => 'AccessoriesController@postCheckout' ] + [ 'as' => 'checkout/accessory', 'uses' => 'Accessories\AccessoryCheckoutController@store' ] ); Route::get( '{accessoryID}/checkin/{backto?}', - [ 'as' => 'checkin/accessory', 'uses' => 'AccessoriesController@getCheckin' ] + [ 'as' => 'checkin/accessory', 'uses' => 'Accessories\AccessoryCheckinController@create' ] ); Route::post( '{accessoryID}/checkin/{backto?}', - [ 'as' => 'checkin/accessory', 'uses' => 'AccessoriesController@postCheckin' ] + [ 'as' => 'checkin/accessory', 'uses' => 'Accessories\AccessoryCheckinController@store' ] ); }); -Route::resource('accessories', 'AccessoriesController', [ +Route::resource('accessories', 'Accessories\AccessoriesController', [ 'middleware' => ['auth'], 'parameters' => ['accessory' => 'accessory_id'] ]); diff --git a/routes/web/components.php b/routes/web/components.php index 120580d82b..b467c090b5 100644 --- a/routes/web/components.php +++ b/routes/web/components.php @@ -5,24 +5,24 @@ Route::group([ 'prefix' => 'components','middleware' => ['auth'] ], function () Route::get( '{componentID}/checkout', - [ 'as' => 'checkout/component', 'uses' => 'ComponentsController@getCheckout' ] + [ 'as' => 'checkout/component', 'uses' => 'Components\ComponentCheckoutController@create' ] ); Route::post( '{componentID}/checkout', - [ 'as' => 'checkout/component', 'uses' => 'ComponentsController@postCheckout' ] + [ 'as' => 'checkout/component', 'uses' => 'Components\ComponentCheckoutController@store' ] ); Route::get( '{componentID}/checkin', - [ 'as' => 'checkin/component', 'uses' => 'ComponentsController@getCheckin' ] + [ 'as' => 'checkin/component', 'uses' => 'Components\ComponentCheckinController@create' ] ); Route::post( '{componentID}/checkin', - [ 'as' => 'component.checkin.save', 'uses' => 'ComponentsController@postCheckin' ] + [ 'as' => 'component.checkin.save', 'uses' => 'Components\ComponentCheckinController@store' ] ); }); -Route::resource('components', 'ComponentsController', [ +Route::resource('components', 'Components\ComponentsController', [ 'middleware' => ['auth'], 'parameters' => ['component' => 'component_id'] ]); diff --git a/routes/web/consumables.php b/routes/web/consumables.php index 623d09a346..8fbdded4bd 100644 --- a/routes/web/consumables.php +++ b/routes/web/consumables.php @@ -5,15 +5,15 @@ Route::group([ 'prefix' => 'consumables', 'middleware' => ['auth']], function () { Route::get( '{consumableID}/checkout', - [ 'as' => 'checkout/consumable','uses' => 'ConsumablesController@getCheckout' ] + [ 'as' => 'checkout/consumable','uses' => 'Consumables\ConsumableCheckoutController@create' ] ); Route::post( '{consumableID}/checkout', - [ 'as' => 'checkout/consumable', 'uses' => 'ConsumablesController@postCheckout' ] + [ 'as' => 'checkout/consumable', 'uses' => 'Consumables\ConsumableCheckoutController@store' ] ); }); - Route::resource('consumables', 'ConsumablesController', [ + Route::resource('consumables', 'Consumables\ConsumablesController', [ 'middleware' => ['auth'], 'parameters' => ['consumable' => 'consumable_id'] ]); diff --git a/routes/web/hardware.php b/routes/web/hardware.php index 081098806a..4c8cf09cca 100644 --- a/routes/web/hardware.php +++ b/routes/web/hardware.php @@ -14,7 +14,7 @@ Route::group( Route::get( 'bulkaudit', [ 'as' => 'assets.bulkaudit', - 'uses' => 'AssetsController@quickScan' + 'uses' => 'Assets\AssetsController@quickScan' ]); # Asset Maintenances @@ -22,86 +22,86 @@ Route::group( 'parameters' => ['maintenance' => 'maintenance_id', 'asset' => 'asset_id'] ]); - Route::get('requested', [ 'as' => 'assets.requested', 'uses' => 'AssetsController@getRequestedIndex']); + Route::get('requested', [ 'as' => 'assets.requested', 'uses' => 'Assets\AssetsController@getRequestedIndex']); Route::get('scan', [ 'as' => 'asset.scan', - 'uses' => 'AssetsController@scan' + 'uses' => 'Assets\AssetsController@scan' ]); Route::get('audit/{id}', [ 'as' => 'asset.audit.create', - 'uses' => 'AssetsController@audit' + 'uses' => 'Assets\AssetsController@audit' ]); Route::post('audit/{id}', [ 'as' => 'asset.audit.store', - 'uses' => 'AssetsController@auditStore' + 'uses' => 'Assets\AssetsController@auditStore' ]); Route::get('history', [ 'as' => 'asset.import-history', - 'uses' => 'AssetsController@getImportHistory' + 'uses' => 'Assets\AssetsController@getImportHistory' ]); Route::post('history', [ 'as' => 'asset.process-import-history', - 'uses' => 'AssetsController@postImportHistory' + 'uses' => 'Assets\AssetsController@postImportHistory' ]); Route::get('/bytag', [ 'as' => 'findbytag/hardware', - 'uses' => 'AssetsController@getAssetByTag' + 'uses' => 'Assets\AssetsController@getAssetByTag' ]); Route::get('{assetId}/clone', [ 'as' => 'clone/hardware', - 'uses' => 'AssetsController@getClone' + 'uses' => 'Assets\AssetsController@getClone' ]); - Route::post('{assetId}/clone', 'AssetsController@postCreate'); + Route::post('{assetId}/clone', 'Assets\AssetsController@postCreate'); Route::get('{assetId}/checkout', [ 'as' => 'checkout/hardware', - 'uses' => 'AssetCheckoutController@create' + 'uses' => 'Assets\AssetCheckoutController@create' ]); Route::post('{assetId}/checkout', [ 'as' => 'checkout/hardware', - 'uses' => 'AssetCheckoutController@store' + 'uses' => 'Assets\AssetCheckoutController@store' ]); Route::get('{assetId}/checkin/{backto?}', [ 'as' => 'checkin/hardware', - 'uses' => 'AssetCheckinController@create' + 'uses' => 'Assets\AssetCheckinController@create' ]); Route::post('{assetId}/checkin/{backto?}', [ 'as' => 'checkin/hardware', - 'uses' => 'AssetCheckinController@store' + 'uses' => 'Assets\AssetCheckinController@store' ]); Route::get('{assetId}/view', [ 'as' => 'hardware.view', - 'uses' => 'AssetsController@show' + 'uses' => 'Assets\AssetsController@show' ]); - Route::get('{assetId}/qr_code', [ 'as' => 'qr_code/hardware', 'uses' => 'AssetsController@getQrCode' ]); - Route::get('{assetId}/barcode', [ 'as' => 'barcode/hardware', 'uses' => 'AssetsController@getBarCode' ]); + Route::get('{assetId}/qr_code', [ 'as' => 'qr_code/hardware', 'uses' => 'Assets\AssetsController@getQrCode' ]); + Route::get('{assetId}/barcode', [ 'as' => 'barcode/hardware', 'uses' => 'Assets\AssetsController@getBarCode' ]); Route::get('{assetId}/restore', [ 'as' => 'restore/hardware', - 'uses' => 'AssetsController@getRestore' + 'uses' => 'Assets\AssetsController@getRestore' ]); Route::post('{assetId}/upload', [ 'as' => 'upload/asset', - 'uses' => 'AssetFilesController@store' + 'uses' => 'Assets\AssetFilesController@store' ]); Route::get('{assetId}/showfile/{fileId}/{download?}', [ 'as' => 'show/assetfile', - 'uses' => 'AssetFilesController@show' + 'uses' => 'Assets\AssetFilesController@show' ]); Route::delete('{assetId}/showfile/{fileId}/delete', [ 'as' => 'delete/assetfile', - 'uses' => 'AssetFilesController@destroy' + 'uses' => 'Assets\AssetFilesController@destroy' ]); @@ -109,32 +109,32 @@ Route::group( 'bulkedit', [ 'as' => 'hardware/bulkedit', - 'uses' => 'BulkAssetsController@edit' + 'uses' => 'Assets\BulkAssetsController@edit' ] ); Route::post( 'bulkdelete', [ 'as' => 'hardware/bulkdelete', - 'uses' => 'BulkAssetsController@destroy' + 'uses' => 'Assets\BulkAssetsController@destroy' ] ); Route::post( 'bulksave', [ 'as' => 'hardware/bulksave', - 'uses' => 'BulkAssetsController@update' + 'uses' => 'Assets\BulkAssetsController@update' ] ); # Bulk checkout / checkin Route::get( 'bulkcheckout', [ 'as' => 'hardware/bulkcheckout', - 'uses' => 'BulkAssetsController@showCheckout' + 'uses' => 'Assets\BulkAssetsController@showCheckout' ]); Route::post( 'bulkcheckout', [ 'as' => 'hardware/bulkcheckout', - 'uses' => 'BulkAssetsController@storeCheckout' + 'uses' => 'Assets\BulkAssetsController@storeCheckout' ]); @@ -143,7 +143,7 @@ Route::group( }); -Route::resource('hardware', 'AssetsController', [ +Route::resource('hardware', 'Assets\AssetsController', [ 'middleware' => ['auth'], 'parameters' => ['asset' => 'asset_id'] ]); diff --git a/routes/web/licenses.php b/routes/web/licenses.php index 2117d5229d..44ed0f5ace 100644 --- a/routes/web/licenses.php +++ b/routes/web/licenses.php @@ -4,46 +4,45 @@ # Licenses Route::group([ 'prefix' => 'licenses', 'middleware' => ['auth'] ], function () { - Route::get('{licenseId}/clone', [ 'as' => 'clone/license', 'uses' => 'LicensesController@getClone' ]); - Route::post('{licenseId}/clone', [ 'as' => 'clone/license', 'uses' => 'LicensesController@postCreate' ]); + Route::get('{licenseId}/clone', [ 'as' => 'clone/license', 'uses' => 'Licenses\LicensesController@getClone' ]); Route::get('{licenseId}/freecheckout', [ 'as' => 'licenses.freecheckout', - 'uses' => 'LicensesController@getFreeLicense' + 'uses' => 'Licenses\LicensesController@getFreeLicense' ]); Route::get('{licenseId}/checkout/{seatId?}', [ 'as' => 'licenses.checkout', - 'uses' => 'LicensesController@getCheckout' + 'uses' => 'Licenses\LicenseCheckoutController@create' ]); Route::post( '{licenseId}/checkout/{seatId?}', - [ 'as' => 'licenses.checkout', 'uses' => 'LicensesController@postCheckout' ] + [ 'as' => 'licenses.checkout', 'uses' => 'Licenses\LicenseCheckoutController@store' ] ); Route::get('{licenseId}/checkin/{backto?}', [ 'as' => 'licenses.checkin', - 'uses' => 'LicensesController@getCheckin' + 'uses' => 'Licenses\LicenseCheckinController@create' ]); Route::post('{licenseId}/checkin/{backto?}', [ 'as' => 'licenses.checkin.save', - 'uses' => 'LicensesController@postCheckin' + 'uses' => 'Licenses\LicenseCheckinController@store' ]); Route::post( '{licenseId}/upload', - [ 'as' => 'upload/license', 'uses' => 'LicensesController@postUpload' ] + [ 'as' => 'upload/license', 'uses' => 'Licenses\LicenseFilesController@store' ] ); Route::delete( '{licenseId}/deletefile/{fileId}', - [ 'as' => 'delete/licensefile', 'uses' => 'LicensesController@getDeleteFile' ] + [ 'as' => 'delete/licensefile', 'uses' => 'Licenses\LicenseFilesController@destroy' ] ); Route::get( '{licenseId}/showfile/{fileId}/{download?}', - [ 'as' => 'show.licensefile', 'uses' => 'LicensesController@displayFile' ] + [ 'as' => 'show.licensefile', 'uses' => 'Licenses\LicenseFilesController@show' ] ); }); -Route::resource('licenses', 'LicensesController', [ +Route::resource('licenses', 'Licenses\LicensesController', [ 'middleware' => ['auth'], 'parameters' => ['license' => 'license_id'] ]); diff --git a/routes/web/models.php b/routes/web/models.php index 25437051fe..a491c395da 100644 --- a/routes/web/models.php +++ b/routes/web/models.php @@ -8,9 +8,9 @@ Route::group([ 'prefix' => 'models', 'middleware' => ['auth'] ], function () { Route::get('{modelId}/view', [ 'as' => 'view/model', 'uses' => 'AssetModelsController@getView' ]); Route::get('{modelID}/restore', [ 'as' => 'restore/model', 'uses' => 'AssetModelsController@getRestore', 'middleware' => ['authorize:superuser'] ]); Route::get('{modelId}/custom_fields', ['as' => 'custom_fields/model','uses' => 'AssetModelsController@getCustomFields']); - Route::post('bulkedit', ['as' => 'models.bulkedit.index','uses' => 'AssetModelsController@postBulkEdit']); - Route::post('bulksave', ['as' => 'models.bulkedit.store','uses' => 'AssetModelsController@postBulkEditSave']); - Route::post('bulkdelete', ['as' => 'models.bulkdelete.store','uses' => 'AssetModelsController@postBulkDelete']); + Route::post('bulkedit', ['as' => 'models.bulkedit.index','uses' => 'BulkAssetModelsController@edit']); + Route::post('bulksave', ['as' => 'models.bulkedit.store','uses' => 'BulkAssetModelsController@update']); + Route::post('bulkdelete', ['as' => 'models.bulkdelete.store','uses' => 'BulkAssetModelsController@destroy']); }); Route::resource('models', 'AssetModelsController', [ diff --git a/routes/web/users.php b/routes/web/users.php index 0dd24311c3..f1927c1604 100644 --- a/routes/web/users.php +++ b/routes/web/users.php @@ -3,56 +3,56 @@ # User Management Route::group([ 'prefix' => 'users', 'middleware' => ['auth']], function () { - Route::get('ldap', ['as' => 'ldap/user', 'uses' => 'UsersController@getLDAP' ]); - Route::post('ldap', 'UsersController@postLDAP'); - Route::get('export', [ 'as' => 'users.export', 'uses' => 'UsersController@getExportUserCsv' ]); - Route::get('{userId}/clone', [ 'as' => 'clone/user', 'uses' => 'UsersController@getClone' ]); - Route::post('{userId}/clone', [ 'uses' => 'UsersController@postCreate' ]); - Route::get('{userId}/restore', [ 'as' => 'restore/user', 'uses' => 'UsersController@getRestore' ]); - Route::get('{userId}/unsuspend', [ 'as' => 'unsuspend/user', 'uses' => 'UsersController@getUnsuspend' ]); - Route::post('{userId}/upload', [ 'as' => 'upload/user', 'uses' => 'UsersController@postUpload' ]); + Route::get('ldap', ['as' => 'ldap/user', 'uses' => 'Users\LDAPImportController@create' ]); + Route::post('ldap', 'Users\LDAPImportController@store'); + Route::get('export', [ 'as' => 'users.export', 'uses' => 'Users\UsersController@getExportUserCsv' ]); + Route::get('{userId}/clone', [ 'as' => 'clone/user', 'uses' => 'Users\UsersController@getClone' ]); + Route::post('{userId}/clone', [ 'uses' => 'Users\UsersController@postCreate' ]); + Route::get('{userId}/restore', [ 'as' => 'restore/user', 'uses' => 'Users\UsersController@getRestore' ]); + Route::get('{userId}/unsuspend', [ 'as' => 'unsuspend/user', 'uses' => 'Users\UsersController@getUnsuspend' ]); + Route::post('{userId}/upload', [ 'as' => 'upload/user', 'uses' => 'Users\UserFilesController@store' ]); Route::delete( '{userId}/deletefile/{fileId}', - [ 'as' => 'userfile.destroy', 'uses' => 'UsersController@getDeleteFile' ] + [ 'as' => 'userfile.destroy', 'uses' => 'Users\UserFilesController@destroy' ] ); Route::get( '{userId}/print', - [ 'as' => 'users.print', 'uses' => 'UsersController@printInventory' ] + [ 'as' => 'users.print', 'uses' => 'Users\UsersController@printInventory' ] ); Route::get( '{userId}/showfile/{fileId}', - [ 'as' => 'show/userfile', 'uses' => 'UsersController@displayFile' ] + [ 'as' => 'show/userfile', 'uses' => 'Users\UserFilesController@show' ] ); Route::post( 'bulkedit', [ 'as' => 'users/bulkedit', - 'uses' => 'UsersController@postBulkEdit', + 'uses' => 'Users\BulkUsersController@edit', ] ); Route::post( 'bulksave', [ 'as' => 'users/bulksave', - 'uses' => 'UsersController@postBulkSave', + 'uses' => 'Users\BulkUsersController@destroy', ] ); Route::post( 'bulkeditsave', [ 'as' => 'users/bulkeditsave', - 'uses' => 'UsersController@postBulkEditSave', + 'uses' => 'Users\BulkUsersController@update', ] ); }); -Route::resource('users', 'UsersController', [ +Route::resource('users', 'Users\UsersController', [ 'middleware' => ['auth'], 'parameters' => ['user' => 'user_id'] ]);
{{ trans('general.notes') }}
' + file.notes + '' + file.name + 'Just now' + file.filesize + ' Process
' + file.note + '' + file.filename + '