diff --git a/.env.example b/.env.example index 7da2ad49bebf..5f7ab855016a 100644 --- a/.env.example +++ b/.env.example @@ -222,4 +222,4 @@ ARGON_TIME=2 # OPTIONAL: SCIM # -------------------------------------------- SCIM_TRACE=false -SCIM_STANDARDS_COMPLIANCE=false \ No newline at end of file +SCIM_STANDARDS_COMPLIANCE=false diff --git a/.gitignore b/.gitignore index 613474217e6e..17a7d28dab80 100755 --- a/.gitignore +++ b/.gitignore @@ -70,7 +70,4 @@ storage/ldap_client_tls.cert storage/ldap_client_tls.key /storage/framework/testing -/.phpunit.cache - -#Ignore vscode AI rules -.github/instructions/codacy.instructions.md +/.phpunit.cache \ No newline at end of file diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index 55c650a3038b..cc66a080120a 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -150,19 +150,19 @@ public function render($request, Throwable $e) // Sigh. if ($route == 'assets.index') { $route = 'hardware.index'; - } else if ($route == 'reporttemplates.index') { + } elseif ($route == 'reporttemplates.index') { $route = 'reports/custom'; - } else if ($route == 'assetmodels.index') { + } elseif ($route == 'assetmodels.index') { $route = 'models.index'; - } else if ($route == 'predefinedkits.index') { + } elseif ($route == 'predefinedkits.index') { $route = 'kits.index'; - } else if ($route == 'assetmaintenances.index') { + } elseif ($route == 'assetmaintenances.index') { $route = 'maintenances.index'; - } else if ($route === 'licenseseats.index') { + } elseif ($route === 'licenseseats.index') { $route = 'licenses.index'; - } else if (($route === 'customfieldsets.index') || ($route === 'customfields.index')) { + } elseif (($route === 'customfieldsets.index') || ($route === 'customfields.index')) { $route = 'fields.index'; - } else if ($route === 'predefinedfilters.index') { + } elseif ($route === 'predefinedfilters.index') { $route = 'predefined-filters.index'; } diff --git a/app/Http/Controllers/Api/AssetsController.php b/app/Http/Controllers/Api/AssetsController.php index 91d5e365b40e..740f9136c404 100644 --- a/app/Http/Controllers/Api/AssetsController.php +++ b/app/Http/Controllers/Api/AssetsController.php @@ -58,7 +58,7 @@ class AssetsController extends Controller * @param int $assetId * @since [v4.0] */ - public function index(FilterRequest $request, $action = null, $upcoming_status = null):JsonResponse|array + public function index(FilterRequest $request, $action = null, $upcoming_status = null) : JsonResponse | array { @@ -135,7 +135,7 @@ public function index(FilterRequest $request, $action = null, $upcoming_status = 'created_by', ]; - + $all_custom_fields = CustomField::all(); //used as a 'cache' of custom fields throughout this page load foreach ($all_custom_fields as $field) { @@ -159,7 +159,6 @@ public function index(FilterRequest $request, $action = null, $upcoming_status = $allowed_columns[] = $field->db_column_name(); } - $assets = Asset::select('assets.*') ->with( 'model', @@ -196,7 +195,7 @@ public function index(FilterRequest $request, $action = null, $upcoming_status = } } - if ((!is_null($filter)) && (count($filter)) > 0) { + if ((! is_null($filter)) && (count($filter)) > 0) { $assets->ByFilter($filter); } elseif ($request->filled('search')) { $assets->TextSearch($request->input('search')); @@ -207,7 +206,7 @@ public function index(FilterRequest $request, $action = null, $upcoming_status = * Handle due and overdue audits and checkin dates */ switch ($action) { - // Audit (singular) is left over from earlier legacy APIs + // Audit (singular) is left over from earlier legacy APIs case 'audits': switch ($upcoming_status) { case 'due': @@ -300,7 +299,7 @@ public function index(FilterRequest $request, $action = null, $upcoming_status = break; default: - if ((!$request->filled('status_id')) && ($settings->show_archived_in_list != '1')) { + if ((! $request->filled('status_id')) && ($settings->show_archived_in_list != '1')) { // terrible workaround for complex-query Laravel bug in fulltext $assets->join('status_labels AS status_alias', function ($join) { $join->on('status_alias.id', '=', 'assets.status_id') @@ -332,7 +331,7 @@ public function index(FilterRequest $request, $action = null, $upcoming_status = if ($request->input('requestable') == 'true') { $assets->where('assets.requestable', '=', '1'); } - + if ($request->filled('model_id')) { // If model_id is already an array, just use it as-is if (is_array($request->input('model_id'))) { @@ -487,11 +486,9 @@ public function index(FilterRequest $request, $action = null, $upcoming_status = * Include additional associated relationships */ if ($request->input('components')) { - $assets->loadMissing([ - 'components' => function ($query) { - $query->orderBy('created_at', 'desc'); - } - ]); + $assets->loadMissing(['components' => function ($query) { + $query->orderBy('created_at', 'desc'); + }]); } return (new $transformer)->transformAssets($assets, $total, $request); @@ -584,18 +581,11 @@ public function showBySerial(Request $request, $serial): JsonResponse | array * @since [v4.0] * @return \Illuminate\Http\JsonResponse */ - public function show(Request $request, $id): JsonResponse|array + public function show(Request $request, $id): JsonResponse | array { - if ( - $asset = Asset::with('assetstatus') - ->with('assignedTo') - ->withTrashed() - ->withCount( - 'checkins as checkins_count', - 'checkouts as checkouts_count', - 'userRequests as user_requests_count' - ) - ->find($id) + if ($asset = Asset::with('assetstatus') + ->with('assignedTo')->withTrashed() + ->withCount('checkins as checkins_count', 'checkouts as checkouts_count', 'userRequests as user_requests_count')->find($id) ) { $this->authorize('view', $asset); @@ -636,7 +626,7 @@ public function selectlist(Request $request): array ])->with('model', 'assetstatus', 'assignedTo') ->NotArchived(); - if ((Setting::getSettings()->full_multiple_companies_support=='1') && ($request->filled('companyId'))) { + if ((Setting::getSettings()->full_multiple_companies_support=='1') && ($request->filled('companyId'))) { $assets->where('assets.company_id', $request->input('companyId')); } @@ -687,7 +677,7 @@ public function store(StoreAssetRequest $request): JsonResponse $asset->model()->associate(AssetModel::find((int) $request->get('model_id'))); $asset->fill($request->validated()); - $asset->created_by = auth()->id(); + $asset->created_by = auth()->id(); /** * this is here just legacy reasons. Api\AssetController @@ -1131,6 +1121,7 @@ public function checkinByTag(Request $request, $tag = null): JsonResponse * @since [v4.0] */ public function audit(Request $request, Asset $asset): JsonResponse + { $this->authorize('audit', Asset::class); @@ -1173,7 +1164,7 @@ public function audit(Request $request, Asset $asset): JsonResponse * Update custom fields in the database. * Validation for these fields is handled through the AssetRequest form request * $model = AssetModel::find($request->get('model_id')); - */ + */ if (($asset->model) && ($asset->model->fieldset)) { $payload['custom_fields'] = []; foreach ($asset->model->fieldset->fields as $field) { @@ -1193,7 +1184,7 @@ public function audit(Request $request, Asset $asset): JsonResponse $asset->{$field->db_column} = $request->input($field->db_column); } } - $payload['custom_fields'][$field->db_column] = $request->input($field->db_column); + $payload['custom_fields'][$field->db_column] = $request->input($field->db_column); } } @@ -1204,7 +1195,7 @@ public function audit(Request $request, Asset $asset): JsonResponse // Validate the rest of the data before we turn off the event dispatcher if ($asset->isInvalid()) { - return response()->json(Helper::formatStandardApiResponse('error', ['asset_tag' => $asset->asset_tag], $asset->getErrors())); + return response()->json(Helper::formatStandardApiResponse('error', ['asset_tag' => $asset->asset_tag], $asset->getErrors())); } @@ -1225,7 +1216,7 @@ public function audit(Request $request, Asset $asset): JsonResponse * @see \App\Models\Asset::save() */ - $asset->unsetEventDispatcher(); + $asset->unsetEventDispatcher(); /** @@ -1241,7 +1232,7 @@ public function audit(Request $request, Asset $asset): JsonResponse // No matching asset for the asset tag that was passed. - return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.does_not_exist')), 200); + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.does_not_exist')), 200); } @@ -1396,26 +1387,20 @@ public function getLabels(Request $request): JsonResponse try { $this->authorize('view', Asset::class); - // Validate that asset tags were provided in the request + // Validate that asset tags were provided in the request if (!$request->filled('asset_tags')) { - return response()->json(Helper::formatStandardApiResponse( - 'error', - null, - trans('admin/hardware/message.no_assets_selected') - ), 400); + return response()->json(Helper::formatStandardApiResponse('error', null, + trans('admin/hardware/message.no_assets_selected')), 400); } - // Convert asset tags from request into collection and fetch matching assets + // Convert asset tags from request into collection and fetch matching assets $asset_tags = collect($request->input('asset_tags')); $assets = Asset::whereIn('asset_tag', $asset_tags)->get(); - // Return error if no assets were found for the provided tags + // Return error if no assets were found for the provided tags if ($assets->isEmpty()) { - return response()->json(Helper::formatStandardApiResponse( - 'error', - null, - trans('admin/hardware/message.does_not_exist') - ), 404); + return response()->json(Helper::formatStandardApiResponse('error', null, + trans('admin/hardware/message.does_not_exist')), 404); } try { @@ -1435,9 +1420,9 @@ public function getLabels(Request $request): JsonResponse // Configure label with assets and settings // bulkedit=false and count=0 are default values for label generation $label = $label->with('assets', $assets) - ->with('settings', $settings) - ->with('bulkedit', false) - ->with('count', 0); + ->with('settings', $settings) + ->with('bulkedit', false) + ->with('count', 0); // Generate PDF using callback function // The callback captures the PDF content in $pdf_content variable diff --git a/app/Http/Controllers/Api/GroupsController.php b/app/Http/Controllers/Api/GroupsController.php index 00bdb269784a..c044440c6680 100644 --- a/app/Http/Controllers/Api/GroupsController.php +++ b/app/Http/Controllers/Api/GroupsController.php @@ -115,7 +115,7 @@ public function show($id) : array * @param \Illuminate\Http\Request $request * @param int $id */ - public function update(Request $request, $id): JsonResponse + public function update(Request $request, $id) : JsonResponse { $this->authorize('superadmin'); $group = Group::findOrFail($id); @@ -138,7 +138,7 @@ public function update(Request $request, $id): JsonResponse * @since [v4.0] * @param int $id */ - public function destroy($id): JsonResponse + public function destroy($id) : JsonResponse { $this->authorize('superadmin'); $group = Group::findOrFail($id); diff --git a/app/Http/Controllers/Assets/AssetsController.php b/app/Http/Controllers/Assets/AssetsController.php index ab6c1ed2a9aa..4b5736dee9af 100755 --- a/app/Http/Controllers/Assets/AssetsController.php +++ b/app/Http/Controllers/Assets/AssetsController.php @@ -70,7 +70,7 @@ public function __construct(PredefinedFilterService $predefinedFilterService) * @since [v1.0] * @param Request $request */ - public function index(Request $request): View + public function index(Request $request) : View { $this->authorize('index', Asset::class); $company = Company::find($request->input('company_id')); @@ -116,7 +116,7 @@ public function index(Request $request): View * @param Request $request * @internal param int $model_id */ - public function create(Request $request): View + public function create(Request $request) : View { $this->authorize('create', Asset::class); $view = view('hardware/edit') @@ -311,10 +311,8 @@ public function store(CreateMultipleAssetRequest $request): RedirectResponse session()->put(['redirect_option' => $request->get('redirect_option')]); } - session()->put([ - 'checkout_to_type' => $request->get('checkout_to_type'), - 'other_redirect' => 'model' - ]); + session()->put(['checkout_to_type' => $request->get('checkout_to_type'), + 'other_redirect' => 'model' ]); @@ -322,7 +320,7 @@ public function store(CreateMultipleAssetRequest $request): RedirectResponse if ($failures) { //some succeeded, some failed return Helper::getRedirectOption($request, $asset->id, 'Assets') //FIXME - not tested - ->with('success-unescaped', trans_choice('admin/hardware/message.create.multi_success_linked', $successes, ['links' => join(", ", $successes)])) + ->with('success-unescaped', trans_choice('admin/hardware/message.create.multi_success_linked', $successes, ['links' => join(", ", $successes)])) ->with('warning', trans_choice('admin/hardware/message.create.partial_failure', $failures, ['failures' => join("; ", $failures)])); } else { if (count($successes) == 1) { @@ -350,7 +348,7 @@ public function store(CreateMultipleAssetRequest $request): RedirectResponse * @since [v1.0] * @return \Illuminate\Contracts\View\View */ - public function edit(Asset $asset): View|RedirectResponse + public function edit(Asset $asset) : View | RedirectResponse { $this->authorize($asset); session()->put('back_url', url()->previous()); @@ -369,7 +367,7 @@ public function edit(Asset $asset): View|RedirectResponse * @since [v1.0] * @return \Illuminate\Contracts\View\View */ - public function show(Asset $asset): View|RedirectResponse + public function show(Asset $asset) : View | RedirectResponse { $this->authorize('view', $asset); $settings = Setting::getSettings(); @@ -409,7 +407,7 @@ public function show(Asset $asset): View|RedirectResponse * @since [v1.0] * @author [A. Gianotto] [] */ - public function update(ImageUploadRequest $request, Asset $asset): RedirectResponse + public function update(ImageUploadRequest $request, Asset $asset) : RedirectResponse { $this->authorize($asset); @@ -420,24 +418,24 @@ public function update(ImageUploadRequest $request, Asset $asset): RedirectRespo $asset->purchase_date = $request->input('purchase_date', null); $asset->next_audit_date = $request->input('next_audit_date', null); if ($request->filled('purchase_date') && !$request->filled('asset_eol_date') && ($asset->model?->eol > 0)) { - $asset->purchase_date = $request->input('purchase_date', null); + $asset->purchase_date = $request->input('purchase_date', null); $asset->asset_eol_date = Carbon::parse($request->input('purchase_date'))->addMonths($asset->model->eol)->format('Y-m-d'); $asset->eol_explicit = false; } elseif ($request->filled('asset_eol_date')) { - $asset->asset_eol_date = $request->input('asset_eol_date', null); + $asset->asset_eol_date = $request->input('asset_eol_date', null); $months = (int) Carbon::parse($asset->asset_eol_date)->diffInMonths($asset->purchase_date, true); - if ($asset->model->eol) { - if ($months != $asset->model->eol > 0) { - $asset->eol_explicit = true; - } else { - $asset->eol_explicit = false; - } - } else { - $asset->eol_explicit = true; - } + if($asset->model->eol) { + if($months != $asset->model->eol > 0) { + $asset->eol_explicit = true; + } else { + $asset->eol_explicit = false; + } + } else { + $asset->eol_explicit = true; + } } elseif (!$request->filled('asset_eol_date') && (($asset->model?->eol) == 0)) { - $asset->asset_eol_date = null; - $asset->eol_explicit = false; + $asset->asset_eol_date = null; + $asset->eol_explicit = false; } $asset->supplier_id = $request->input('supplier_id', null); $asset->expected_checkin = $request->input('expected_checkin', null); @@ -460,7 +458,7 @@ public function update(ImageUploadRequest $request, Asset $asset): RedirectRespo if ($request->filled('image_delete')) { try { - unlink(public_path() . '/uploads/assets/' . $asset->image); + unlink(public_path().'/uploads/assets/'.$asset->image); $asset->image = ''; } catch (\Exception $e) { Log::info($e); @@ -549,7 +547,7 @@ public function update(ImageUploadRequest $request, Asset $asset): RedirectRespo * @param int $assetId * @since [v1.0] */ - public function destroy(Request $request, $assetId): RedirectResponse + public function destroy(Request $request, $assetId) : RedirectResponse { // Check if the asset exists if (is_null($asset = Asset::find($assetId))) { @@ -573,7 +571,7 @@ public function destroy(Request $request, $assetId): RedirectResponse if ($asset->image) { try { - Storage::disk('public')->delete('assets' . '/' . $asset->image); + Storage::disk('public')->delete('assets'.'/'.$asset->image); } catch (\Exception $e) { Log::debug($e); } @@ -591,9 +589,9 @@ public function destroy(Request $request, $assetId): RedirectResponse * @author [A. Gianotto] [] * @since [v3.0] */ - public function getAssetBySerial(Request $request): RedirectResponse + public function getAssetBySerial(Request $request) : RedirectResponse { - $topsearch = ($request->get('topsearch') == "true"); + $topsearch = ($request->get('topsearch')=="true"); if (!$asset = Asset::where('serial', '=', $request->get('serial'))->first()) { return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist')); @@ -609,7 +607,7 @@ public function getAssetBySerial(Request $request): RedirectResponse * @since [v3.0] * @return \Illuminate\Http\RedirectResponse */ - public function getAssetByTag(Request $request, $tag=null): RedirectResponse + public function getAssetByTag(Request $request, $tag=null) : RedirectResponse { $tag = $tag ? $tag : $request->get('assetTag'); $topsearch = ($request->get('topsearch') == 'true'); @@ -621,7 +619,7 @@ public function getAssetByTag(Request $request, $tag=null): RedirectResponse if ($assets->count() != 1) { return redirect()->route('hardware.index') ->with('search', $tag) - ->with('warning', trans('admin/hardware/message.does_not_exist_var', ['asset_tag' => $tag])); + ->with('warning', trans('admin/hardware/message.does_not_exist_var', [ 'asset_tag' => $tag ])); } $asset = $assets->first(); $this->authorize('view', $asset); @@ -637,7 +635,7 @@ public function getAssetByTag(Request $request, $tag=null): RedirectResponse * @param int $assetId * @since [v1.0] */ - public function getQrCode(Asset $asset): Response|BinaryFileResponse|string|bool + public function getQrCode(Asset $asset) : Response | BinaryFileResponse | string | bool { $settings = Setting::getSettings(); @@ -645,7 +643,7 @@ public function getQrCode(Asset $asset): Response|BinaryFileResponse|string|bool if ($asset) { $size = Helper::barcodeDimensions($settings->label2_2d_type); - $qr_file = public_path() . '/uploads/barcodes/qr-' . str_slug($asset->asset_tag) . '-' . str_slug($asset->id) . '.png'; + $qr_file = public_path().'/uploads/barcodes/qr-'.str_slug($asset->asset_tag).'-'.str_slug($asset->id).'.png'; if (isset($asset->id, $asset->asset_tag)) { if (file_exists($qr_file)) { @@ -679,7 +677,7 @@ public function getBarCode($assetId = null) { $settings = Setting::getSettings(); if ($asset = Asset::withTrashed()->find($assetId)) { - $barcode_file = public_path() . '/uploads/barcodes/' . str_slug($settings->label2_1d_type) . '-' . str_slug($asset->asset_tag) . '.png'; + $barcode_file = public_path().'/uploads/barcodes/'.str_slug($settings->label2_1d_type).'-'.str_slug($asset->asset_tag).'.png'; if (isset($asset->id, $asset->asset_tag)) { if (file_exists($barcode_file)) { @@ -696,7 +694,7 @@ public function getBarCode($assetId = null) file_put_contents($barcode_file, $barcode_obj->getPngData()); return response($barcode_obj->getPngData())->header('Content-type', 'image/png'); - } catch (\Exception | TypeError $e) { + } catch (\Exception|TypeError $e) { Log::debug('The barcode format is invalid.'); return response(file_get_contents(public_path('uploads/barcodes/invalid_barcode.gif')))->header('Content-type', 'image/gif'); @@ -721,7 +719,7 @@ public function getLabel($assetId = null) $this->authorize('view', $asset); return (new Label()) - ->with('assets', collect([$asset])) + ->with('assets', collect([ $asset ])) ->with('settings', Setting::getSettings()) ->with('template', request()->get('template')) ->with('offset', request()->get('offset')) @@ -787,11 +785,11 @@ public function getImportHistory() */ public function postImportHistory(Request $request) { - if (!$request->hasFile('user_import_csv')) { + if (! $request->hasFile('user_import_csv')) { return back()->with('error', 'No file provided. Please select a file for import and try again. '); } - if (!ini_get('auto_detect_line_endings')) { + if (! ini_get('auto_detect_line_endings')) { ini_set('auto_detect_line_endings', '1'); } $csv = Reader::createFromPath($request->file('user_import_csv')); @@ -802,7 +800,7 @@ public function postImportHistory(Request $request) $results = $csv->getRecords(); } catch (\Exception $e) { return back()->with('error', trans('general.error_in_import_file', ['error' => $e->getMessage()])); - } + } $item = []; $status = []; $status['error'] = []; @@ -811,7 +809,7 @@ public function postImportHistory(Request $request) if (is_array($row)) { $row = array_change_key_case($row, CASE_LOWER); $asset_tag = Helper::array_smart_fetch($row, 'asset tag'); - if (!array_key_exists($asset_tag, $item)) { + if (! array_key_exists($asset_tag, $item)) { $item[$asset_tag] = []; } $batch_counter = count($item[$asset_tag]); @@ -819,7 +817,7 @@ public function postImportHistory(Request $request) if ($isCheckinHeaderExplicit) { //checkin date not empty, assume past transaction or future checkin date (expected) - if (!empty(Helper::array_smart_fetch($row, 'checkin date'))) { + if (! empty(Helper::array_smart_fetch($row, 'checkin date'))) { $item[$asset_tag][$batch_counter]['checkin_date'] = Carbon::parse(Helper::array_smart_fetch($row, 'checkin date'))->format('Y-m-d H:i:s'); } else { $item[$asset_tag][$batch_counter]['checkin_date'] = ''; @@ -836,37 +834,37 @@ public function postImportHistory(Request $request) $item[$asset_tag][$batch_counter]['asset_id'] = $asset->id; $base_username = User::generateFormattedNameFromFullName(Setting::getSettings()->username_format, $item[$asset_tag][$batch_counter]['name']); $user = User::where('username', '=', $base_username['username']); - $user_query = ' on username ' . $base_username['username']; + $user_query = ' on username '.$base_username['username']; if ($request->input('match_firstnamelastname') == '1') { $firstnamedotlastname = User::generateFormattedNameFromFullName('firstname.lastname', $item[$asset_tag][$batch_counter]['name']); $item[$asset_tag][$batch_counter]['username'][] = $firstnamedotlastname['username']; $user->orWhere('username', '=', $firstnamedotlastname['username']); - $user_query .= ', or on username ' . $firstnamedotlastname['username']; + $user_query .= ', or on username '.$firstnamedotlastname['username']; } if ($request->input('match_flastname') == '1') { $flastname = User::generateFormattedNameFromFullName('filastname', $item[$asset_tag][$batch_counter]['name']); $item[$asset_tag][$batch_counter]['username'][] = $flastname['username']; $user->orWhere('username', '=', $flastname['username']); - $user_query .= ', or on username ' . $flastname['username']; + $user_query .= ', or on username '.$flastname['username']; } if ($request->input('match_firstname') == '1') { $firstname = User::generateFormattedNameFromFullName('firstname', $item[$asset_tag][$batch_counter]['name']); $item[$asset_tag][$batch_counter]['username'][] = $firstname['username']; $user->orWhere('username', '=', $firstname['username']); - $user_query .= ', or on username ' . $firstname['username']; + $user_query .= ', or on username '.$firstname['username']; } if ($request->input('match_email') == '1') { if ($item[$asset_tag][$batch_counter]['name'] == '') { $item[$asset_tag][$batch_counter]['username'][] = $user_email = User::generateEmailFromFullName($item[$asset_tag][$batch_counter]['name']); $user->orWhere('username', '=', $user_email); - $user_query .= ', or on username ' . $user_email; + $user_query .= ', or on username '.$user_email; } } if ($request->input('match_username') == '1') { // Added #8825: add explicit username lookup $raw_username = $item[$asset_tag][$batch_counter]['name']; $user->orWhere('username', '=', $raw_username); - $user_query .= ', or on username ' . $raw_username; + $user_query .= ', or on username '.$raw_username; } // A matching user was found @@ -877,12 +875,12 @@ public function postImportHistory(Request $request) Actionlog::firstOrCreate([ 'item_id' => $asset->id, 'item_type' => Asset::class, - 'created_by' => auth()->id(), - 'note' => 'Checkout imported by ' . auth()->user()->display_name . ' from history importer', + 'created_by' => auth()->id(), + 'note' => 'Checkout imported by '.auth()->user()->display_name.' from history importer', 'target_id' => $item[$asset_tag][$batch_counter]['user_id'], 'target_type' => User::class, - 'created_at' => $item[$asset_tag][$batch_counter]['checkout_date'], - 'action_type' => 'checkout', + 'created_at' => $item[$asset_tag][$batch_counter]['checkout_date'], + 'action_type' => 'checkout', ]); $checkin_date = $item[$asset_tag][$batch_counter]['checkin_date']; @@ -892,20 +890,21 @@ public function postImportHistory(Request $request) // if checkin date header exists, assume that empty or future date is still checked out // if checkin is before today's date, assume it's checked in and do not assign user ID, if checkin date is in the future or blank, this is the expected checkin date, items are checked out - if ((strtotime($checkin_date) > strtotime(Carbon::now())) || (empty($checkin_date))) { + if ((strtotime($checkin_date) > strtotime(Carbon::now())) || (empty($checkin_date))) + { //only do this if item is checked out $asset->assigned_to = $user->id; $asset->assigned_type = User::class; } } - if (!empty($checkin_date)) { + if (! empty($checkin_date)) { //only make a checkin there is a valid checkin date or we created one on import. Actionlog::firstOrCreate([ 'item_id' => $item[$asset_tag][$batch_counter]['asset_id'], 'item_type' => Asset::class, 'created_by' => auth()->id(), - 'note' => 'Checkin imported by ' . auth()->user()->display_name . ' from history importer', + 'note' => 'Checkin imported by '.auth()->user()->display_name.' from history importer', 'target_id' => null, 'created_at' => $checkin_date, 'action_type' => 'checkin', @@ -913,7 +912,7 @@ public function postImportHistory(Request $request) } if ($asset->save()) { - $status['success'][]['asset'][$asset_tag]['msg'] = 'Asset successfully matched for ' . Helper::array_smart_fetch($row, 'name') . $user_query . ' on ' . $item[$asset_tag][$batch_counter]['checkout_date']; + $status['success'][]['asset'][$asset_tag]['msg'] = 'Asset successfully matched for '.Helper::array_smart_fetch($row, 'name').$user_query.' on '.$item[$asset_tag][$batch_counter]['checkout_date']; } else { $status['error'][]['asset'][$asset_tag]['msg'] = 'Asset and user was matched but could not be saved.'; } @@ -1000,7 +999,7 @@ public function dueForCheckin() } - public function audit(Asset $asset): View|RedirectResponse + public function audit(Asset $asset): View | RedirectResponse { $this->authorize('audit', Asset::class); $settings = Setting::getSettings(); @@ -1013,7 +1012,7 @@ public function audit(Asset $asset): View|RedirectResponse return redirect()->route('hardware.edit', $asset)->withErrors($asset->getErrors()); } - $dt = Carbon::now()->addMonths((int) $settings->audit_interval)->toDateString(); + $dt = Carbon::now()->addMonths( (int) $settings->audit_interval)->toDateString(); return view('hardware/audit')->with('asset', $asset)->with('item', $asset)->with('next_audit_date', $dt)->with('locations_list'); } @@ -1040,7 +1039,7 @@ public function auditStore(UploadFileRequest $request, Asset $asset) // Update custom fields in the database if (($asset->model) && ($asset->model->fieldset)) { foreach ($asset->model->fieldset->fields as $field) { - if (($field->display_audit == '1') && ($request->has($field->db_column))) { + if (($field->display_audit=='1') && ($request->has($field->db_column))) { if ($field->field_encrypted == '1') { if (Gate::allows('assets.view.encrypted_custom_fields')) { if (is_array($request->input($field->db_column))) { @@ -1097,7 +1096,7 @@ public function auditStore(UploadFileRequest $request, Asset $asset) $file_name = null; // Create the image (if one was chosen.) if ($request->hasFile('image')) { - $file_name = $request->handleFile('private_uploads/audits/', 'audit-' . $asset->id, $request->file('image')); + $file_name = $request->handleFile('private_uploads/audits/', 'audit-'.$asset->id, $request->file('image')); } $asset->logAudit($request->input('note'), $request->input('location_id'), $file_name, $originalValues); diff --git a/app/Http/Transformers/SelectlistTransformer.php b/app/Http/Transformers/SelectlistTransformer.php index 97efa93f86e4..d1cd4d76203d 100644 --- a/app/Http/Transformers/SelectlistTransformer.php +++ b/app/Http/Transformers/SelectlistTransformer.php @@ -24,9 +24,10 @@ public function transformSelectlist(LengthAwarePaginator $select_items) foreach ($select_items as $select_item) { $item = [ 'id' => (int) $select_item->id, - 'text' => $select_item->use_text ?: $select_item->name, - 'image' => $select_item->use_image ?: null, + 'text' => ($select_item->use_text) ? $select_item->use_text : $select_item->name, + 'image' => ($select_item->use_image) ? $select_item->use_image : null, 'tag_color' => ($select_item->tag_color) ? $select_item->tag_color : null, + ]; if (!empty($select_item->type)) { @@ -39,9 +40,9 @@ public function transformSelectlist(LengthAwarePaginator $select_items) $results = [ 'results' => $items_array, 'pagination' => [ - 'more' => ($select_items->currentPage() >= $select_items->lastPage()) ? false : true, - 'per_page' => $select_items->perPage(), - ], + 'more' => ($select_items->currentPage() >= $select_items->lastPage()) ? false : true, + 'per_page' => $select_items->perPage(), + ], 'total_count' => $select_items->total(), 'page' => $select_items->currentPage(), 'page_count' => $select_items->lastPage(), diff --git a/app/Models/Asset.php b/app/Models/Asset.php index 830dc62a6e1d..d79726a38d6f 100644 --- a/app/Models/Asset.php +++ b/app/Models/Asset.php @@ -2,10 +2,8 @@ namespace App\Models; -use DB; use App\Events\CheckoutableCheckedOut; use App\Exceptions\CheckoutNotAllowed; -use App\Services\FilterService\FilterService; use App\Helpers\Helper; use App\Http\Traits\UniqueUndeletedTrait; use App\Models\Traits\Acceptable; @@ -16,6 +14,7 @@ use App\Models\Traits\Searchable; use App\Presenters\AssetPresenter; use App\Presenters\Presentable; +use App\Services\FilterService\FilterService; use Carbon\Carbon; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Casts\Attribute; @@ -23,13 +22,8 @@ use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Support\Facades\Crypt; use Illuminate\Support\Facades\Gate; -use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Storage; - -use UnexpectedValueException; use Watson\Validating\ValidatingTrait; -use Arr; -use Illuminate\Support\Str; /** * Model for Assets. @@ -85,7 +79,7 @@ public function declinedCheckout(User $declinedBy, $signature) * Leaving this commented out, since we need to test further, but this would eager load the model relationship every single * time the asset model is loaded. */ - // protected $with = ['model']; + // protected $with = ['model']; /** * Whether the model should inject it's identifier to the unique @@ -104,46 +98,46 @@ public function declinedCheckout(User $declinedBy, $signature) 'expected_checkin' => 'datetime:m-d-Y', 'last_audit_date' => 'datetime', 'next_audit_date' => 'datetime:m-d-Y', - 'model_id' => 'integer', - 'status_id' => 'integer', - 'company_id' => 'integer', - 'location_id' => 'integer', + 'model_id' => 'integer', + 'status_id' => 'integer', + 'company_id' => 'integer', + 'location_id' => 'integer', 'rtd_company_id' => 'integer', - 'supplier_id' => 'integer', - 'created_at' => 'datetime', - 'updated_at' => 'datetime', - 'deleted_at' => 'datetime', + 'supplier_id' => 'integer', + 'created_at' => 'datetime', + 'updated_at' => 'datetime', + 'deleted_at' => 'datetime', ]; protected $rules = [ - 'model_id' => ['required', 'integer', 'exists:models,id,deleted_at,NULL', 'not_array'], - 'status_id' => ['required', 'integer', 'exists:status_labels,id'], - 'asset_tag' => ['required', 'min:1', 'max:255', 'unique_undeleted:assets,asset_tag', 'not_array'], - 'name' => ['nullable', 'max:255'], - 'company_id' => ['nullable', 'integer', 'exists:companies,id'], - 'warranty_months' => ['nullable', 'numeric', 'digits_between:0,240'], - 'last_checkout' => ['nullable', 'date_format:Y-m-d H:i:s'], - 'last_checkin' => ['nullable', 'date_format:Y-m-d H:i:s'], - 'expected_checkin' => ['nullable', 'date'], - 'last_audit_date' => ['nullable', 'date_format:Y-m-d H:i:s'], - 'next_audit_date' => ['nullable', 'date'], - 'location_id' => ['nullable', 'exists:locations,id', 'fmcs_location'], - 'rtd_location_id' => ['nullable', 'exists:locations,id', 'fmcs_location'], - 'purchase_date' => ['nullable', 'date', 'date_format:Y-m-d'], - 'serial' => ['nullable', 'string', 'unique_undeleted:assets,serial'], - 'purchase_cost' => ['nullable', 'numeric', 'gte:0', 'max:9999999999999'], - 'supplier_id' => ['nullable', 'exists:suppliers,id'], - 'asset_eol_date' => ['nullable', 'date'], - 'eol_explicit' => ['nullable', 'boolean'], - 'byod' => ['nullable', 'boolean'], - 'order_number' => ['nullable', 'string', 'max:191'], - 'notes' => ['nullable', 'string', 'max:65535'], - 'assigned_to' => ['nullable', 'integer', 'required_with:assigned_type'], - 'assigned_type' => ['nullable', 'required_with:assigned_to', 'in:' . User::class . "," . Location::class . "," . Asset::class], - 'requestable' => ['nullable', 'boolean'], - 'assigned_user' => ['integer', 'nullable', 'exists:users,id,deleted_at,NULL'], + 'model_id' => ['required', 'integer', 'exists:models,id,deleted_at,NULL', 'not_array'], + 'status_id' => ['required', 'integer', 'exists:status_labels,id'], + 'asset_tag' => ['required', 'min:1', 'max:255', 'unique_undeleted:assets,asset_tag', 'not_array'], + 'name' => ['nullable', 'max:255'], + 'company_id' => ['nullable', 'integer', 'exists:companies,id'], + 'warranty_months' => ['nullable', 'numeric', 'digits_between:0,240'], + 'last_checkout' => ['nullable', 'date_format:Y-m-d H:i:s'], + 'last_checkin' => ['nullable', 'date_format:Y-m-d H:i:s'], + 'expected_checkin' => ['nullable', 'date'], + 'last_audit_date' => ['nullable', 'date_format:Y-m-d H:i:s'], + 'next_audit_date' => ['nullable', 'date'], + 'location_id' => ['nullable', 'exists:locations,id', 'fmcs_location'], + 'rtd_location_id' => ['nullable', 'exists:locations,id', 'fmcs_location'], + 'purchase_date' => ['nullable', 'date', 'date_format:Y-m-d'], + 'serial' => ['nullable', 'string', 'unique_undeleted:assets,serial'], + 'purchase_cost' => ['nullable', 'numeric', 'gte:0', 'max:99999999999999999.99'], + 'supplier_id' => ['nullable', 'exists:suppliers,id'], + 'asset_eol_date' => ['nullable', 'date'], + 'eol_explicit' => ['nullable', 'boolean'], + 'byod' => ['nullable', 'boolean'], + 'order_number' => ['nullable', 'string', 'max:191'], + 'notes' => ['nullable', 'string', 'max:65535'], + 'assigned_to' => ['nullable', 'integer', 'required_with:assigned_type'], + 'assigned_type' => ['nullable', 'required_with:assigned_to', 'in:'.User::class.",".Location::class.",".Asset::class], + 'requestable' => ['nullable', 'boolean'], + 'assigned_user' => ['integer', 'nullable', 'exists:users,id,deleted_at,NULL'], 'assigned_location' => ['integer', 'nullable', 'exists:locations,id,deleted_at,NULL', 'fmcs_location'], - 'assigned_asset' => ['integer', 'nullable', 'exists:assets,id,deleted_at,NULL'] + 'assigned_asset' => ['integer', 'nullable', 'exists:assets,id,deleted_at,NULL'] ]; @@ -190,21 +184,21 @@ public function declinedCheckout(User $declinedBy, $signature) * @var array */ protected $searchableAttributes = [ - 'name', - 'asset_tag', - 'serial', - 'order_number', - 'purchase_cost', - 'notes', - 'created_at', - 'updated_at', - 'purchase_date', - 'expected_checkin', - 'next_audit_date', - 'last_audit_date', - 'last_checkin', - 'last_checkout', - 'asset_eol_date', + 'name', + 'asset_tag', + 'serial', + 'order_number', + 'purchase_cost', + 'notes', + 'created_at', + 'updated_at', + 'purchase_date', + 'expected_checkin', + 'next_audit_date', + 'last_audit_date', + 'last_checkin', + 'last_checkout', + 'asset_eol_date', ]; /** @@ -213,13 +207,13 @@ public function declinedCheckout(User $declinedBy, $signature) * @var array */ protected $searchableRelations = [ - 'assetstatus' => ['name'], - 'supplier' => ['name'], - 'company' => ['name'], - 'defaultLoc' => ['name'], - 'location' => ['name'], - 'model' => ['name', 'model_number', 'eol'], - 'model.category' => ['name'], + 'assetstatus' => ['name'], + 'supplier' => ['name'], + 'company' => ['name'], + 'defaultLoc' => ['name'], + 'location' => ['name'], + 'model' => ['name', 'model_number', 'eol'], + 'model.category' => ['name'], 'model.manufacturer' => ['name'], ]; @@ -296,22 +290,22 @@ public function getDisplayNameAttribute() protected function warrantyExpires(): Attribute { - return Attribute::make( - get: fn(mixed $value, array $attributes) => ($attributes['warranty_months'] && $attributes['purchase_date']) ? Carbon::parse($attributes['purchase_date'])->addMonths((int) $attributes['warranty_months']) : null, + return Attribute:: make( + get: fn(mixed $value, array $attributes) => ($attributes['warranty_months'] && $attributes['purchase_date']) ? Carbon::parse($attributes['purchase_date'])->addMonths((int)$attributes['warranty_months']) : null, ); } protected function warrantyExpiresFormattedDate(): Attribute { - return Attribute::make( - get: fn(mixed $value, array $attributes) => Helper::getFormattedDateObject($this->warrantyExpires, 'date', false) + return Attribute:: make( + get: fn(mixed $value, array $attributes) => Helper::getFormattedDateObject($this->warrantyExpires, 'date', false) ); } protected function warrantyExpiresDiff(): Attribute { - return Attribute::make( + return Attribute:: make( get: fn(mixed $value, array $attributes) => $this->warrantyExpires ? round((Carbon::now()->diffInDays($this->warrantyExpires))) : null, ); @@ -319,7 +313,7 @@ protected function warrantyExpiresDiff(): Attribute protected function warrantyExpiresDiffForHumans(): Attribute { - return Attribute::make( + return Attribute:: make( get: fn(mixed $value, array $attributes) => $this->warrantyExpires ? Carbon::parse($this->warrantyExpires)->diffForHumans() : null, ); @@ -329,14 +323,14 @@ protected function warrantyExpiresDiffForHumans(): Attribute protected function lastAuditFormattedDate(): Attribute { - return Attribute::make( + return Attribute:: make( get: fn(mixed $value, array $attributes) => Helper::getFormattedDateObject($this->last_audit_date, 'datetime', false) ); } protected function lastAuditDiff(): Attribute { - return Attribute::make( + return Attribute:: make( get: fn(mixed $value, array $attributes) => $this->warrantyExpires ? round((Carbon::now()->diffInDays($this->warrantyExpires))) : null, ); @@ -344,8 +338,8 @@ protected function lastAuditDiff(): Attribute protected function lastAuditDiffForHumans(): Attribute { - return Attribute::make( - get: fn(mixed $value, array $attributes) => $attributes['last_audit_date'] ? Carbon::parse($attributes['last_audit_date'])->diffForHumans() : null, + return Attribute:: make( + get: fn(mixed $value, array $attributes) => $attributes['last_audit_date'] ? Carbon::parse($attributes['last_audit_date'])->diffForHumans() : null, ); } @@ -353,21 +347,21 @@ protected function lastAuditDiffForHumans(): Attribute protected function nextAuditFormattedDate(): Attribute { - return Attribute::make( + return Attribute:: make( get: fn(mixed $value, array $attributes) => Helper::getFormattedDateObject($this->next_audit_date, 'date', false) ); } protected function nextAuditDiffInDays(): Attribute { - return Attribute::make( + return Attribute:: make( get: fn(mixed $value, array $attributes) => $attributes['next_audit_date'] ? Carbon::now()->diffInDays($attributes['next_audit_date']) : null, ); } protected function nextAuditDiffForHumans(): Attribute { - return Attribute::make( + return Attribute:: make( get: fn(mixed $value, array $attributes) => $attributes['next_audit_date'] ? Carbon::parse($attributes['next_audit_date'])->diffForHumans() : null, ); @@ -376,8 +370,8 @@ protected function nextAuditDiffForHumans(): Attribute protected function eolDate(): Attribute { - return Attribute::make( - get: function (mixed $value, array $attributes) { + return Attribute:: make( + get: function(mixed $value, array $attributes) { if ($attributes['asset_eol_date'] && $attributes['eol_explicit'] == '1') { return Carbon::parse($attributes['asset_eol_date']); } elseif ($attributes['purchase_date'] && $this->model && ((int) $this->model->eol > 0)) { @@ -390,17 +384,19 @@ protected function eolDate(): Attribute } + + protected function eolFormattedDate(): Attribute { - return Attribute::make( + return Attribute:: make( get: fn(mixed $value, array $attributes) => $this->eolDate ? Helper::getFormattedDateObject($this->eolDate, 'date', false) : null, ); } protected function eolDiffInDays(): Attribute { - return Attribute::make( - get: fn(mixed $value, array $attributes) => $this->eolDate ? round((Carbon::now()->diffInDays(Carbon::parse($this->eolDate), false, 1))) : null, + return Attribute:: make( + get: fn(mixed $value, array $attributes) => $this->eolDate ? round((Carbon::now()->diffInDays(Carbon::parse($this->eolDate), false, 1))) : null, ); } @@ -408,15 +404,15 @@ protected function eolDiffInDays(): Attribute protected function eolDiffForHumans(): Attribute { - return Attribute::make( - get: fn(mixed $value, array $attributes) => $this->eolDate ? Carbon::parse($this->eolDate)->diffForHumans() : null, + return Attribute:: make( + get: fn(mixed $value, array $attributes) => $this->eolDate ? Carbon::parse($this->eolDate)->diffForHumans() : null, ); } protected function expectedCheckinFormattedDate(): Attribute { - return Attribute::make( + return Attribute:: make( get: fn(mixed $value, array $attributes) => array_key_exists('expected_checkin', $attributes) ? Helper::getFormattedDateObject($attributes['expected_checkin'], 'date', false) : null, ); } @@ -452,16 +448,16 @@ public function company() */ public function availableForCheckout() { + // This asset is not currently assigned to anyone and is not deleted... - if ((!$this->assigned_to) && (!$this->deleted_at)) { - + if ((! $this->assigned_to) && (! $this->deleted_at)) { + // The asset status is not archived and is deployable - if ( - ($this->assetstatus) && - ($this->assetstatus->archived == '0') && - ($this->assetstatus->deployable == '1') + if (($this->assetstatus) && ($this->assetstatus->archived == '0') + && ($this->assetstatus->deployable == '1') ) { return true; + } } return false; @@ -486,7 +482,7 @@ public function availableForCheckout() */ public function checkOut($target, $admin = null, $checkout_at = null, $expected_checkin = null, $note = null, $name = null, $location = null) { - if (!$target) { + if (! $target) { return false; } if ($this->is($target)) { @@ -553,7 +549,7 @@ public function getDetailedNameAttribute() $user_name = 'Unassigned'; } - return $this->asset_tag . ' - ' . $this->name . ' (' . $user_name . ') ' . ($this->model) ? $this->model->name : ''; + return $this->asset_tag.' - '.$this->name.' ('.$user_name.') '.($this->model) ? $this->model->name : ''; } /** @@ -742,13 +738,13 @@ public function assignedAccessories() */ public function assetLoc($iterations = 1, $first_asset = null) { - if (!empty($this->assignedType())) { + if (! empty($this->assignedType())) { if ($this->assignedType() == self::ASSET) { - if (!$first_asset) { + if (! $first_asset) { $first_asset = $this; } if ($iterations > 10) { - throw new \Exception('Asset assignment Loop for Asset ID: ' . $first_asset->id); + throw new \Exception('Asset assignment Loop for Asset ID: '.$first_asset->id); } $assigned_to = self::find($this->assigned_to); //have to do this this way because otherwise it errors if ($assigned_to) { @@ -800,7 +796,7 @@ public function assignedType() public function targetShowRoute() { $route = str_plural($this->assignedType()); - if ($route == 'assets') { + if ($route=='assets') { return 'hardware'; } @@ -833,12 +829,12 @@ public function defaultLoc() */ public function getImageUrl() { - if ($this->image && !empty($this->image)) { - return Storage::disk('public')->url(app('assets_upload_path') . e($this->image)); - } elseif ($this->model && !empty($this->model->image)) { - return Storage::disk('public')->url(app('models_upload_path') . e($this->model->image)); - } elseif ($this->model?->category && !empty($this->model->category->image)) { - return Storage::disk('public')->url(app('categories_upload_path') . e($this->model->category->image)); + if ($this->image && ! empty($this->image)) { + return Storage::disk('public')->url(app('assets_upload_path').e($this->image)); + } elseif ($this->model && ! empty($this->model->image)) { + return Storage::disk('public')->url(app('models_upload_path').e($this->model->image)); + } elseif ($this->model?->category && ! empty($this->model->category->image)) { + return Storage::disk('public')->url(app('categories_upload_path').e($this->model->category->image)); } return false; @@ -1078,10 +1074,10 @@ public static function autoincrement_asset(int $additional_increment = 0) if ($settings->auto_increment_assets == '1') { if ($settings->zerofill_count > 0) { - return $settings->auto_increment_prefix . self::zerofill($settings->next_auto_tag_base + $additional_increment, $settings->zerofill_count); + return $settings->auto_increment_prefix.self::zerofill($settings->next_auto_tag_base + $additional_increment, $settings->zerofill_count); } - return $settings->auto_increment_prefix . ($settings->next_auto_tag_base + $additional_increment); + return $settings->auto_increment_prefix.($settings->next_auto_tag_base + $additional_increment); } else { return false; } @@ -1194,8 +1190,8 @@ public function checkInvalidNextAuditDate() public function getComponentCost() { $cost = 0; - foreach ($this->components as $component) { - $cost += $component->pivot->assigned_qty * $component->purchase_cost; + foreach($this->components as $component) { + $cost += $component->pivot->assigned_qty*$component->purchase_cost; } return $cost; } @@ -1219,40 +1215,40 @@ public function getComponentCost() protected function nextAuditDate(): Attribute { return Attribute::make( - get: fn($value) => $value ? Carbon::parse($value)->format('Y-m-d') : null, - set: fn($value) => $value ? Carbon::parse($value)->format('Y-m-d') : null, + get: fn ($value) => $value ? Carbon::parse($value)->format('Y-m-d') : null, + set: fn ($value) => $value ? Carbon::parse($value)->format('Y-m-d') : null, ); } protected function lastAuditDate(): Attribute { return Attribute::make( - get: fn($value) => $value ? Carbon::parse($value)->format('Y-m-d H:i:s') : null, - set: fn($value) => $value ? Carbon::parse($value)->format('Y-m-d H:i:s') : null, + get: fn ($value) => $value ? Carbon::parse($value)->format('Y-m-d H:i:s') : null, + set: fn ($value) => $value ? Carbon::parse($value)->format('Y-m-d H:i:s') : null, ); } protected function lastCheckout(): Attribute { return Attribute::make( - get: fn($value) => $value ? Carbon::parse($value)->format('Y-m-d H:i:s') : null, - set: fn($value) => $value ? Carbon::parse($value)->format('Y-m-d H:i:s') : null, + get: fn ($value) => $value ? Carbon::parse($value)->format('Y-m-d H:i:s') : null, + set: fn ($value) => $value ? Carbon::parse($value)->format('Y-m-d H:i:s') : null, ); } protected function lastCheckin(): Attribute { return Attribute::make( - get: fn($value) => $value ? Carbon::parse($value)->format('Y-m-d H:i:s') : null, - set: fn($value) => $value ? Carbon::parse($value)->format('Y-m-d H:i:s') : null, + get: fn ($value) => $value ? Carbon::parse($value)->format('Y-m-d H:i:s') : null, + set: fn ($value) => $value ? Carbon::parse($value)->format('Y-m-d H:i:s') : null, ); } protected function assetEolDate(): Attribute { return Attribute::make( - get: fn($value) => $value ? Carbon::parse($value)->format('Y-m-d') : null, - set: fn($value) => $value ? Carbon::parse($value)->format('Y-m-d') : null, + get: fn ($value) => $value ? Carbon::parse($value)->format('Y-m-d') : null, + set: fn ($value) => $value ? Carbon::parse($value)->format('Y-m-d') : null, ); } @@ -1269,8 +1265,8 @@ protected function assetEolDate(): Attribute protected function requestable(): Attribute { return Attribute::make( - get: fn($value) => (int) filter_var($value, FILTER_VALIDATE_BOOLEAN), - set: fn($value) => (int) filter_var($value, FILTER_VALIDATE_BOOLEAN), + get: fn ($value) => (int) filter_var($value, FILTER_VALIDATE_BOOLEAN), + set: fn ($value) => (int) filter_var($value, FILTER_VALIDATE_BOOLEAN), ); } @@ -1295,8 +1291,7 @@ public function advancedTextSearch(Builder $query, array $terms) * Assigned user */ $query = $query->leftJoin( - 'users as assets_users', - function ($leftJoin) { + 'users as assets_users', function ($leftJoin) { $leftJoin->on('assets_users.id', '=', 'assets.assigned_to') ->where('assets.assigned_type', '=', User::class); } @@ -1305,17 +1300,16 @@ function ($leftJoin) { foreach ($terms as $term) { $query = $query - ->orWhere('assets_users.first_name', 'LIKE', '%' . $term . '%') - ->orWhere('assets_users.last_name', 'LIKE', '%' . $term . '%') - ->orWhere('assets_users.jobtitle', 'LIKE', '%' . $term . '%') - ->orWhere('assets_users.username', 'LIKE', '%' . $term . '%') - ->orWhere('assets_users.employee_num', 'LIKE', '%' . $term . '%') + ->orWhere('assets_users.first_name', 'LIKE', '%'.$term.'%') + ->orWhere('assets_users.last_name', 'LIKE', '%'.$term.'%') + ->orWhere('assets_users.jobtitle', 'LIKE', '%'.$term.'%') + ->orWhere('assets_users.username', 'LIKE', '%'.$term.'%') + ->orWhere('assets_users.employee_num', 'LIKE', '%'.$term.'%') ->orWhereMultipleColumns( [ - 'assets_users.first_name', - 'assets_users.last_name', - ], - $term + 'assets_users.first_name', + 'assets_users.last_name', + ], $term ); } @@ -1323,8 +1317,7 @@ function ($leftJoin) { * Assigned location */ $query = $query->leftJoin( - 'locations as assets_locations', - function ($leftJoin) { + 'locations as assets_locations', function ($leftJoin) { $leftJoin->on('assets_locations.id', '=', 'assets.assigned_to') ->where('assets.assigned_type', '=', Location::class); } @@ -1332,22 +1325,21 @@ function ($leftJoin) { foreach ($terms as $term) { - $query = $query->orWhere('assets_locations.name', 'LIKE', '%' . $term . '%'); + $query = $query->orWhere('assets_locations.name', 'LIKE', '%'.$term.'%'); } /** * Assigned assets */ $query = $query->leftJoin( - 'assets as assigned_assets', - function ($leftJoin) { + 'assets as assigned_assets', function ($leftJoin) { $leftJoin->on('assigned_assets.id', '=', 'assets.assigned_to') ->where('assets.assigned_type', '=', self::class); } ); foreach ($terms as $term) { - $query = $query->orWhere('assigned_assets.name', 'LIKE', '%' . $term . '%'); + $query = $query->orWhere('assigned_assets.name', 'LIKE', '%'.$term.'%'); } @@ -1379,8 +1371,7 @@ public function scopeHardware($query) public function scopePending($query) { return $query->whereHas( - 'assetstatus', - function ($query) { + 'assetstatus', function ($query) { $query->where('deployable', '=', 0) ->where('pending', '=', 1) ->where('archived', '=', 0); @@ -1402,31 +1393,30 @@ public function scopeAssetsByLocation($query, $location) return $query->where( function ($query) use ($location) { $query->whereHas( - 'assignedTo', - function ($query) use ($location) { + 'assignedTo', function ($query) use ($location) { $query->where( [ - ['users.location_id', '=', $location->id], - ['assets.assigned_type', '=', User::class], + ['users.location_id', '=', $location->id], + ['assets.assigned_type', '=', User::class], ] )->orWhere( - [ - ['locations.id', '=', $location->id], - ['assets.assigned_type', '=', Location::class], - ] - )->orWhere( - [ - ['assets.rtd_location_id', '=', $location->id], - ['assets.assigned_type', '=', self::class], - ] - ); + [ + ['locations.id', '=', $location->id], + ['assets.assigned_type', '=', Location::class], + ] + )->orWhere( + [ + ['assets.rtd_location_id', '=', $location->id], + ['assets.assigned_type', '=', self::class], + ] + ); } )->orWhere( - function ($query) use ($location) { - $query->where('assets.rtd_location_id', '=', $location->id); - $query->whereNull('assets.assigned_to'); - } - ); + function ($query) use ($location) { + $query->where('assets.rtd_location_id', '=', $location->id); + $query->whereNull('assets.assigned_to'); + } + ); } ); } @@ -1444,11 +1434,10 @@ public function scopeRTD($query) { return $query->whereNull('assets.assigned_to') ->whereHas( - 'assetstatus', - function ($query) { - $query->where('deployable', '=', 1) - ->where('pending', '=', 0) - ->where('archived', '=', 0); + 'assetstatus', function ($query) { + $query->where('deployable', '=', 1) + ->where('pending', '=', 0) + ->where('archived', '=', 0); } ); } @@ -1464,8 +1453,7 @@ function ($query) { public function scopeUndeployable($query) { return $query->whereHas( - 'assetstatus', - function ($query) { + 'assetstatus', function ($query) { $query->where('deployable', '=', 0) ->where('pending', '=', 0) ->where('archived', '=', 0); @@ -1484,8 +1472,7 @@ function ($query) { public function scopeNotArchived($query) { return $query->whereHas( - 'assetstatus', - function ($query) { + 'assetstatus', function ($query) { $query->where('archived', '=', 0); } ); @@ -1570,10 +1557,10 @@ function ($query) { $query->OverdueForAudit(); } )->orWhere( - function ($query) use ($settings) { - $query->DueForAudit($settings); - } - ); + function ($query) use ($settings) { + $query->DueForAudit($settings); + } + ); } @@ -1629,10 +1616,10 @@ function ($query) { $query->OverdueForCheckin(); } )->orWhere( - function ($query) use ($settings) { - $query->DueForCheckin($settings); - } - ); + function ($query) use ($settings) { + $query->DueForCheckin($settings); + } + ); } @@ -1651,10 +1638,9 @@ function ($query) use ($settings) { public function scopeAssetsForShow($query) { - if (Setting::getSettings()->show_archived_in_list != 1) { + if (Setting::getSettings()->show_archived_in_list!=1) { return $query->whereHas( - 'assetstatus', - function ($query) { + 'assetstatus', function ($query) { $query->where('archived', '=', 0); } ); @@ -1675,8 +1661,7 @@ function ($query) { public function scopeArchived($query) { return $query->whereHas( - 'assetstatus', - function ($query) { + 'assetstatus', function ($query) { $query->where('deployable', '=', 0) ->where('pending', '=', 0) ->where('archived', '=', 1); @@ -1709,18 +1694,17 @@ public function scopeRequestableAssets($query): Builder { $table = $query->getModel()->getTable(); - return Company::scopeCompanyables($query->where($table . '.requestable', '=', 1)) - ->whereHas( - 'assetstatus', - function ($query) { - $query->where( - function ($query) { - $query->where('deployable', '=', 1) - ->where('archived', '=', 0); // you definitely can't request something that's archived - } - )->orWhere('pending', '=', 1); // we've decided that even though an asset may be 'pending', you can still request it - } - ); + return Company::scopeCompanyables($query->where($table.'.requestable', '=', 1)) + ->whereHas( + 'assetstatus', function ($query) { + $query->where( + function ($query) { + $query->where('deployable', '=', 1) + ->where('archived', '=', 0); // you definitely can't request something that's archived + } + )->orWhere('pending', '=', 1); // we've decided that even though an asset may be 'pending', you can still request it + } + ); } @@ -1790,82 +1774,74 @@ public function scopeAssignedSearch($query, $search) $search = explode(' OR ', $search); return $query->leftJoin( - 'users as assets_users', - function ($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) { + '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( + 'assets as assigned_assets', function ($leftJoin) { $leftJoin->on('assigned_assets.id', '=', 'assets.assigned_to') ->where('assets.assigned_type', '=', self::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', + } + )->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( - function ($query) use ($search) { - $query->where('manufacturers.name', 'LIKE', '%' . $search . '%'); - } - ); + $query->where('categories.name', 'LIKE', '%'.$search.'%') + ->orWhere('models.name', 'LIKE', '%'.$search.'%') + ->orWhere('models.model_number', '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_users.jobtitle', 'LIKE', '%' . $search . '%') - ->orWhereMultipleColumns( - [ - 'assets_users.first_name', - 'assets_users.last_name', - 'assets_users.jobtitle', - ], - $search - ) - ->orWhere('assets_locations.name', 'LIKE', '%' . $search . '%') - ->orWhere('assigned_assets.name', '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('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 . '%'); - } - + ); + } + )->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_users.jobtitle', 'LIKE', '%'.$search.'%') + ->orWhereMultipleColumns( + [ + 'assets_users.first_name', + 'assets_users.last_name', + 'assets_users.jobtitle', + ], $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.'%'); } - )->withTrashed()->whereNull('assets.deleted_at'); //workaround for laravel bug + + } + )->withTrashed()->whereNull('assets.deleted_at'); //workaround for laravel bug } /** @@ -1880,17 +1856,16 @@ function ($query) use ($search) { public function scopeCheckedOutToTargetInDepartment($query, $search) { return $query->leftJoin( - 'users as assets_dept_users', - function ($leftJoin) { + 'users as assets_dept_users', function ($leftJoin) { $leftJoin->on('assets_dept_users.id', '=', 'assets.assigned_to') ->where('assets.assigned_type', '=', User::class); } )->where( - function ($query) use ($search) { + function ($query) use ($search) { $query->whereIn('assets_dept_users.department_id', $search); - } - )->withTrashed()->whereNull('assets.deleted_at'); //workaround for laravel bug + } + )->withTrashed()->whereNull('assets.deleted_at'); //workaround for laravel bug } @@ -1903,323 +1878,58 @@ function ($query) use ($search) { * * @return \Illuminate\Database\Query\Builder Modified query builder */ - - - public function scopeByFilter($query, array $filters) + public function applyLegacyFilters($query, $filter) { - // Check if the filters are in Snipe-IT's original format (key => value) - if ($this->isLegacyFilterFormat($filters)) { - return $this->applyLegacyFilters($query, $filters); - } - return $this->filterService()->searchByFilter($query, $filters); - } + return $query->where( + function ($query) use ($filter) { + foreach ($filter as $key => $search_val) { - private function isLegacyFilterFormat($filters) - { - // Snipe-IT filters are simple key/value (not arrays with 'field') - return !isset($filters[0]['field']); - } + $fieldname = str_replace('custom_fields.', '', $key); - /** - * Query builder scope to order on model - * - * @param \Illuminate\Database\Query\Builder $query Query builder instance - * @param text $order Order - * - * @return \Illuminate\Database\Query\Builder Modified query builder - */ - public function scopeOrderModels($query, $order) - { - return $query->join('models as asset_models', 'assets.model_id', '=', 'asset_models.id')->orderBy('asset_models.name', $order); - } + if ($fieldname == 'asset_tag') { + $query->where('assets.asset_tag', 'LIKE', '%'.$search_val.'%'); + } - /** - * Query builder scope to order on model number - * - * @param \Illuminate\Database\Query\Builder $query Query builder instance - * @param text $order Order - * - * @return \Illuminate\Database\Query\Builder Modified query builder - */ - public function scopeOrderModelNumber($query, $order) - { - return $query->leftJoin('models as model_number_sort', 'assets.model_id', '=', 'model_number_sort.id')->orderBy('model_number_sort.model_number', $order); - } + if ($fieldname == 'name') { + $query->where('assets.name', 'LIKE', '%'.$search_val.'%'); + } - /** - * Query builder scope to order on created_by name - * - * @param \Illuminate\Database\Query\Builder $query Query builder instance - * @param text $order Order - * - * @return \Illuminate\Database\Query\Builder Modified query builder - */ - public function scopeOrderByCreatedByName($query, $order) - { - return $query->leftJoin('users as admin_sort', 'assets.created_by', '=', 'admin_sort.id')->select('assets.*')->orderBy('admin_sort.first_name', $order)->orderBy('admin_sort.last_name', $order); - } + if ($fieldname =='serial') { + $query->where('assets.serial', 'LIKE', '%'.$search_val.'%'); + } + if ($fieldname == 'purchase_date') { + $query->where('assets.purchase_date', 'LIKE', '%'.$search_val.'%'); + } - /** - * Query builder scope to order on assigned user - * - * @param \Illuminate\Database\Query\Builder $query Query builder instance - * @param text $order Order - * - * @return \Illuminate\Database\Query\Builder Modified query builder - */ - public function scopeOrderAssigned($query, $order) - { - return $query->leftJoin('users as users_sort', 'assets.assigned_to', '=', 'users_sort.id')->select('assets.*')->orderBy('users_sort.first_name', $order)->orderBy('users_sort.last_name', $order); - } + if ($fieldname == 'purchase_cost') { + $query->where('assets.purchase_cost', 'LIKE', '%'.$search_val.'%'); + } - /** - * Query builder scope to order on status - * - * @param \Illuminate\Database\Query\Builder $query Query builder instance - * @param text $order Order - * - * @return \Illuminate\Database\Query\Builder Modified query builder - */ - public function scopeOrderStatus($query, $order) - { - return $query->join('status_labels as status_sort', 'assets.status_id', '=', 'status_sort.id')->orderBy('status_sort.name', $order); - } + if ($fieldname == 'notes') { + $query->where('assets.notes', 'LIKE', '%'.$search_val.'%'); + } - /** - * Query builder scope to order on company - * - * @param \Illuminate\Database\Query\Builder $query Query builder instance - * @param text $order Order - * - * @return \Illuminate\Database\Query\Builder Modified query builder - */ - public function scopeOrderCompany($query, $order) - { - return $query->leftJoin('companies as company_sort', 'assets.company_id', '=', 'company_sort.id')->orderBy('company_sort.name', $order); - } + if ($fieldname == 'order_number') { + $query->where('assets.order_number', 'LIKE', '%'.$search_val.'%'); + } + if ($fieldname == 'status_label') { + $query->whereHas( + 'assetstatus', function ($query) use ($search_val) { + $query->where('status_labels.name', 'LIKE', '%'.$search_val.'%'); + } + ); + } - /** - * Query builder scope to return results of a category - * - * @param \Illuminate\Database\Query\Builder $query Query builder instance - * @param text $order Order - * - * @return \Illuminate\Database\Query\Builder Modified query builder - */ - public function scopeInCategory($query, $category_id) - { - return $query->join('models as category_models', 'assets.model_id', '=', 'category_models.id') - ->join('categories', 'category_models.category_id', '=', 'categories.id') - ->whereIn('category_models.category_id', (!is_array($category_id) ? explode(',', $category_id) : $category_id)); - //->whereIn('category_models.category_id', $category_id); - } - - /** - * Query builder scope to return results of a manufacturer - * - * @param \Illuminate\Database\Query\Builder $query Query builder instance - * @param text $order Order - * - * @return \Illuminate\Database\Query\Builder Modified query builder - */ - public function scopeByManufacturer($query, $manufacturer_id) - { - return $query->join('models', 'assets.model_id', '=', 'models.id') - ->join('manufacturers', 'models.manufacturer_id', '=', 'manufacturers.id')->whereIn('models.manufacturer_id', (!is_array($manufacturer_id) ? explode(',', $manufacturer_id) : $manufacturer_id)); - } - - - - /** - * Query builder scope to order on category - * - * @param \Illuminate\Database\Query\Builder $query Query builder instance - * @param text $order Order - * - * @return \Illuminate\Database\Query\Builder Modified query builder - */ - public function scopeOrderCategory($query, $order) - { - return $query->join('models as order_model_category', 'assets.model_id', '=', 'order_model_category.id') - ->join('categories as category_order', 'order_model_category.category_id', '=', 'category_order.id') - ->orderBy('category_order.name', $order); - } - - - /** - * Query builder scope to order on manufacturer - * - * @param \Illuminate\Database\Query\Builder $query Query builder instance - * @param text $order Order - * - * @return \Illuminate\Database\Query\Builder Modified query builder - */ - public function scopeOrderManufacturer($query, $order) - { - return $query->join('models as order_asset_model', 'assets.model_id', '=', 'order_asset_model.id') - ->leftjoin('manufacturers as manufacturer_order', 'order_asset_model.manufacturer_id', '=', 'manufacturer_order.id') - ->orderBy('manufacturer_order.name', $order); - } - - /** - * Query builder scope to order on location - * - * @param \Illuminate\Database\Query\Builder $query Query builder instance - * @param text $order Order - * - * @return \Illuminate\Database\Query\Builder Modified query builder - */ - public function scopeOrderLocation($query, $order) - { - return $query->leftJoin('locations as asset_locations', 'asset_locations.id', '=', 'assets.location_id')->orderBy('asset_locations.name', $order); - } - - /** - * Query builder scope to order on default - * - * @param \Illuminate\Database\Query\Builder $query Query builder instance - * @param text $order Order - * - * @return \Illuminate\Database\Query\Builder Modified query builder - */ - public function scopeOrderRtdLocation($query, $order) - { - return $query->leftJoin('locations as rtd_asset_locations', 'rtd_asset_locations.id', '=', 'assets.rtd_location_id')->orderBy('rtd_asset_locations.name', $order); - } - - - /** - * Query builder scope to order on supplier name - * - * @param \Illuminate\Database\Query\Builder $query Query builder instance - * @param text $order Order - * - * @return \Illuminate\Database\Query\Builder Modified query builder - */ - public function scopeOrderSupplier($query, $order) - { - return $query->leftJoin('suppliers as suppliers_assets', 'assets.supplier_id', '=', 'suppliers_assets.id')->orderBy('suppliers_assets.name', $order); - } - - /** - * Query builder scope to order on supplier name - * - * @param \Illuminate\Database\Query\Builder $query Query builder instance - * @param text $order Order - * - * @return \Illuminate\Database\Query\Builder Modified query builder - */ - public function scopeOrderByJobTitle($query, $order) - { - return $query->leftJoin('users as users_sort', 'assets.assigned_to', '=', 'users_sort.id')->select('assets.*')->orderBy('users_sort.jobtitle', $order); - } - - /** - * Query builder scope to search on location ID - * - * @param \Illuminate\Database\Query\Builder $query Query builder instance - * @param text $search Search term - * - * @return \Illuminate\Database\Query\Builder Modified query builder - */ - public function scopeByLocationId($query, $search) - { - return $query->where( - function ($query) use ($search) { - $query->whereHas( - 'location', - function ($query) use ($search) { - $query->where('locations.id', '=', $search); - } - ); - } - ); - - } - - - /** - * Query builder scope to search on depreciation name - * - * @param \Illuminate\Database\Query\Builder $query Query builder instance - * @param text $search Search term - * - * @return \Illuminate\Database\Query\Builder Modified query builder - */ - public function scopeByDepreciationId($query, $search) - { - return $query->join('models', 'assets.model_id', '=', 'models.id') - ->join('depreciations', 'models.depreciation_id', '=', 'depreciations.id')->where('models.depreciation_id', '=', $search); - - } - - /** - * Query builder scope to filter by a date range on a given field - * - * @param \Illuminate\Database\Eloquent\Builder $query Query builder instance - * @param string $field Database column name - * @param string $startKey Filter array key for start date - * @param string $endKey Filter array key for end date - * @param array $filter Filter array - * - * @return \Illuminate\Database\Eloquent\Builder Modified query builder - */ - - public function applyLegacyFilters($query, $filter) - { - return $query->where( - function ($query) use ($filter) { - foreach ($filter as $key => $search_val) { - - $fieldname = str_replace('custom_fields.', '', $key); - - if ($fieldname == 'asset_tag') { - $query->where('assets.asset_tag', 'LIKE', '%'.$search_val.'%'); - } - - if ($fieldname == 'name') { - $query->where('assets.name', 'LIKE', '%'.$search_val.'%'); - } - - - if ($fieldname =='serial') { - $query->where('assets.serial', 'LIKE', '%'.$search_val.'%'); - } - - if ($fieldname == 'purchase_date') { - $query->where('assets.purchase_date', 'LIKE', '%'.$search_val.'%'); - } - - if ($fieldname == 'purchase_cost') { - $query->where('assets.purchase_cost', 'LIKE', '%'.$search_val.'%'); - } - - if ($fieldname == 'notes') { - $query->where('assets.notes', 'LIKE', '%'.$search_val.'%'); - } - - if ($fieldname == 'order_number') { - $query->where('assets.order_number', 'LIKE', '%'.$search_val.'%'); - } - - if ($fieldname == 'status_label') { - $query->whereHas( - 'assetstatus', function ($query) use ($search_val) { - $query->where('status_labels.name', 'LIKE', '%'.$search_val.'%'); - } - ); - } - - if ($fieldname == 'location') { - $query->whereHas( - 'location', function ($query) use ($search_val) { - $query->where('locations.name', 'LIKE', '%'.$search_val.'%'); - } - ); - } + if ($fieldname == 'location') { + $query->whereHas( + 'location', function ($query) use ($search_val) { + $query->where('locations.name', 'LIKE', '%'.$search_val.'%'); + } + ); + } if ($fieldname == 'rtd_location') { $query->whereHas( @@ -2326,7 +2036,7 @@ function ($query) use ($search_val) { } ); } - + if ($fieldname == 'status_label') { $query->whereHas( 'assetstatus', function ($query) use ($search_val) { @@ -2387,8 +2097,265 @@ function ($query) use ($search_val) { ) { $query->where('assets.'.$fieldname, 'LIKE', '%' . $search_val . '%'); } + + } + + } ); } + + + public function scopeByFilter($query, array $filters) + { + // Check if the filters are in Snipe-IT's original format (key => value) + if ($this->isLegacyFilterFormat($filters)) { + return $this->applyLegacyFilters($query, $filters); + } + return $this->filterService()->searchByFilter($query, $filters); + } + + private function isLegacyFilterFormat($filters) + { + // Snipe-IT filters are simple key/value (not arrays with 'field') + return !isset($filters[0]['field']); + } + + /** + * Query builder scope to order on model + * + * @param \Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return \Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderModels($query, $order) + { + return $query->join('models as asset_models', 'assets.model_id', '=', 'asset_models.id')->orderBy('asset_models.name', $order); + } + + /** + * Query builder scope to order on model number + * + * @param \Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return \Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderModelNumber($query, $order) + { + return $query->leftJoin('models as model_number_sort', 'assets.model_id', '=', 'model_number_sort.id')->orderBy('model_number_sort.model_number', $order); + } + + + /** + * Query builder scope to order on created_by name + * + * @param \Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return \Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderByCreatedByName($query, $order) + { + return $query->leftJoin('users as admin_sort', 'assets.created_by', '=', 'admin_sort.id')->select('assets.*')->orderBy('admin_sort.first_name', $order)->orderBy('admin_sort.last_name', $order); + } + + + /** + * Query builder scope to order on assigned user + * + * @param \Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return \Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderAssigned($query, $order) + { + return $query->leftJoin('users as users_sort', 'assets.assigned_to', '=', 'users_sort.id')->select('assets.*')->orderBy('users_sort.first_name', $order)->orderBy('users_sort.last_name', $order); + } + + /** + * Query builder scope to order on status + * + * @param \Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return \Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderStatus($query, $order) + { + return $query->join('status_labels as status_sort', 'assets.status_id', '=', 'status_sort.id')->orderBy('status_sort.name', $order); + } + + /** + * Query builder scope to order on company + * + * @param \Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return \Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderCompany($query, $order) + { + return $query->leftJoin('companies as company_sort', 'assets.company_id', '=', 'company_sort.id')->orderBy('company_sort.name', $order); + } + + + /** + * Query builder scope to return results of a category + * + * @param \Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return \Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeInCategory($query, $category_id) + { + return $query->join('models as category_models', 'assets.model_id', '=', 'category_models.id') + ->join('categories', 'category_models.category_id', '=', 'categories.id') + ->whereIn('category_models.category_id', (!is_array($category_id) ? explode(',', $category_id): $category_id)); + //->whereIn('category_models.category_id', $category_id); + } + + /** + * Query builder scope to return results of a manufacturer + * + * @param \Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return \Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeByManufacturer($query, $manufacturer_id) + { + return $query->join('models', 'assets.model_id', '=', 'models.id') + ->join('manufacturers', 'models.manufacturer_id', '=', 'manufacturers.id')->whereIn('models.manufacturer_id', (!is_array($manufacturer_id) ? explode(',', $manufacturer_id): $manufacturer_id)); + } + + + + /** + * Query builder scope to order on category + * + * @param \Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return \Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderCategory($query, $order) + { + return $query->join('models as order_model_category', 'assets.model_id', '=', 'order_model_category.id') + ->join('categories as category_order', 'order_model_category.category_id', '=', 'category_order.id') + ->orderBy('category_order.name', $order); + } + + + /** + * Query builder scope to order on manufacturer + * + * @param \Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return \Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderManufacturer($query, $order) + { + return $query->join('models as order_asset_model', 'assets.model_id', '=', 'order_asset_model.id') + ->leftjoin('manufacturers as manufacturer_order', 'order_asset_model.manufacturer_id', '=', 'manufacturer_order.id') + ->orderBy('manufacturer_order.name', $order); + } + + /** + * Query builder scope to order on location + * + * @param \Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return \Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderLocation($query, $order) + { + return $query->leftJoin('locations as asset_locations', 'asset_locations.id', '=', 'assets.location_id')->orderBy('asset_locations.name', $order); + } + + /** + * Query builder scope to order on default + * + * @param \Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return \Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderRtdLocation($query, $order) + { + return $query->leftJoin('locations as rtd_asset_locations', 'rtd_asset_locations.id', '=', 'assets.rtd_location_id')->orderBy('rtd_asset_locations.name', $order); + } + + + /** + * Query builder scope to order on supplier name + * + * @param \Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return \Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderSupplier($query, $order) + { + return $query->leftJoin('suppliers as suppliers_assets', 'assets.supplier_id', '=', 'suppliers_assets.id')->orderBy('suppliers_assets.name', $order); + } + + /** + * Query builder scope to order on supplier name + * + * @param \Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return \Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderByJobTitle($query, $order) + { + return $query->leftJoin('users as users_sort', 'assets.assigned_to', '=', 'users_sort.id')->select('assets.*')->orderBy('users_sort.jobtitle', $order); + } + + /** + * Query builder scope to search on location ID + * + * @param \Illuminate\Database\Query\Builder $query Query builder instance + * @param text $search Search term + * + * @return \Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeByLocationId($query, $search) + { + return $query->where( + function ($query) use ($search) { + $query->whereHas( + 'location', function ($query) use ($search) { + $query->where('locations.id', '=', $search); + } + ); + } + ); + + } + + + /** + * Query builder scope to search on depreciation name + * + * @param \Illuminate\Database\Query\Builder $query Query builder instance + * @param text $search Search term + * + * @return \Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeByDepreciationId($query, $search) + { + return $query->join('models', 'assets.model_id', '=', 'models.id') + ->join('depreciations', 'models.depreciation_id', '=', 'depreciations.id')->where('models.depreciation_id', '=', $search); + + } + + } diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 11aae1b3dc51..997009b72f11 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -21,7 +21,9 @@ public function run() { Model::unguard(); + // Only create default settings if they do not exist in the db. if (! Setting::first()) { + // factory(Setting::class)->create(); $this->call(SettingsSeeder::class); } @@ -53,7 +55,7 @@ public function run() $this->call(ActionlogSeeder::class); $this->call(PredefinedFilterSeeder::class); $this->call(PredefinedFilterPermissionSeeder::class); - + Artisan::call('snipeit:sync-asset-locations', ['--output' => 'all']); $output = Artisan::output(); Log::info($output); @@ -64,4 +66,4 @@ public function run() DB::table('maintenances')->truncate(); DB::table('requested_assets')->truncate(); } -} \ No newline at end of file +} diff --git a/database/seeders/GroupMatrixSeeder.php b/database/seeders/GroupMatrixSeeder.php index 10e0923d9d5a..67e9cf44376f 100644 --- a/database/seeders/GroupMatrixSeeder.php +++ b/database/seeders/GroupMatrixSeeder.php @@ -68,4 +68,4 @@ public function run(): void $g->save(); } } -} \ No newline at end of file +} diff --git a/database/seeders/PredefinedFilterPermissionSeeder.php b/database/seeders/PredefinedFilterPermissionSeeder.php index 48fbcfcb31f3..963226337d1b 100644 --- a/database/seeders/PredefinedFilterPermissionSeeder.php +++ b/database/seeders/PredefinedFilterPermissionSeeder.php @@ -58,4 +58,4 @@ public function run(): void Log::debug($e); } } -} \ No newline at end of file +} diff --git a/database/seeders/SettingsSeeder.php b/database/seeders/SettingsSeeder.php index d7f31e67f768..cc7f1b4d27df 100644 --- a/database/seeders/SettingsSeeder.php +++ b/database/seeders/SettingsSeeder.php @@ -41,7 +41,7 @@ public function run() if ($user = User::where('username', '=', 'admin')->first()) { $user->locale = 'en-US'; - $user->enable_sounds = 1; + $user->enable_sound = 1; $user->enable_confetti = 1; $user->save(); } diff --git a/package-lock.json b/package-lock.json index 141f25f75269..2d50f65dfc43 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "snipeit", + "name": "snipe-it", "lockfileVersion": 3, "requires": true, "packages": { @@ -90,7 +90,6 @@ "version": "7.24.5", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.2", @@ -2471,7 +2470,6 @@ "version": "8.14.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2560,7 +2558,6 @@ "node_modules/ajv": { "version": "6.12.6", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -3337,7 +3334,6 @@ "url": "https://github.com/sponsors/ai" } ], - "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001669", "electron-to-chromium": "^1.5.41", @@ -3467,9 +3463,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001759", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001759.tgz", - "integrity": "sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==", + "version": "1.0.30001727", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz", + "integrity": "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==", "funding": [ { "type": "opencollective", @@ -3483,8 +3479,7 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ], - "license": "CC-BY-4.0" + ] }, "node_modules/canvas-confetti": { "version": "1.9.3", @@ -6684,8 +6679,7 @@ }, "node_modules/jquery": { "version": "3.5.1", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jquery-knob": { "version": "1.2.11", @@ -6806,7 +6800,6 @@ "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-3.0.3.tgz", "integrity": "sha512-eURjAyz5iX1H8BOYAfzvdPfIKK53V7mCpBTe7Kb16PaM8JSXEcUQNBQaiWMI8wY5RvNOPj4GccMjTlfwRBd+oQ==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.26.9", "fast-png": "^6.2.0", @@ -7000,7 +6993,6 @@ "version": "7.0.1", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "file-type": "^12.0.0", "globby": "^10.0.0", @@ -7624,7 +7616,6 @@ "node_modules/moment": { "version": "2.30.1", "license": "MIT", - "peer": true, "engines": { "node": "*" } @@ -8381,7 +8372,6 @@ "url": "https://github.com/sponsors/ai" } ], - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -10182,7 +10172,6 @@ "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -10707,7 +10696,6 @@ "version": "5.98.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz", "integrity": "sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==", - "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", @@ -10753,7 +10741,6 @@ "version": "4.10.0", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@discoveryjs/json-ext": "^0.5.0", "@webpack-cli/configtest": "^1.2.0", @@ -10822,7 +10809,6 @@ "version": "8.13.0", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", @@ -10930,7 +10916,6 @@ "version": "8.13.0", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", @@ -11019,7 +11004,6 @@ "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", diff --git a/phpunit.xml b/phpunit.xml index 7aa677af24a1..30a78b7a63cf 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -26,7 +26,6 @@ - diff --git a/resources/assets/js/snipeit.js b/resources/assets/js/snipeit.js index 1ff14b20de81..d684c38f48e6 100755 --- a/resources/assets/js/snipeit.js +++ b/resources/assets/js/snipeit.js @@ -23,8 +23,8 @@ require('blueimp-file-upload') require('bootstrap-colorpicker') require('bootstrap-datepicker') require('ekko-lightbox') //TODO - this doesn't seem jquery-ish, we might need to do something weird here -// it *does* require Bootstrap, which requires jquery, so maybe that's OK -// it seems to work... + // it *does* require Bootstrap, which requires jquery, so maybe that's OK + // it seems to work... require('./extensions/pGenerator.jquery'); //WEIRD, but works //require('chart.js') // Weirdly, this seems to "just work." Without this line, the dashboard blows up // but it's *HUGE* - and we only use it one place. So we're taking it out of the bundle @@ -46,34 +46,34 @@ window.ClipboardJS = require('clipboard') lineOptions = { - legend: { - position: "bottom" - }, - scales: { - yAxes: [{ - ticks: { - fontColor: "rgba(0,0,0,0.5)", - fontStyle: "bold", - beginAtZero: true, - maxTicksLimit: 5, - padding: 20 - }, - gridLines: { - drawTicks: false, - display: false - } - }], - xAxes: [{ - gridLines: { - zeroLineColor: "transparent" - }, - ticks: { - padding: 20, - fontColor: "rgba(0,0,0,0.5)", - fontStyle: "bold" - } - }] - } + legend: { + position: "bottom" + }, + scales: { + yAxes: [{ + ticks: { + fontColor: "rgba(0,0,0,0.5)", + fontStyle: "bold", + beginAtZero: true, + maxTicksLimit: 5, + padding: 20 + }, + gridLines: { + drawTicks: false, + display: false + } + }], + xAxes: [{ + gridLines: { + zeroLineColor: "transparent" + }, + ticks: { + padding: 20, + fontColor: "rgba(0,0,0,0.5)", + fontStyle: "bold" + } + }] + } }; @@ -101,8 +101,8 @@ pieOptions = { //String - A legend template legendTemplate: "
    -legend\"><% for (var i=0; i
  • " + - "" + - "<%if(segments[i].label){%><%=segments[i].label%><%}%> foo
  • <%}%>
