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.
This commit is contained in:
Daniel Meltzer 2018-07-24 22:35:26 -04:00 committed by snipe
parent e320d2ba05
commit 64d649be7f
59 changed files with 3098 additions and 3365 deletions

View file

@ -0,0 +1,198 @@
<?php
namespace App\Http\Controllers\Accessories;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Http\Requests\ImageUploadRequest;
use App\Models\Accessory;
use App\Models\Company;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
use Redirect;
/** This controller handles all actions related to Accessories for
* the Snipe-IT Asset Management application.
*
* @version v1.0
*/
class AccessoriesController extends Controller
{
/**
* 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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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]));
}
}

View file

@ -0,0 +1,71 @@
<?php
namespace App\Http\Controllers\Accessories;
use App\Http\Controllers\Controller;
use App\Models\Accessory;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Input;
class AccessoryCheckinController extends Controller
{
/**
* Check the accessory back into inventory
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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'));
}
}

View file

@ -0,0 +1,87 @@
<?php
namespace App\Http\Controllers\Accessories;
use App\Http\Controllers\Controller;
use App\Models\Accessory;
use App\Models\User;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Input;
class AccessoryCheckoutController extends Controller
{
/**
* Return the form to checkout an Accessory to a user.
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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'));
}
}

View file

@ -1,400 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Helpers\Helper;
use App\Models\Accessory;
use App\Models\Company;
use App\Models\User;
use Auth;
use Carbon\Carbon;
use Config;
use DB;
use Gate;
use Input;
use Lang;
use Redirect;
use Illuminate\Http\Request;
use Slack;
use Str;
use View;
use Image;
use App\Http\Requests\ImageUploadRequest;
/** This controller handles all actions related to Accessories for
* the Snipe-IT Asset Management application.
*
* @version v1.0
*/
class AccessoriesController extends Controller
{
/**
* 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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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'));
}
}

View file

@ -233,7 +233,7 @@ class AssetsController extends Controller
// This handles all of the pivot sorting (versus the assets.* fields // This handles all of the pivot sorting (versus the assets.* fields
// in the allowed_columns array) // in the allowed_columns array)
$column_sort = in_array($sort_override, $allowed_columns) ? $sort_override : 'assets.created_at'; $column_sort = in_array($sort_override, $allowed_columns) ? $sort_override : 'assets.created_at';
// dd($column_sort);
switch ($sort_override) { switch ($sort_override) {
case 'model': case 'model':
@ -270,9 +270,9 @@ class AssetsController extends Controller
break; break;
} }
$total = $assets->count(); $total = $assets->count();
$assets = $assets->skip($offset)->take($limit)->get(); $assets = $assets->skip($offset)->take($limit)->get();
// dd($assets);
return (new AssetsTransformer)->transformAssets($assets, $total); return (new AssetsTransformer)->transformAssets($assets, $total);
} }

View file

@ -152,7 +152,7 @@ class ConsumablesController extends Controller
* Returns a JSON response containing details on the users associated with this consumable. * Returns a JSON response containing details on the users associated with this consumable.
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @see ConsumablesController::getView() method that returns the form. * @see \App\Http\Controllers\Consumables\ConsumablesController::getView() method that returns the form.
* @since [v1.0] * @since [v1.0]
* @param int $consumableId * @param int $consumableId
* @return array * @return array

View file

@ -1,26 +1,15 @@
<?php <?php
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Models\CustomField; use Illuminate\Support\Facades\Auth;
use Image; use Illuminate\Support\Facades\Input;
use Input; use Illuminate\Support\Facades\View;
use Lang;
use App\Models\AssetModel; use App\Models\AssetModel;
use Redirect; use Redirect;
use Auth;
use DB;
use Str;
use Validator;
use View;
use App\Models\Asset;
use App\Models\Company;
use Config;
use App\Helpers\Helper; use App\Helpers\Helper;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Http\Requests\ImageUploadRequest; use App\Http\Requests\ImageUploadRequest;
use Symfony\Component\HttpFoundation\JsonResponse;
/** /**
* This class controls all actions related to asset models for * This class controls all actions related to asset models for
* the Snipe-IT Asset Management application. * the Snipe-IT Asset Management application.
@ -31,13 +20,14 @@ use Symfony\Component\HttpFoundation\JsonResponse;
class AssetModelsController extends Controller class AssetModelsController extends Controller
{ {
/** /**
* Returns a view that invokes the ajax tables which actually contains * Returns a view that invokes the ajax tables which actually contains
* the content for the accessories listing, which is generated in getDatatable. * the content for the accessories listing, which is generated in getDatatable.
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.0] * @since [v1.0]
* @return View * @return View
*/ * @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function index() public function index()
{ {
$this->authorize('index', AssetModel::class); $this->authorize('index', AssetModel::class);
@ -45,29 +35,31 @@ class AssetModelsController extends Controller
} }
/** /**
* Returns a view containing the asset model creation form. * Returns a view containing the asset model creation form.
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.0] * @since [v1.0]
* @return View * @return View
*/ * @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function create() public function create()
{ {
$this->authorize('create', AssetModel::class); $this->authorize('create', AssetModel::class);
$category_type = 'asset'; return view('models/edit')->with('category_type', 'asset')
return view('models/edit')->with('category_type',$category_type) ->with('depreciation_list', Helper::depreciationList())
->with('depreciation_list', Helper::depreciationList()) ->with('item', new AssetModel);
->with('item', new AssetModel);
} }
/** /**
* Validate and process the new Asset Model data. * Validate and process the new Asset Model data.
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.0] * @since [v1.0]
* @return Redirect * @param ImageUploadRequest $request
*/ * @return Redirect
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function store(ImageUploadRequest $request) public function store(ImageUploadRequest $request)
{ {
@ -90,23 +82,7 @@ class AssetModelsController extends Controller
$model->fieldset_id = e($request->input('custom_fieldset')); $model->fieldset_id = e($request->input('custom_fieldset'));
} }
if (Input::file('image')) { $model = $request->handleImages($model, app('models_upload_path'));
$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;
}
// Was it created? // Was it created?
if ($model->save()) { if ($model->save()) {
@ -121,13 +97,14 @@ class AssetModelsController extends Controller
} }
/** /**
* Returns a view containing the asset model edit form. * Returns a view containing the asset model edit form.
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.0] * @since [v1.0]
* @param int $modelId * @param int $modelId
* @return View * @return View
*/ * @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function edit($modelId = null) public function edit($modelId = null)
{ {
$this->authorize('update', AssetModel::class); $this->authorize('update', AssetModel::class);
@ -144,14 +121,16 @@ class AssetModelsController extends Controller
/** /**
* Validates and processes form data from the edit * Validates and processes form data from the edit
* Asset Model form based on the model ID passed. * Asset Model form based on the model ID passed.
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.0] * @since [v1.0]
* @param int $modelId * @param ImageUploadRequest $request
* @return Redirect * @param int $modelId
*/ * @return Redirect
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function update(ImageUploadRequest $request, $modelId = null) public function update(ImageUploadRequest $request, $modelId = null)
{ {
$this->authorize('update', AssetModel::class); $this->authorize('update', AssetModel::class);
@ -182,37 +161,7 @@ class AssetModelsController extends Controller
} }
} }
$old_image = $model->image; $model = $request->handleImages($model, app('models_upload_path'));
// 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);
}
}
if ($model->save()) { if ($model->save()) {
return redirect()->route("models.index")->with('success', trans('admin/models/message.update.success')); 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 * Validate and delete the given Asset Model. An Asset Model
* cannot be deleted if there are associated assets. * cannot be deleted if there are associated assets.
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.0] * @since [v1.0]
* @param int $modelId * @param int $modelId
* @return Redirect * @return Redirect
*/ * @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function destroy($modelId) public function destroy($modelId)
{ {
$this->authorize('delete', AssetModel::class); $this->authorize('delete', AssetModel::class);
@ -259,13 +209,14 @@ class AssetModelsController extends Controller
/** /**
* Restore a given Asset Model (mark as un-deleted) * Restore a given Asset Model (mark as un-deleted)
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.0] * @since [v1.0]
* @param int $modelId * @param int $modelId
* @return Redirect * @return Redirect
*/ * @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function getRestore($modelId = null) public function getRestore($modelId = null)
{ {
$this->authorize('create', AssetModel::class); $this->authorize('create', AssetModel::class);
@ -273,16 +224,8 @@ class AssetModelsController extends Controller
$model = AssetModel::withTrashed()->find($modelId); $model = AssetModel::withTrashed()->find($modelId);
if (isset($model->id)) { if (isset($model->id)) {
// Restore the model
$model->restore(); $model->restore();
return redirect()->route('models.index')->with('success', trans('admin/models/message.restore.success'));
// Prepare the success message
$success = trans('admin/models/message.restore.success');
// Redirect back
return redirect()->route('models.index')->with('success', $success);
} }
return redirect()->back()->with('error', trans('admin/models/message.not_found')); 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 * Get the model information to present to the model view page
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.0] * @since [v1.0]
* @param int $modelId * @param int $modelId
* @return View * @return View
*/ * @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function show($modelId = null) public function show($modelId = null)
{ {
$this->authorize('view', AssetModel::class); $this->authorize('view', AssetModel::class);
@ -305,11 +249,8 @@ class AssetModelsController extends Controller
if (isset($model->id)) { if (isset($model->id)) {
return view('models/view', compact('model')); 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 // 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; $model->id = null;
// Show the page // Show the page
$view = View::make('models/edit'); return view('models/edit')
$view->with('depreciation_list', Helper::depreciationList()); ->with('depreciation_list', Helper::depreciationList())
$view->with('item', $model); ->with('item', $model)
$view->with('clone_model', $model_to_clone); ->with('clone_model', $model_to_clone);
return $view;
} }
@ -350,150 +289,10 @@ class AssetModelsController extends Controller
*/ */
public function getCustomFields($modelId) public function getCustomFields($modelId)
{ {
$model = AssetModel::find($modelId); return view("models.custom_fields_form")->with("model", AssetModel::find($modelId));
return view("models.custom_fields_form")->with("model", $model);
} }
/**
* Returns a view that allows the user to bulk edit model attrbutes
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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 * Returns true if a fieldset is set, 'add default values' is ticked and if
* any default values were entered into the form. * any default values were entered into the form.

View file

@ -1,25 +1,27 @@
<?php <?php
namespace App\Http\Controllers; namespace App\Http\Controllers\Assets;
use App\Helpers\Helper; use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Http\Requests\AssetCheckinRequest; use App\Http\Requests\AssetCheckinRequest;
use App\Models\Asset; use App\Models\Asset;
use Illuminate\Http\Request; use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\View;
class AssetCheckinController extends Controller class AssetCheckinController extends Controller
{ {
/** /**
* Returns a view that presents a form to check an asset back into inventory. * Returns a view that presents a form to check an asset back into inventory.
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $assetId * @param int $assetId
* @param string $backto * @param string $backto
* @since [v1.0] * @return View
* @return View * @throws \Illuminate\Auth\Access\AuthorizationException
*/ * @since [v1.0]
*/
public function create($assetId, $backto = null) public function create($assetId, $backto = null)
{ {
// Check if the asset exists // Check if the asset exists
@ -40,6 +42,7 @@ class AssetCheckinController extends Controller
* @param int $assetId * @param int $assetId
* @param null $backto * @param null $backto
* @return Redirect * @return Redirect
* @throws \Illuminate\Auth\Access\AuthorizationException
* @since [v1.0] * @since [v1.0]
*/ */
public function store(AssetCheckinRequest $request, $assetId = null, $backto = null) public function store(AssetCheckinRequest $request, $assetId = null, $backto = null)
@ -79,19 +82,8 @@ class AssetCheckinController extends Controller
// Was the asset updated? // Was the asset updated?
if ($asset->save()) { 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') { if ($backto=='user') {
return redirect()->route("users.show", $user->id)->with('success', trans('admin/hardware/message.checkin.success')); return redirect()->route("users.show", $user->id)->with('success', trans('admin/hardware/message.checkin.success'));

View file

@ -1,9 +1,11 @@
<?php <?php
namespace App\Http\Controllers; namespace App\Http\Controllers\Assets;
use App\Exceptions\CheckoutNotAllowed; use App\Exceptions\CheckoutNotAllowed;
use App\Http\Controllers\CheckInOutRequest; use App\Http\Controllers\CheckInOutRequest;
use App\Http\Controllers\Controller;
use App\Http\Requests\AssetCheckoutRequest; use App\Http\Requests\AssetCheckoutRequest;
use App\Models\Asset; use App\Models\Asset;
use App\Models\Location; use App\Models\Location;

View file

@ -1,12 +1,12 @@
<?php <?php
namespace App\Http\Controllers; namespace App\Http\Controllers\Assets;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Http\Requests\AssetFileRequest; use App\Http\Requests\AssetFileRequest;
use App\Models\Actionlog; use App\Models\Actionlog;
use App\Models\Asset; use App\Models\Asset;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Response; use Illuminate\Support\Facades\Response;
class AssetFilesController extends Controller class AssetFilesController extends Controller
@ -19,6 +19,7 @@ class AssetFilesController extends Controller
* @param int $assetId * @param int $assetId
* @return Redirect * @return Redirect
* @since [v1.0] * @since [v1.0]
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function store(AssetFileRequest $request, $assetId = null) public function store(AssetFileRequest $request, $assetId = null)
{ {
@ -45,14 +46,15 @@ class AssetFilesController extends Controller
} }
/** /**
* Check for permissions and display the file. * Check for permissions and display the file.
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $assetId * @param int $assetId
* @param int $fileId * @param int $fileId
* @since [v1.0] * @since [v1.0]
* @return View * @return View
*/ * @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function show($assetId = null, $fileId = null, $download = true) public function show($assetId = null, $fileId = null, $download = true)
{ {
$asset = Asset::find($assetId); $asset = Asset::find($assetId);
@ -92,14 +94,15 @@ class AssetFilesController extends Controller
} }
/** /**
* Delete the associated file * Delete the associated file
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $assetId * @param int $assetId
* @param int $fileId * @param int $fileId
* @since [v1.0] * @since [v1.0]
* @return View * @return View
*/ * @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function destroy($assetId = null, $fileId = null) public function destroy($assetId = null, $fileId = null)
{ {
$asset = Asset::find($assetId); $asset = Asset::find($assetId);

View file

@ -1,18 +1,13 @@
<?php <?php
namespace App\Http\Controllers; namespace App\Http\Controllers\Assets;
use App\Helpers\Helper; use App\Helpers\Helper;
use App\Http\Requests\AssetCheckinRequest; use App\Http\Controllers\Controller;
use App\Http\Requests\AssetCheckoutRequest;
use App\Http\Requests\AssetFileRequest;
use App\Http\Requests\AssetRequest; use App\Http\Requests\AssetRequest;
use App\Http\Requests\ItemImportRequest;
use App\Models\Actionlog; use App\Models\Actionlog;
use App\Models\Asset; use App\Models\Asset;
use App\Models\AssetModel; use App\Models\AssetModel;
use App\Models\Company; use App\Models\Company;
use App\Models\CustomField;
use App\Models\Import;
use App\Models\Location; use App\Models\Location;
use App\Models\Setting; use App\Models\Setting;
use App\Models\User; use App\Models\User;
@ -34,7 +29,6 @@ use Redirect;
use Response; use Response;
use Slack; use Slack;
use Str; use Str;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use TCPDF; use TCPDF;
use Validator; use Validator;
use View; use View;
@ -66,7 +60,9 @@ class AssetsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @see AssetController::getDatatable() method that generates the JSON response * @see AssetController::getDatatable() method that generates the JSON response
* @since [v1.0] * @since [v1.0]
* @param Request $request
* @return View * @return View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function index(Request $request) public function index(Request $request)
{ {

View file

@ -1,9 +1,10 @@
<?php <?php
namespace App\Http\Controllers; namespace App\Http\Controllers\Assets;
use App\Helpers\Helper; use App\Helpers\Helper;
use App\Http\Controllers\CheckInOutRequest; use App\Http\Controllers\CheckInOutRequest;
use App\Http\Controllers\Controller;
use App\Models\Asset; use App\Models\Asset;
use App\Models\Setting; use App\Models\Setting;
use App\Models\User; use App\Models\User;
@ -14,6 +15,7 @@ use Illuminate\Support\Facades\DB;
class BulkAssetsController extends Controller class BulkAssetsController extends Controller
{ {
use CheckInOutRequest; use CheckInOutRequest;
/** /**
* Display the bulk edit page. * Display the bulk edit page.
* *
@ -21,6 +23,7 @@ class BulkAssetsController extends Controller
* @return View * @return View
* @internal param int $assetId * @internal param int $assetId
* @since [v2.0] * @since [v2.0]
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function edit(Request $request) public function edit(Request $request)
{ {
@ -130,10 +133,11 @@ class BulkAssetsController extends Controller
* @var Array * @var Array
*/ */
private $update_array; private $update_array;
/** /**
* Adds parameter to update array for an item if it exists in request * Adds parameter to update array for an item if it exists in request
* @param String $field field name * @param String $field field name
* @return this Model for Chaining * @return BulkAssetsController Model for Chaining
*/ */
protected function conditionallyAddItem($field) protected function conditionallyAddItem($field)
{ {
@ -147,7 +151,9 @@ class BulkAssetsController extends Controller
* Save bulk deleted. * Save bulk deleted.
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @param Request $request
* @return View * @return View
* @throws \Illuminate\Auth\Access\AuthorizationException
* @internal param array $assets * @internal param array $assets
* @since [v2.0] * @since [v2.0]
*/ */

View file

@ -0,0 +1,138 @@
<?php
namespace App\Http\Controllers;
use App\Helpers\Helper;
use App\Models\AssetModel;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Redirect;
class BulkAssetModelsController extends Controller
{
/**
* Returns a view that allows the user to bulk edit model attrbutes
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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'));
}
}

View file

@ -29,13 +29,14 @@ class CategoriesController extends Controller
{ {
/** /**
* Returns a view that invokes the ajax tables which actually contains * Returns a view that invokes the ajax tables which actually contains
* the content for the categories listing, which is generated in getDatatable. * the content for the categories listing, which is generated in getDatatable.
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @see CategoriesController::getDatatable() method that generates the JSON response * @see CategoriesController::getDatatable() method that generates the JSON response
* @since [v1.0] * @since [v1.0]
* @return \Illuminate\Contracts\View\View * @return \Illuminate\Contracts\View\View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function index() public function index()
{ {
@ -46,30 +47,32 @@ class CategoriesController extends Controller
/** /**
* Returns a form view to create a new category. * Returns a form view to create a new category.
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @see CategoriesController::store() method that stores the data * @see CategoriesController::store() method that stores the data
* @since [v1.0] * @since [v1.0]
* @return \Illuminate\Contracts\View\View * @return \Illuminate\Contracts\View\View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function create() public function create()
{ {
// Show the page // Show the page
$this->authorize('create', Category::class); $this->authorize('create', Category::class);
$category_types= Helper::categoryTypeList();
return view('categories/edit')->with('item', new Category) 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. * Validates and stores the new category data.
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @see CategoriesController::create() method that makes the form. * @see CategoriesController::create() method that makes the form.
* @since [v1.0] * @since [v1.0]
* @return \Illuminate\Http\RedirectResponse * @param ImageUploadRequest $request
* @return \Illuminate\Http\RedirectResponse
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function store(ImageUploadRequest $request) public function store(ImageUploadRequest $request)
{ {
@ -83,17 +86,7 @@ class CategoriesController extends Controller
$category->checkin_email = $request->input('checkin_email', '0'); $category->checkin_email = $request->input('checkin_email', '0');
$category->user_id = Auth::id(); $category->user_id = Auth::id();
if ($request->file('image')) { $category = $request->handleImages($category);
$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;
}
if ($category->save()) { if ($category->save()) {
return redirect()->route('categories.index')->with('success', trans('admin/categories/message.create.success')); 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. * Returns a view that makes a form to update a category.
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @see CategoriesController::postEdit() method saves the data * @see CategoriesController::postEdit() method saves the data
* @param int $categoryId * @param int $categoryId
* @since [v1.0] * @since [v1.0]
* @return \Illuminate\Contracts\View\View * @return \Illuminate\Contracts\View\View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function edit($categoryId = null) public function edit($categoryId = null)
{ {
@ -117,10 +111,8 @@ class CategoriesController extends Controller
if (is_null($item = Category::find($categoryId))) { if (is_null($item = Category::find($categoryId))) {
return redirect()->route('categories.index')->with('error', trans('admin/categories/message.does_not_exist')); return redirect()->route('categories.index')->with('error', trans('admin/categories/message.does_not_exist'));
} }
$category_types= Helper::categoryTypeList();
return view('categories/edit', compact('item')) 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] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @see CategoriesController::getEdit() method that makes the form. * @see CategoriesController::getEdit() method that makes the form.
* @param Request $request * @param ImageUploadRequest $request
* @param int $categoryId * @param int $categoryId
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
* @throws \Illuminate\Auth\Access\AuthorizationException
* @since [v1.0] * @since [v1.0]
*/ */
public function update(ImageUploadRequest $request, $categoryId = null) public function update(ImageUploadRequest $request, $categoryId = null)
@ -152,37 +145,7 @@ class CategoriesController extends Controller
$category->require_acceptance = $request->input('require_acceptance', '0'); $category->require_acceptance = $request->input('require_acceptance', '0');
$category->checkin_email = $request->input('checkin_email', '0'); $category->checkin_email = $request->input('checkin_email', '0');
$old_image = $category->image; $category = $request->handleImages($category);
// 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);
}
}
if ($category->save()) { if ($category->save()) {
// Redirect to the new category page // Redirect to the new category page
@ -193,12 +156,13 @@ class CategoriesController extends Controller
} }
/** /**
* Validates and marks a category as deleted. * Validates and marks a category as deleted.
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.0] * @since [v1.0]
* @param int $categoryId * @param int $categoryId
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function destroy($categoryId) public function destroy($categoryId)
{ {
@ -225,14 +189,15 @@ class CategoriesController extends Controller
/** /**
* Returns a view that invokes the ajax tables which actually contains * Returns a view that invokes the ajax tables which actually contains
* the content for the categories detail view, which is generated in getDataView. * the content for the categories detail view, which is generated in getDataView.
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @see CategoriesController::getDataView() method that generates the JSON response * @see CategoriesController::getDataView() method that generates the JSON response
* @param int $categoryId * @param $id
* @since [v1.8] * @return \Illuminate\Contracts\View\View
* @return \Illuminate\Contracts\View\View * @throws \Illuminate\Auth\Access\AuthorizationException
* @since [v1.8]
*/ */
public function show($id) public function show($id)
{ {
@ -255,10 +220,8 @@ class CategoriesController extends Controller
} }
// Prepare the error message // Prepare the error message
$error = trans('admin/categories/message.does_not_exist', compact('id'));
// Redirect to the user management page // 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'));
} }
} }

View file

@ -4,6 +4,7 @@ namespace App\Http\Controllers;
use App\Exceptions\CheckoutNotAllowed; use App\Exceptions\CheckoutNotAllowed;
use App\Models\Asset; use App\Models\Asset;
use App\Models\Location; use App\Models\Location;
use App\Models\SnipeModel;
use App\Models\User; use App\Models\User;
trait CheckInOutRequest trait CheckInOutRequest

View file

@ -2,10 +2,6 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Models\Company; use App\Models\Company;
use Input;
use Lang;
use Redirect;
use View;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Image; use Image;
use App\Http\Requests\ImageUploadRequest; use App\Http\Requests\ImageUploadRequest;
@ -21,11 +17,12 @@ final class CompaniesController extends Controller
{ {
/** /**
* Returns view to display listing of companies. * Returns view to display listing of companies.
* *
* @author [Abdullah Alansari] [<ahimta@gmail.com>] * @author [Abdullah Alansari] [<ahimta@gmail.com>]
* @since [v1.8] * @since [v1.8]
* @return \Illuminate\Contracts\View\View * @return \Illuminate\Contracts\View\View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function index() public function index()
{ {
@ -35,11 +32,12 @@ final class CompaniesController extends Controller
} }
/** /**
* Returns view to create a new company. * Returns view to create a new company.
* *
* @author [Abdullah Alansari] [<ahimta@gmail.com>] * @author [Abdullah Alansari] [<ahimta@gmail.com>]
* @since [v1.8] * @since [v1.8]
* @return \Illuminate\Contracts\View\View * @return \Illuminate\Contracts\View\View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function create() public function create()
{ {
@ -55,6 +53,7 @@ final class CompaniesController extends Controller
* @since [v1.8] * @since [v1.8]
* @param Request $request * @param Request $request
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function store(ImageUploadRequest $request) public function store(ImageUploadRequest $request)
{ {
@ -63,16 +62,7 @@ final class CompaniesController extends Controller
$company = new Company; $company = new Company;
$company->name = $request->input('name'); $company->name = $request->input('name');
if ($request->file('image')) { $company = $request->handleImages($company);
$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;
}
if ($company->save()) { if ($company->save()) {
return redirect()->route('companies.index') return redirect()->route('companies.index')
@ -83,12 +73,13 @@ final class CompaniesController extends Controller
/** /**
* Return form to edit existing company. * Return form to edit existing company.
* *
* @author [Abdullah Alansari] [<ahimta@gmail.com>] * @author [Abdullah Alansari] [<ahimta@gmail.com>]
* @since [v1.8] * @since [v1.8]
* @param int $companyId * @param int $companyId
* @return \Illuminate\Contracts\View\View * @return \Illuminate\Contracts\View\View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function edit($companyId) public function edit($companyId)
{ {
@ -107,9 +98,10 @@ final class CompaniesController extends Controller
* *
* @author [Abdullah Alansari] [<ahimta@gmail.com>] * @author [Abdullah Alansari] [<ahimta@gmail.com>]
* @since [v1.8] * @since [v1.8]
* @param Request $request * @param ImageUploadRequest $request
* @param int $companyId * @param int $companyId
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function update(ImageUploadRequest $request, $companyId) public function update(ImageUploadRequest $request, $companyId)
{ {
@ -121,37 +113,7 @@ final class CompaniesController extends Controller
$company->name = $request->input('name'); $company->name = $request->input('name');
$old_image = $company->image; $company = $request->handleImages($company);
// 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);
}
}
if ($company->save()) { if ($company->save()) {
return redirect()->route('companies.index') return redirect()->route('companies.index')
@ -162,38 +124,38 @@ final class CompaniesController extends Controller
} }
/** /**
* Delete company * Delete company
* *
* @author [Abdullah Alansari] [<ahimta@gmail.com>] * @author [Abdullah Alansari] [<ahimta@gmail.com>]
* @since [v1.8] * @since [v1.8]
* @param int $companyId * @param int $companyId
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function destroy($companyId) public function destroy($companyId)
{ {
$this->authorize('delete', $company);
if (is_null($company = Company::find($companyId))) { if (is_null($company = Company::find($companyId))) {
return redirect()->route('companies.index') return redirect()->route('companies.index')
->with('error', trans('admin/companies/message.not_found')); ->with('error', trans('admin/companies/message.not_found'));
} else { }
$this->authorize('delete', $company); try {
$company->delete();
try { return redirect()->route('companies.index')
$company->delete(); ->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') return redirect()->route('companies.index')
->with('success', trans('admin/companies/message.delete.success')); ->with('error', trans('admin/companies/message.assoc_users'));
} 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;
}
} }
throw $exception;
} }
} }
@ -203,9 +165,8 @@ final class CompaniesController extends Controller
if (is_null($company = Company::find($id))) { if (is_null($company = Company::find($id))) {
return redirect()->route('companies.index') return redirect()->route('companies.index')
->with('error', trans('admin/companies/message.not_found')); ->with('error', trans('admin/companies/message.not_found'));
} else {
return view('companies/view')->with('company',$company);
} }
return view('companies/view')->with('company',$company);
} }
} }

View file

@ -0,0 +1,111 @@
<?php
namespace App\Http\Controllers\Components;
use App\Http\Controllers\Controller;
use App\Models\Actionlog;
use App\Models\Asset;
use App\Models\Component;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
class ComponentCheckinController extends Controller
{
/**
* Returns a view that allows the checkin of a component from an asset.
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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'));
}
}

View file

@ -0,0 +1,92 @@
<?php
namespace App\Http\Controllers\Components;
use App\Http\Controllers\Controller;
use App\Models\Asset;
use App\Models\Component;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Validator;
class ComponentCheckoutController extends Controller
{
/**
* Returns a view that allows the checkout of a component to an asset.
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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'));
}
}

View file

@ -0,0 +1,188 @@
<?php
namespace App\Http\Controllers\Components;
use App\Http\Controllers\Controller;
use App\Http\Requests\ImageUploadRequest;
use App\Models\Company;
use App\Models\Component;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Input;
/**
* This class controls all actions related to Components for
* the Snipe-IT Asset Management application.
*
* @version v1.0
*/
class ComponentsController extends Controller
{
/**
* Returns a view that invokes the ajax tables which actually contains
* the content for the components listing, which is generated in getDatatable.
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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'));
}
}

View file

@ -1,397 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Helpers\Helper;
use App\Http\Requests\ImageUploadRequest;
use App\Models\Actionlog;
use App\Models\Company;
use App\Models\Component;
use App\Models\CustomField;
use App\Models\Setting;
use App\Models\User;
use App\Models\Asset;
use Auth;
use Config;
use DB;
use Input;
use Lang;
use Mail;
use Redirect;
use Slack;
use Str;
use View;
use Validator;
use Illuminate\Http\Request;
use Gate;
use Image;
/**
* This class controls all actions related to Components for
* the Snipe-IT Asset Management application.
*
* @version v1.0
*/
class ComponentsController extends Controller
{
/**
* Returns a view that invokes the ajax tables which actually contains
* the content for the components listing, which is generated in getDatatable.
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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'));
}
}

View file

@ -0,0 +1,76 @@
<?php
namespace App\Http\Controllers\Consumables;
use App\Models\Consumable;
use App\Models\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Input;
class ConsumableCheckoutController extends Controller
{
/**
* Return a view to checkout a consumable to a user.
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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'));
}
}

View file

@ -0,0 +1,197 @@
<?php
namespace App\Http\Controllers\Consumables;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Http\Requests\ImageUploadRequest;
use App\Models\Company;
use App\Models\Consumable;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Input;
/**
* This controller handles all actions related to Consumables for
* the Snipe-IT Asset Management application.
*
* @version v1.0
*/
class ConsumablesController extends Controller
{
/**
* Return a view to display component information.
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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'));
}
}

View file

@ -1,286 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Helpers\Helper;
use App\Models\Company;
use App\Models\Consumable;
use App\Models\Setting;
use App\Models\User;
use Auth;
use Config;
use DB;
use Input;
use Lang;
use Redirect;
use Slack;
use Str;
use View;
use Gate;
use Image;
use App\Http\Requests\ImageUploadRequest;
/**
* This controller handles all actions related to Consumables for
* the Snipe-IT Asset Management application.
*
* @version v1.0
*/
class ConsumablesController extends Controller
{
/**
* Return a view to display component information.
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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'));
}
}

View file

@ -2,18 +2,12 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Http\Requests\CustomFieldRequest; use App\Http\Requests\CustomFieldRequest;
use View;
use App\Models\CustomFieldset; use App\Models\CustomFieldset;
use App\Models\CustomField; use App\Models\CustomField;
use Input; use Illuminate\Support\Facades\Input;
use Validator;
use Redirect; use Redirect;
use App\Models\AssetModel; use Illuminate\Support\Facades\Auth;
use Lang;
use Auth;
use Illuminate\Http\Request;
use App\Helpers\Helper;
use Log;
/** /**
* This controller handles all actions related to Custom Asset Fields for * 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. * Returns a view with a listing of custom fields.
* *
* @author [Brady Wetherington] [<uberbrady@gmail.com>] * @author [Brady Wetherington] [<uberbrady@gmail.com>]
* @since [v1.8] * @since [v1.8]
* @return View * @return \Illuminate\Support\Facades\View
*/ * @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function index() public function index()
{ {
$this->authorize('view', CustomField::class); $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. * Returns a view with a form to create a new custom field.
* *
* @see CustomFieldsController::storeField() * @see CustomFieldsController::storeField()
* @author [Brady Wetherington] [<uberbrady@gmail.com>] * @author [Brady Wetherington] [<uberbrady@gmail.com>]
* @since [v1.8] * @since [v1.8]
* @return View * @return \Illuminate\Support\Facades\View
*/ * @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function create() public function create()
{ {
$this->authorize('create', CustomField::class); $this->authorize('create', CustomField::class);
@ -65,13 +58,14 @@ class CustomFieldsController extends Controller
/** /**
* Validates and stores a new custom field. * Validates and stores a new custom field.
* *
* @see CustomFieldsController::createField() * @see CustomFieldsController::createField()
* @author [Brady Wetherington] [<uberbrady@gmail.com>] * @author [Brady Wetherington] [<uberbrady@gmail.com>]
* @since [v1.8] * @since [v1.8]
* @return Redirect * @return Redirect
*/ * @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function store(CustomFieldRequest $request) public function store(CustomFieldRequest $request)
{ {
$this->authorize('create', CustomField::class); $this->authorize('create', CustomField::class);
@ -83,7 +77,7 @@ class CustomFieldsController extends Controller
"field_values" => $request->get("field_values"), "field_values" => $request->get("field_values"),
"field_encrypted" => $request->get("field_encrypted", 0), "field_encrypted" => $request->get("field_encrypted", 0),
"show_in_email" => $request->get("show_in_email", 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()) { if ($field->save()) {
return redirect()->route("fields.index")->with("success", trans('admin/custom_fields/message.field.create.success')); 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] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v3.0] * @since [v3.0]
* @return Redirect * @return Redirect
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function deleteFieldFromFieldset($field_id, $fieldset_id) public function deleteFieldFromFieldset($field_id, $fieldset_id)
{ {
@ -116,19 +113,21 @@ class CustomFieldsController extends Controller
$this->authorize('update', $field); $this->authorize('update', $field);
if ($field->fieldset()->detach($fieldset_id)) { 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"]); return redirect()->back()->withErrors(['message' => "Field is in-use"]);
} }
/** /**
* Delete a custom field. * Delete a custom field.
* *
* @author [Brady Wetherington] [<uberbrady@gmail.com>] * @author [Brady Wetherington] [<uberbrady@gmail.com>]
* @since [v1.8] * @since [v1.8]
* @return Redirect * @return Redirect
*/ * @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function destroy($field_id) public function destroy($field_id)
{ {
$field = CustomField::find($field_id); $field = CustomField::find($field_id);
@ -137,22 +136,22 @@ class CustomFieldsController extends Controller
if ($field->fieldset->count()>0) { if ($field->fieldset->count()>0) {
return redirect()->back()->withErrors(['message' => "Field is in-use"]); 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 * Return a view to edit a custom field
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $id * @param int $id
* @since [v4.0] * @since [v4.0]
* @return View * @return \Illuminate\Support\Facades\View
*/ * @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function edit($id) public function edit($id)
{ {
$field = CustomField::find($id); $field = CustomField::find($id);
@ -164,15 +163,16 @@ class CustomFieldsController extends Controller
/** /**
* Store the updated field * Store the updated field
* *
* @todo Allow encrypting/decrypting if encryption status changes * @todo Allow encrypting/decrypting if encryption status changes
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $id * @param int $id
* @since [v4.0] * @since [v4.0]
* @return Redirect * @return Redirect
*/ * @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function update(CustomFieldRequest $request, $id) public function update(CustomFieldRequest $request, $id)
{ {
$field = CustomField::find($id); $field = CustomField::find($id);
@ -182,7 +182,7 @@ class CustomFieldsController extends Controller
$field->name = e($request->get("name")); $field->name = e($request->get("name"));
$field->element = e($request->get("element")); $field->element = e($request->get("element"));
$field->field_values = e($request->get("field_values")); $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->help_text = $request->get("help_text");
$field->show_in_email = $request->get("show_in_email", 0); $field->show_in_email = $request->get("show_in_email", 0);

View file

@ -1,17 +1,14 @@
<?php <?php
namespace App\Http\Controllers; namespace App\Http\Controllers;
use View;
use App\Models\CustomFieldset; use App\Models\CustomFieldset;
use App\Models\CustomField; use App\Models\CustomField;
use Input; use Illuminate\Support\Facades\Input;
use Validator; use Illuminate\Support\Facades\Validator;
use Redirect; use Redirect;
use App\Models\AssetModel; use App\Models\AssetModel;
use Lang; use Illuminate\Support\Facades\Auth;
use Auth;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Log;
/** /**
* This controller handles all actions related to Custom Asset Fields for * This controller handles all actions related to Custom Asset Fields for
@ -26,17 +23,19 @@ use Log;
class CustomFieldsetsController extends Controller class CustomFieldsetsController extends Controller
{ {
/** /**
* Validates and stores a new custom field. * Validates and stores a new custom field.
* *
* @author [Brady Wetherington] [<uberbrady@gmail.com>] * @author [Brady Wetherington] [<uberbrady@gmail.com>]
* @param int $id * @param int $id
* @since [v1.8] * @return \Illuminate\Support\Facades\View
* @return View * @throws \Illuminate\Auth\Access\AuthorizationException
*/ * @since [v1.8]
*/
public function show($id) 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); $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. * Returns a view with a form for creating a new custom fieldset.
* *
* @author [Brady Wetherington] [<uberbrady@gmail.com>] * @author [Brady Wetherington] [<uberbrady@gmail.com>]
* @since [v1.8] * @since [v1.8]
* @return View * @return \Illuminate\Support\Facades\View
*/ * @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function create() public function create()
{ {
$this->authorize('create', CustomFieldset::class); $this->authorize('create', CustomFieldset::class);
@ -77,29 +81,30 @@ class CustomFieldsetsController extends Controller
/** /**
* Validates and stores a new custom fieldset. * Validates and stores a new custom fieldset.
* *
* @author [Brady Wetherington] [<uberbrady@gmail.com>] * @author [Brady Wetherington] [<uberbrady@gmail.com>]
* @since [v1.8] * @since [v1.8]
* @return Redirect * @param Request $request
*/ * @return Redirect
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function store(Request $request) public function store(Request $request)
{ {
$this->authorize('create', CustomFieldset::class); $this->authorize('create', CustomFieldset::class);
$cfset = new CustomFieldset( $cfset = new CustomFieldset([
[
"name" => e($request->get("name")), "name" => e($request->get("name")),
"user_id" => Auth::user()->id] "user_id" => Auth::user()->id
); ]);
$validator = Validator::make(Input::all(), $cfset->rules); $validator = Validator::make(Input::all(), $cfset->rules);
if ($validator->passes()) { if ($validator->passes()) {
$cfset->save(); $cfset->save();
return redirect()->route("fieldsets.show", [$cfset->id])->with('success', trans('admin/custom_fields/message.fieldset.create.success')); return redirect()->route("fieldsets.show", [$cfset->id])
} else { ->with('success', trans('admin/custom_fields/message.fieldset.create.success'));
return redirect()->back()->withInput()->withErrors($validator);
} }
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. * Validates a custom fieldset and then deletes if it has no models associated.
* *
* @author [Brady Wetherington] [<uberbrady@gmail.com>] * @author [Brady Wetherington] [<uberbrady@gmail.com>]
* @param int $id * @param int $id
* @since [v1.8] * @since [v1.8]
* @return View * @return View
*/ * @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function destroy($id) public function destroy($id)
{ {
$fieldset = CustomFieldset::find($id); $fieldset = CustomFieldset::find($id);
@ -154,9 +160,8 @@ class CustomFieldsetsController extends Controller
if ($models->count() == 0) { if ($models->count() == 0) {
$fieldset->delete(); $fieldset->delete();
return redirect()->route("fields.index")->with("success", trans('admin/custom_fields/message.fieldset.delete.success')); 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')); 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. * Associate the custom field with a custom fieldset.
* *
* @author [Brady Wetherington] [<uberbrady@gmail.com>] * @author [Brady Wetherington] [<uberbrady@gmail.com>]
* @since [v1.8] * @since [v1.8]
* @return View * @return View
*/ * @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function associate($id) public function associate($id)
{ {

View file

@ -4,8 +4,7 @@ namespace App\Http\Controllers;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Models\Department; use App\Models\Department;
use App\Helpers\Helper; use Illuminate\Support\Facades\Auth;
use Auth;
use Image; use Image;
use App\Http\Requests\ImageUploadRequest; use App\Http\Requests\ImageUploadRequest;
@ -24,7 +23,9 @@ class DepartmentsController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @see AssetController::getDatatable() method that generates the JSON response * @see AssetController::getDatatable() method that generates the JSON response
* @since [v4.0] * @since [v4.0]
* @return View * @param Request $request
* @return \Illuminate\Support\Facades\View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function index(Request $request) public function index(Request $request)
{ {
@ -42,27 +43,19 @@ class DepartmentsController extends Controller
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v4.0] * @since [v4.0]
* @param \Illuminate\Http\Request $request * @param ImageUploadRequest $request
* @return \Illuminate\Http\Response * @return \Illuminate\Http\Response
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function store(ImageUploadRequest $request) public function store(ImageUploadRequest $request)
{ {
$this->authorize('create', Department::class); $this->authorize('create', Department::class);
$department = new Department; $department = new Department;
$department->fill($request->all()); $department->fill($request->all());
$department->user_id = Auth::user()->id; $department->user_id = Auth::id();
$department->manager_id = ($request->has('manager_id' ) ? $request->input('manager_id') : null); $department->manager_id = $request->input('manager_id', null);
if ($request->file('image')) { $department = $request->handleImages($department);
$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;
}
if ($department->save()) { if ($department->save()) {
return redirect()->route("departments.index")->with('success', trans('admin/departments/message.create.success')); return redirect()->route("departments.index")->with('success', trans('admin/departments/message.create.success'));
@ -78,6 +71,7 @@ class DepartmentsController extends Controller
* @param int $id * @param int $id
* @since [v4.0] * @since [v4.0]
* @return \Illuminate\Contracts\View\View * @return \Illuminate\Contracts\View\View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function show($id) public function show($id)
{ {
@ -88,7 +82,7 @@ class DepartmentsController extends Controller
if (isset($department->id)) { if (isset($department->id)) {
return view('departments/view', compact('department')); 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 * @see DepartmentsController::postCreate() method that validates and stores the data
* @since [v4.0] * @since [v4.0]
* @return \Illuminate\Contracts\View\View * @return \Illuminate\Contracts\View\View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function create() public function create()
{ {
@ -115,6 +110,7 @@ class DepartmentsController extends Controller
* @param int $locationId * @param int $locationId
* @since [v4.0] * @since [v4.0]
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function destroy($id) 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] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @see LocationsController::postCreate() method that validates and stores * @see LocationsController::postCreate() method that validates and stores
* @param int $locationId * @param int $departmentId
* @since [v1.0] * @since [v1.0]
* @return \Illuminate\Contracts\View\View * @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')); 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->fill($request->all());
$department->manager_id = ($request->has('manager_id' ) ? $request->input('manager_id') : null); $department->manager_id = ($request->has('manager_id' ) ? $request->input('manager_id') : null);
$old_image = $department->image; $department = $request->handleImages($department);
// 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);
}
}
if ($department->save()) { if ($department->save()) {
return redirect()->route("departments.index")->with('success', trans('admin/departments/message.update.success')); return redirect()->route("departments.index")->with('success', trans('admin/departments/message.update.success'));

View file

@ -1,15 +1,8 @@
<?php <?php
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Helpers\Helper;
use Lang;
use App\Models\Depreciation; use App\Models\Depreciation;
use Redirect; use Illuminate\Support\Facades\Auth;
use App\Models\Setting;
use DB;
use Str;
use View;
use Auth;
use Illuminate\Http\Request; use Illuminate\Http\Request;
/** /**
@ -21,13 +14,14 @@ use Illuminate\Http\Request;
class DepreciationsController extends Controller class DepreciationsController extends Controller
{ {
/** /**
* Returns a view that invokes the ajax tables which actually contains * Returns a view that invokes the ajax tables which actually contains
* the content for the depreciation listing, which is generated in getDatatable. * the content for the depreciation listing, which is generated in getDatatable.
* *
* @author [A. Gianotto] [<snipe@snipe.net] * @author [A. Gianotto] [<snipe@snipe.net]
* @see DepreciationsController::getDatatable() method that generates the JSON response * @see DepreciationsController::getDatatable() method that generates the JSON response
* @since [v1.0] * @since [v1.0]
* @return \Illuminate\Contracts\View\View * @return \Illuminate\Contracts\View\View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function index() public function index()
{ {
@ -39,12 +33,13 @@ class DepreciationsController extends Controller
/** /**
* Returns a view that displays a form to create a new depreciation. * Returns a view that displays a form to create a new depreciation.
* *
* @author [A. Gianotto] [<snipe@snipe.net] * @author [A. Gianotto] [<snipe@snipe.net]
* @see DepreciationsController::postCreate() * @see DepreciationsController::postCreate()
* @since [v1.0] * @since [v1.0]
* @return \Illuminate\Contracts\View\View * @return \Illuminate\Contracts\View\View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function create() public function create()
{ {
@ -63,6 +58,7 @@ class DepreciationsController extends Controller
* @since [v1.0] * @since [v1.0]
* @param Request $request * @param Request $request
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function store(Request $request) public function store(Request $request)
{ {
@ -84,13 +80,14 @@ class DepreciationsController extends Controller
} }
/** /**
* Returns a view that displays a form to update a depreciation. * Returns a view that displays a form to update a depreciation.
* *
* @author [A. Gianotto] [<snipe@snipe.net] * @author [A. Gianotto] [<snipe@snipe.net]
* @see DepreciationsController::postEdit() * @see DepreciationsController::postEdit()
* @param int $depreciationId * @param int $depreciationId
* @since [v1.0] * @since [v1.0]
* @return \Illuminate\Contracts\View\View * @return \Illuminate\Contracts\View\View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function edit($depreciationId = null) public function edit($depreciationId = null)
{ {
@ -115,6 +112,7 @@ class DepreciationsController extends Controller
* @param int $depreciationId * @param int $depreciationId
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
* @since [v1.0] * @since [v1.0]
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function update(Request $request, $depreciationId = null) public function update(Request $request, $depreciationId = null)
{ {
@ -147,6 +145,7 @@ class DepreciationsController extends Controller
* @since [v1.0] * @since [v1.0]
* @param integer $depreciationId * @param integer $depreciationId
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function destroy($depreciationId) public function destroy($depreciationId)
{ {
@ -175,6 +174,7 @@ class DepreciationsController extends Controller
* @param int $depreciationId * @param int $depreciationId
* @since [v1.0] * @since [v1.0]
* @return \Illuminate\Contracts\View\View * @return \Illuminate\Contracts\View\View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function show($id) public function show($id)
{ {

View file

@ -1,13 +1,7 @@
<?php <?php
namespace App\Http\Controllers; namespace App\Http\Controllers;
use Config; use Illuminate\Support\Facades\Input;
use Input;
use Lang;
use Redirect;
use App\Models\Setting;
use Validator;
use View;
use App\Models\Group; use App\Models\Group;
use App\Helpers\Helper; use App\Helpers\Helper;
@ -109,7 +103,6 @@ class GroupsController extends Controller
*/ */
public function update($id = null) public function update($id = null)
{ {
$permissions = config('permissions');
if (!$group = Group::find($id)) { if (!$group = Group::find($id)) {
return redirect()->route('groups')->with('error', trans('admin/groups/message.group_not_found', compact('id'))); return redirect()->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. * Validates and deletes the User Group.
* *
* @author [A. Gianotto] [<snipe@snipe.net] * @author [A. Gianotto] [<snipe@snipe.net]
* @see GroupsController::getEdit() * @see GroupsController::getEdit()
* @param int $id * @param int $id
* @since [v1.0] * @since [v1.0]
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
* @throws \Exception
*/ */
public function destroy($id = null) public function destroy($id = null)
{ {
@ -152,9 +146,9 @@ class GroupsController extends Controller
* the content for the group detail page. * the content for the group detail page.
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $locationId * @param $id
* @since [v4.0.11]
* @return \Illuminate\Contracts\View\View * @return \Illuminate\Contracts\View\View
* @since [v4.0.11]
*/ */
public function show($id) public function show($id)
{ {

View file

@ -4,17 +4,19 @@ namespace App\Http\Controllers;
use App\Http\Transformers\ImportsTransformer; use App\Http\Transformers\ImportsTransformer;
use App\Models\Import; use App\Models\Import;
use Illuminate\Http\Request;
use App\Models\Asset; use App\Models\Asset;
class ImportsController extends Controller class ImportsController extends Controller
{ {
/**
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function index() public function index()
{ {
$this->authorize('create', Asset::class); $this->authorize('create', Asset::class);
$imports = Import::latest()->get(); $imports = (new ImportsTransformer)->transformImports(Import::latest()->get());
$imports = (new ImportsTransformer)->transformImports($imports);
return view('importer/import')->with('imports', $imports); return view('importer/import')->with('imports', $imports);
} }
} }

View file

@ -0,0 +1,102 @@
<?php
namespace App\Http\Controllers\Licenses;
use App\Models\Asset;
use App\Models\License;
use App\Models\LicenseSeat;
use App\Models\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Validator;
class LicenseCheckinController extends Controller
{
/**
* Makes the form view to check a license seat back into inventory.
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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'));
}
}

View file

@ -0,0 +1,110 @@
<?php
namespace App\Http\Controllers\Licenses;
use App\Http\Requests\LicenseCheckoutRequest;
use App\Models\Asset;
use App\Models\License;
use App\Models\LicenseSeat;
use App\Models\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Validator;
class LicenseCheckoutController extends Controller
{
/**
* 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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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;
}
}

View file

@ -0,0 +1,146 @@
<?php
namespace App\Http\Controllers\Licenses;
use App\Http\Requests\AssetFileRequest;
use App\Models\Actionlog;
use App\Models\License;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
class LicenseFilesController extends Controller
{
/**
* Validates and stores files associated with a license.
*
* @todo Switch to using the AssetFileRequest form request validator.
* @author [A. Gianotto] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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'));
}
}

View file

@ -0,0 +1,273 @@
<?php
namespace App\Http\Controllers\Licenses;
use App\Http\Controllers\Controller;
use App\Models\License;
use Illuminate\Support\Facades\DB;
use App\Models\Company;
use App\Helpers\Helper;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
/**
* This controller handles all actions related to Licenses for
* the Snipe-IT Asset Management application.
*
* @version v1.0
*/
class LicensesController extends Controller
{
/**
* Returns a view that invokes the ajax tables which actually contains
* the content for the licenses listing, which is generated in getDatatable.
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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);
}
}

View file

@ -1,649 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Http\Requests\AssetFileRequest;
use Assets;
use Illuminate\Support\Facades\Session;
use Input;
use Lang;
use App\Models\License;
use App\Models\Asset;
use App\Models\User;
use App\Models\Actionlog;
use DB;
use App\Models\LicenseSeat;
use App\Models\Company;
use Validator;
use View;
use Response;
use Slack;
use Config;
use App\Helpers\Helper;
use Auth;
use Gate;
use Illuminate\Http\Request;
/**
* This controller handles all actions related to Licenses for
* the Snipe-IT Asset Management application.
*
* @version v1.0
*/
class LicensesController extends Controller
{
/**
* Returns a view that invokes the ajax tables which actually contains
* the content for the licenses listing, which is generated in getDatatable.
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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);
}
}

View file

@ -1,21 +1,9 @@
<?php <?php
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Helpers\Helper;
use Input;
use Lang;
use App\Models\Location; use App\Models\Location;
use phpDocumentor\Reflection\Types\Array_; use Illuminate\Support\Facades\Auth;
use Redirect;
use App\Models\Setting;
use App\Models\User;
use App\Models\Asset;
use DB;
use Str;
use Validator;
use View;
use Auth;
use Symfony\Component\HttpFoundation\JsonResponse;
use Image; use Image;
use App\Http\Requests\ImageUploadRequest; use App\Http\Requests\ImageUploadRequest;
@ -29,13 +17,14 @@ class LocationsController extends Controller
{ {
/** /**
* Returns a view that invokes the ajax tables which actually contains * Returns a view that invokes the ajax tables which actually contains
* the content for the locations listing, which is generated in getDatatable. * the content for the locations listing, which is generated in getDatatable.
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @see LocationsController::getDatatable() method that generates the JSON response * @see LocationsController::getDatatable() method that generates the JSON response
* @since [v1.0] * @since [v1.0]
* @return \Illuminate\Contracts\View\View * @return \Illuminate\Contracts\View\View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function index() public function index()
{ {
@ -49,12 +38,13 @@ class LocationsController extends Controller
/** /**
* Returns a form view used to create a new location. * Returns a form view used to create a new location.
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @see LocationsController::postCreate() method that validates and stores the data * @see LocationsController::postCreate() method that validates and stores the data
* @since [v1.0] * @since [v1.0]
* @return \Illuminate\Contracts\View\View * @return \Illuminate\Contracts\View\View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function create() public function create()
{ {
@ -72,13 +62,15 @@ class LocationsController extends Controller
/** /**
* Validates and stores a new location. * Validates and stores a new location.
* *
* @todo Check if a Form Request would work better here. * @todo Check if a Form Request would work better here.
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @see LocationsController::getCreate() method that makes the form * @see LocationsController::getCreate() method that makes the form
* @since [v1.0] * @since [v1.0]
* @return \Illuminate\Http\RedirectResponse * @param ImageUploadRequest $request
* @return \Illuminate\Http\RedirectResponse
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function store(ImageUploadRequest $request) public function store(ImageUploadRequest $request)
{ {
@ -97,16 +89,7 @@ class LocationsController extends Controller
$location->manager_id = $request->input('manager_id'); $location->manager_id = $request->input('manager_id');
$location->user_id = Auth::id(); $location->user_id = Auth::id();
if ($request->file('image')) { $location = $request->handleImages($location);
$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;
}
if ($location->save()) { if ($location->save()) {
return redirect()->route("locations.index")->with('success', trans('admin/locations/message.create.success')); 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. * Makes a form view to edit location information.
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @see LocationsController::postCreate() method that validates and stores * @see LocationsController::postCreate() method that validates and stores
* @param int $locationId * @param int $locationId
* @since [v1.0] * @since [v1.0]
* @return \Illuminate\Contracts\View\View * @return \Illuminate\Contracts\View\View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function edit($locationId = null) public function edit($locationId = null)
{ {
@ -144,13 +128,15 @@ class LocationsController extends Controller
/** /**
* Validates and stores updated location data from edit form. * Validates and stores updated location data from edit form.
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @see LocationsController::getEdit() method that makes the form view * @see LocationsController::getEdit() method that makes the form view
* @param int $locationId * @param ImageUploadRequest $request
* @since [v1.0] * @param int $locationId
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
* @throws \Illuminate\Auth\Access\AuthorizationException
* @since [v1.0]
*/ */
public function update(ImageUploadRequest $request, $locationId = null) public function update(ImageUploadRequest $request, $locationId = null)
{ {
@ -173,36 +159,7 @@ class LocationsController extends Controller
$location->ldap_ou = $request->input('ldap_ou'); $location->ldap_ou = $request->input('ldap_ou');
$location->manager_id = $request->input('manager_id'); $location->manager_id = $request->input('manager_id');
$old_image = $location->image; $location = $request->handleImages($location);
// 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);
}
}
if ($location->save()) { if ($location->save()) {
@ -212,12 +169,13 @@ class LocationsController extends Controller
} }
/** /**
* Validates and deletes selected location. * Validates and deletes selected location.
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $locationId * @param int $locationId
* @since [v1.0] * @since [v1.0]
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function destroy($locationId) 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')); 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')); 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')); 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')); 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')); 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. * the content for the locations detail page.
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $locationId * @param int $id
* @since [v1.0] * @since [v1.0]
* @return \Illuminate\Contracts\View\View * @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)) { if (isset($location->id)) {
return view('locations/view', compact('location')); 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'));
} }
} }

View file

@ -1,18 +1,10 @@
<?php <?php
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Helpers\Helper;
use App\Http\Requests\ImageUploadRequest; use App\Http\Requests\ImageUploadRequest;
use App\Models\CustomField;
use App\Models\Manufacturer; use App\Models\Manufacturer;
use Auth; use Illuminate\Support\Facades\Auth;
use Exception;
use Gate;
use Input;
use Lang;
use Redirect; use Redirect;
use Str;
use View;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Image; use Image;
@ -25,13 +17,14 @@ use Image;
class ManufacturersController extends Controller class ManufacturersController extends Controller
{ {
/** /**
* Returns a view that invokes the ajax tables which actually contains * Returns a view that invokes the ajax tables which actually contains
* the content for the manufacturers listing, which is generated in getDatatable. * the content for the manufacturers listing, which is generated in getDatatable.
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @see Api\ManufacturersController::index() method that generates the JSON response * @see Api\ManufacturersController::index() method that generates the JSON response
* @since [v1.0] * @since [v1.0]
* @return \Illuminate\Contracts\View\View * @return \Illuminate\Contracts\View\View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function index() public function index()
{ {
@ -41,12 +34,13 @@ class ManufacturersController extends Controller
/** /**
* Returns a view that displays a form to create a new manufacturer. * Returns a view that displays a form to create a new manufacturer.
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @see ManufacturersController::store() * @see ManufacturersController::store()
* @since [v1.0] * @since [v1.0]
* @return \Illuminate\Contracts\View\View * @return \Illuminate\Contracts\View\View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function create() public function create()
{ {
@ -61,32 +55,24 @@ class ManufacturersController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @see ManufacturersController::create() * @see ManufacturersController::create()
* @since [v1.0] * @since [v1.0]
* @param Request $request * @param ImageUploadRequest $request
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function store(ImageUploadRequest $request) public function store(ImageUploadRequest $request)
{ {
$this->authorize('create', Manufacturer::class); $this->authorize('create', Manufacturer::class);
$manufacturer = new Manufacturer; $manufacturer = new Manufacturer;
$manufacturer->name = $request->input('name'); $manufacturer->name = $request->input('name');
$manufacturer->user_id = Auth::user()->id; $manufacturer->user_id = Auth::id();
$manufacturer->url = $request->input('url'); $manufacturer->url = $request->input('url');
$manufacturer->support_url = $request->input('support_url'); $manufacturer->support_url = $request->input('support_url');
$manufacturer->support_phone = $request->input('support_phone'); $manufacturer->support_phone = $request->input('support_phone');
$manufacturer->support_email = $request->input('support_email'); $manufacturer->support_email = $request->input('support_email');
if ($request->file('image')) { $manufacturer = $request->handleImages($manufacturer);
$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;
}
@ -97,19 +83,20 @@ class ManufacturersController extends Controller
} }
/** /**
* Returns a view that displays a form to edit a manufacturer. * Returns a view that displays a form to edit a manufacturer.
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @see ManufacturersController::update() * @see ManufacturersController::update()
* @param int $manufacturerId * @param int $manufacturerId
* @since [v1.0] * @since [v1.0]
* @return \Illuminate\Contracts\View\View * @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); $this->authorize('edit', Manufacturer::class);
// Check if the manufacturer exists // 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')); return redirect()->route('manufacturers.index')->with('error', trans('admin/manufacturers/message.does_not_exist'));
} }
// Show the page // Show the page
@ -126,6 +113,7 @@ class ManufacturersController extends Controller
* @param int $manufacturerId * @param int $manufacturerId
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
* @since [v1.0] * @since [v1.0]
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function update(ImageUploadRequest $request, $manufacturerId = null) public function update(ImageUploadRequest $request, $manufacturerId = null)
{ {
@ -137,42 +125,13 @@ class ManufacturersController extends Controller
} }
// Save the data // Save the data
$manufacturer->name = $request->input('name'); $manufacturer->name = $request->input('name');
$manufacturer->url = $request->input('url'); $manufacturer->url = $request->input('url');
$manufacturer->support_url = $request->input('support_url'); $manufacturer->support_url = $request->input('support_url');
$manufacturer->support_phone = $request->input('support_phone'); $manufacturer->support_phone = $request->input('support_phone');
$manufacturer->support_email = $request->input('support_email'); $manufacturer->support_email = $request->input('support_email');
$old_image = $manufacturer->image; $manufacturer = $request->handleImages($manufacturer);
// 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);
}
}
if ($manufacturer->save()) { if ($manufacturer->save()) {
@ -182,12 +141,13 @@ class ManufacturersController extends Controller
} }
/** /**
* Deletes a manufacturer. * Deletes a manufacturer.
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $manufacturerId * @param int $manufacturerId
* @since [v1.0] * @since [v1.0]
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function destroy($manufacturerId) public function destroy($manufacturerId)
{ {
@ -219,14 +179,15 @@ class ManufacturersController extends Controller
} }
/** /**
* Returns a view that invokes the ajax tables which actually contains * Returns a view that invokes the ajax tables which actually contains
* the content for the manufacturers detail listing, which is generated via API. * 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. * This data contains a listing of all assets that belong to that manufacturer.
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $manufacturerId * @param int $manufacturerId
* @since [v1.0] * @since [v1.0]
* @return \Illuminate\Contracts\View\View * @return \Illuminate\Contracts\View\View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function show($manufacturerId = null) public function show($manufacturerId = null)
{ {
@ -249,6 +210,7 @@ class ManufacturersController extends Controller
* @since [v4.1.15] * @since [v4.1.15]
* @param int $manufacturers_id * @param int $manufacturers_id
* @return Redirect * @return Redirect
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function restore($manufacturers_id) public function restore($manufacturers_id)
{ {

View file

@ -1,21 +1,12 @@
<?php <?php
namespace App\Http\Controllers; namespace App\Http\Controllers;
use Input; use Illuminate\Support\Facades\Input;
use Lang;
use App\Models\Statuslabel; use App\Models\Statuslabel;
use App\Models\Asset;
use Redirect;
use DB;
use App\Models\Setting;
use Str;
use View;
use App\Helpers\Helper; use App\Helpers\Helper;
use Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
/** /**
* This controller handles all actions related to Status Labels for * This controller handles all actions related to Status Labels for
* the Snipe-IT Asset Management application. * the Snipe-IT Asset Management application.
@ -28,6 +19,7 @@ class StatuslabelsController extends Controller
* Show a list of all the statuslabels. * Show a list of all the statuslabels.
* *
* @return \Illuminate\Contracts\View\View * @return \Illuminate\Contracts\View\View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function index() public function index()
@ -43,25 +35,25 @@ class StatuslabelsController extends Controller
return view('statuslabels.view')->with('statuslabel', $statuslabel); return view('statuslabels.view')->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. * Statuslabel create.
* *
* @return \Illuminate\Contracts\View\View * @return \Illuminate\Contracts\View\View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function create() public function create()
{ {
// Show the page // Show the page
$this->authorize('create', Statuslabel::class); $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 * @param Request $request
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function store(Request $request) public function store(Request $request)
{ {
@ -106,8 +99,9 @@ class StatuslabelsController extends Controller
/** /**
* Statuslabel update. * Statuslabel update.
* *
* @param int $statuslabelId * @param int $statuslabelId
* @return \Illuminate\Contracts\View\View * @return \Illuminate\Contracts\View\View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function edit($statuslabelId = null) public function edit($statuslabelId = null)
{ {
@ -129,8 +123,9 @@ class StatuslabelsController extends Controller
/** /**
* Statuslabel update form processing page. * Statuslabel update form processing page.
* *
* @param int $statuslabelId * @param int $statuslabelId
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function update(Request $request, $statuslabelId = null) public function update(Request $request, $statuslabelId = null)
{ {
@ -169,8 +164,9 @@ class StatuslabelsController extends Controller
/** /**
* Delete the given Statuslabel. * Delete the given Statuslabel.
* *
* @param int $statuslabelId * @param int $statuslabelId
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function destroy($statuslabelId) public function destroy($statuslabelId)
{ {

View file

@ -1,22 +1,12 @@
<?php <?php
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Helpers\Helper;
use Image; use Image;
use App\Models\AssetMaintenance;
use Input;
use Lang;
use App\Models\Supplier; use App\Models\Supplier;
use Redirect; use Illuminate\Support\Facades\Auth;
use App\Models\Setting;
use Str;
use View;
use Auth;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Http\Requests\ImageUploadRequest; use App\Http\Requests\ImageUploadRequest;
use Symfony\Component\HttpFoundation\JsonResponse;
/** /**
* This controller handles all actions related to Suppliers for * This controller handles all actions related to Suppliers for
* the Snipe-IT Asset Management application. * the Snipe-IT Asset Management application.
@ -29,6 +19,7 @@ class SuppliersController extends Controller
* Show a list of all suppliers * Show a list of all suppliers
* *
* @return \Illuminate\Contracts\View\View * @return \Illuminate\Contracts\View\View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function index() public function index()
{ {
@ -45,6 +36,7 @@ class SuppliersController extends Controller
* Supplier create. * Supplier create.
* *
* @return \Illuminate\Contracts\View\View * @return \Illuminate\Contracts\View\View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function create() public function create()
{ {
@ -56,8 +48,9 @@ class SuppliersController extends Controller
/** /**
* Supplier create form processing. * Supplier create form processing.
* *
* @param Request $request * @param ImageUploadRequest $request
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function store(ImageUploadRequest $request) public function store(ImageUploadRequest $request)
{ {
@ -80,16 +73,7 @@ class SuppliersController extends Controller
$supplier->url = $supplier->addhttp(request('url')); $supplier->url = $supplier->addhttp(request('url'));
$supplier->user_id = Auth::id(); $supplier->user_id = Auth::id();
if ($request->file('image')) { $supplier = $request->handleImages($supplier);
$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;
}
if ($supplier->save()) { if ($supplier->save()) {
return redirect()->route('suppliers.index')->with('success', trans('admin/suppliers/message.create.success')); return redirect()->route('suppliers.index')->with('success', trans('admin/suppliers/message.create.success'));
@ -100,8 +84,9 @@ class SuppliersController extends Controller
/** /**
* Supplier update. * Supplier update.
* *
* @param int $supplierId * @param int $supplierId
* @return \Illuminate\Contracts\View\View * @return \Illuminate\Contracts\View\View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function edit($supplierId = null) public function edit($supplierId = null)
{ {
@ -120,8 +105,9 @@ class SuppliersController extends Controller
/** /**
* Supplier update form processing page. * Supplier update form processing page.
* *
* @param int $supplierId * @param int $supplierId
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function update($supplierId = null, ImageUploadRequest $request) public function update($supplierId = null, ImageUploadRequest $request)
{ {
@ -147,37 +133,7 @@ class SuppliersController extends Controller
$supplier->url = $supplier->addhttp(request('url')); $supplier->url = $supplier->addhttp(request('url'));
$supplier->notes = request('notes'); $supplier->notes = request('notes');
$supplier = $request->handleImages($supplier);
$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);
}
}
if ($supplier->save()) { if ($supplier->save()) {
@ -191,8 +147,9 @@ class SuppliersController extends Controller
/** /**
* Delete the given supplier. * Delete the given supplier.
* *
* @param int $supplierId * @param int $supplierId
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function destroy($supplierId) public function destroy($supplierId)
{ {
@ -237,11 +194,8 @@ class SuppliersController extends Controller
if (isset($supplier->id)) { if (isset($supplier->id)) {
return view('suppliers/view', compact('supplier')); 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 // 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'));
} }
} }

View file

@ -0,0 +1,204 @@
<?php
namespace App\Http\Controllers\Users;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Models\Accessory;
use App\Models\Actionlog;
use App\Models\Asset;
use App\Models\Group;
use App\Models\LicenseSeat;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
class BulkUsersController extends Controller
{
/**
* Returns a view that confirms the user's a bulk delete will be applied to.
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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');
}
}
}

View file

@ -0,0 +1,61 @@
<?php
namespace App\Http\Controllers\Users;
use App\Models\Ldap;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Artisan;
class LDAPImportController extends Controller
{
/**
* Return view for LDAP import
*
* @author Aladin Alaily
* @since [v1.8]
* @return \Illuminate\Contracts\View\View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function create()
{
$this->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']);
}
}

View file

@ -0,0 +1,130 @@
<?php
namespace App\Http\Controllers\Users;
use App\Http\Requests\AssetFileRequest;
use App\Http\Controllers\Controller;
use App\Models\Actionlog;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
class UserFilesController extends Controller
{
/**
* Return JSON response with a list of user details for the getIndex() view.
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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);
}
}

View file

@ -1,7 +1,9 @@
<?php <?php
namespace App\Http\Controllers; namespace App\Http\Controllers\Users;
use App\Helpers\Helper; use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Http\Controllers\UserNotFoundException;
use App\Http\Requests\AssetFileRequest; use App\Http\Requests\AssetFileRequest;
use App\Http\Requests\SaveUserRequest; use App\Http\Requests\SaveUserRequest;
use App\Models\Accessory; use App\Models\Accessory;
@ -50,13 +52,14 @@ class UsersController extends Controller
/** /**
* Returns a view that invokes the ajax tables which actually contains * Returns a view that invokes the ajax tables which actually contains
* the content for the users listing, which is generated in getDatatable(). * the content for the users listing, which is generated in getDatatable().
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @see UsersController::getDatatable() method that generates the JSON response * @see UsersController::getDatatable() method that generates the JSON response
* @since [v1.0] * @since [v1.0]
* @return \Illuminate\Contracts\View\View * @return \Illuminate\Contracts\View\View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function index() public function index()
{ {
@ -65,21 +68,22 @@ class UsersController extends Controller
} }
/** /**
* Returns a view that displays the user creation form. * Returns a view that displays the user creation form.
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.0] * @since [v1.0]
* @return \Illuminate\Contracts\View\View * @return \Illuminate\Contracts\View\View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function create() public function create()
{ {
$this->authorize('create', User::class); $this->authorize('create', User::class);
$groups = Group::pluck('name', 'id'); $groups = Group::pluck('name', 'id');
$userGroups = collect();
if (Input::old('groups')) { if (Input::old('groups')) {
$userGroups = Group::whereIn('id', Input::old('groups'))->pluck('name', 'id'); $userGroups = Group::whereIn('id', Input::old('groups'))->pluck('name', 'id');
} else {
$userGroups = collect();
} }
$permissions = config('permissions'); $permissions = config('permissions');
@ -87,26 +91,27 @@ class UsersController extends Controller
$permissions = $this->filterDisplayable($permissions); $permissions = $this->filterDisplayable($permissions);
return view('users/edit', compact('groups', 'userGroups', 'permissions', 'userPermissions')) 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. * Validate and store the new user data, or return an error.
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.0] * @since [v1.0]
* @return \Illuminate\Http\RedirectResponse * @param SaveUserRequest $request
* @return \Illuminate\Http\RedirectResponse
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function store(SaveUserRequest $request) public function store(SaveUserRequest $request)
{ {
$this->authorize('create', User::class); $this->authorize('create', User::class);
$user = new User; $user = new User;
//Username, email, and password need to be handled specially because the need to respect config values on an edit. //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->email = e($request->input('email'));
$user->username = $data['username'] = e($request->input('username')); $user->username = e($request->input('username'));
if ($request->has('password')) { if ($request->has('password')) {
$user->password = bcrypt($request->input('password')); $user->password = bcrypt($request->input('password'));
$data['password'] = $request->input('password');
} }
$user->first_name = $request->input('first_name'); $user->first_name = $request->input('first_name');
$user->last_name = $request->input('last_name'); $user->last_name = $request->input('last_name');
@ -152,12 +157,6 @@ class UsersController extends Controller
$data['password'] = e($request->input('password')); $data['password'] = e($request->input('password'));
$user->notify(new WelcomeNotification($data)); $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')); return redirect::route('users.index')->with('success', trans('admin/users/message.success.create'));
} }
@ -185,6 +184,7 @@ class UsersController extends Controller
* @param $permissions * @param $permissions
* @return View * @return View
* @internal param int $id * @internal param int $id
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function edit($id) public function edit($id)
{ {
@ -215,9 +215,10 @@ class UsersController extends Controller
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.0] * @since [v1.0]
* @param UpdateUserRequest $request * @param SaveUserRequest $request
* @param int $id * @param int $id
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function update(SaveUserRequest $request, $id = null) public function update(SaveUserRequest $request, $id = null)
{ {
@ -232,7 +233,7 @@ class UsersController extends Controller
try { try {
$user = User::find($id); $user = User::findOrFail($id);
if ($user->id == $request->input('manager_id')) { if ($user->id == $request->input('manager_id')) {
return redirect()->back()->withInput()->with('error', 'You cannot be your own manager.'); return redirect()->back()->withInput()->with('error', 'You cannot be your own manager.');
@ -248,6 +249,7 @@ class UsersController extends Controller
} }
} catch (ModelNotFoundException $e) { } catch (ModelNotFoundException $e) {
return redirect()->route('users.index') return redirect()->route('users.index')
->with('error', trans('admin/users/message.user_not_found', compact('id'))); ->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 // Update the location of any assets checked out to this user
Asset::where('assigned_type', User::class) 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? // Do we want to update the user password?
if ($request->has('password')) { if ($request->has('password')) {
$user->password = bcrypt($request->input('password')); $user->password = bcrypt($request->input('password'));
} }
// Strip out the superuser permission if the user isn't a superadmin
$permissions_array = $request->input('permission'); $permissions_array = $request->input('permission');
// Strip out the superuser permission if the user isn't a superadmin
if (!Auth::user()->isSuperUser()) { if (!Auth::user()->isSuperUser()) {
unset($permissions_array['superuser']); unset($permissions_array['superuser']);
$permissions_array['superuser'] = $orig_superuser; $permissions_array['superuser'] = $orig_superuser;
@ -311,21 +314,21 @@ class UsersController extends Controller
// Was the user updated? // Was the user updated?
if ($user->save()) { if ($user->save()) {
// Prepare the success message
$success = trans('admin/users/message.success.update');
// Redirect to the user page // 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()); return redirect()->back()->withInput()->withErrors($user->getErrors());
} }
/** /**
* Delete a user * Delete a user
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.0] * @since [v1.0]
* @param int $id * @param int $id
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function destroy($id = null) public function destroy($id = null)
{ {
@ -336,247 +339,58 @@ class UsersController extends Controller
$this->authorize('delete', User::class); $this->authorize('delete', User::class);
// Check if we are not trying to delete ourselves // 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 // 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 // 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 // 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 // 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 // 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 // Delete the user
$user->delete(); $user->delete();
// Prepare the success message // Prepare the success message
$success = trans('admin/users/message.success.delete');
// Redirect to the user management page // 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) { } catch (ModelNotFoundException $e) {
// Prepare the error message // Prepare the error message
$error = trans('admin/users/message.user_not_found', compact('id'));
// Redirect to the user management page // 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. * Restore a deleted user
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @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
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.0] * @since [v1.0]
* @param int $id
* @return \Illuminate\Http\RedirectResponse * @return \Illuminate\Http\RedirectResponse
*/ * @throws \Illuminate\Auth\Access\AuthorizationException
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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @since [v1.0]
* @param int $id
* @return \Illuminate\Http\RedirectResponse
*/ */
public function getRestore($id = null) public function getRestore($id = null)
{ {
@ -595,46 +409,46 @@ class UsersController extends Controller
/** /**
* Return a view with user detail * Return a view with user detail
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.0] * @since [v1.0]
* @param int $userId * @param int $userId
* @return \Illuminate\Contracts\View\View * @return \Illuminate\Contracts\View\View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function show($userId = null) public function show($userId = null)
{ {
if(!$user = User::with('assets', 'assets.model', 'consumables', 'accessories', 'licenses', 'userloc')->withTrashed()->find($userId)) { 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 // 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'); $userlog = $user->userlog->load('item');
if (isset($user->id)) { $this->authorize('view', $user);
$this->authorize('view', $user); return view('users/view', compact('user', 'userlog'));
return view('users/view', compact('user', 'userlog'));
}
} }
/** /**
* Unsuspend a user. * Unsuspend a user.
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.0] * @since [v1.0]
* @param int $id * @param int $id
* @return Redirect * @return Redirect
*/ * @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function getUnsuspend($id = null) public function getUnsuspend($id = null)
{ {
try { try {
// Get user information // Get user information
$user = User::find($id); $user = User::findOrFail($id);
$this->authorize('edit', $user); $this->authorize('edit', $user);
// Check if we are not trying to unsuspend ourselves // Check if we are not trying to unsuspend ourselves
if ($user->id === Auth::user()->id) { if ($user->id === Auth::id()) {
// Prepare the error message // Prepare the error message
$error = trans('admin/users/message.error.unsuspend'); $error = trans('admin/users/message.error.unsuspend');
// Redirect to the user management page // Redirect to the user management page
@ -647,27 +461,25 @@ class UsersController extends Controller
return redirect()->route('users.index')->with('error', 'Insufficient permissions!'); 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 // 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.unsuspend'));
} 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 // 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, * Return a view containing a pre-populated new user form,
* populated with some fields from an existing user. * populated with some fields from an existing user.
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.0] * @since [v1.0]
* @param int $id * @param int $id
* @return \Illuminate\Contracts\View\View * @return \Illuminate\Contracts\View\View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function getClone($id = null) public function getClone($id = null)
{ {
@ -675,7 +487,6 @@ class UsersController extends Controller
// We need to reverse the UI specific logic for our // We need to reverse the UI specific logic for our
// permissions here before we update the user. // permissions here before we update the user.
$permissions = Input::get('permissions', array()); $permissions = Input::get('permissions', array());
//$this->decodePermissions($permissions);
app('request')->request->set('permissions', $permissions); app('request')->request->set('permissions', $permissions);
@ -695,7 +506,7 @@ class UsersController extends Controller
$permissions = config('permissions'); $permissions = config('permissions');
$clonedPermissions = $user_to_clone->decodePermissions(); $clonedPermissions = $user_to_clone->decodePermissions();
$userPermissions =Helper::selectedPermissionsArray($permissions, $clonedPermissions); $userPermissions = Helper::selectedPermissionsArray($permissions, $clonedPermissions);
// Show the page // Show the page
return view('users/edit', compact('permissions', 'userPermissions')) return view('users/edit', compact('permissions', 'userPermissions'))
@ -703,184 +514,11 @@ class UsersController extends Controller
->with('groups', Group::pluck('name', 'id')) ->with('groups', Group::pluck('name', 'id'))
->with('userGroups', $userGroups) ->with('userGroups', $userGroups)
->with('clone_user', $user_to_clone); ->with('clone_user', $user_to_clone);
} catch (UserNotFoundException $e) { } catch (ModelNotFoundException $e) {
// Prepare the error message // Prepare the error message
$error = trans('admin/users/message.user_not_found', compact('id'));
// Redirect to the user management page // 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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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] [<snipe@snipe.net>]
* @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']);
} }
} }
@ -891,6 +529,7 @@ class UsersController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v3.5] * @since [v3.5]
* @return StreamedResponse * @return StreamedResponse
* @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function getExportUserCsv() public function getExportUserCsv()
{ {
@ -902,7 +541,9 @@ class UsersController extends Controller
// Open output stream // Open output stream
$handle = fopen('php://output', 'w'); $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=[ $headers=[
// strtolower to prevent Excel from trying to open it as a SYLK file // strtolower to prevent Excel from trying to open it as a SYLK file
strtolower(trans('general.id')), strtolower(trans('general.id')),
@ -984,10 +625,13 @@ class UsersController extends Controller
$show_user = User::where('id',$id)->withTrashed()->first(); $show_user = User::where('id',$id)->withTrashed()->first();
$assets = Asset::where('assigned_to', $id)->where('assigned_type', User::class)->with('model', 'model.category')->get(); $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(); $accessories = $show_user->accessories()->get();
$consumables = $show_user->consumables()->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);
} }

View file

@ -1,29 +1,18 @@
<?php <?php
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Models\Accessory;
use App\Models\Actionlog; use App\Models\Actionlog;
use App\Models\Asset; use App\Models\Asset;
use App\Models\AssetModel; use App\Models\AssetModel;
use App\Models\CheckoutRequest;
use App\Models\Company; use App\Models\Company;
use App\Models\Component;
use App\Models\Consumable;
use App\Models\License;
use App\Models\Setting; use App\Models\Setting;
use App\Models\User; use App\Models\User;
use App\Notifications\RequestAssetNotification; use App\Notifications\RequestAssetNotification;
use App\Notifications\RequestAssetCancelationNotification; use App\Notifications\RequestAssetCancelationNotification;
use Auth; use Illuminate\Support\Facades\Auth;
use Config; use Illuminate\Support\Facades\DB;
use DB; use Illuminate\Support\Facades\Input;
use Input;
use Lang;
use Mail;
use Redirect; use Redirect;
use Slack;
use Validator;
use View;
use Illuminate\Http\Request; use Illuminate\Http\Request;
/** /**
@ -49,24 +38,25 @@ class ViewAssetsController extends Controller
'licenses', 'licenses',
'userloc', 'userloc',
'userlog' 'userlog'
)->withTrashed()->find(Auth::user()->id); )->withTrashed()->find(Auth::id());
$userlog = $user->userlog->load('item', 'user', 'target'); $userlog = $user->userlog->load('item', 'user', 'target');
if (isset($user->id)) { if (isset($user->id)) {
return view('account/view-assets', compact('user', 'userlog')); 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() 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')); 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) public function getRequestAsset($assetId = null)
{ {
@ -156,7 +145,8 @@ class ViewAssetsController extends Controller
if (is_null($asset = Asset::RequestableAssets()->find($assetId))) { if (is_null($asset = Asset::RequestableAssets()->find($assetId))) {
return redirect()->route('requestable-assets') return redirect()->route('requestable-assets')
->with('error', trans('admin/hardware/message.does_not_exist_or_not_requestable')); ->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') return redirect()->route('requestable-assets')
->with('error', trans('general.insufficient_permissions')); ->with('error', trans('general.insufficient_permissions'));
} }
@ -187,17 +177,16 @@ class ViewAssetsController extends Controller
$settings->notify(new RequestAssetCancelationNotification($data)); $settings->notify(new RequestAssetCancelationNotification($data));
return redirect()->route('requestable-assets') return redirect()->route('requestable-assets')
->with('success')->with('success', trans('admin/hardware/message.requests.cancel-success')); ->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)) { if (is_null($item)) {
// Redirect to the asset management page // Redirect to the asset management page
return redirect()->to('account')->with('error', trans('admin/hardware/message.does_not_exist')); 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 // Save the acceptance
@ -326,8 +315,8 @@ class ViewAssetsController extends Controller
if ($update_checkout) { if ($update_checkout) {
return redirect()->to('account/view-assets')->with('success', $return_msg); 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 ');
} }
} }

View file

@ -2,7 +2,8 @@
namespace App\Http\Requests; namespace App\Http\Requests;
use App\Http\Requests\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
class AssetFileRequest extends Request 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, '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);
}
} }

View file

@ -2,7 +2,8 @@
namespace App\Http\Requests; namespace App\Http\Requests;
use App\Http\Requests\Request; use App\Models\SnipeModel;
use Intervention\Image\Facades\Image;
class ImageUploadRequest extends Request class ImageUploadRequest extends Request
{ {
@ -33,4 +34,45 @@ class ImageUploadRequest extends Request
{ {
return $this->redirector->back()->withInput()->withErrors($errors, $this->errorBag); 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;
}
} }

View file

@ -0,0 +1,53 @@
<?php
namespace App\Http\Requests;
use App\Models\LicenseSeat;
use Illuminate\Foundation\Http\FormRequest;
class LicenseCheckoutRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'note' => '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;
}
}

View file

@ -55,4 +55,6 @@ class LicenseSeat extends Model implements ICompanyableChild
return false; return false;
} }
} }

View file

@ -80,7 +80,9 @@ class CheckoutConsumableNotification extends Notification
/** /**
* Send an email if an email should be sent at checkin/checkout * Send an email if an email should be sent at checkin/checkout
*/ */
if ((method_exists($this->item, 'checkin_email')) && ($this->item->checkin_email())) { if ((method_exists($this->item, 'checkin_email')) && ($this->item->checkin_email())) {
$notifyBy[1] = 'mail'; $notifyBy[1] = 'mail';
} }

View file

@ -2,7 +2,7 @@
return array( 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. ', 'assoc_users' => 'This accessory currently has :count items checked out to users. Please check in the accessories and and try again. ',
'create' => array( 'create' => array(

View file

@ -24,18 +24,17 @@
<!-- Image --> <!-- Image -->
<div class="form-group {{ $errors->has('image') ? 'has-error' : '' }}"> @if ($item->image)
<label class="col-md-3 control-label" for="image">{{ trans('general.image_upload') }}</label> <div class="form-group {{ $errors->has('image_delete') ? 'has-error' : '' }}">
<div class="col-md-5"> <label class="col-md-3 control-label" for="image_delete">{{ trans('general.image_delete') }}</label>
<label class="btn btn-default"> <div class="col-md-5">
{{ trans('button.select_file') }} {{ Form::checkbox('image_delete') }}
<input type="file" name="image" accept="image/gif,image/jpeg,image/png,image/svg" hidden> <img src="{{ url('/') }}/uploads/accessories/{{ $item->image }}" />
</label> {!! $errors->first('image_delete', '<span class="alert-msg">:message</span>') !!}
<p class="help-block">Accepted filetypes are jpg, png, gif and svg</p> </div>
{!! $errors->first('image', '<span class="alert-msg">:message</span>') !!}
</div> </div>
</div> @endif
@include ('partials.forms.edit.image-upload')
@stop @stop

View file

@ -391,7 +391,7 @@
<div class="tab-pane" id="files_tab"> <div class="tab-pane" id="files_tab">
<div class="row"> <div class="row">
<div class="col-md-12 col-sm-12"> <div class="col-md-12 col-sm-12">
<p>{{ trans('admin/hardware/general.filetype_info') }}</p> <p>{{ trans('admin/users/general.filetype_info') }}</p>
</div> </div>
<div class="col-md-2"> <div class="col-md-2">
<!-- The fileinput-button span is used to style the file input field as button --> <!-- The fileinput-button span is used to style the file input field as button -->
@ -427,7 +427,7 @@
<div class="col-md-12 col-sm-12"> <div class="col-md-12 col-sm-12">
<div class="table-responsive"> <div class="table-responsive">
<table class="display table table-striped"> <table id="files-table" class="display table table-striped">
<thead> <thead>
<tr> <tr>
<th class="col-md-5">{{ trans('general.notes') }}</th> <th class="col-md-5">{{ trans('general.notes') }}</th>
@ -560,23 +560,22 @@ $(function () {
done: function (e, data) { done: function (e, data) {
console.dir(data); console.dir(data);
// We use this instead of the fail option, since our API // We use this instead of the fail option, since our API
// returns a 200 OK status which always shows as "success" // returns a 200 OK status which always shows as "success"
if (data && data.jqXHR.responseJSON.error && data.jqXHR.responseJSON && data.jqXHR.responseJSON.error) { if (data && data.jqXHR && data.jqXHR.responseJSON && data.jqXHR.responseJSON.status === "error") {
$('#progress-bar-text').html(data.jqXHR.responseJSON.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-bar').removeClass('progress-bar-warning').addClass('progress-bar-danger').css('width','100%');
$('.progress-checkmark').fadeIn('fast').html('<i class="fa fa-times fa-3x icon-white" style="color: #d9534f"></i>'); $('.progress-checkmark').fadeIn('fast').html('<i class="fa fa-times fa-3x icon-white" style="color: #d9534f"></i>');
console.log(data.jqXHR.responseJSON.error);
} else { } else {
$('.progress-bar').removeClass('progress-bar-warning').addClass('progress-bar-success').css('width','100%'); $('.progress-bar').removeClass('progress-bar-warning').addClass('progress-bar-success').css('width','100%');
$('.progress-checkmark').fadeIn('fast'); $('.progress-checkmark').fadeIn('fast');
$('#progress-container').delay(950).css('visibility', 'visible'); $('#progress-container').delay(950).css('visibility', 'visible');
$('.progress-bar-text').html('Finished!'); $('.progress-bar-text').html('Finished!');
$('.progress-checkmark').fadeIn('fast').html('<i class="fa fa-check fa-3x icon-white" style="color: green"></i>'); $('.progress-checkmark').fadeIn('fast').html('<i class="fa fa-check fa-3x icon-white" style="color: green"></i>');
$.each(data.result.file, function (index, file) { $.each(data.result, function (index, file) {
$('<tr><td>' + file.notes + '</td><<td>' + file.name + '</td><td>Just now</td><td>' + file.filesize + '</td><td><a class="btn btn-info btn-sm hidden-print" href="import/process/' + file.name + '"><i class="fa fa-spinner process"></i> Process</a></td></tr>').prependTo("#upload-table > tbody"); $('<tr><td>' + file.note + '</td><<td>' + file.filename + '</td></tr>').prependTo("#files-table > tbody");
}); });
} }
$('#progress').removeClass('active'); $('#progress').removeClass('active');

View file

@ -58,13 +58,6 @@ Route::group(['middleware' => 'auth'], function () {
]); ]);
/*
* Status Labels
*/
Route::resource('components', 'ComponentsController', [
'parameters' => ['component' => 'component_id']
]);
/* /*
* Departments * Departments
*/ */

View file

@ -7,25 +7,25 @@ Route::group([ 'prefix' => 'accessories', 'middleware' => ['auth']], function ()
Route::get( Route::get(
'{accessoryID}/checkout', '{accessoryID}/checkout',
[ 'as' => 'checkout/accessory', 'uses' => 'AccessoriesController@getCheckout' ] [ 'as' => 'checkout/accessory', 'uses' => 'Accessories\AccessoryCheckoutController@create' ]
); );
Route::post( Route::post(
'{accessoryID}/checkout', '{accessoryID}/checkout',
[ 'as' => 'checkout/accessory', 'uses' => 'AccessoriesController@postCheckout' ] [ 'as' => 'checkout/accessory', 'uses' => 'Accessories\AccessoryCheckoutController@store' ]
); );
Route::get( Route::get(
'{accessoryID}/checkin/{backto?}', '{accessoryID}/checkin/{backto?}',
[ 'as' => 'checkin/accessory', 'uses' => 'AccessoriesController@getCheckin' ] [ 'as' => 'checkin/accessory', 'uses' => 'Accessories\AccessoryCheckinController@create' ]
); );
Route::post( Route::post(
'{accessoryID}/checkin/{backto?}', '{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'], 'middleware' => ['auth'],
'parameters' => ['accessory' => 'accessory_id'] 'parameters' => ['accessory' => 'accessory_id']
]); ]);

View file

@ -5,24 +5,24 @@ Route::group([ 'prefix' => 'components','middleware' => ['auth'] ], function ()
Route::get( Route::get(
'{componentID}/checkout', '{componentID}/checkout',
[ 'as' => 'checkout/component', 'uses' => 'ComponentsController@getCheckout' ] [ 'as' => 'checkout/component', 'uses' => 'Components\ComponentCheckoutController@create' ]
); );
Route::post( Route::post(
'{componentID}/checkout', '{componentID}/checkout',
[ 'as' => 'checkout/component', 'uses' => 'ComponentsController@postCheckout' ] [ 'as' => 'checkout/component', 'uses' => 'Components\ComponentCheckoutController@store' ]
); );
Route::get( Route::get(
'{componentID}/checkin', '{componentID}/checkin',
[ 'as' => 'checkin/component', 'uses' => 'ComponentsController@getCheckin' ] [ 'as' => 'checkin/component', 'uses' => 'Components\ComponentCheckinController@create' ]
); );
Route::post( Route::post(
'{componentID}/checkin', '{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'], 'middleware' => ['auth'],
'parameters' => ['component' => 'component_id'] 'parameters' => ['component' => 'component_id']
]); ]);

View file

@ -5,15 +5,15 @@
Route::group([ 'prefix' => 'consumables', 'middleware' => ['auth']], function () { Route::group([ 'prefix' => 'consumables', 'middleware' => ['auth']], function () {
Route::get( Route::get(
'{consumableID}/checkout', '{consumableID}/checkout',
[ 'as' => 'checkout/consumable','uses' => 'ConsumablesController@getCheckout' ] [ 'as' => 'checkout/consumable','uses' => 'Consumables\ConsumableCheckoutController@create' ]
); );
Route::post( Route::post(
'{consumableID}/checkout', '{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'], 'middleware' => ['auth'],
'parameters' => ['consumable' => 'consumable_id'] 'parameters' => ['consumable' => 'consumable_id']
]); ]);

View file

@ -14,7 +14,7 @@ Route::group(
Route::get( 'bulkaudit', [ Route::get( 'bulkaudit', [
'as' => 'assets.bulkaudit', 'as' => 'assets.bulkaudit',
'uses' => 'AssetsController@quickScan' 'uses' => 'Assets\AssetsController@quickScan'
]); ]);
# Asset Maintenances # Asset Maintenances
@ -22,86 +22,86 @@ Route::group(
'parameters' => ['maintenance' => 'maintenance_id', 'asset' => 'asset_id'] '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', [ Route::get('scan', [
'as' => 'asset.scan', 'as' => 'asset.scan',
'uses' => 'AssetsController@scan' 'uses' => 'Assets\AssetsController@scan'
]); ]);
Route::get('audit/{id}', [ Route::get('audit/{id}', [
'as' => 'asset.audit.create', 'as' => 'asset.audit.create',
'uses' => 'AssetsController@audit' 'uses' => 'Assets\AssetsController@audit'
]); ]);
Route::post('audit/{id}', [ Route::post('audit/{id}', [
'as' => 'asset.audit.store', 'as' => 'asset.audit.store',
'uses' => 'AssetsController@auditStore' 'uses' => 'Assets\AssetsController@auditStore'
]); ]);
Route::get('history', [ Route::get('history', [
'as' => 'asset.import-history', 'as' => 'asset.import-history',
'uses' => 'AssetsController@getImportHistory' 'uses' => 'Assets\AssetsController@getImportHistory'
]); ]);
Route::post('history', [ Route::post('history', [
'as' => 'asset.process-import-history', 'as' => 'asset.process-import-history',
'uses' => 'AssetsController@postImportHistory' 'uses' => 'Assets\AssetsController@postImportHistory'
]); ]);
Route::get('/bytag', [ Route::get('/bytag', [
'as' => 'findbytag/hardware', 'as' => 'findbytag/hardware',
'uses' => 'AssetsController@getAssetByTag' 'uses' => 'Assets\AssetsController@getAssetByTag'
]); ]);
Route::get('{assetId}/clone', [ Route::get('{assetId}/clone', [
'as' => 'clone/hardware', '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', [ Route::get('{assetId}/checkout', [
'as' => 'checkout/hardware', 'as' => 'checkout/hardware',
'uses' => 'AssetCheckoutController@create' 'uses' => 'Assets\AssetCheckoutController@create'
]); ]);
Route::post('{assetId}/checkout', [ Route::post('{assetId}/checkout', [
'as' => 'checkout/hardware', 'as' => 'checkout/hardware',
'uses' => 'AssetCheckoutController@store' 'uses' => 'Assets\AssetCheckoutController@store'
]); ]);
Route::get('{assetId}/checkin/{backto?}', [ Route::get('{assetId}/checkin/{backto?}', [
'as' => 'checkin/hardware', 'as' => 'checkin/hardware',
'uses' => 'AssetCheckinController@create' 'uses' => 'Assets\AssetCheckinController@create'
]); ]);
Route::post('{assetId}/checkin/{backto?}', [ Route::post('{assetId}/checkin/{backto?}', [
'as' => 'checkin/hardware', 'as' => 'checkin/hardware',
'uses' => 'AssetCheckinController@store' 'uses' => 'Assets\AssetCheckinController@store'
]); ]);
Route::get('{assetId}/view', [ Route::get('{assetId}/view', [
'as' => 'hardware.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}/qr_code', [ 'as' => 'qr_code/hardware', 'uses' => 'Assets\AssetsController@getQrCode' ]);
Route::get('{assetId}/barcode', [ 'as' => 'barcode/hardware', 'uses' => 'AssetsController@getBarCode' ]); Route::get('{assetId}/barcode', [ 'as' => 'barcode/hardware', 'uses' => 'Assets\AssetsController@getBarCode' ]);
Route::get('{assetId}/restore', [ Route::get('{assetId}/restore', [
'as' => 'restore/hardware', 'as' => 'restore/hardware',
'uses' => 'AssetsController@getRestore' 'uses' => 'Assets\AssetsController@getRestore'
]); ]);
Route::post('{assetId}/upload', [ Route::post('{assetId}/upload', [
'as' => 'upload/asset', 'as' => 'upload/asset',
'uses' => 'AssetFilesController@store' 'uses' => 'Assets\AssetFilesController@store'
]); ]);
Route::get('{assetId}/showfile/{fileId}/{download?}', [ Route::get('{assetId}/showfile/{fileId}/{download?}', [
'as' => 'show/assetfile', 'as' => 'show/assetfile',
'uses' => 'AssetFilesController@show' 'uses' => 'Assets\AssetFilesController@show'
]); ]);
Route::delete('{assetId}/showfile/{fileId}/delete', [ Route::delete('{assetId}/showfile/{fileId}/delete', [
'as' => 'delete/assetfile', 'as' => 'delete/assetfile',
'uses' => 'AssetFilesController@destroy' 'uses' => 'Assets\AssetFilesController@destroy'
]); ]);
@ -109,32 +109,32 @@ Route::group(
'bulkedit', 'bulkedit',
[ [
'as' => 'hardware/bulkedit', 'as' => 'hardware/bulkedit',
'uses' => 'BulkAssetsController@edit' 'uses' => 'Assets\BulkAssetsController@edit'
] ]
); );
Route::post( Route::post(
'bulkdelete', 'bulkdelete',
[ [
'as' => 'hardware/bulkdelete', 'as' => 'hardware/bulkdelete',
'uses' => 'BulkAssetsController@destroy' 'uses' => 'Assets\BulkAssetsController@destroy'
] ]
); );
Route::post( Route::post(
'bulksave', 'bulksave',
[ [
'as' => 'hardware/bulksave', 'as' => 'hardware/bulksave',
'uses' => 'BulkAssetsController@update' 'uses' => 'Assets\BulkAssetsController@update'
] ]
); );
# Bulk checkout / checkin # Bulk checkout / checkin
Route::get( 'bulkcheckout', [ Route::get( 'bulkcheckout', [
'as' => 'hardware/bulkcheckout', 'as' => 'hardware/bulkcheckout',
'uses' => 'BulkAssetsController@showCheckout' 'uses' => 'Assets\BulkAssetsController@showCheckout'
]); ]);
Route::post( 'bulkcheckout', [ Route::post( 'bulkcheckout', [
'as' => 'hardware/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'], 'middleware' => ['auth'],
'parameters' => ['asset' => 'asset_id'] 'parameters' => ['asset' => 'asset_id']
]); ]);

View file

@ -4,46 +4,45 @@
# Licenses # Licenses
Route::group([ 'prefix' => 'licenses', 'middleware' => ['auth'] ], function () { Route::group([ 'prefix' => 'licenses', 'middleware' => ['auth'] ], function () {
Route::get('{licenseId}/clone', [ 'as' => 'clone/license', 'uses' => 'LicensesController@getClone' ]); Route::get('{licenseId}/clone', [ 'as' => 'clone/license', 'uses' => 'Licenses\LicensesController@getClone' ]);
Route::post('{licenseId}/clone', [ 'as' => 'clone/license', 'uses' => 'LicensesController@postCreate' ]);
Route::get('{licenseId}/freecheckout', [ Route::get('{licenseId}/freecheckout', [
'as' => 'licenses.freecheckout', 'as' => 'licenses.freecheckout',
'uses' => 'LicensesController@getFreeLicense' 'uses' => 'Licenses\LicensesController@getFreeLicense'
]); ]);
Route::get('{licenseId}/checkout/{seatId?}', [ Route::get('{licenseId}/checkout/{seatId?}', [
'as' => 'licenses.checkout', 'as' => 'licenses.checkout',
'uses' => 'LicensesController@getCheckout' 'uses' => 'Licenses\LicenseCheckoutController@create'
]); ]);
Route::post( Route::post(
'{licenseId}/checkout/{seatId?}', '{licenseId}/checkout/{seatId?}',
[ 'as' => 'licenses.checkout', 'uses' => 'LicensesController@postCheckout' ] [ 'as' => 'licenses.checkout', 'uses' => 'Licenses\LicenseCheckoutController@store' ]
); );
Route::get('{licenseId}/checkin/{backto?}', [ Route::get('{licenseId}/checkin/{backto?}', [
'as' => 'licenses.checkin', 'as' => 'licenses.checkin',
'uses' => 'LicensesController@getCheckin' 'uses' => 'Licenses\LicenseCheckinController@create'
]); ]);
Route::post('{licenseId}/checkin/{backto?}', [ Route::post('{licenseId}/checkin/{backto?}', [
'as' => 'licenses.checkin.save', 'as' => 'licenses.checkin.save',
'uses' => 'LicensesController@postCheckin' 'uses' => 'Licenses\LicenseCheckinController@store'
]); ]);
Route::post( Route::post(
'{licenseId}/upload', '{licenseId}/upload',
[ 'as' => 'upload/license', 'uses' => 'LicensesController@postUpload' ] [ 'as' => 'upload/license', 'uses' => 'Licenses\LicenseFilesController@store' ]
); );
Route::delete( Route::delete(
'{licenseId}/deletefile/{fileId}', '{licenseId}/deletefile/{fileId}',
[ 'as' => 'delete/licensefile', 'uses' => 'LicensesController@getDeleteFile' ] [ 'as' => 'delete/licensefile', 'uses' => 'Licenses\LicenseFilesController@destroy' ]
); );
Route::get( Route::get(
'{licenseId}/showfile/{fileId}/{download?}', '{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'], 'middleware' => ['auth'],
'parameters' => ['license' => 'license_id'] 'parameters' => ['license' => 'license_id']
]); ]);

View file

@ -8,9 +8,9 @@ Route::group([ 'prefix' => 'models', 'middleware' => ['auth'] ], function () {
Route::get('{modelId}/view', [ 'as' => 'view/model', 'uses' => 'AssetModelsController@getView' ]); 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}/restore', [ 'as' => 'restore/model', 'uses' => 'AssetModelsController@getRestore', 'middleware' => ['authorize:superuser'] ]);
Route::get('{modelId}/custom_fields', ['as' => 'custom_fields/model','uses' => 'AssetModelsController@getCustomFields']); Route::get('{modelId}/custom_fields', ['as' => 'custom_fields/model','uses' => 'AssetModelsController@getCustomFields']);
Route::post('bulkedit', ['as' => 'models.bulkedit.index','uses' => 'AssetModelsController@postBulkEdit']); Route::post('bulkedit', ['as' => 'models.bulkedit.index','uses' => 'BulkAssetModelsController@edit']);
Route::post('bulksave', ['as' => 'models.bulkedit.store','uses' => 'AssetModelsController@postBulkEditSave']); Route::post('bulksave', ['as' => 'models.bulkedit.store','uses' => 'BulkAssetModelsController@update']);
Route::post('bulkdelete', ['as' => 'models.bulkdelete.store','uses' => 'AssetModelsController@postBulkDelete']); Route::post('bulkdelete', ['as' => 'models.bulkdelete.store','uses' => 'BulkAssetModelsController@destroy']);
}); });
Route::resource('models', 'AssetModelsController', [ Route::resource('models', 'AssetModelsController', [

View file

@ -3,56 +3,56 @@
# User Management # User Management
Route::group([ 'prefix' => 'users', 'middleware' => ['auth']], function () { Route::group([ 'prefix' => 'users', 'middleware' => ['auth']], function () {
Route::get('ldap', ['as' => 'ldap/user', 'uses' => 'UsersController@getLDAP' ]); Route::get('ldap', ['as' => 'ldap/user', 'uses' => 'Users\LDAPImportController@create' ]);
Route::post('ldap', 'UsersController@postLDAP'); Route::post('ldap', 'Users\LDAPImportController@store');
Route::get('export', [ 'as' => 'users.export', 'uses' => 'UsersController@getExportUserCsv' ]); Route::get('export', [ 'as' => 'users.export', 'uses' => 'Users\UsersController@getExportUserCsv' ]);
Route::get('{userId}/clone', [ 'as' => 'clone/user', 'uses' => 'UsersController@getClone' ]); Route::get('{userId}/clone', [ 'as' => 'clone/user', 'uses' => 'Users\UsersController@getClone' ]);
Route::post('{userId}/clone', [ 'uses' => 'UsersController@postCreate' ]); Route::post('{userId}/clone', [ 'uses' => 'Users\UsersController@postCreate' ]);
Route::get('{userId}/restore', [ 'as' => 'restore/user', 'uses' => 'UsersController@getRestore' ]); Route::get('{userId}/restore', [ 'as' => 'restore/user', 'uses' => 'Users\UsersController@getRestore' ]);
Route::get('{userId}/unsuspend', [ 'as' => 'unsuspend/user', 'uses' => 'UsersController@getUnsuspend' ]); Route::get('{userId}/unsuspend', [ 'as' => 'unsuspend/user', 'uses' => 'Users\UsersController@getUnsuspend' ]);
Route::post('{userId}/upload', [ 'as' => 'upload/user', 'uses' => 'UsersController@postUpload' ]); Route::post('{userId}/upload', [ 'as' => 'upload/user', 'uses' => 'Users\UserFilesController@store' ]);
Route::delete( Route::delete(
'{userId}/deletefile/{fileId}', '{userId}/deletefile/{fileId}',
[ 'as' => 'userfile.destroy', 'uses' => 'UsersController@getDeleteFile' ] [ 'as' => 'userfile.destroy', 'uses' => 'Users\UserFilesController@destroy' ]
); );
Route::get( Route::get(
'{userId}/print', '{userId}/print',
[ 'as' => 'users.print', 'uses' => 'UsersController@printInventory' ] [ 'as' => 'users.print', 'uses' => 'Users\UsersController@printInventory' ]
); );
Route::get( Route::get(
'{userId}/showfile/{fileId}', '{userId}/showfile/{fileId}',
[ 'as' => 'show/userfile', 'uses' => 'UsersController@displayFile' ] [ 'as' => 'show/userfile', 'uses' => 'Users\UserFilesController@show' ]
); );
Route::post( Route::post(
'bulkedit', 'bulkedit',
[ [
'as' => 'users/bulkedit', 'as' => 'users/bulkedit',
'uses' => 'UsersController@postBulkEdit', 'uses' => 'Users\BulkUsersController@edit',
] ]
); );
Route::post( Route::post(
'bulksave', 'bulksave',
[ [
'as' => 'users/bulksave', 'as' => 'users/bulksave',
'uses' => 'UsersController@postBulkSave', 'uses' => 'Users\BulkUsersController@destroy',
] ]
); );
Route::post( Route::post(
'bulkeditsave', 'bulkeditsave',
[ [
'as' => 'users/bulkeditsave', 'as' => 'users/bulkeditsave',
'uses' => 'UsersController@postBulkEditSave', 'uses' => 'Users\BulkUsersController@update',
] ]
); );
}); });
Route::resource('users', 'UsersController', [ Route::resource('users', 'Users\UsersController', [
'middleware' => ['auth'], 'middleware' => ['auth'],
'parameters' => ['user' => 'user_id'] 'parameters' => ['user' => 'user_id']
]); ]);