From 7321c5937fcb41206e712fc21723d7306bf3ffc4 Mon Sep 17 00:00:00 2001 From: snipe Date: Thu, 16 Nov 2017 16:49:16 -0800 Subject: [PATCH] Fixed #4440 - allow username search in asset dropdown --- app/Http/Controllers/Api/AssetsController.php | 21 ++++-- app/Models/Asset.php | 72 ++++++++++++++++--- 2 files changed, 78 insertions(+), 15 deletions(-) diff --git a/app/Http/Controllers/Api/AssetsController.php b/app/Http/Controllers/Api/AssetsController.php index 2f44ac7965..2980057ea6 100644 --- a/app/Http/Controllers/Api/AssetsController.php +++ b/app/Http/Controllers/Api/AssetsController.php @@ -281,27 +281,34 @@ class AssetsController extends Controller 'assets.name', 'assets.asset_tag', 'assets.model_id', + 'assets.assigned_to', + 'assets.assigned_type', 'assets.status_id' - ])->with('model', 'assetstatus')->NotArchived()); + ])->with('model', 'assetstatus', 'assignedTo')->NotArchived()); if ($request->has('search')) { - $assets = $assets->where('assets.name', 'LIKE', '%'.$request->get('search').'%') - ->orWhere('assets.asset_tag', 'LIKE', '%'.$request->get('search').'%') - ->join('models AS assets_models',function ($join) use ($request) { - $join->on('assets_models.id', "=", "assets.model_id"); - })->orWhere('assets_models.name','LIKE','%'.$request->get('search').'%'); + $assets = $assets->AssignedSearch($request->input('search')); } + $assets = $assets->paginate(50); // Loop through and set some custom properties for the transformer to use. // This lets us have more flexibility in special cases like assets, where // they may not have a ->name value but we want to display something anyway foreach ($assets as $asset) { + + $asset->use_text = $asset->present()->fullName; + + if ($asset->checkedOutToUser()) { + $asset->use_text .= ' → '.$asset->assigned->getFullNameAttribute(); + } + + if ($asset->assetstatus->getStatuslabelType()=='pending') { - $asset->use_text = $asset->present()->fullName.' ('.$asset->assetstatus->getStatuslabelType().')'; + $asset->use_text .= '('.$asset->assetstatus->getStatuslabelType().')'; } $asset->use_image = ($asset->getImageUrl()) ? $asset->getImageUrl() : null; diff --git a/app/Models/Asset.php b/app/Models/Asset.php index a8d0035b7a..e71ae82b6a 100644 --- a/app/Models/Asset.php +++ b/app/Models/Asset.php @@ -765,11 +765,11 @@ class Asset extends Depreciable { $search = explode(' OR ', $search); - return $query->leftJoin('users',function ($leftJoin) { - $leftJoin->on("users.id", "=", "assets.assigned_to") + return $query->leftJoin('users as assets_users',function ($leftJoin) { + $leftJoin->on("assets_users.id", "=", "assets.assigned_to") ->where("assets.assigned_type", "=", User::class); - })->leftJoin('locations',function ($leftJoin) { - $leftJoin->on("locations.id","=","assets.assigned_to") + })->leftJoin('locations as assets_locations',function ($leftJoin) { + $leftJoin->on("assets_locations.id","=","assets.assigned_to") ->where("assets.assigned_type","=",Location::class); })->leftJoin('assets as assigned_assets',function ($leftJoin) { $leftJoin->on('assigned_assets.id', '=', 'assets.assigned_to') @@ -808,10 +808,10 @@ class Asset extends Depreciable $query->where('locations.name', 'LIKE', '%'.$search.'%'); }); })->orWhere(function ($query) use ($search) { - $query->where('users.first_name', 'LIKE', '%'.$search.'%') - ->orWhere('users.last_name', 'LIKE', '%'.$search.'%') - ->orWhere('users.username', 'LIKE', '%'.$search.'%') - ->orWhere('locations.name', 'LIKE', '%'.$search.'%') + $query->where('assets_users.first_name', 'LIKE', '%'.$search.'%') + ->orWhere('assets_users.last_name', 'LIKE', '%'.$search.'%') + ->orWhere('assets_users.username', 'LIKE', '%'.$search.'%') + ->orWhere('assets_locations.name', 'LIKE', '%'.$search.'%') ->orWhere('assigned_assets.name', 'LIKE', '%'.$search.'%'); })->orWhere('assets.name', 'LIKE', '%'.$search.'%') ->orWhere('assets.asset_tag', 'LIKE', '%'.$search.'%') @@ -826,6 +826,62 @@ class Asset extends Depreciable } + /** + * Query builder scope to search on text for complex Bootstrap Tables API. + * + * @param \Illuminate\Database\Query\Builder $query Query builder instance + * @param text $search Search term + * + * @return \Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeAssignedSearch($query, $search) + { + $search = explode(' OR ', $search); + + return $query->leftJoin('users as assets_users',function ($leftJoin) { + $leftJoin->on("assets_users.id", "=", "assets.assigned_to") + ->where("assets.assigned_type", "=", User::class); + })->leftJoin('locations as assets_locations',function ($leftJoin) { + $leftJoin->on("assets_locations.id","=","assets.assigned_to") + ->where("assets.assigned_type","=",Location::class); + })->leftJoin('assets as assigned_assets',function ($leftJoin) { + $leftJoin->on('assigned_assets.id', '=', 'assets.assigned_to') + ->where('assets.assigned_type', '=', Asset::class); + })->where(function ($query) use ($search) { + foreach ($search as $search) { + $query->whereHas('model', function ($query) use ($search) { + $query->whereHas('category', function ($query) use ($search) { + $query->where(function ($query) use ($search) { + $query->where('categories.name', 'LIKE', '%'.$search.'%') + ->orWhere('models.name', 'LIKE', '%'.$search.'%') + ->orWhere('models.model_number', 'LIKE', '%'.$search.'%'); + }); + }); + })->orWhereHas('model', function ($query) use ($search) { + $query->whereHas('manufacturer', function ($query) use ($search) { + $query->where(function ($query) use ($search) { + $query->where('manufacturers.name', 'LIKE', '%'.$search.'%'); + }); + }); + })->orWhere(function ($query) use ($search) { + $query->where('assets_users.first_name', 'LIKE', '%'.$search.'%') + ->orWhere('assets_users.last_name', 'LIKE', '%'.$search.'%') + ->orWhere('assets_users.username', 'LIKE', '%'.$search.'%') + ->orWhere('assets_locations.name', 'LIKE', '%'.$search.'%') + ->orWhere('assigned_assets.name', 'LIKE', '%'.$search.'%'); + })->orWhere('assets.name', 'LIKE', '%'.$search.'%') + ->orWhere('assets.asset_tag', 'LIKE', '%'.$search.'%') + ->orWhere('assets.serial', 'LIKE', '%'.$search.'%') + ->orWhere('assets.order_number', 'LIKE', '%'.$search.'%') + ->orWhere('assets.notes', 'LIKE', '%'.$search.'%'); + } + foreach (CustomField::all() as $field) { + $query->orWhere('assets.'.$field->db_column_name(), 'LIKE', "%$search%"); + } + })->withTrashed()->whereNull("assets.deleted_at"); //workaround for laravel bug + } + + /** * Query builder scope to search on text filters for complex Bootstrap Tables API