", + "" + + "<%if(segments[i].label){%><%=segments[i].label%><%}%> foo<%}%>", //String - A tooltip template tooltipTemplate: "<%=value %> <%=label%> " }; @@ -162,15 +162,15 @@ $(function () { - /* - * Select2 - */ + /* + * Select2 + */ - $('select.select2:not(".select2-hidden-accessible")').each(function (i, obj) { - { - $(obj).select2(); - } - }); + $('select.select2:not(".select2-hidden-accessible")').each(function (i,obj) { + { + $(obj).select2(); + } + }); // $('.datepicker').datepicker(); @@ -179,7 +179,7 @@ $(function () { // $('.datepicker').datepicker(); // Crazy select2 rich dropdowns with images! - $('.js-data-ajax').each(function (i, item) { + $('.js-data-ajax').each( function (i,item) { var link = $(item); var endpoint = link.data("endpoint"); var select = link.data("select"); @@ -194,7 +194,7 @@ $(function () { allowClear: true, language: $('meta[name="language"]').attr('content'), dir: $('meta[name="language-direction"]').attr('content'), - + ajax: { // the baseUrl includes a trailing slash @@ -243,107 +243,107 @@ $(function () { }); - function getSelect2Value(element) { - - // if the passed object is not a jquery object, assuming 'element' is a selector - if (!(element instanceof jQuery)) element = $(element); - - var select = element.data("select2"); - - // There's two different locations where the select2-generated input element can be. - searchElement = select.dropdown.$search || select.$container.find(".select2-search__field"); - - var value = searchElement.val(); - return value; - } - - $(".select2-hidden-accessible").on('select2:selecting', function (e) { - var data = e.params.args.data; - var isMouseUp = false; - var element = $(this); - var value = getSelect2Value(element); - - if (e.params.args.originalEvent) isMouseUp = e.params.args.originalEvent.type == "mouseup"; - - // if selected item does not match typed text, do not allow it to pass - force close for ajax. - if (!isMouseUp) { - if (value.toLowerCase() && data.text.toLowerCase().indexOf(value) < 0) { - e.preventDefault(); - - element.select2('close'); - - // if it does match, we set a flag in the event (which gets passed to subsequent events), telling it not to worry about the ajax - } else if (value.toLowerCase() && data.text.toLowerCase().indexOf(value) > -1) { - e.params.args.noForceAjax = true; - } - } - }); - - $(".select2-hidden-accessible").on('select2:closing', function (e) { - var element = $(this); - var value = getSelect2Value(element); - var noForceAjax = false; - var isMouseUp = false; - if (e.params.args.originalSelect2Event) noForceAjax = e.params.args.originalSelect2Event.noForceAjax; - if (e.params.args.originalEvent) isMouseUp = e.params.args.originalEvent.type == "mouseup"; - - if (value && !noForceAjax && !isMouseUp) { - var endpoint = element.data("endpoint"); - var assetStatusType = element.data("asset-status-type"); - $.ajax({ - url: baseUrl + 'api/v1/' + endpoint + '/selectlist?search=' + value + '&page=1' + (assetStatusType ? '&assetStatusType=' + assetStatusType : ''), - dataType: 'json', - headers: { - "X-Requested-With": 'XMLHttpRequest', - "X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr('content') - }, - }).done(function (response) { - var currentlySelected = element.select2('data').map(function (x) { + function getSelect2Value(element) { + + // if the passed object is not a jquery object, assuming 'element' is a selector + if (!(element instanceof jQuery)) element = $(element); + + var select = element.data("select2"); + + // There's two different locations where the select2-generated input element can be. + searchElement = select.dropdown.$search || select.$container.find(".select2-search__field"); + + var value = searchElement.val(); + return value; + } + + $(".select2-hidden-accessible").on('select2:selecting', function (e) { + var data = e.params.args.data; + var isMouseUp = false; + var element = $(this); + var value = getSelect2Value(element); + + if(e.params.args.originalEvent) isMouseUp = e.params.args.originalEvent.type == "mouseup"; + + // if selected item does not match typed text, do not allow it to pass - force close for ajax. + if(!isMouseUp) { + if(value.toLowerCase() && data.text.toLowerCase().indexOf(value) < 0) { + e.preventDefault(); + + element.select2('close'); + + // if it does match, we set a flag in the event (which gets passed to subsequent events), telling it not to worry about the ajax + } else if(value.toLowerCase() && data.text.toLowerCase().indexOf(value) > -1) { + e.params.args.noForceAjax = true; + } + } + }); + + $(".select2-hidden-accessible").on('select2:closing', function (e) { + var element = $(this); + var value = getSelect2Value(element); + var noForceAjax = false; + var isMouseUp = false; + if(e.params.args.originalSelect2Event) noForceAjax = e.params.args.originalSelect2Event.noForceAjax; + if(e.params.args.originalEvent) isMouseUp = e.params.args.originalEvent.type == "mouseup"; + + if(value && !noForceAjax && !isMouseUp) { + var endpoint = element.data("endpoint"); + var assetStatusType = element.data("asset-status-type"); + $.ajax({ + url: baseUrl + 'api/v1/' + endpoint + '/selectlist?search='+value+'&page=1' + (assetStatusType ? '&assetStatusType='+assetStatusType : ''), + dataType: 'json', + headers: { + "X-Requested-With": 'XMLHttpRequest', + "X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr('content') + }, + }).done(function(response) { + var currentlySelected = element.select2('data').map(function (x){ return +x.id; }).filter(function (x) { return x !== 0; }); - - // makes sure we're not selecting the same thing twice for multiples - var filteredResponse = response.results.filter(function (item) { - return currentlySelected.indexOf(+item.id) < 0; - }); - - var first = (currentlySelected.length > 0) ? filteredResponse[0] : response.results[0]; - - if (first && first.id) { - first.selected = true; - - if ($("option[value='" + first.id + "']", element).length < 1) { - var option = new Option(first.text, first.id, true, true); - element.append(option); - } else { - var isMultiple = element.attr("multiple") == "multiple"; - element.val(isMultiple ? element.val().concat(first.id) : element.val(first.id)); - } - element.trigger('change'); - - element.trigger({ - type: 'select2:select', - params: { - data: first - } - }); - } - }); - } - }); - - function formatDatalist(datalist) { + + // makes sure we're not selecting the same thing twice for multiples + var filteredResponse = response.results.filter(function(item) { + return currentlySelected.indexOf(+item.id) < 0; + }); + + var first = (currentlySelected.length > 0) ? filteredResponse[0] : response.results[0]; + + if(first && first.id) { + first.selected = true; + + if($("option[value='" + first.id + "']", element).length < 1) { + var option = new Option(first.text, first.id, true, true); + element.append(option); + } else { + var isMultiple = element.attr("multiple") == "multiple"; + element.val(isMultiple? element.val().concat(first.id) : element.val(first.id)); + } + element.trigger('change'); + + element.trigger({ + type: 'select2:select', + params: { + data: first + } + }); + } + }); + } + }); + + function formatDatalist (datalist) { var loading_markup = ' Loading...'; if (datalist.loading) { return loading_markup; } - var markup = '
'; + var markup = '
' ; markup += '
'; if (datalist.image) { - markup += "
" + datalist.text + "
"; + markup += "
" +  datalist.text + "
"; } else { markup += '
'; } @@ -359,7 +359,7 @@ $(function () { return $(' Loading...'); } - var root_div = $("
"); + var root_div = $("
") ; var left_pull = $("
"); if (datalist.image) { var inner_div = $("
"); @@ -393,7 +393,7 @@ $(function () { root_div.append(name_div) var safe_html = root_div.get(0).outerHTML; var old_html = formatDatalist(datalist); - if (safe_html != old_html) { + if(safe_html != old_html) { //console.log("HTML MISMATCH: "); //console.log("FormatDatalistSafe: "); // console.dir(root_div.get(0)); @@ -405,7 +405,7 @@ $(function () { } - function formatDataSelection(datalist) { + function formatDataSelection (datalist) { // This a heinous workaround for a known bug in Select2. // Without this, the rich selectlists are vulnerable to XSS. // Many thanks to @uberbrady for this fix. It ain't pretty, @@ -422,8 +422,8 @@ $(function () { // This handles the radio button selectors for the checkout-to-foo options // on asset checkout and also on asset edit - $(function () { - $('input[name=checkout_to_type]').on("change", function () { + $(function() { + $('input[name=checkout_to_type]').on("change",function () { var assignto_type = $('input[name=checkout_to_type]:checked').val(); var userid = $('#assigned_user option:selected').val(); @@ -446,7 +446,7 @@ $(function () { $('[name="assigned_asset"]').val('').trigger('change.select2'); $('[name="assigned_user"]').val('').trigger('change.select2'); - } else { + } else { $('#assigned_asset').hide(); $('#assigned_user').show(); @@ -473,8 +473,8 @@ $(function () { // This allows linking to a tab on page load via the address bar. // So a URL such as, http://snipe-it.local/hardware/2/#my_tab will // cause the tab on that page with an ID of “my_tab” to be active. - if (taburl.match('#')) { - $('.nav-tabs a[href="#' + taburl.split('#')[1] + '"]').tab('show'); + if (taburl.match('#') ) { + $('.nav-tabs a[href="#'+taburl.split('#')[1]+'"]').tab('show'); } // Allow internal page links to activate a tab's ID. @@ -500,7 +500,7 @@ $(function () { function readURL(input, $preview) { if (input.files && input.files[0]) { var reader = new FileReader(); - reader.onload = function (e) { + reader.onload = function(e) { $preview.attr('src', e.target.result); }; reader.readAsDataURL(input.files[0]); @@ -508,14 +508,14 @@ $(function () { } function formatBytes(bytes) { - if (bytes < 1024) return bytes + " Bytes"; - else if (bytes < 1048576) return (bytes / 1024).toFixed(2) + " KB"; - else if (bytes < 1073741824) return (bytes / 1048576).toFixed(2) + " MB"; - else return (bytes / 1073741824).toFixed(2) + " GB"; + if(bytes < 1024) return bytes + " Bytes"; + else if(bytes < 1048576) return(bytes / 1024).toFixed(2) + " KB"; + else if(bytes < 1073741824) return(bytes / 1048576).toFixed(2) + " MB"; + else return(bytes / 1073741824).toFixed(2) + " GB"; } - // File size validation - $('.js-uploadFile').bind('change', function () { + // File size validation + $('.js-uploadFile').bind('change', function() { var $this = $(this); var id = '#' + $this.attr('id'); var status = id + '-status'; @@ -544,7 +544,7 @@ $(function () { $status.addClass('text-danger').removeClass('help-block').prepend(' ').append(' Upload is ' + formatBytes(total_size) + '.'); } else { $status.addClass('text-success').removeClass('help-block').prepend(' '); - var $preview = $(id + '-imagePreview'); + var $preview = $(id + '-imagePreview'); readURL(this, $preview); $preview.fadeIn(); preview_container.fadeIn(); @@ -565,12 +565,12 @@ function htmlEntities(str) { /** * Toggle disabled */ -(function ($) { - - $.fn.toggleDisabled = function (callback) { - return this.each(function () { +(function($){ + + $.fn.toggleDisabled = function(callback){ + return this.each(function(){ var disabled, $this = $(this); - if ($this.attr('disabled')) { + if($this.attr('disabled')){ $this.removeAttr('disabled'); disabled = false; } else { @@ -578,12 +578,12 @@ function htmlEntities(str) { disabled = true; } - if (callback && typeof callback === 'function') { + if(callback && typeof callback === 'function'){ callback(this, disabled); } }); }; - + })(jQuery); @@ -603,7 +603,7 @@ document.addEventListener('livewire:init', () => { $(document).on('select2:select', '.livewire-select2', function (event) { var target = $(event.target) - if (!event.target.name || !target.data('livewire-component')) { + if(!event.target.name || !target.data('livewire-component')) { console.error("You need to set both name (which should match a Livewire property) and data-livewire-component on your Livewire-ed select2 elements!") console.error("For data-livewire-component, you probably want to use $this->getId() or {{ $this->getId() }}, as appropriate") return false @@ -611,7 +611,7 @@ document.addEventListener('livewire:init', () => { Livewire.find(target.data('livewire-component')).set(event.target.name, this.options[this.selectedIndex].value) }); - Livewire.hook('request', ({ succeed }) => { + Livewire.hook('request', ({succeed}) => { succeed(() => { queueMicrotask(() => { $('.livewire-select2').select2(); diff --git a/resources/views/auth/passwords/reset.blade.php b/resources/views/auth/passwords/reset.blade.php index 2220f6f618e8..0e529d3f52ce 100644 --- a/resources/views/auth/passwords/reset.blade.php +++ b/resources/views/auth/passwords/reset.blade.php @@ -25,6 +25,8 @@ @include('notifications') + +
diff --git a/resources/views/hardware/index.blade.php b/resources/views/hardware/index.blade.php index 71c3a0423468..2ff01c2d8574 100755 --- a/resources/views/hardware/index.blade.php +++ b/resources/views/hardware/index.blade.php @@ -1,94 +1,116 @@ @extends('layouts/default') @section('title0') -@if (Request::get('company_id') && $company) + + @if ((Request::get('company_id')) && ($company)) {{ $company->name }} -@endif + @endif + + @if (Request::get('status')) - @switch(Request::get('status')) - @case('Pending') {{ trans('general.pending') }} @break - @case('RTD') {{ trans('general.ready_to_deploy') }} @break - @case('Deployed') {{ trans('general.deployed') }} @break - @case('Undeployable') {{ trans('general.undeployable') }} @break - @case('Deployable') {{ trans('general.deployed') }} @break - @case('Requestable') {{ trans('admin/hardware/general.requestable') }} @break - @case('Archived') {{ trans('general.archived') }} @break - @case('Deleted') {{ ucfirst(trans('general.deleted')) }} @break - @case('byod') {{ strtoupper(trans('general.byod')) }} @break - @endswitch + @if (Request::get('status')=='Pending') + {{ trans('general.pending') }} + @elseif (Request::get('status')=='RTD') + {{ trans('general.ready_to_deploy') }} + @elseif (Request::get('status')=='Deployed') + {{ trans('general.deployed') }} + @elseif (Request::get('status')=='Undeployable') + {{ trans('general.undeployable') }} + @elseif (Request::get('status')=='Deployable') + {{ trans('general.deployed') }} + @elseif (Request::get('status')=='Requestable') + {{ trans('admin/hardware/general.requestable') }} + @elseif (Request::get('status')=='Archived') + {{ trans('general.archived') }} + @elseif (Request::get('status')=='Deleted') + {{ ucfirst(trans('general.deleted')) }} + @elseif (Request::get('status')=='byod') + {{ strtoupper(trans('general.byod')) }} + @endif @else - {{ trans('general.all') }} +{{ trans('general.all') }} @endif {{ trans('general.assets') }} -@if (Request::has('order_number')) + @if (Request::has('order_number')) : Order #{{ strval(Request::get('order_number')) }} -@endif + @endif @stop +{{-- Page title --}} @section('title') -@yield('title0') @parent +@yield('title0') @parent @stop + +{{-- Page content --}} @section('content') -
- -
- @include('partials.advanced-search.advanced-search', [ - 'predefined_filter_id' => $predefined_filter_id, - ]) -
+
+ +
+ @include('partials.advanced-search.advanced-search', [ + 'predefined_filter_id' => $predefined_filter_id, + ]) +
- -
-
-
- @include('partials.asset-bulk-actions', [ - 'status' => Request::get('status'), - 'showFiltersTogglebutton' => $advanced_search_permission, - ]) - - +
+
+
+ @include('partials.asset-bulk-actions', [ + 'status' => Request::get('status'), + 'showFiltersTogglebutton' => $advanced_search_permission, + ]) + +
-
-
+
+
+
- @if($advanced_search_permission) - - @endif + @if($advanced_search_permission) + + @endif -
+
- + - @if($advanced_search_permission) - +@if($advanced_search_permission) + @stop @section('moar_scripts') - @include('partials.bootstrap-table') +@include('partials.bootstrap-table') + @stop diff --git a/resources/views/hardware/view.blade.php b/resources/views/hardware/view.blade.php index 0bf87497779a..a243bd9a3515 100755 --- a/resources/views/hardware/view.blade.php +++ b/resources/views/hardware/view.blade.php @@ -2,60 +2,57 @@ {{-- Page title --}} @section('title') -{{ trans('admin/hardware/general.view') }} {{ $asset->asset_tag }} -@parent + {{ trans('admin/hardware/general.view') }} {{ $asset->asset_tag }} + @parent @stop {{-- Page content --}} @section('content') -
+
- @if (!$asset->model) -
-
-

{{ trans('admin/models/message.no_association') }} - {{ trans('admin/models/message.no_association_fix') }}

+ @if (!$asset->model) +
+
+

{{ trans('admin/models/message.no_association') }} {{ trans('admin/models/message.no_association_fix') }}

+
-
- @endif - - @if ($asset->checkInvalidNextAuditDate()) -
-
-

{{ trans( - 'general.warning', - [ - 'warning' => trans( - 'admin/hardware/message.warning_audit_date_mismatch', - [ - 'last_audit_date' => Helper::getFormattedDateObject($asset->last_audit_date, 'datetime', false), - 'next_audit_date' => Helper::getFormattedDateObject($asset->next_audit_date, 'date', false) - ] - ) - ] - ) }}

+ @endif + + @if ($asset->checkInvalidNextAuditDate()) +
+
+

{{ trans('general.warning', + [ + 'warning' => trans('admin/hardware/message.warning_audit_date_mismatch', + [ + 'last_audit_date' => Helper::getFormattedDateObject($asset->last_audit_date, 'datetime', false), + 'next_audit_date' => Helper::getFormattedDateObject($asset->next_audit_date, 'date', false) + ] + ) + ] + ) }}

+
-
- @endif - - @if ($asset->deleted_at != '') -
-
- - {{ trans('general.asset_deleted_warning') }} + @endif + + @if ($asset->deleted_at!='') +
+
+ + {{ trans('general.asset_deleted_warning') }} +
-
- @endif + @endif -
- +
+
+ + @can('update', \App\Models\Asset::class) + @include ('modals.upload-file', ['item_type' => 'asset', 'item_id' => $asset->id]) + @endcan @stop - @section('moar_scripts') - @include ('partials.bootstrap-table') + @section('moar_scripts') + @include ('partials.bootstrap-table') @stop \ No newline at end of file diff --git a/resources/views/notifications.blade.php b/resources/views/notifications.blade.php index d1a197a1e261..0bb60c689e36 100755 --- a/resources/views/notifications.blade.php +++ b/resources/views/notifications.blade.php @@ -192,4 +192,4 @@ {{ $message }}
-@endif \ No newline at end of file +@endif diff --git a/resources/views/partials/confetti-js.blade.php b/resources/views/partials/confetti-js.blade.php index 51652ee91721..964797c93905 100644 --- a/resources/views/partials/confetti-js.blade.php +++ b/resources/views/partials/confetti-js.blade.php @@ -42,4 +42,4 @@ function randomInRange(min, max) { // Expose function globally for manual trigger window.triggerConfetti = triggerConfetti; -@endif +@endif \ No newline at end of file diff --git a/resources/views/partials/forms/edit/accessory-select.blade.php b/resources/views/partials/forms/edit/accessory-select.blade.php index f756a8691efd..6ecf4f2b236a 100644 --- a/resources/views/partials/forms/edit/accessory-select.blade.php +++ b/resources/views/partials/forms/edit/accessory-select.blade.php @@ -5,4 +5,5 @@ @include('partials.select/dropdowns/accessory-select')
{!! $errors->first($fieldname, '
:message
') !!} +
diff --git a/resources/views/partials/forms/edit/category-select.blade.php b/resources/views/partials/forms/edit/category-select.blade.php index 88e007e1dbe0..8d053497fce8 100644 --- a/resources/views/partials/forms/edit/category-select.blade.php +++ b/resources/views/partials/forms/edit/category-select.blade.php @@ -15,13 +15,7 @@
- {!! $errors->first( - $fieldname, - '
', - ) !!} + {!! $errors->first($fieldname, '
') !!} - {!! $errors->first( - 'category_type', - '
', - ) !!} + {!! $errors->first('category_type', '
') !!}
diff --git a/resources/views/partials/forms/edit/company-select.blade.php b/resources/views/partials/forms/edit/company-select.blade.php index b6edc5c4a483..d290d99a5f6b 100644 --- a/resources/views/partials/forms/edit/company-select.blade.php +++ b/resources/views/partials/forms/edit/company-select.blade.php @@ -1,5 +1,6 @@ - + @if (($snipeSettings->full_multiple_companies_support=='1') && (!Auth::user()->isSuperUser())) +
@@ -13,7 +14,9 @@ ])
+ @else +
@@ -27,7 +30,7 @@ ])
{!! $errors->first($fieldname, '
:message
') !!} -
-@endif +
+@endif diff --git a/resources/views/partials/forms/edit/consumable-select.blade.php b/resources/views/partials/forms/edit/consumable-select.blade.php index 51a89fdf4843..e0628ace2020 100644 --- a/resources/views/partials/forms/edit/consumable-select.blade.php +++ b/resources/views/partials/forms/edit/consumable-select.blade.php @@ -1,12 +1,9 @@ -
+
@include('partials.select/dropdowns/consumable-select')
- {!! $errors->first( - $fieldname, - '
:message
', - ) !!} + {!! $errors->first($fieldname, '
:message
') !!}
diff --git a/resources/views/partials/forms/edit/department-select.blade.php b/resources/views/partials/forms/edit/department-select.blade.php index 2ad47e9e7e05..799638b641c6 100644 --- a/resources/views/partials/forms/edit/department-select.blade.php +++ b/resources/views/partials/forms/edit/department-select.blade.php @@ -7,9 +7,6 @@
- {!! $errors->first( - $fieldname, - '
', - ) !!} + {!! $errors->first($fieldname, '
') !!}
diff --git a/resources/views/partials/forms/edit/kit-select.blade.php b/resources/views/partials/forms/edit/kit-select.blade.php index fbe682021692..49f99f7798f2 100644 --- a/resources/views/partials/forms/edit/kit-select.blade.php +++ b/resources/views/partials/forms/edit/kit-select.blade.php @@ -1,4 +1,4 @@ -
+
@@ -14,9 +14,6 @@ @endcan
- {!! $errors->first( - $fieldname, - '
:message
', - ) !!} + {!! $errors->first($fieldname, '
:message
') !!}
diff --git a/resources/views/partials/forms/edit/license-select.blade.php b/resources/views/partials/forms/edit/license-select.blade.php index 2e7b46246372..7e1574a7d062 100644 --- a/resources/views/partials/forms/edit/license-select.blade.php +++ b/resources/views/partials/forms/edit/license-select.blade.php @@ -1,12 +1,9 @@ -
+
@include('partials.select/dropdowns/license-select')
- {!! $errors->first( - $fieldname, - '
:message
', - ) !!} + {!! $errors->first($fieldname, '
:message
') !!}
diff --git a/resources/views/partials/forms/edit/location-profile-select.blade.php b/resources/views/partials/forms/edit/location-profile-select.blade.php index 647ca367713b..3c24e80975bc 100644 --- a/resources/views/partials/forms/edit/location-profile-select.blade.php +++ b/resources/views/partials/forms/edit/location-profile-select.blade.php @@ -1,14 +1,14 @@ -
+
@include('partials.select/dropdowns/location-profile-select')
- {!! $errors->first( - 'location_id', - '
', - ) !!} + {!! $errors->first('location_id', '
') !!}
+ + + diff --git a/resources/views/partials/forms/edit/location-select.blade.php b/resources/views/partials/forms/edit/location-select.blade.php index dd8623e307c7..7185f3636c64 100644 --- a/resources/views/partials/forms/edit/location-select.blade.php +++ b/resources/views/partials/forms/edit/location-select.blade.php @@ -1,5 +1,5 @@ -
+
@@ -14,33 +14,30 @@ @endcan
- {!! $errors->first( - $fieldname, - '
', - ) !!} + {!! $errors->first($fieldname, '
') !!} @if (isset($help_text)) -
-

{{ $help_text }}

-
+
+

{{ $help_text }}

+
@endif @if (isset($hide_location_radio)) - -
-
- - -
-
- @endif + +
+
+ + +
+
+@endif
+ + diff --git a/resources/views/partials/forms/edit/manufacturer-select.blade.php b/resources/views/partials/forms/edit/manufacturer-select.blade.php index c072d6049f15..5f8dedd1d666 100644 --- a/resources/views/partials/forms/edit/manufacturer-select.blade.php +++ b/resources/views/partials/forms/edit/manufacturer-select.blade.php @@ -16,8 +16,5 @@
- {!! $errors->first( - $fieldname, - '
', - ) !!} + {!! $errors->first($fieldname, '
') !!}
diff --git a/resources/views/partials/forms/edit/model-select.blade.php b/resources/views/partials/forms/edit/model-select.blade.php index f2b83b4e5450..406a28f18566 100644 --- a/resources/views/partials/forms/edit/model-select.blade.php +++ b/resources/views/partials/forms/edit/model-select.blade.php @@ -17,8 +17,5 @@ @endcan
- {!! $errors->first( - $fieldname, - '
', - ) !!} + {!! $errors->first($fieldname, '
') !!}
diff --git a/resources/views/partials/forms/edit/status-select.blade.php b/resources/views/partials/forms/edit/status-select.blade.php index c1e5e0200f97..3a761c60617e 100644 --- a/resources/views/partials/forms/edit/status-select.blade.php +++ b/resources/views/partials/forms/edit/status-select.blade.php @@ -16,8 +16,5 @@
- {!! $errors->first( - $fieldname, - '
', - ) !!} + {!! $errors->first($fieldname, '
') !!}
diff --git a/resources/views/partials/forms/edit/supplier-select.blade.php b/resources/views/partials/forms/edit/supplier-select.blade.php index f0606f9b5ee5..85738e3aceb8 100644 --- a/resources/views/partials/forms/edit/supplier-select.blade.php +++ b/resources/views/partials/forms/edit/supplier-select.blade.php @@ -14,9 +14,6 @@ @endcan - {!! $errors->first( - $fieldname, - '
', - ) !!} + {!! $errors->first($fieldname, '
') !!} diff --git a/resources/views/partials/forms/edit/user-select.blade.php b/resources/views/partials/forms/edit/user-select.blade.php index 106ed02a90a5..772ad78301a6 100644 --- a/resources/views/partials/forms/edit/user-select.blade.php +++ b/resources/views/partials/forms/edit/user-select.blade.php @@ -1,4 +1,4 @@ -
+
@@ -14,9 +14,6 @@ @endcan
- {!! $errors->first( - $fieldname, - '
', - ) !!} + {!! $errors->first($fieldname, '
') !!}
diff --git a/routes/api.php b/routes/api.php index 29ca0b930d83..7a07764a0d4b 100644 --- a/routes/api.php +++ b/routes/api.php @@ -25,9 +25,7 @@ 'status' => 'error', 'message' => '404 endpoint not found. This is the base URL for the API and does not return anything itself. Please check the API reference at https://snipe-it.readme.io/reference to find a valid API endpoint.', 'payload' => null, - ], - 404 - ); + ], 404); }); @@ -36,16 +34,14 @@ */ Route::group(['prefix' => 'account'], function () { - Route::get( - 'requests', + Route::get('requests', [ - Api\ProfileController::class, + Api\ProfileController::class, 'requestedAssets' ] )->name('api.assets.requested'); - Route::get( - 'eulas', + Route::get('eulas', [ Api\ProfileController::class, 'eulas' @@ -55,32 +51,28 @@ Route::post('request/{asset}', [Api\CheckoutRequest::class, 'store'])->name('api.assets.requests.store'); Route::post('request/{asset}/cancel', [Api\CheckoutRequest::class, 'destroy'])->name('api.assets.requests.destroy'); - Route::get( - 'requestable/hardware', + Route::get('requestable/hardware', [ - Api\AssetsController::class, + Api\AssetsController::class, 'requestable' ] )->name('api.assets.requestable'); - Route::post( - 'personal-access-tokens', + Route::post('personal-access-tokens', [ Api\ProfileController::class, 'createApiToken' ] )->name('api.personal-access-token.create'); - Route::get( - 'personal-access-tokens', + Route::get('personal-access-tokens', [ Api\ProfileController::class, 'showApiTokens' ] )->name('api.personal-access-token.index'); - Route::delete( - 'personal-access-tokens/{tokenId}', + Route::delete('personal-access-tokens/{tokenId}', [ Api\ProfileController::class, 'deleteApiToken' @@ -89,56 +81,50 @@ - }); // end account group + }); // end account group - /** + /** * Accessories routes */ Route::group(['prefix' => 'accessories'], function () { - Route::get( - '{accessory}/checkedout', + Route::get('{accessory}/checkedout', [ - Api\AccessoriesController::class, + Api\AccessoriesController::class, 'checkedout' ] )->name('api.accessories.checkedout'); - Route::post( - '{accessory}/checkout', + Route::post('{accessory}/checkout', [ - Api\AccessoriesController::class, + Api\AccessoriesController::class, 'checkout' ] )->name('api.accessories.checkout'); - Route::post( - '{accessory}/checkin', + Route::post('{accessory}/checkin', [ - Api\AccessoriesController::class, + Api\AccessoriesController::class, 'checkin' ] )->name('api.accessories.checkin'); - Route::get( - 'selectlist', + Route::get('selectlist', [ - Api\AccessoriesController::class, + Api\AccessoriesController::class, 'selectlist' ] )->name('api.accessories.selectlist'); - }); // end accessories group + }); // end accessories group - Route::resource( - 'accessories', + Route::resource('accessories', Api\AccessoriesController::class, - [ - 'names' => [ + ['names' => [ 'index' => 'api.accessories.index', 'show' => 'api.accessories.show', 'update' => 'api.accessories.update', @@ -150,133 +136,121 @@ ] ); - /** - * Categpries API routes - */ - Route::group(['prefix' => 'categories'], function () { - - Route::get( - '{item_type}/selectlist', + + /** + * Categories API routes + */ + Route::group(['prefix' => 'categories'], function () { + + Route::get('{item_type}/selectlist', [ - Api\CategoriesController::class, + Api\CategoriesController::class, 'selectlist' ] )->name('api.categories.selectlist'); - }); + }); - Route::resource( - 'categories', + Route::resource('categories', Api\CategoriesController::class, - [ - 'names' => [ + ['names' => [ 'index' => 'api.categories.index', 'show' => 'api.categories.show', 'update' => 'api.categories.update', 'store' => 'api.categories.store', 'destroy' => 'api.categories.destroy', ], - 'except' => ['create', 'edit'], - 'parameters' => ['category' => 'category_id'], + 'except' => ['create', 'edit'], + 'parameters' => ['category' => 'category_id'], ] ); // end category API routes - /** - * Companies API routes - */ - Route::group(['prefix' => 'companies'], function () { - - Route::get( - 'selectlist', + /** + * Companies API routes + */ + Route::group(['prefix' => 'companies'], function () { + + Route::get('selectlist', [ - Api\CompaniesController::class, + Api\CompaniesController::class, 'selectlist' ] )->name('api.companies.selectlist'); - }); + }); - Route::resource( - 'companies', + Route::resource('companies', Api\CompaniesController::class, - [ - 'names' => [ + ['names' => [ 'index' => 'api.companies.index', 'show' => 'api.companies.show', 'update' => 'api.companies.update', 'store' => 'api.companies.store', 'destroy' => 'api.companies.destroy', ], - 'except' => ['create', 'edit'], - 'parameters' => ['company' => 'company_id'], + 'except' => ['create', 'edit'], + 'parameters' => ['company' => 'company_id'], ] ); // end companies API routes /** - * Departments API routes - */ - Route::group(['prefix' => 'departments'], function () { - - Route::get( - 'selectlist', + * Departments API routes + */ + Route::group(['prefix' => 'departments'], function () { + + Route::get('selectlist', [ - Api\DepartmentsController::class, + Api\DepartmentsController::class, 'selectlist' ] )->name('api.departments.selectlist'); - }); + }); - Route::resource( - 'departments', + Route::resource('departments', Api\DepartmentsController::class, - [ - 'names' => [ + ['names' => [ 'index' => 'api.departments.index', 'show' => 'api.departments.show', 'update' => 'api.departments.update', 'store' => 'api.departments.store', 'destroy' => 'api.departments.destroy', ], - 'except' => ['create', 'edit'], - 'parameters' => ['department' => 'department_id'], + 'except' => ['create', 'edit'], + 'parameters' => ['department' => 'department_id'], ] ); // end departments API routes - /** - * Components API routes - */ - Route::group(['prefix' => 'components'], function () { - - Route::get( - 'selectlist', + /** + * Components API routes + */ + Route::group(['prefix' => 'components'], function () { + + Route::get('selectlist', [ - Api\ComponentsController::class, + Api\ComponentsController::class, 'selectlist' ] )->name('api.components.selectlist'); - Route::get( - '{component}/assets', - [ - Api\ComponentsController::class, - 'getAssets' - ] + Route::get('{component}/assets', + [ + Api\ComponentsController::class, + 'getAssets' + ] )->name('api.components.assets'); - }); - Route::post( - 'components/{id}/checkin', + }); + Route::post('components/{id}/checkin', [ Api\ComponentsController::class, 'checkin' ] )->name('api.components.checkin'); - Route::post( - 'components/{id}/checkout', + Route::post('components/{id}/checkout', [ Api\ComponentsController::class, 'checkout' @@ -284,139 +258,124 @@ )->name('api.components.checkout'); - Route::resource( - 'components', + Route::resource('components', Api\ComponentsController::class, - [ - 'names' => [ + ['names' => [ 'index' => 'api.components.index', 'show' => 'api.components.show', 'update' => 'api.components.update', 'store' => 'api.components.store', 'destroy' => 'api.components.destroy', ], - 'except' => ['create', 'edit'], - 'parameters' => ['component' => 'component_id'], + 'except' => ['create', 'edit'], + 'parameters' => ['component' => 'component_id'], ] ); // end components API routes - /** - * Consumables API routes - */ - Route::group(['prefix' => 'consumables'], function () { - - Route::get( - 'selectlist', + /** + * Consumables API routes + */ + Route::group(['prefix' => 'consumables'], function () { + + Route::get('selectlist', [ - Api\ConsumablesController::class, + Api\ConsumablesController::class, 'selectlist' ] )->name('api.consumables.selectlist'); - Route::get( - '{id}/users', + Route::get('{id}/users', [ - Api\ConsumablesController::class, + Api\ConsumablesController::class, 'getDataView' ] )->name('api.consumables.show.users'); - Route::post( - '{consumable}/checkout', + Route::post('{consumable}/checkout', [ - Api\ConsumablesController::class, + Api\ConsumablesController::class, 'checkout' ] )->name('api.consumables.checkout'); - }); + }); - Route::resource( - 'consumables', + Route::resource('consumables', Api\ConsumablesController::class, - [ - 'names' => [ + ['names' => [ 'index' => 'api.consumables.index', 'show' => 'api.consumables.show', 'update' => 'api.consumables.update', 'store' => 'api.consumables.store', 'destroy' => 'api.consumables.destroy', ], - 'except' => ['create', 'edit'], - 'parameters' => ['consumable' => 'consumable_id'], + 'except' => ['create', 'edit'], + 'parameters' => ['consumable' => 'consumable_id'], ] - ); // end consumables API routes + ); // end consumables API routes - /** - * Depreciations API routes - */ - Route::resource( - 'depreciations', + /** + * Depreciations API routes + */ + Route::resource('depreciations', Api\DepreciationsController::class, - [ - 'names' => [ + ['names' => [ 'index' => 'api.depreciations.index', 'show' => 'api.depreciations.show', 'update' => 'api.depreciations.update', 'store' => 'api.depreciations.store', 'destroy' => 'api.depreciations.destroy', ], - 'except' => ['create', 'edit'], - 'parameters' => ['depreciations' => 'depreciation_id'], + 'except' => ['create', 'edit'], + 'parameters' => ['depreciations' => 'depreciation_id'], ] - ); // end depreciations API routes + ); // end depreciations API routes - Route::get( - 'reports/depreciation', + Route::get('reports/depreciation', [ - Api\AssetsController::class, + Api\AssetsController::class, 'index' ] - )->name('api.depreciation-report.index'); - - - - /** - * Fields API routes - */ - Route::group(['prefix' => 'fields'], function () { - - Route::post( - 'fieldsets/{id}/order', - [ - Api\CustomFieldsController::class, - 'postReorder' - ] - )->name('api.customfields.order'); - - Route::post( - '{field}/associate', - [ - Api\CustomFieldsController::class, - 'associate' - ] - )->name('api.customfields.associate'); + )->name('api.depreciation-report.index'); + + + + /** + * Fields API routes + */ + Route::group(['prefix' => 'fields'], function () { + + Route::post('fieldsets/{id}/order', + [ + Api\CustomFieldsController::class, + 'postReorder' + ] + )->name('api.customfields.order'); + + Route::post('{field}/associate', + [ + Api\CustomFieldsController::class, + 'associate' + ] + )->name('api.customfields.associate'); - Route::post( - '{field}/disassociate', - [ - Api\CustomFieldsController::class, - 'disassociate' - ] - )->name('api.customfields.disassociate'); - }); + Route::post('{field}/disassociate', + [ + Api\CustomFieldsController::class, + 'disassociate' + ] + )->name('api.customfields.disassociate'); + }); - Route::resource( - 'fields', + Route::resource('fields', Api\CustomFieldsController::class, - [ - 'names' => + ['names' => [ 'index' => 'api.customfields.index', 'show' => 'api.customfields.show', @@ -426,228 +385,203 @@ ], 'except' => ['create', 'edit'], 'parameters' => ['field' => 'field_id'], - ] - ); // end custom fields API routes - - /** - * Fieldsets API routes - */ - Route::group(['prefix' => 'fieldsets'], function () { - - Route::post( - '{fieldset}/fields', - [ - Api\CustomFieldsetsController::class, - 'fields' ] - )->name('api.fieldsets.fields'); + ); // end custom fields API routes - Route::post( - '{fieldset}/fields/{model}', - [ - Api\CustomFieldsetsController::class, - 'fieldsWithDefaultValues' - ] - )->name('api.fieldsets.fields-with-default-value'); + /** + * Fieldsets API routes + */ + Route::group(['prefix' => 'fieldsets'], function () { + + Route::post('{fieldset}/fields', + [ + Api\CustomFieldsetsController::class, + 'fields' + ] + )->name('api.fieldsets.fields'); - }); + Route::post('{fieldset}/fields/{model}', + [ + Api\CustomFieldsetsController::class, + 'fieldsWithDefaultValues' + ] + )->name('api.fieldsets.fields-with-default-value'); + + }); - Route::resource( - 'fieldsets', + Route::resource('fieldsets', Api\CustomFieldsetsController::class, - [ - 'names' => [ - 'index' => 'api.fieldsets.index', - 'show' => 'api.fieldsets.show', - 'update' => 'api.fieldsets.update', - 'store' => 'api.fieldsets.store', - 'destroy' => 'api.fieldsets.destroy', - ], + ['names' => [ + 'index' => 'api.fieldsets.index', + 'show' => 'api.fieldsets.show', + 'update' => 'api.fieldsets.update', + 'store' => 'api.fieldsets.store', + 'destroy' => 'api.fieldsets.destroy', + ], 'except' => ['create', 'edit'], 'parameters' => ['fieldset' => 'fieldset_id'], - ] - ); // end custom fieldsets API routes + ] + ); // end custom fieldsets API routes - /** - * Groups API routes - */ - Route::get('groups/selectlist', [Api\GroupsController::class, 'selectlist']) - ->name('api.groups.selectlist'); - Route::resource( - 'groups', + /** + * Groups API routes + */ + Route::resource('groups', Api\GroupsController::class, - [ - 'names' => [ - 'index' => 'api.groups.index', - 'show' => 'api.groups.show', - 'update' => 'api.groups.update', - 'store' => 'api.groups.store', - 'destroy' => 'api.groups.destroy', - ], + ['names' => [ + 'index' => 'api.groups.index', + 'show' => 'api.groups.show', + 'update' => 'api.groups.update', + 'store' => 'api.groups.store', + 'destroy' => 'api.groups.destroy', + ], 'except' => ['create', 'edit'], 'parameters' => ['group' => 'group_id'], - ] - ); // end groups API routes + ] + ); // end groups API routes - /** - * Assets API routes - */ - Route::group(['prefix' => 'hardware'], function () { + /** + * Assets API routes + */ + Route::group(['prefix' => 'hardware'], function () { - Route::get( - 'selectlist', + Route::get('selectlist', [ - Api\AssetsController::class, + Api\AssetsController::class, 'selectlist' ] )->name('assets.selectlist'); - Route::get( - '{asset_id}/licenses', + Route::get('{asset_id}/licenses', [ - Api\AssetsController::class, + Api\AssetsController::class, 'licenses' ] )->name('api.assets.licenselist'); - Route::get( - 'bytag/{tag}', + Route::get('bytag/{tag}', [ - Api\AssetsController::class, + Api\AssetsController::class, 'showByTag' ] )->name('assets.show.bytag'); - Route::get( - 'bytag/{any}', + Route::get('bytag/{any}', [ - Api\AssetsController::class, + Api\AssetsController::class, 'showByTag' ] )->name('api.assets.show.bytag') - ->where('any', '.*'); + ->where('any', '.*'); - Route::post( - 'bytag/{any}/checkout', + Route::post('bytag/{any}/checkout', [ - Api\AssetsController::class, + Api\AssetsController::class, 'checkoutByTag' ] )->name('api.assets.checkout.bytag'); - Route::post( - 'bytag/{any}/checkin', + Route::post('bytag/{any}/checkin', [ Api\AssetsController::class, 'checkinbytag' ] )->name('api.asset.checkinbytagPath'); - Route::post( - 'checkinbytag', + Route::post('checkinbytag', [ Api\AssetsController::class, 'checkinbytag' ] )->name('api.asset.checkinbytag'); - Route::get( - 'byserial/{any}', + Route::get('byserial/{any}', [ - Api\AssetsController::class, + Api\AssetsController::class, 'showBySerial' ] )->name('api.assets.show.byserial') - ->where('any', '.*'); + ->where('any', '.*'); // This gets the "due or overdue" API endpoints for audit/audits and checkins - Route::get( - '{action}/{upcoming_status}', - [ - Api\AssetsController::class, - 'index' - ] + Route::get('{action}/{upcoming_status}', + [ + Api\AssetsController::class, + 'index' + ] )->name('api.assets.list-upcoming') - ->where(['action' => 'audit|audits|checkins', 'upcoming_status' => 'due|overdue|due-or-overdue']); + ->where(['action' => 'audit|audits|checkins', 'upcoming_status' => 'due|overdue|due-or-overdue']); // Legacy URL for audit - Route::post( - 'audit', - [ - Api\AssetsController::class, - 'audit' - ] - )->name('api.asset.audit.legacy'); + Route::post('audit', + [ + Api\AssetsController::class, + 'audit' + ] + )->name('api.asset.audit.legacy'); - // Newer url for audit - Route::post( - '{asset}/audit', - [ - Api\AssetsController::class, - 'audit' - ] + // Newer url for audit + Route::post('{asset}/audit', + [ + Api\AssetsController::class, + 'audit' + ] )->name('api.asset.audit'); - Route::post( - '{id}/checkin', - [ - Api\AssetsController::class, - 'checkin' - ] + Route::post('{id}/checkin', + [ + Api\AssetsController::class, + 'checkin' + ] )->name('api.asset.checkin'); - Route::post( - '{id}/checkout', - [ - Api\AssetsController::class, - 'checkout' - ] + Route::post('{id}/checkout', + [ + Api\AssetsController::class, + 'checkout' + ] )->name('api.asset.checkout'); - Route::post( - '{asset_id}/restore', - [ - Api\AssetsController::class, - 'restore' - ] + Route::post('{asset_id}/restore', + [ + Api\AssetsController::class, + 'restore' + ] )->name('api.assets.restore'); - /** Begin assigned routes */ - Route::get( - '{asset}/assigned/assets', - [ - Api\AssetsController::class, - 'assignedAssets' - ] - )->name('api.assets.assigned_assets'); + /** Begin assigned routes */ + Route::get('{asset}/assigned/assets', + [ + Api\AssetsController::class, + 'assignedAssets' + ] + )->name('api.assets.assigned_assets'); - Route::get( - '{asset}/assigned/accessories', - [ - Api\AssetsController::class, - 'assignedAccessories' - ] - )->name('api.assets.assigned_accessories'); + Route::get('{asset}/assigned/accessories', + [ + Api\AssetsController::class, + 'assignedAccessories' + ] + )->name('api.assets.assigned_accessories'); - Route::get( - '{asset}/assigned/components', - [ - Api\AssetsController::class, - 'assignedComponents' - ] - )->name('api.assets.assigned_components'); - /** End assigned routes */ + Route::get('{asset}/assigned/components', + [ + Api\AssetsController::class, + 'assignedComponents' + ] + )->name('api.assets.assigned_components'); + /** End assigned routes */ - }); + }); @@ -657,297 +591,266 @@ // the model name to be the parameter - and i think it's a good differentiation in the code while we convert the others. Route::patch('/hardware/{asset}', [Api\AssetsController::class, 'update'])->name('api.assets.update'); Route::put('/hardware/{asset}', [Api\AssetsController::class, 'update'])->name('api.assets.put-update'); - - Route::resource( - 'hardware', + + Route::resource('hardware', Api\AssetsController::class, - [ - 'names' => [ + ['names' => [ 'index' => 'api.assets.index', 'show' => 'api.assets.show', 'store' => 'api.assets.store', 'destroy' => 'api.assets.destroy', ], 'except' => ['create', 'edit', 'update'], - 'parameters' => ['asset' => 'asset_id'], + 'parameters' => ['asset' => 'asset_id'], ] - ); // end assets API routes + ); // end assets API routes - /** - * Asset maintenances API routes - */ - Route::resource( - 'maintenances', + /** + * Asset maintenances API routes + */ + Route::resource('maintenances', Api\MaintenancesController::class, - [ - 'names' => [ + ['names' => [ 'index' => 'api.maintenances.index', 'show' => 'api.maintenances.show', 'update' => 'api.maintenances.update', 'store' => 'api.maintenances.store', 'destroy' => 'api.maintenances.destroy', ], - 'except' => ['create', 'edit'], - 'parameters' => ['maintenance' => 'maintenance_id'], + 'except' => ['create', 'edit'], + 'parameters' => ['maintenance' => 'maintenance_id'], ] - ); // end assets API routes + ); // end assets API routes - /** - * Imports API routes - */ - Route::group(['prefix' => 'imports'], function () { - - Route::post( - 'process/{import}', + /** + * Imports API routes + */ + Route::group(['prefix' => 'imports'], function () { + + Route::post('process/{import}', [ - Api\ImportController::class, + Api\ImportController::class, 'process' ] )->name('api.imports.importFile'); - }); + }); - Route::resource( - 'imports', + Route::resource('imports', Api\ImportController::class, - [ - 'names' => [ + ['names' => [ 'index' => 'api.imports.index', 'show' => 'api.imports.show', 'update' => 'api.imports.update', 'store' => 'api.imports.store', 'destroy' => 'api.imports.destroy', ], - 'except' => ['create', 'edit'], - 'parameters' => ['import' => 'import_id'], + 'except' => ['create', 'edit'], + 'parameters' => ['import' => 'import_id'], ] ); // end imports API routes - /** - * Labels API routes - */ - Route::group(['prefix' => 'labels'], function () { - Route::get('{name}', [Api\LabelsController::class, 'show']) - ->where('name', '.*') - ->name('api.labels.show'); - Route::get('', [Api\LabelsController::class, 'index']) - ->name('api.labels.index'); - }); + /** + * Labels API routes + */ + Route::group(['prefix' => 'labels'], function() { + Route::get('{name}', [ Api\LabelsController::class, 'show']) + ->where('name', '.*') + ->name('api.labels.show'); + Route::get('', [ Api\LabelsController::class, 'index']) + ->name('api.labels.index'); + }); - /** - * Licenses API routes - */ - Route::group(['prefix' => 'licenses'], function () { + /** + * Licenses API routes + */ + Route::group(['prefix' => 'licenses'], function () { - Route::get( - 'selectlist', + Route::get('selectlist', [ - Api\LicensesController::class, + Api\LicensesController::class, 'selectlist' ] )->name('api.licenses.selectlist'); - }); + }); - Route::resource( - 'licenses', + Route::resource('licenses', Api\LicensesController::class, - [ - 'names' => [ + ['names' => [ 'index' => 'api.licenses.index', 'show' => 'api.licenses.show', 'update' => 'api.licenses.update', 'store' => 'api.licenses.store', 'destroy' => 'api.licenses.destroy', ], - 'except' => ['create', 'edit'], - 'parameters' => ['licenses' => 'license_id'], + 'except' => ['create', 'edit'], + 'parameters' => ['licenses' => 'license_id'], ] - ); + ); - Route::resource( - 'licenses.seats', + Route::resource('licenses.seats', Api\LicenseSeatsController::class, - [ - 'names' => [ + ['names' => [ 'index' => 'api.licenses.seats.index', 'show' => 'api.licenses.seats.show', 'update' => 'api.licenses.seats.update', ], - 'except' => ['create', 'edit', 'destroy', 'store'], - 'parameters' => ['licenseseat' => 'licenseseat_id'], + 'except' => ['create', 'edit', 'destroy', 'store'], + 'parameters' => ['licenseseat' => 'licenseseat_id'], ] - ); // end license API routes + ); // end license API routes - /** - * Locations API routes - */ - Route::group(['prefix' => 'locations'], function () { + /** + * Locations API routes + */ + Route::group(['prefix' => 'locations'], function () { - Route::get( - 'selectlist', - [ - Api\LocationsController::class, - 'selectlist' - ] - )->name('api.locations.selectlist'); + Route::get('selectlist', + [ + Api\LocationsController::class, + 'selectlist' + ] + )->name('api.locations.selectlist'); - // Users within a location - Route::get( - '{location}/users', - [ - Api\LocationsController::class, - 'getDataViewUsers' - ] - )->name('api.locations.viewusers'); + // Users within a location + Route::get('{location}/users', + [ + Api\LocationsController::class, + 'getDataViewUsers' + ] + )->name('api.locations.viewusers'); - // Get list of assets with a default location - Route::get( - '{location}/assets', + // Get list of assets with a default location + Route::get('{location}/assets', [ - Api\LocationsController::class, + Api\LocationsController::class, 'assets' ] - )->name('api.locations.viewassets'); - + )->name('api.locations.viewassets'); - // Add a comment here, you moron - /** Begin assigned routes */ - Route::get( - '{location}/assigned/assets', - [ - Api\LocationsController::class, - 'assignedAssets' - ] - )->name('api.locations.assigned_assets'); - Route::get( - '{location}/assigned/accessories', - [ - Api\LocationsController::class, - 'assignedAccessories' - ] - )->name('api.locations.assigned_accessories'); - /** End assigned routes */ - }); + // Add a comment here, you moron + /** Begin assigned routes */ + Route::get('{location}/assigned/assets', + [ + Api\LocationsController::class, + 'assignedAssets' + ] + )->name('api.locations.assigned_assets'); - Route::resource( - 'locations', + Route::get('{location}/assigned/accessories', + [ + Api\LocationsController::class, + 'assignedAccessories' + ] + )->name('api.locations.assigned_accessories'); + /** End assigned routes */ + }); + + Route::resource('locations', Api\LocationsController::class, - [ - 'names' => [ + ['names' => [ 'index' => 'api.locations.index', 'show' => 'api.locations.show', 'update' => 'api.locations.update', 'store' => 'api.locations.store', 'destroy' => 'api.locations.destroy', ], - 'except' => ['create', 'edit'], - 'parameters' => ['location' => 'location_id'], + 'except' => ['create', 'edit'], + 'parameters' => ['location' => 'location_id'], ] - ); // end locations API routes + ); // end locations API routes - /** - * Manufacturers API routes - */ - Route::group(['prefix' => 'manufacturers'], function () { + /** + * Manufacturers API routes + */ + Route::group(['prefix' => 'manufacturers'], function () { - Route::get( - 'selectlist', - [ - Api\ManufacturersController::class, - 'selectlist' - ] - )->name('api.manufacturers.selectlist'); - - Route::post( - '{id}/restore', - [ - Api\ManufacturersController::class, - 'restore' - ] - )->name('api.manufacturers.restore'); + Route::get('selectlist', + [ + Api\ManufacturersController::class, + 'selectlist' + ] + )->name('api.manufacturers.selectlist'); - }); + Route::post('{id}/restore', + [ + Api\ManufacturersController::class, + 'restore' + ] + )->name('api.manufacturers.restore'); - Route::resource( - 'manufacturers', + }); + + Route::resource('manufacturers', Api\ManufacturersController::class, - [ - 'names' => [ + ['names' => [ 'index' => 'api.manufacturers.index', 'show' => 'api.manufacturers.show', 'update' => 'api.manufacturers.update', 'store' => 'api.manufacturers.store', 'destroy' => 'api.manufacturers.destroy', ], - 'except' => ['create', 'edit'], - 'parameters' => ['manufacturer' => 'manufacturer_id'], + 'except' => ['create', 'edit'], + 'parameters' => ['manufacturer' => 'manufacturer_id'], ] - ); // end manufacturers API routes - + ); // end manufacturers API routes - /** - * Asset models API routes - */ - Route::group(['prefix' => 'models'], function () { - Route::get( - 'selectlist', - [ - Api\AssetModelsController::class, - 'selectlist' - ] - )->name('api.models.selectlist'); + /** + * Asset models API routes + */ + Route::group(['prefix' => 'models'], function () { - Route::get( - 'assets', - [ - Api\AssetModelsController::class, - 'assets' - ] - )->name('api.models.assets'); + Route::get('selectlist', + [ + Api\AssetModelsController::class, + 'selectlist' + ] + )->name('api.models.selectlist'); - Route::post( - '{id}/restore', - [ - Api\AssetModelsController::class, - 'restore' - ] - )->name('api.models.restore'); + Route::get('assets', + [ + Api\AssetModelsController::class, + 'assets' + ] + )->name('api.models.assets'); - }); + Route::post('{id}/restore', + [ + Api\AssetModelsController::class, + 'restore' + ] + )->name('api.models.restore'); - Route::resource( - 'models', + }); + + Route::resource('models', Api\AssetModelsController::class, - [ - 'names' => [ + ['names' => [ 'index' => 'api.models.index', 'show' => 'api.models.show', 'update' => 'api.models.update', 'store' => 'api.models.store', 'destroy' => 'api.models.destroy', ], - 'except' => ['create', 'edit'], - 'parameters' => ['model' => 'model_id'], + 'except' => ['create', 'edit'], + 'parameters' => ['model' => 'model_id'], ] - ); + ); // end asset models API routes - // end asset models API routes - /** - * Asset notes API routes - */ - Route::group( - ['prefix' => 'notes'], - function () { + /** + * Asset notes API routes + */ + Route::group(['prefix' => 'notes'], function () { Route::post( '{asset}/store', @@ -965,9 +868,9 @@ function () { ] )->name('api.notes.index'); } - ); + ); // end asset notes API routes - /** + /** * PredefinedFilter API routes */ //Route::middleware('auth:api')->group(function () { @@ -995,529 +898,480 @@ function () { ->name('api.predefined-filters.destroy'); }); // end predefinedFilters API routes - /** - * Settings API routes - */ - Route::group(['middleware' => ['auth', 'authorize:superuser'], 'prefix' => 'settings'], function () { + /** + * Settings API routes + */ + Route::group(['middleware'=> ['auth', 'authorize:superuser'], 'prefix' => 'settings'], function () { - Route::get( - 'ldaptest', - [ - Api\SettingsController::class, - 'ldaptest' - ] - )->name('api.settings.ldaptest'); + Route::get('ldaptest', + [ + Api\SettingsController::class, + 'ldaptest' + ] + )->name('api.settings.ldaptest'); - Route::post( - 'purge_barcodes', - [ - Api\SettingsController::class, - 'purgeBarcodes' - ] - )->name('api.settings.purgebarcodes'); + Route::post('purge_barcodes', + [ + Api\SettingsController::class, + 'purgeBarcodes' + ] + )->name('api.settings.purgebarcodes'); - Route::get( - 'login-attempts', - [ - Api\SettingsController::class, - 'showLoginAttempts' - ] - )->name('api.settings.login_attempts'); + Route::get('login-attempts', + [ + Api\SettingsController::class, + 'showLoginAttempts' + ] + )->name('api.settings.login_attempts'); - Route::post( - 'ldaptestlogin', - [ - Api\SettingsController::class, - 'ldaptestlogin' - ] - )->name('api.settings.ldaptestlogin'); + Route::post('ldaptestlogin', + [ + Api\SettingsController::class, + 'ldaptestlogin' + ] + )->name('api.settings.ldaptestlogin'); - Route::post( - 'slacktest', + Route::post('slacktest', [ - Api\SettingsController::class, + Api\SettingsController::class, 'slacktest' ] - )->name('api.settings.slacktest'); + )->name('api.settings.slacktest'); - Route::post( - 'mailtest', + Route::post('mailtest', [ - Api\SettingsController::class, + Api\SettingsController::class, 'ajaxTestEmail' ] - )->name('api.settings.mailtest'); - - Route::get( - 'backups', - [ - Api\SettingsController::class, - 'listBackups' - ] - )->name('api.settings.backups.index'); + )->name('api.settings.mailtest'); - Route::get( - 'backups/download/latest', - [ - Api\SettingsController::class, - 'downloadLatestBackup' - ] - )->name('api.settings.backups.latest'); + Route::get('backups', + [ + Api\SettingsController::class, + 'listBackups' + ] + )->name('api.settings.backups.index'); - Route::get( - 'backups/download/{file}', - [ - Api\SettingsController::class, - 'downloadBackup' - ] - )->name('api.settings.backups.download'); + Route::get('backups/download/latest', + [ + Api\SettingsController::class, + 'downloadLatestBackup' + ] + )->name('api.settings.backups.latest'); - }); + Route::get('backups/download/{file}', + [ + Api\SettingsController::class, + 'downloadBackup' + ] + )->name('api.settings.backups.download'); - Route::resource( - 'settings', + }); + + Route::resource('settings', Api\SettingsController::class, - [ - 'names' => [ + ['names' => [ 'show' => 'api.settings.show', 'update' => 'api.settings.update', 'store' => 'api.settings.store', ], - 'except' => ['create', 'edit', 'index', 'destroy'], - 'parameters' => ['setting' => 'setting_id'], + 'except' => ['create', 'edit', 'index', 'destroy'], + 'parameters' => ['setting' => 'setting_id'], ] - ); // end settings API + ); // end settings API - /** - * Status labels API routes - */ - Route::group(['prefix' => 'statuslabels'], function () { + /** + * Status labels API routes + */ + Route::group(['prefix' => 'statuslabels'], function () { - Route::get( - 'selectlist', - [ - Api\StatuslabelsController::class, - 'selectlist' - ] - )->name('api.statuslabels.selectlist'); - - Route::get( - 'assets/name', - [ - Api\StatuslabelsController::class, - 'getAssetCountByStatuslabel' - ] - )->name('api.statuslabels.assets.byname'); + Route::get('selectlist', + [ + Api\StatuslabelsController::class, + 'selectlist' + ] + )->name('api.statuslabels.selectlist'); - Route::get( - 'assets/type', - [ - Api\StatuslabelsController::class, - 'getAssetCountByMetaStatus' - ] - )->name('api.statuslabels.assets.bytype'); + Route::get('assets/name', + [ + Api\StatuslabelsController::class, + 'getAssetCountByStatuslabel' + ] + )->name('api.statuslabels.assets.byname'); - Route::get( - '{id}/assetlist', - [ - Api\StatuslabelsController::class, - 'assets' - ] - )->name('api.statuslabels.assets'); + Route::get('assets/type', + [ + Api\StatuslabelsController::class, + 'getAssetCountByMetaStatus' + ] + )->name('api.statuslabels.assets.bytype'); - Route::get( - '{statuslabel}/deployable', - [ - Api\StatuslabelsController::class, - 'checkIfDeployable' - ] - )->name('api.statuslabels.deployable'); + Route::get('{id}/assetlist', + [ + Api\StatuslabelsController::class, + 'assets' + ] + )->name('api.statuslabels.assets'); - Route::get( - 'selectlist', - [ - Api\StatuslabelsController::class, - 'selectlist' - ] - )->name('api.statuslabels.selectlist'); + Route::get('{statuslabel}/deployable', + [ + Api\StatuslabelsController::class, + 'checkIfDeployable' + ] + )->name('api.statuslabels.deployable'); - }); + Route::get('selectlist', + [ + Api\StatuslabelsController::class, + 'selectlist' + ] + )->name('api.statuslabels.selectlist'); - Route::resource( - 'statuslabels', + }); + + Route::resource('statuslabels', Api\StatuslabelsController::class, - [ - 'names' => [ + ['names' => [ 'index' => 'api.statuslabels.index', 'show' => 'api.statuslabels.show', 'update' => 'api.statuslabels.update', 'store' => 'api.statuslabels.store', 'destroy' => 'api.statuslabels.destroy', ], - 'except' => ['create', 'edit'], - 'parameters' => ['statuslabel' => 'statuslabel_id'], + 'except' => ['create', 'edit'], + 'parameters' => ['statuslabel' => 'statuslabel_id'], ] - ); // end status labels API routes + ); // end status labels API routes - /** - * Suppliers API routes - */ - Route::group(['prefix' => 'suppliers'], function () { - - Route::get( - 'selectlist', - [ - Api\SuppliersController::class, - 'selectlist' - ] - )->name('api.suppliers.selectlist'); + /** + * Suppliers API routes + */ + Route::group(['prefix' => 'suppliers'], function () { - }); + Route::get('selectlist', + [ + Api\SuppliersController::class, + 'selectlist' + ] + )->name('api.suppliers.selectlist'); - Route::resource( - 'suppliers', + }); + + Route::resource('suppliers', Api\SuppliersController::class, - [ - 'names' => [ + ['names' => [ 'index' => 'api.suppliers.index', 'show' => 'api.suppliers.show', 'update' => 'api.suppliers.update', 'store' => 'api.suppliers.store', 'destroy' => 'api.suppliers.destroy', ], - 'except' => ['create', 'edit'], - 'parameters' => ['supplier' => 'supplier_id'], + 'except' => ['create', 'edit'], + 'parameters' => ['supplier' => 'supplier_id'], ] - ); // end suppliers API routes + ); // end suppliers API routes - /** - * Users API routes - */ - Route::group(['prefix' => 'users'], function () { + /** + * Users API routes + */ + Route::group(['prefix' => 'users'], function () { - Route::get( - 'selectlist', - [ - Api\UsersController::class, - 'selectlist' - ] - )->name('api.users.selectlist'); + Route::get('selectlist', + [ + Api\UsersController::class, + 'selectlist' + ] + )->name('api.users.selectlist'); - Route::post( - 'two_factor_reset', - [ - Api\UsersController::class, - 'postTwoFactorReset' - ] - )->name('api.users.two_factor_reset'); + Route::post('ldapsync', + [ + Api\UsersController::class, + 'syncLdapUsers' + ] + )->name('api.users.ldapsync'); - Route::get( - 'me', - [ - Api\UsersController::class, - 'getCurrentUserInfo' - ] - )->name('api.users.me'); + Route::post('two_factor_reset', + [ + Api\UsersController::class, + 'postTwoFactorReset' + ] + )->name('api.users.two_factor_reset'); - Route::get( - '{user}/eulas', - [ - Api\UsersController::class, - 'eulas' - ] - )->name('api.user.eulas'); + Route::get('me', + [ + Api\UsersController::class, + 'getCurrentUserInfo' + ] + )->name('api.users.me'); + Route::get('{user}/eulas', + [ + Api\UsersController::class, + 'eulas' + ] + )->name('api.user.eulas'); - Route::get( - 'list/{status?}', + + Route::get('list/{status?}', [ - Api\UsersController::class, + Api\UsersController::class, 'getDatatable' ] - )->name('api.users.list'); + )->name('api.users.list'); - Route::get( - '{user}/assets', + Route::get('{user}/assets', [ - Api\UsersController::class, + Api\UsersController::class, 'assets' ] - )->name('api.users.assetlist'); + )->name('api.users.assetlist'); - Route::post( - '{user}/email', - [ - Api\UsersController::class, - 'emailAssetList' - ] - )->name('api.users.email_assets'); + Route::post('{user}/email', + [ + Api\UsersController::class, + 'emailAssetList' + ] + )->name('api.users.email_assets'); - Route::get( - '{user}/accessories', + Route::get('{user}/accessories', [ - Api\UsersController::class, + Api\UsersController::class, 'accessories' ] - )->name('api.users.accessorieslist'); + )->name('api.users.accessorieslist'); - Route::get( - '{user}/licenses', + Route::get('{user}/licenses', [ - Api\UsersController::class, + Api\UsersController::class, 'licenses' ] - )->name('api.users.licenselist'); + )->name('api.users.licenselist'); - Route::post( - '{user}/restore', - [ - Api\UsersController::class, - 'restore' - ] - )->name('api.users.restore'); + Route::post('{user}/restore', + [ + Api\UsersController::class, + 'restore' + ] + )->name('api.users.restore'); - }); + }); - Route::resource( - 'users', + Route::resource('users', Api\UsersController::class, - [ - 'names' => [ + ['names' => [ 'index' => 'api.users.index', 'show' => 'api.users.show', 'store' => 'api.users.store', 'update' => 'api.users.update', 'destroy' => 'api.users.destroy', ], - 'except' => ['create', 'edit'], - 'parameters' => ['user' => 'user_id'], + 'except' => ['create', 'edit'], + 'parameters' => ['user' => 'user_id'], ] - ); // end users API routes + ); // end users API routes - /** - * Kits API routes - */ - Route::resource( - 'kits', + /** + * Kits API routes + */ + Route::resource('kits', Api\PredefinedKitsController::class, - [ - 'names' => [ + ['names' => [ 'index' => 'api.kits.index', 'show' => 'api.kits.show', 'update' => 'api.kits.update', 'store' => 'api.kits.store', 'destroy' => 'api.kits.destroy', ], - 'except' => ['create', 'edit'], - 'parameters' => ['kit' => 'kit_id'], + 'except' => ['create', 'edit'], + 'parameters' => ['kit' => 'kit_id'], ] - ); // end kits API routes + ); // end kits API routes - Route::group(['prefix' => 'kits/{kit_id}'], function () { + Route::group(['prefix' => 'kits/{kit_id}'], function () { - // kit licenses - Route::get( - 'licenses', - [ - Api\PredefinedKitsController::class, - 'indexLicenses' - ] - )->name('api.kits.licenses.index'); + // kit licenses + Route::get('licenses', + [ + Api\PredefinedKitsController::class, + 'indexLicenses' + ] + )->name('api.kits.licenses.index'); - Route::post( - 'licenses', - [ - Api\PredefinedKitsController::class, - 'storeLicense' - ] - )->name('api.kits.licenses.store'); + Route::post('licenses', + [ + Api\PredefinedKitsController::class, + 'storeLicense' + ] + )->name('api.kits.licenses.store'); - Route::put( - 'licenses/{license_id}', - [ - Api\PredefinedKitsController::class, - 'updateLicense' - ] - )->name('api.kits.licenses.update'); + Route::put('licenses/{license_id}', + [ + Api\PredefinedKitsController::class, + 'updateLicense' + ] + )->name('api.kits.licenses.update'); - Route::delete( - 'licenses/{license_id}', - [ - Api\PredefinedKitsController::class, - 'detachLicense' - ] - )->name('api.kits.licenses.destroy'); + Route::delete('licenses/{license_id}', + [ + Api\PredefinedKitsController::class, + 'detachLicense' + ] + )->name('api.kits.licenses.destroy'); - // kit models - Route::get( - 'models', - [ - Api\PredefinedKitsController::class, - 'indexModels' - ] - )->name('api.kits.models.index'); + // kit models + Route::get('models', + [ + Api\PredefinedKitsController::class, + 'indexModels' + ] + )->name('api.kits.models.index'); - Route::post( - 'models', - [ - Api\PredefinedKitsController::class, - 'storeModel' - ] - )->name('api.kits.models.store'); + Route::post('models', + [ + Api\PredefinedKitsController::class, + 'storeModel' + ] + )->name('api.kits.models.store'); - Route::put( - 'models/{model_id}', - [ - Api\PredefinedKitsController::class, - 'updateModels' - ] - )->name('api.kits.models.update'); + Route::put('models/{model_id}', + [ + Api\PredefinedKitsController::class, + 'updateModels' + ] + )->name('api.kits.models.update'); - Route::delete( - 'models/{model_id}', - [ - Api\PredefinedKitsController::class, - 'detachModels' - ] - )->name('api.kits.models.destroy'); + Route::delete('models/{model_id}', + [ + Api\PredefinedKitsController::class, + 'detachModels' + ] + )->name('api.kits.models.destroy'); - // kit accessories - Route::get( - 'accessories', - [ - Api\PredefinedKitsController::class, - 'indexAccessories' - ] - )->name('api.kits.accessories.index'); + // kit accessories + Route::get('accessories', + [ + Api\PredefinedKitsController::class, + 'indexAccessories' + ] + )->name('api.kits.accessories.index'); - Route::post( - 'accessories', - [ - Api\PredefinedKitsController::class, - 'storeAccessory' - ] - )->name('api.kits.accessories.store'); + Route::post('accessories', + [ + Api\PredefinedKitsController::class, + 'storeAccessory' + ] + )->name('api.kits.accessories.store'); - Route::put( - 'accessories/{accessory_id}', - [ - Api\PredefinedKitsController::class, - 'updateAccessory' - ] - )->name('api.kits.accessories.update'); + Route::put('accessories/{accessory_id}', + [ + Api\PredefinedKitsController::class, + 'updateAccessory' + ] + )->name('api.kits.accessories.update'); - Route::delete( - 'accessories/{accessory_id}', - [ - Api\PredefinedKitsController::class, - 'detachAccessory' - ] - )->name('api.kits.accessories.destroy'); + Route::delete('accessories/{accessory_id}', + [ + Api\PredefinedKitsController::class, + 'detachAccessory' + ] + )->name('api.kits.accessories.destroy'); - // kit consumables - Route::get( - 'consumables', + // kit consumables + Route::get('consumables', [ - Api\PredefinedKitsController::class, + Api\PredefinedKitsController::class, 'indexConsumables' ] - )->name('api.kits.consumables.index'); + )->name('api.kits.consumables.index'); - Route::post( - 'consumables', + Route::post('consumables', [ - Api\PredefinedKitsController::class, + Api\PredefinedKitsController::class, 'storeConsumable' ] - )->name('api.kits.consumables.store'); + )->name('api.kits.consumables.store'); - Route::put( - 'consumables/{consumable_id}', + Route::put('consumables/{consumable_id}', [ - Api\PredefinedKitsController::class, + Api\PredefinedKitsController::class, 'updateConsumable' ] - )->name('api.kits.consumables.update'); + )->name('api.kits.consumables.update'); - Route::delete( - 'consumables/{consumable_id}', + Route::delete('consumables/{consumable_id}', [ - Api\PredefinedKitsController::class, + Api\PredefinedKitsController::class, 'detachConsumable' ] - )->name('api.kits.consumables.destroy'); - - }); // end consumable routes + )->name('api.kits.consumables.destroy'); + }); // end consumable routes + + + /** + * Reports API routes + */ + + Route::group(['prefix' => 'reports'], function () { - /** - * Reports API routes - */ - - Route::group(['prefix' => 'reports'], function () { - - Route::get( - 'activity', + Route::get('activity', [ - Api\ReportsController::class, + Api\ReportsController::class, 'index' ] - )->name('api.activity.index'); - }); // end reports api routes + )->name('api.activity.index'); + }); // end reports api routes /** - * Version API routes - */ - - Route::get('/version', function () { - return response()->json( - [ - 'version' => config('version.app_version'), - 'build_version' => config('version.build_version'), - 'hash_version' => config('version.hash_version'), - 'full_version' => config('version.full_app_version') - ] - ); - }); // end version api routes + * Version API routes + */ + Route::get('/version', function () { + return response()->json( + [ + 'version' => config('version.app_version'), + 'build_version' => config('version.build_version'), + 'hash_version' => config('version.hash_version'), + 'full_version' => config('version.full_app_version') + ] + ); + }); // end version api routes - Route::fallback(function () { - return response()->json( - [ - 'status' => 'error', - 'message' => '404 endpoint not found. Please check the API reference at https://snipe-it.readme.io/reference to find a valid API endpoint.', - 'payload' => null, - ], - 404 - ); - }); // end fallback routes - /** - * Generate label routes - */ - Route::post('hardware/labels', [ - Api\AssetsController::class, - 'getLabels' - ])->name('api.assets.labels'); - // end generate label routes + Route::fallback(function () { + return response()->json( + [ + 'status' => 'error', + 'message' => '404 endpoint not found. Please check the API reference at https://snipe-it.readme.io/reference to find a valid API endpoint.', + 'payload' => null, + ], 404); + }); // end fallback routes + + /** + * Generate label routes + */ + Route::post('hardware/labels', [ + Api\AssetsController::class, + 'getLabels' + ])->name('api.assets.labels'); + // end generate label routes /** * Uploaded files API routes */ // List files - Route::get( - '{object_type}/{id}/files', + Route::get('{object_type}/{id}/files', [ Api\UploadedFilesController::class, 'index' @@ -1526,8 +1380,7 @@ function () { ->where(['object_type' => 'accessories|audits|assets|components|consumables|hardware|licenses|locations|maintenances|models|suppliers|users']); // Get a file - Route::get( - '{object_type}/{id}/files/{file_id}', + Route::get('{object_type}/{id}/files/{file_id}', [ Api\UploadedFilesController::class, 'show' @@ -1536,8 +1389,7 @@ function () { ->where(['object_type' => 'accessories|audits|assets|components|consumables|hardware|licenses|locations|maintenances|models|suppliers|users']); // Upload files(s) - Route::post( - '{object_type}/{id}/files', + Route::post('{object_type}/{id}/files', [ Api\UploadedFilesController::class, 'store' @@ -1546,8 +1398,7 @@ function () { ->where(['object_type' => 'accessories|audits|assets|components|consumables|hardware|licenses|locations|maintenances|models|suppliers|users']); // Delete files(s) - Route::delete( - '{object_type}/{id}/files/{file_id}/delete', + Route::delete('{object_type}/{id}/files/{file_id}/delete', [ Api\UploadedFilesController::class, 'destroy' diff --git a/storage/framework/cache/.gitignore b/storage/framework/cache/.gitignore index d6b7ef32c847..01e4a6cda9eb 100644 --- a/storage/framework/cache/.gitignore +++ b/storage/framework/cache/.gitignore @@ -1,2 +1,3 @@ * +!data/ !.gitignore diff --git a/tests/Feature/Assets/Ui/CheckinCheckoutCounters.php b/tests/Feature/Assets/Ui/CheckinCheckoutCounters.php index 342ec9c7984a..cd4faeaad972 100644 --- a/tests/Feature/Assets/Ui/CheckinCheckoutCounters.php +++ b/tests/Feature/Assets/Ui/CheckinCheckoutCounters.php @@ -44,7 +44,7 @@ function counters() ])->assertRedirect()->assertSessionHasNoErrors(); $asset->refresh(); - +// dump($asset); $this->assertEquals(1,$asset->checkout_counter); $this->assertEquals(0,$asset->checkin_counter); @@ -58,7 +58,7 @@ function counters() )->assertRedirect()->assertSessionHasNoErrors(); $asset->refresh(); - +// dump($asset); $this->assertEquals(1,$asset->checkout_counter); $this->assertEquals(1,$asset->checkin_counter); } diff --git a/tests/Feature/Suppliers/Ui/UpdateSupplierTest.php b/tests/Feature/Suppliers/Ui/UpdateSupplierTest.php index dbb2531e1ffa..f3be726319a7 100644 --- a/tests/Feature/Suppliers/Ui/UpdateSupplierTest.php +++ b/tests/Feature/Suppliers/Ui/UpdateSupplierTest.php @@ -14,4 +14,4 @@ public function testPageRenders() ->get(route('suppliers.edit', Supplier::factory()->create()->id)) ->assertOk(); } -} \ No newline at end of file +}