From f0546bf689b152046dfc5058ffc0ca01321fcb4b Mon Sep 17 00:00:00 2001 From: Daniel Meltzer Date: Sat, 23 May 2020 13:36:02 -0400 Subject: [PATCH] Clean up Transformers and extract an isDeletable() method to models where it makes sense. --- .../Controllers/Api/CategoriesController.php | 14 +++---- .../Controllers/Api/CompaniesController.php | 27 ++++--------- .../Controllers/Api/LocationsController.php | 6 ++- .../Api/ManufacturersController.php | 6 +-- app/Http/Controllers/CategoriesController.php | 12 ++---- app/Http/Controllers/CompaniesController.php | 40 +++++++------------ app/Http/Controllers/LocationsController.php | 12 ++---- .../Controllers/ManufacturersController.php | 3 +- .../Transformers/AccessoriesTransformer.php | 6 +-- .../AssetMaintenancesTransformer.php | 4 +- .../Transformers/AssetModelsTransformer.php | 8 ++-- app/Http/Transformers/AssetsTransformer.php | 12 +++--- .../Transformers/CategoriesTransformer.php | 13 +++--- .../Transformers/CompaniesTransformer.php | 4 +- .../ComponentsAssetsTransformer.php | 8 ++-- .../Transformers/ComponentsTransformer.php | 8 ++-- .../Transformers/ConsumablesTransformer.php | 8 ++-- .../Transformers/DepartmentsTransformer.php | 4 +- .../Transformers/DepreciationsTransformer.php | 4 +- .../Transformers/LicenseSeatsTransformer.php | 12 +++--- app/Http/Transformers/LicensesTransformer.php | 10 ++--- .../Transformers/LocationsTransformer.php | 2 +- .../Transformers/ManufacturersTransformer.php | 6 +-- .../PredefinedKitsTransformer.php | 2 +- .../Transformers/SuppliersTransformer.php | 4 +- app/Http/Transformers/UsersTransformer.php | 6 +-- app/Models/Category.php | 20 ++++++++-- app/Models/Company.php | 18 ++++++++- app/Models/Location.php | 11 ++++- app/Models/Manufacturer.php | 17 ++++++-- app/Policies/SnipePermissionsPolicy.php | 6 ++- app/Presenters/CategoryPresenter.php | 37 +++-------------- 32 files changed, 173 insertions(+), 177 deletions(-) diff --git a/app/Http/Controllers/Api/CategoriesController.php b/app/Http/Controllers/Api/CategoriesController.php index 7422e64052..ae085c0f35 100644 --- a/app/Http/Controllers/Api/CategoriesController.php +++ b/app/Http/Controllers/Api/CategoriesController.php @@ -120,16 +120,12 @@ class CategoriesController extends Controller public function destroy($id) { $this->authorize('delete', Category::class); - $category = Category::withCount('models as models_count', 'accessories as accessories_count','consumables as consumables_count','components as components_count')->findOrFail($id); + $category = Category::findOrFail($id); - if ($category->models_count > 0) { - return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/categories/message.assoc_items', ['asset_type'=>'model']))); - } elseif ($category->accessories_count > 0) { - return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/categories/message.assoc_items', ['asset_type'=>'accessory']))); - } elseif ($category->consumables_count > 0) { - return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/categories/message.assoc_items', ['asset_type'=>'consumable']))); - } elseif ($category->components_count > 0) { - return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/categories/message.assoc_items', ['asset_type'=>'component']))); + if (!$category->isDeletable()) { + return response()->json( + Helper::formatStandardApiResponse('error', null, trans('admin/categories/message.assoc_items', ['asset_type'=>$category->category_type])) + ); } $category->delete(); return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/categories/message.delete.success'))); diff --git a/app/Http/Controllers/Api/CompaniesController.php b/app/Http/Controllers/Api/CompaniesController.php index e07a895eee..c56ed9f871 100644 --- a/app/Http/Controllers/Api/CompaniesController.php +++ b/app/Http/Controllers/Api/CompaniesController.php @@ -48,7 +48,7 @@ class CompaniesController extends Controller // Check to make sure the limit is not higher than the max allowed ((config('app.max_results') >= $request->input('limit')) && ($request->filled('limit'))) ? $limit = $request->input('limit') : $limit = config('app.max_results'); - + $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; $sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at'; $companies->orderBy($sort, $order); @@ -133,28 +133,17 @@ class CompaniesController extends Controller */ public function destroy($id) { - $this->authorize('delete', Company::class); - $company = Company::findOrFail($id); - $this->authorize('delete', $company); + $this->authorize('delete', Company::class); + $company = Company::findOrFail($id); + $this->authorize('delete', $company); - try { - $company->delete(); + if ( !$company->isDeletable() ) { return response() - ->json(Helper::formatStandardApiResponse('success', null, 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 response() ->json(Helper::formatStandardApiResponse('error', null, trans('admin/companies/message.assoc_users'))); - - } else { - throw $exception; - } } - + $company->delete(); + return response() + ->json(Helper::formatStandardApiResponse('success', null, trans('admin/companies/message.delete.success'))); } /** diff --git a/app/Http/Controllers/Api/LocationsController.php b/app/Http/Controllers/Api/LocationsController.php index 2f6a2d8eac..cd2917b4f3 100644 --- a/app/Http/Controllers/Api/LocationsController.php +++ b/app/Http/Controllers/Api/LocationsController.php @@ -179,6 +179,10 @@ class LocationsController extends Controller { $this->authorize('delete', Location::class); $location = Location::findOrFail($id); + if(!$location->isDeletable()) { + return response() + ->json(Helper::formatStandardApiResponse('error', null, trans('admin/companies/message.assoc_users'))); + } $this->authorize('delete', $location); $location->delete(); return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/locations/message.delete.success'))); @@ -259,4 +263,4 @@ class LocationsController extends Controller } -} \ No newline at end of file +} diff --git a/app/Http/Controllers/Api/ManufacturersController.php b/app/Http/Controllers/Api/ManufacturersController.php index f8867a4132..6b9212137f 100644 --- a/app/Http/Controllers/Api/ManufacturersController.php +++ b/app/Http/Controllers/Api/ManufacturersController.php @@ -125,15 +125,15 @@ class ManufacturersController extends Controller { $this->authorize('delete', Manufacturer::class); - $manufacturer = Manufacturer::withCount('assets as assets_count', 'licenses as licenses_count', 'consumables as consumables_count', 'accessories as accessories_count', 'models as models_count' )->findOrFail($id); + $manufacturer = Manufacturer::findOrFail($id); $this->authorize('delete', $manufacturer); - if (($manufacturer->assets_count == 0) && ($manufacturer->licenses_count==0) && ($manufacturer->consumables_count==0) && ($manufacturer->accessories_count==0) && ($manufacturer->models_count==0) && ($manufacturer->deleted_at=='')) { + if ($manufacturer->isDeletable()) { $manufacturer->delete(); return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/manufacturers/message.delete.success'))); } - return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/manufacturers/message.delete.error'))); + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/manufacturers/message.assoc_users'))); diff --git a/app/Http/Controllers/CategoriesController.php b/app/Http/Controllers/CategoriesController.php index 6623276bce..2383dc5530 100755 --- a/app/Http/Controllers/CategoriesController.php +++ b/app/Http/Controllers/CategoriesController.php @@ -159,18 +159,12 @@ class CategoriesController extends Controller { $this->authorize('delete', Category::class); // Check if the category exists - if (is_null($category = Category::withCount('models as models_count', 'accessories as accessories_count','consumables as consumables_count','components as components_count')->findOrFail($categoryId))) { + if (is_null($category = Category::findOrFail($categoryId))) { return redirect()->route('categories.index')->with('error', trans('admin/categories/message.not_found')); } - if ($category->models_count > 0) { - return redirect()->route('categories.index')->with('error', trans('admin/categories/message.assoc_items', ['asset_type'=>'model'])); - } elseif ($category->accessories_count > 0) { - return redirect()->route('categories.index')->with('error', trans('admin/categories/message.assoc_items', ['asset_type'=>'accessory'])); - } elseif ($category->consumables_count > 0) { - return redirect()->route('categories.index')->with('error', trans('admin/categories/message.assoc_items', ['asset_type'=>'consumable'])); - } elseif ($category->components_count > 0) { - return redirect()->route('categories.index')->with('error', trans('admin/categories/message.assoc_items', ['asset_type'=>'component'])); + if (!$category->isDeletable()) { + return redirect()->route('categories.index')->with('error', trans('admin/categories/message.assoc_items', ['asset_type'=> $category->category_type ])); } Storage::disk('public')->delete('categories'.'/'.$category->image); diff --git a/app/Http/Controllers/CompaniesController.php b/app/Http/Controllers/CompaniesController.php index 2a61ffe968..369672354b 100644 --- a/app/Http/Controllers/CompaniesController.php +++ b/app/Http/Controllers/CompaniesController.php @@ -113,7 +113,7 @@ final class CompaniesController extends Controller $company->name = $request->input('name'); - + $company = $request->handleImages($company,600, public_path().'/uploads/companies'); @@ -140,34 +140,24 @@ final class CompaniesController extends Controller return redirect()->route('companies.index') ->with('error', trans('admin/companies/message.not_found')); } - + $this->authorize('delete', $company); - - try { - - if ($company->image) { - try { - Storage::disk('public')->delete('companies'.'/'.$company->image); - } catch (\Exception $e) { - \Log::debug($e); - } - } - - $company->delete(); + if(!$company->isDeletable()) { return redirect()->route('companies.index') - ->with('success', trans('admin/companies/message.delete.success')); - } catch (\Illuminate\Database\QueryException $exception) { - /* - * NOTE: This happens when there's a foreign key constraint violation - * For example when rows in other tables are referencing this company - */ - if ($exception->getCode() == 23000) { - return redirect()->route('companies.index') ->with('error', trans('admin/companies/message.assoc_users')); - } - - throw $exception; } + + if ($company->image) { + try { + Storage::disk('public')->delete('companies'.'/'.$company->image); + } catch (\Exception $e) { + \Log::debug($e); + } + } + + $company->delete(); + return redirect()->route('companies.index') + ->with('success', trans('admin/companies/message.delete.success')); } public function show($id) { diff --git a/app/Http/Controllers/LocationsController.php b/app/Http/Controllers/LocationsController.php index 86476867c1..41263efd7e 100755 --- a/app/Http/Controllers/LocationsController.php +++ b/app/Http/Controllers/LocationsController.php @@ -171,18 +171,14 @@ class LocationsController extends Controller return redirect()->to(route('locations.index'))->with('error', trans('admin/locations/message.not_found')); } - if (($location->users()) && ($location->users()->count() > 0)) { + if ($location->users()->count() > 0) { return redirect()->to(route('locations.index'))->with('error', trans('admin/locations/message.assoc_users')); - - } elseif (($location->children) && ($location->children->count() > 0)) { + } elseif ($location->children()->count() > 0) { return redirect()->to(route('locations.index'))->with('error', trans('admin/locations/message.assoc_child_loc')); - - } elseif (($location->assets()) && ($location->assets()->count() > 0)) { + } elseif ($location->assets()->count() > 0) { return redirect()->to(route('locations.index'))->with('error', trans('admin/locations/message.assoc_assets')); - - } elseif (($location->assignedassets()) && ($location->assignedassets()->count() > 0)) { + } elseif ($location->assignedassets()->count() > 0) { return redirect()->to(route('locations.index'))->with('error', trans('admin/locations/message.assoc_assets')); - } if ($location->image) { diff --git a/app/Http/Controllers/ManufacturersController.php b/app/Http/Controllers/ManufacturersController.php index dde37b090d..436f197a77 100755 --- a/app/Http/Controllers/ManufacturersController.php +++ b/app/Http/Controllers/ManufacturersController.php @@ -162,7 +162,7 @@ class ManufacturersController extends Controller return redirect()->route('manufacturers.index')->with('error', trans('admin/manufacturers/message.not_found')); } - if ($manufacturer->models_count > 0) { + if (!$manufacturer->isDeletable()) { return redirect()->route('manufacturers.index')->with('error', trans('admin/manufacturers/message.assoc_users')); } @@ -174,7 +174,6 @@ class ManufacturersController extends Controller } } - // Delete the manufacturer $manufacturer->delete(); // Redirect to the manufacturers management page diff --git a/app/Http/Transformers/AccessoriesTransformer.php b/app/Http/Transformers/AccessoriesTransformer.php index 13a62c70b3..8b56ae05f6 100644 --- a/app/Http/Transformers/AccessoriesTransformer.php +++ b/app/Http/Transformers/AccessoriesTransformer.php @@ -45,10 +45,10 @@ class AccessoriesTransformer ]; $permissions_array['available_actions'] = [ - 'checkout' => Gate::allows('checkout', Accessory::class) ? true : false, + 'checkout' => Gate::allows('checkout', Accessory::class), 'checkin' => false, - 'update' => Gate::allows('update', Accessory::class) ? true : false, - 'delete' => Gate::allows('delete', Accessory::class) ? true : false, + 'update' => Gate::allows('update', Accessory::class) , + 'delete' => Gate::allows('delete', Accessory::class), ]; $permissions_array['user_can_checkout'] = false; diff --git a/app/Http/Transformers/AssetMaintenancesTransformer.php b/app/Http/Transformers/AssetMaintenancesTransformer.php index 8b93031886..49c1b38b65 100644 --- a/app/Http/Transformers/AssetMaintenancesTransformer.php +++ b/app/Http/Transformers/AssetMaintenancesTransformer.php @@ -58,8 +58,8 @@ class AssetMaintenancesTransformer ]; $permissions_array['available_actions'] = [ - 'update' => (bool) Gate::allows('update', Asset::class), - 'delete' => (bool) Gate::allows('delete', Asset::class), + 'update' => Gate::allows('update', Asset::class), + 'delete' => Gate::allows('delete', Asset::class), ]; $array += $permissions_array; diff --git a/app/Http/Transformers/AssetModelsTransformer.php b/app/Http/Transformers/AssetModelsTransformer.php index 4b2658e739..3f561b7b9f 100644 --- a/app/Http/Transformers/AssetModelsTransformer.php +++ b/app/Http/Transformers/AssetModelsTransformer.php @@ -54,10 +54,10 @@ class AssetModelsTransformer ]; $permissions_array['available_actions'] = [ - 'update' => (Gate::allows('update', AssetModel::class) && ($assetmodel->deleted_at=='')) ? true : false, - 'delete' => (Gate::allows('delete', AssetModel::class) && ($assetmodel->assets_count==0) && ($assetmodel->deleted_at=='')) ? true : false, - 'clone' => (Gate::allows('create', AssetModel::class) && ($assetmodel->deleted_at=='')) , - 'restore' => (Gate::allows('create', AssetModel::class) && ($assetmodel->deleted_at!='')) ? true : false, + 'update' => (Gate::allows('update', AssetModel::class) && ($assetmodel->deleted_at=='')), + 'delete' => (Gate::allows('delete', AssetModel::class) && ($assetmodel->assets_count==0)), + 'clone' => (Gate::allows('create', AssetModel::class) && ($assetmodel->deleted_at=='')), + 'restore' => (Gate::allows('create', AssetModel::class) && ($assetmodel->deleted_at!='')), ]; $array += $permissions_array; diff --git a/app/Http/Transformers/AssetsTransformer.php b/app/Http/Transformers/AssetsTransformer.php index 882b60ff76..400a5dd111 100644 --- a/app/Http/Transformers/AssetsTransformer.php +++ b/app/Http/Transformers/AssetsTransformer.php @@ -114,20 +114,20 @@ class AssetsTransformer } $permissions_array['available_actions'] = [ - 'checkout' => (bool) Gate::allows('checkout', Asset::class), - 'checkin' => (bool) Gate::allows('checkin', Asset::class), - 'clone' => Gate::allows('create', Asset::class) ? true : false, + 'checkout' => Gate::allows('checkout', Asset::class), + 'checkin' => Gate::allows('checkin', Asset::class), + 'clone' => Gate::allows('create', Asset::class), 'restore' => false, 'update' => (bool) Gate::allows('update', Asset::class), - 'delete' => ($asset->assigned_to=='' && Gate::allows('delete', Asset::class) ? true : false), + 'delete' => ($asset->assigned_to=='' && Gate::allows('delete', Asset::class)), ]; if ($asset->deleted_at!='') { $permissions_array['available_actions'] = [ 'checkout' => true, 'checkin' => false, - 'clone' => Gate::allows('create', Asset::class) ? true : false, - 'restore' => Gate::allows('create', Asset::class) ? true : false, + 'clone' => Gate::allows('create', Asset::class), + 'restore' => Gate::allows('create', Asset::class), 'update' => false, 'delete' => false, ]; diff --git a/app/Http/Transformers/CategoriesTransformer.php b/app/Http/Transformers/CategoriesTransformer.php index a76e8c0c19..d10c2ee4c3 100644 --- a/app/Http/Transformers/CategoriesTransformer.php +++ b/app/Http/Transformers/CategoriesTransformer.php @@ -27,10 +27,11 @@ class CategoriesTransformer 'id' => (int) $category->id, 'name' => e($category->name), 'image' => ($category->image) ? Storage::disk('public')->url('categories/'.e($category->image)) : null, - 'category_type' => e($category->category_type), - 'eula' => ($category->getEula()) ? true : false, - 'checkin_email' => ($category->checkin_email =='1') ? true : false, - 'require_acceptance' => ($category->require_acceptance =='1') ? true : false, + 'category_type' => ucwords(e($category->category_type)), + 'eula' => ($category->getEula()), + 'checkin_email' => ($category->checkin_email =='1'), + 'require_acceptance' => ($category->require_acceptance == '1'), + 'item_count' => (int) $category->itemCount(), 'assets_count' => (int) $category->assets_count, 'accessories_count' => (int) $category->accessories_count, 'consumables_count' => (int) $category->consumables_count, @@ -41,8 +42,8 @@ class CategoriesTransformer ]; $permissions_array['available_actions'] = [ - 'update' => Gate::allows('update', Category::class) ? true : false, - 'delete' => (Gate::allows('delete', Category::class) && ($category->assets_count == 0) && ($category->accessories_count == 0) && ($category->consumables_count == 0) && ($category->components_count == 0) && ($category->licenses_count == 0)) ? true : false, + 'update' => Gate::allows('update', Category::class), + 'delete' => $category->isDeletable(), ]; $array += $permissions_array; diff --git a/app/Http/Transformers/CompaniesTransformer.php b/app/Http/Transformers/CompaniesTransformer.php index 616353e9a8..4460b30c14 100644 --- a/app/Http/Transformers/CompaniesTransformer.php +++ b/app/Http/Transformers/CompaniesTransformer.php @@ -38,8 +38,8 @@ class CompaniesTransformer ]; $permissions_array['available_actions'] = [ - 'update' => Gate::allows('update', Company::class) ? true : false, - 'delete' => (Gate::allows('delete', Company::class) && ($company->assets_count == 0) && ($company->accessories_count == 0) && ($company->consumables_count == 0) && ($company->components_count == 0) && ($company->users_count == 0)) ? true : false, + 'update' => Gate::allows('update', Company::class), + 'delete' => $company->isDeletable() ]; $array += $permissions_array; diff --git a/app/Http/Transformers/ComponentsAssetsTransformer.php b/app/Http/Transformers/ComponentsAssetsTransformer.php index a38236e726..8ce3a8600d 100644 --- a/app/Http/Transformers/ComponentsAssetsTransformer.php +++ b/app/Http/Transformers/ComponentsAssetsTransformer.php @@ -28,10 +28,10 @@ class ComponentsAssetsTransformer ]; $permissions_array['available_actions'] = [ - 'checkout' => Gate::allows('checkout', Asset::class) ? true : false, - 'checkin' => Gate::allows('checkin', Asset::class) ? true : false, - 'update' => Gate::allows('update', Asset::class) ? true : false, - 'delete' => Gate::allows('delete', Asset::class) ? true : false, + 'checkout' => Gate::allows('checkout', Asset::class), + 'checkin' => Gate::allows('checkin', Asset::class), + 'update' => Gate::allows('update', Asset::class), + 'delete' => Gate::allows('delete', Asset::class), ]; diff --git a/app/Http/Transformers/ComponentsTransformer.php b/app/Http/Transformers/ComponentsTransformer.php index f81da099d4..c27deb2a1f 100644 --- a/app/Http/Transformers/ComponentsTransformer.php +++ b/app/Http/Transformers/ComponentsTransformer.php @@ -49,10 +49,10 @@ class ComponentsTransformer ]; $permissions_array['available_actions'] = [ - 'checkout' => (bool) Gate::allows('checkout', Component::class), - 'checkin' => (bool) Gate::allows('checkin', Component::class), - 'update' => (bool) Gate::allows('update', Component::class), - 'delete' => (bool) Gate::allows('delete', Component::class), + 'checkout' => Gate::allows('checkout', Component::class), + 'checkin' => Gate::allows('checkin', Component::class), + 'update' => Gate::allows('update', Component::class), + 'delete' => Gate::allows('delete', Component::class), ]; $array += $permissions_array; diff --git a/app/Http/Transformers/ConsumablesTransformer.php b/app/Http/Transformers/ConsumablesTransformer.php index 9d51c5e5c4..c82299de98 100644 --- a/app/Http/Transformers/ConsumablesTransformer.php +++ b/app/Http/Transformers/ConsumablesTransformer.php @@ -48,10 +48,10 @@ class ConsumablesTransformer } $permissions_array['available_actions'] = [ - 'checkout' => Gate::allows('checkout', Consumable::class) ? true : false, - 'checkin' => Gate::allows('checkin', Consumable::class) ? true : false, - 'update' => Gate::allows('update', Consumable::class) ? true : false, - 'delete' => Gate::allows('delete', Consumable::class) ? true : false, + 'checkout' => Gate::allows('checkout', Consumable::class), + 'checkin' => Gate::allows('checkin', Consumable::class), + 'update' => Gate::allows('update', Consumable::class), + 'delete' => Gate::allows('delete', Consumable::class), ]; $array += $permissions_array; return $array; diff --git a/app/Http/Transformers/DepartmentsTransformer.php b/app/Http/Transformers/DepartmentsTransformer.php index 83517ccd43..5429ba684f 100644 --- a/app/Http/Transformers/DepartmentsTransformer.php +++ b/app/Http/Transformers/DepartmentsTransformer.php @@ -47,8 +47,8 @@ class DepartmentsTransformer ]; $permissions_array['available_actions'] = [ - 'update' => Gate::allows('update', Department::class) ? true : false, - 'delete' => (Gate::allows('delete', Department::class) && ($department->users_count==0) && ($department->deleted_at=='')) ? true : false, + 'update' => Gate::allows('update', Department::class), + 'delete' => (Gate::allows('delete', Department::class) && ($department->users_count==0), ]; $array += $permissions_array; diff --git a/app/Http/Transformers/DepreciationsTransformer.php b/app/Http/Transformers/DepreciationsTransformer.php index 5f66eef8b4..0b9d011e23 100644 --- a/app/Http/Transformers/DepreciationsTransformer.php +++ b/app/Http/Transformers/DepreciationsTransformer.php @@ -29,8 +29,8 @@ class DepreciationsTransformer ]; $permissions_array['available_actions'] = [ - 'update' => Gate::allows('update', Depreciation::class) ? true : false, - 'delete' => Gate::allows('delete', Depreciation::class) ? true : false, + 'update' => Gate::allows('update', Depreciation::class), + 'delete' => Gate::allows('delete', Depreciation::class), ]; $array += $permissions_array; diff --git a/app/Http/Transformers/LicenseSeatsTransformer.php b/app/Http/Transformers/LicenseSeatsTransformer.php index 8811f3784c..f7685db167 100644 --- a/app/Http/Transformers/LicenseSeatsTransformer.php +++ b/app/Http/Transformers/LicenseSeatsTransformer.php @@ -46,15 +46,15 @@ class LicenseSeatsTransformer 'name'=> e($seat->location()->name) ] : null, 'reassignable' => (bool) $seat->license->reassignable, - 'user_can_checkout' => (($seat->assigned_to=='') && ($seat->asset_id=='')) ? true : false, + 'user_can_checkout' => (($seat->assigned_to=='') && ($seat->asset_id=='')), ]; $permissions_array['available_actions'] = [ - 'checkout' => Gate::allows('checkout', License::class) ? true : false, - 'checkin' => Gate::allows('checkin', License::class) ? true : false, - 'clone' => Gate::allows('create', License::class) ? true : false, - 'update' => Gate::allows('update', License::class) ? true : false, - 'delete' => Gate::allows('delete', License::class) ? true : false, + 'checkout' => Gate::allows('checkout', License::class), + 'checkin' => Gate::allows('checkin', License::class), + 'clone' => Gate::allows('create', License::class), + 'update' => Gate::allows('update', License::class), + 'delete' => Gate::allows('delete', License::class), ]; $array += $permissions_array; diff --git a/app/Http/Transformers/LicensesTransformer.php b/app/Http/Transformers/LicensesTransformer.php index 5a668b2f62..344213f939 100644 --- a/app/Http/Transformers/LicensesTransformer.php +++ b/app/Http/Transformers/LicensesTransformer.php @@ -45,11 +45,11 @@ class LicensesTransformer ]; $permissions_array['available_actions'] = [ - 'checkout' => Gate::allows('checkout', License::class) ? true : false, - 'checkin' => Gate::allows('checkin', License::class) ? true : false, - 'clone' => Gate::allows('create', License::class) ? true : false, - 'update' => Gate::allows('update', License::class) ? true : false, - 'delete' => Gate::allows('delete', License::class) ? true : false, + 'checkout' => Gate::allows('checkout', License::class), + 'checkin' => Gate::allows('checkin', License::class), + 'clone' => Gate::allows('create', License::class), + 'update' => Gate::allows('update', License::class), + 'delete' => Gate::allows('delete', License::class), ]; $array += $permissions_array; diff --git a/app/Http/Transformers/LocationsTransformer.php b/app/Http/Transformers/LocationsTransformer.php index b5e51a37ce..92f5cc965d 100644 --- a/app/Http/Transformers/LocationsTransformer.php +++ b/app/Http/Transformers/LocationsTransformer.php @@ -61,7 +61,7 @@ class LocationsTransformer $permissions_array['available_actions'] = [ 'update' => Gate::allows('update', Location::class) ? true : false, - 'delete' => (Gate::allows('delete', Location::class) && ($location->assigned_assets_count==0) && ($location->assets_count==0) && ($location->users_count==0) && ($location->deleted_at=='')) ? true : false, + 'delete' => $location->isDeletable(), ]; $array += $permissions_array; diff --git a/app/Http/Transformers/ManufacturersTransformer.php b/app/Http/Transformers/ManufacturersTransformer.php index 860652ef0a..1cdf5dd3fe 100644 --- a/app/Http/Transformers/ManufacturersTransformer.php +++ b/app/Http/Transformers/ManufacturersTransformer.php @@ -41,9 +41,9 @@ class ManufacturersTransformer ]; $permissions_array['available_actions'] = [ - 'update' => (($manufacturer->deleted_at=='') && (Gate::allows('update', Manufacturer::class))) ? true : false, - 'restore' => (($manufacturer->deleted_at!='') && (Gate::allows('create', Manufacturer::class))) ? true : false, - 'delete' => (Gate::allows('delete', Manufacturer::class) && ($manufacturer->assets_count == 0) && ($manufacturer->licenses_count==0) && ($manufacturer->consumables_count==0) && ($manufacturer->accessories_count==0) && ($manufacturer->deleted_at=='')) ? true : false, + 'update' => (($manufacturer->deleted_at=='') && (Gate::allows('update', Manufacturer::class))), + 'restore' => (($manufacturer->deleted_at!='') && (Gate::allows('create', Manufacturer::class))), + 'delete' => $manufacturer->isDeletable(), ]; $array += $permissions_array; diff --git a/app/Http/Transformers/PredefinedKitsTransformer.php b/app/Http/Transformers/PredefinedKitsTransformer.php index f130a659df..57e3aa62f4 100644 --- a/app/Http/Transformers/PredefinedKitsTransformer.php +++ b/app/Http/Transformers/PredefinedKitsTransformer.php @@ -34,7 +34,7 @@ class PredefinedKitsTransformer $permissions_array['available_actions'] = [ 'update' => Gate::allows('update', PredefinedKit::class), 'delete' => Gate::allows('delete', PredefinedKit::class), - 'checkout' => Gate::allows('checkout', PredefinedKit::class) ? true : false, + 'checkout' => Gate::allows('checkout', PredefinedKit::class), // 'clone' => Gate::allows('create', PredefinedKit::class), // 'restore' => Gate::allows('create', PredefinedKit::class), ]; diff --git a/app/Http/Transformers/SuppliersTransformer.php b/app/Http/Transformers/SuppliersTransformer.php index 44f483deac..95d15608d7 100644 --- a/app/Http/Transformers/SuppliersTransformer.php +++ b/app/Http/Transformers/SuppliersTransformer.php @@ -48,8 +48,8 @@ class SuppliersTransformer ]; $permissions_array['available_actions'] = [ - 'update' => Gate::allows('update', Supplier::class) ? true : false, - 'delete' => (Gate::allows('delete', Supplier::class) && ($supplier->assets_count == 0) && ($supplier->licenses_count == 0) && ($supplier->accessories_count == 0)) ? true : false, + 'update' => Gate::allows('update', Supplier::class), + 'delete' => (Gate::allows('delete', Supplier::class) && ($supplier->assets_count == 0) && ($supplier->licenses_count == 0) && ($supplier->accessories_count == 0)), ]; $array += $permissions_array; diff --git a/app/Http/Transformers/UsersTransformer.php b/app/Http/Transformers/UsersTransformer.php index 07b5fc1809..5f844d5883 100644 --- a/app/Http/Transformers/UsersTransformer.php +++ b/app/Http/Transformers/UsersTransformer.php @@ -66,10 +66,10 @@ class UsersTransformer ]; $permissions_array['available_actions'] = [ - 'update' => (Gate::allows('update', User::class) && ($user->deleted_at=='')) ? true : false, - 'delete' => (Gate::allows('delete', User::class) && ($user->deleted_at=='') && ($user->assets_count == 0) && ($user->licenses_count == 0) && ($user->accessories_count == 0) && ($user->consumables_count == 0)) ? true : false, + 'update' => (Gate::allows('update', User::class) && ($user->deleted_at=='')), + 'delete' => (Gate::allows('delete', User::class) && ($user->assets_count == 0) && ($user->licenses_count == 0) && ($user->accessories_count == 0) && ($user->consumables_count == 0)), 'clone' => (Gate::allows('create', User::class) && ($user->deleted_at=='')) , - 'restore' => (Gate::allows('create', User::class) && ($user->deleted_at!='')) ? true : false, + 'restore' => (Gate::allows('create', User::class) && ($user->deleted_at!='')), ]; $array += $permissions_array; diff --git a/app/Models/Category.php b/app/Models/Category.php index b42463addd..ae60a1d735 100755 --- a/app/Models/Category.php +++ b/app/Models/Category.php @@ -5,6 +5,7 @@ use App\Http\Traits\UniqueUndeletedTrait; use App\Models\Traits\Searchable; use App\Presenters\Presentable; use Illuminate\Database\Eloquent\SoftDeletes; +use Illuminate\Support\Facades\Gate; use Watson\Validating\ValidatingTrait; /** @@ -69,22 +70,35 @@ class Category extends SnipeModel ]; use Searchable; - + /** * The attributes that should be included when searching the model. - * + * * @var array */ protected $searchableAttributes = ['name', 'category_type']; /** * The relations and their attributes that should be included when searching the model. - * + * * @var array */ protected $searchableRelations = []; + /** + * Checks if category can be deleted + * + * @author [Dan Meltzer] [] + * @since [v5.0] + * @return bool + */ + public function isDeletable() + { + return (Gate::allows('delete', $this) + && ($this->itemCount() == 0)); + } + /** * Establishes the category -> accessories relationship * diff --git a/app/Models/Company.php b/app/Models/Company.php index a1094b60ea..c81655029e 100644 --- a/app/Models/Company.php +++ b/app/Models/Company.php @@ -5,6 +5,7 @@ use App\Models\Traits\Searchable; use App\Presenters\Presentable; use Auth; use DB; +use Illuminate\Support\Facades\Gate; use Watson\Validating\ValidatingTrait; /** @@ -84,7 +85,6 @@ final class Company extends SnipeModel } else { return $query->join('users as users_comp', 'users_comp.id', 'user_id')->where('users_comp.company_id', '=', $company_id); } - } public static function getIdFromInput($unescaped_input) @@ -143,6 +143,22 @@ final class Company extends SnipeModel Auth::user()->company_id == null); } + /** + * Checks if company can be deleted + * + * @author [Dan Meltzer] [] + * @since [v5.0] + * @return bool + */ + public function isDeletable() { + return Gate::allows('delete', $this) + && ($this->assets()->count() === 0) + && ($this->accessories()->count() === 0) + && ($this->consumables()->count() === 0) + && ($this->components()->count() === 0) + && ($this->users()->count() === 0); + } + public static function getIdForUser($unescaped_input) { if (!static::isFullMultipleCompanySupportEnabled() || Auth::user()->isSuperUser()) { diff --git a/app/Models/Location.php b/app/Models/Location.php index 3b6f862e52..dd1a8c5a43 100755 --- a/app/Models/Location.php +++ b/app/Models/Location.php @@ -7,10 +7,11 @@ use App\Models\SnipeModel; use App\Models\Traits\Searchable; use App\Models\User; use App\Presenters\Presentable; +use DB; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; +use Illuminate\Support\Facades\Gate; use Watson\Validating\ValidatingTrait; -use DB; class Location extends SnipeModel { @@ -86,6 +87,14 @@ class Location extends SnipeModel 'parent' => ['name'] ]; + public function isDeletable() + { + return Gate::allows('delete', $this) + && ($this->assignedAssets()->count()===0) + && ($this->assets()->count()===0) + && ($this->users()->count()===0); + } + public function users() { return $this->hasMany('\App\Models\User', 'location_id'); diff --git a/app/Models/Manufacturer.php b/app/Models/Manufacturer.php index c684c068d1..00ac8e7608 100755 --- a/app/Models/Manufacturer.php +++ b/app/Models/Manufacturer.php @@ -4,6 +4,7 @@ namespace App\Models; use App\Models\Traits\Searchable; use App\Presenters\Presentable; use Illuminate\Database\Eloquent\SoftDeletes; +use Illuminate\Support\Facades\Gate; use Watson\Validating\ValidatingTrait; class Manufacturer extends SnipeModel @@ -49,22 +50,30 @@ class Manufacturer extends SnipeModel ]; use Searchable; - + /** * The attributes that should be included when searching the model. - * + * * @var array */ protected $searchableAttributes = ['name', 'created_at']; /** * The relations and their attributes that should be included when searching the model. - * + * * @var array */ - protected $searchableRelations = []; + protected $searchableRelations = []; + public function isDeletable() + { + return (Gate::allows('delete', $this) + && ($this->assets()->count() === 0) + && ($this->licenses()->count() === 0) + && ($this->consumables()->count() === 0) + && ($this->accessories()->count() === 0)); + } public function assets() { diff --git a/app/Policies/SnipePermissionsPolicy.php b/app/Policies/SnipePermissionsPolicy.php index e17f4f68e5..435828fd14 100644 --- a/app/Policies/SnipePermissionsPolicy.php +++ b/app/Policies/SnipePermissionsPolicy.php @@ -91,7 +91,11 @@ abstract class SnipePermissionsPolicy */ public function delete(User $user, $item = null) { - return $user->hasAccess($this->columnName().'.delete'); + $itemConditional = true; + if ($item) { + $itemConditional = empty($item->deleted_at); + } + return $itemConditional && $user->hasAccess($this->columnName().'.delete'); } /** diff --git a/app/Presenters/CategoryPresenter.php b/app/Presenters/CategoryPresenter.php index 248a875822..16c49b4420 100644 --- a/app/Presenters/CategoryPresenter.php +++ b/app/Presenters/CategoryPresenter.php @@ -43,52 +43,27 @@ class CategoryPresenter extends Presenter "sortable" => true, "title" => trans('general.type'), "visible" => true - ], [ - "field" => "assets_count", + ],[ + "field" => "item_count", "searchable" => false, "sortable" => true, - "title" => trans('general.assets'), + "title" => trans('general.qty'), "visible" => true - ], [ - "field" => "accessories_count", - "searchable" => false, - "sortable" => true, - "title" => trans('general.accessories'), - "visible" => true - ], [ - "field" => "consumables_count", - "searchable" => false, - "sortable" => true, - "title" => trans('general.consumables'), - "visible" => true - ], [ - "field" => "components_count", - "searchable" => false, - "sortable" => true, - "title" => trans('general.components'), - "visible" => true - ], [ - "field" => "licenses_count", - "searchable" => false, - "sortable" => true, - "title" => trans('general.licenses'), - "visible" => true - ], [ + ],[ "field" => "eula", "searchable" => false, "sortable" => false, "title" => trans('admin/categories/table.eula_text'), "visible" => false, "formatter" => 'trueFalseFormatter', - ], [ + ],[ "field" => "require_acceptance", "searchable" => false, "sortable" => true, "title" => trans('admin/categories/table.require_acceptance'), "visible" => true, "formatter" => 'trueFalseFormatter', - ], - [ + ],[ "field" => "actions", "searchable" => false, "sortable" => false,