diff --git a/app/Helpers/Helper.php b/app/Helpers/Helper.php index d77f41b01f..fcb439f819 100644 --- a/app/Helpers/Helper.php +++ b/app/Helpers/Helper.php @@ -1484,35 +1484,57 @@ class Helper } - static public function getRedirectOption($request, $id, $table, $asset_id = null) + static public function getRedirectOption($request, $id, $table, $item_id = null) { $redirect_option = Session::get('redirect_option'); $checkout_to_type = Session::get('checkout_to_type'); - //return to index - if ($redirect_option == '0') { + // return to index + if ($redirect_option == 'index') { switch ($table) { case "Assets": - return redirect()->route('hardware.index')->with('success', trans('admin/hardware/message.checkout.success')); + return route('hardware.index'); + case "Users": + return route('users.index'); + case "Licenses": + return route('licenses.index'); + case "Accessories": + return route('accessories.index'); + case "Components": + return route('components.index'); + case "Consumables": + return route('consumables.index'); } } - //return to thing being assigned - if ($redirect_option == '1') { + + // return to thing being assigned + if ($redirect_option == 'item') { switch ($table) { case "Assets": - return redirect()->route('hardware.show', $id ? $id : $asset_id)->with('success', trans('admin/hardware/message.checkout.success')); + return route('hardware.show', $id ?? $item_id); + case "Users": + return route('users.show', $id ?? $item_id); + case "Licenses": + return route('licenses.show', $id ?? $item_id); + case "Accessories": + return route('accessories.show', $id ?? $item_id); + case "Components": + return route('components.show', $id ?? $item_id); + case "Consumables": + return route('consumables.show', $id ?? $item_id); } } - //return to thing being assigned to - if ($redirect_option == '2') { + + // return to assignment target + if ($redirect_option == 'target') { switch ($checkout_to_type) { case 'user': - return redirect()->route('users.show', $request->assigned_user)->with('success', trans('admin/hardware/message.checkout.success')); + return route('users.show', ['user' => $request->assigned_user]); case 'location': - return redirect()->route('locations.show', $request->assigned_location)->with('success', trans('admin/hardware/message.checkout.success')); + return route('locations.show', ['location' => $request->assigned_location]); case 'asset': - return redirect()->route('hardware.show', $request->assigned_asset)->with('success', trans('admin/hardware/message.checkout.success')); + return route('hardware.show', ['hardware' => $request->assigned_asset]); } } return redirect()->back()->with('error', trans('admin/hardware/message.checkout.error')); diff --git a/app/Http/Controllers/Accessories/AccessoriesController.php b/app/Http/Controllers/Accessories/AccessoriesController.php index bb2e74899b..722638ad8f 100755 --- a/app/Http/Controllers/Accessories/AccessoriesController.php +++ b/app/Http/Controllers/Accessories/AccessoriesController.php @@ -79,10 +79,11 @@ class AccessoriesController extends Controller $accessory = $request->handleImages($accessory); + session()->put(['redirect_option' => $request->get('redirect_option')]); // Was the accessory created? if ($accessory->save()) { // Redirect to the new accessory page - return redirect()->route('accessories.index')->with('success', trans('admin/accessories/message.create.success')); + return redirect()->to(Helper::getRedirectOption($request, $accessory->id, 'Accessories'))->with('success', trans('admin/accessories/message.create.success')); } return redirect()->back()->withInput()->withErrors($accessory->getErrors()); @@ -176,9 +177,10 @@ class AccessoriesController extends Controller $accessory = $request->handleImages($accessory); - // Was the accessory updated? + session()->put(['redirect_option' => $request->get('redirect_option')]); + if ($accessory->save()) { - return redirect()->route('accessories.index')->with('success', trans('admin/accessories/message.update.success')); + return redirect()->to(Helper::getRedirectOption($request, $accessory->id, 'Accessories'))->with('success', trans('admin/accessories/message.update.success')); } } else { return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.does_not_exist')); diff --git a/app/Http/Controllers/Accessories/AccessoryCheckinController.php b/app/Http/Controllers/Accessories/AccessoryCheckinController.php index eff635d24a..7a228e50ad 100644 --- a/app/Http/Controllers/Accessories/AccessoryCheckinController.php +++ b/app/Http/Controllers/Accessories/AccessoryCheckinController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers\Accessories; use App\Events\CheckoutableCheckedIn; +use App\Helpers\Helper; use App\Http\Controllers\Controller; use App\Models\Accessory; use App\Models\User; @@ -63,7 +64,9 @@ class AccessoryCheckinController extends Controller event(new CheckoutableCheckedIn($accessory, User::find($return_to), auth()->user(), $request->input('note'), $checkin_at)); - return redirect()->route('accessories.show', $accessory->id)->with('success', trans('admin/accessories/message.checkin.success')); + session()->put(['redirect_option' => $request->get('redirect_option')]); + + return redirect()->to(Helper::getRedirectOption($request, $accessory->id, 'Accessories'))->with('success', trans('admin/accessories/message.checkin.success')); } // Redirect to the accessory management page with error return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.checkin.error')); diff --git a/app/Http/Controllers/Accessories/AccessoryCheckoutController.php b/app/Http/Controllers/Accessories/AccessoryCheckoutController.php index 19c8c6c7c5..5b10e99bce 100644 --- a/app/Http/Controllers/Accessories/AccessoryCheckoutController.php +++ b/app/Http/Controllers/Accessories/AccessoryCheckoutController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers\Accessories; use App\Events\CheckoutableCheckedOut; +use App\Helpers\Helper; use App\Http\Controllers\Controller; use App\Http\Requests\AccessoryCheckoutRequest; use App\Models\Accessory; @@ -78,8 +79,15 @@ class AccessoryCheckoutController extends Controller } event(new CheckoutableCheckedOut($accessory, $user, auth()->user(), $request->input('note'))); + // Set this as user since we only allow checkout to user for this item type + $request->request->add(['checkout_to_type' => 'user']); + $request->request->add(['assigned_user' => $user->id]); + + session()->put(['redirect_option' => $request->get('redirect_option'), 'checkout_to_type' => $request->get('checkout_to_type')]); + + // Redirect to the new accessory page - return redirect()->route('accessories.index') + return redirect()->to(Helper::getRedirectOption($request, $accessory->id, 'Accessories')) ->with('success', trans('admin/accessories/message.checkout.success')); } } diff --git a/app/Http/Controllers/Assets/AssetCheckinController.php b/app/Http/Controllers/Assets/AssetCheckinController.php index 4794fa0411..f84a468a60 100644 --- a/app/Http/Controllers/Assets/AssetCheckinController.php +++ b/app/Http/Controllers/Assets/AssetCheckinController.php @@ -11,7 +11,6 @@ use App\Models\Asset; use App\Models\CheckoutAcceptance; use App\Models\LicenseSeat; use Illuminate\Database\Eloquent\Builder; -use Illuminate\Support\Facades\Session; use Illuminate\Support\Facades\Log; use \Illuminate\Contracts\View\View; use \Illuminate\Http\RedirectResponse; @@ -83,7 +82,6 @@ class AssetCheckinController extends Controller } $asset->expected_checkin = null; - //$asset->last_checkout = null; $asset->last_checkin = now(); $asset->assignedTo()->disassociate($asset); $asset->accepted = null; @@ -128,12 +126,12 @@ class AssetCheckinController extends Controller $acceptance->delete(); }); - Session::put('redirect_option', $request->get('redirect_option')); - // Was the asset updated? + session()->put('redirect_option', $request->get('redirect_option')); + if ($asset->save()) { event(new CheckoutableCheckedIn($asset, $target, auth()->user(), $request->input('note'), $checkin_at, $originalValues)); - return Helper::getRedirectOption($asset, $assetId, 'Assets'); + return redirect()->to(Helper::getRedirectOption($request, $asset->id, 'Assets'))->with('success', trans('admin/hardware/message.checkin.success')); } // Redirect to the asset management page with error return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.checkin.error').$asset->getErrors()); diff --git a/app/Http/Controllers/Assets/AssetCheckoutController.php b/app/Http/Controllers/Assets/AssetCheckoutController.php index 355f9387bb..05b766916b 100644 --- a/app/Http/Controllers/Assets/AssetCheckoutController.php +++ b/app/Http/Controllers/Assets/AssetCheckoutController.php @@ -109,10 +109,11 @@ class AssetCheckoutController extends Controller } } - Session::put(['redirect_option' => $request->get('redirect_option'), 'checkout_to_type' => $request->get('checkout_to_type')]); + session()->put(['redirect_option' => $request->get('redirect_option'), 'checkout_to_type' => $request->get('checkout_to_type')]); if ($asset->checkOut($target, $admin, $checkout_at, $expected_checkin, $request->get('note'), $request->get('name'))) { - return Helper::getRedirectOption($request, $assetId, 'Assets'); + return redirect()->to(Helper::getRedirectOption($request, $asset->id, 'Assets')) + ->with('success', trans('admin/hardware/message.checkout.success')); } // Redirect to the asset management page with error return redirect()->to("hardware/$assetId/checkout")->with('error', trans('admin/hardware/message.checkout.error').$asset->getErrors()); diff --git a/app/Http/Controllers/Assets/AssetsController.php b/app/Http/Controllers/Assets/AssetsController.php index 8fecff7e12..0852a46240 100755 --- a/app/Http/Controllers/Assets/AssetsController.php +++ b/app/Http/Controllers/Assets/AssetsController.php @@ -204,8 +204,12 @@ class AssetsController extends Controller } } + session()->put(['redirect_option' => $request->get('redirect_option'), 'checkout_to_type' => $request->get('checkout_to_type')]); + + if ($success) { - return redirect()->route('hardware.index') + + return redirect()->to(Helper::getRedirectOption($request, $asset->id, 'Assets')) ->with('success-unescaped', trans('admin/hardware/message.create.success_linked', ['link' => route('hardware.show', ['hardware' => $asset->id]), 'id', 'tag' => e($asset->asset_tag)])); @@ -289,6 +293,7 @@ class AssetsController extends Controller */ public function update(ImageUploadRequest $request, $assetId = null) : RedirectResponse { + // Check if the asset exists if (! $asset = Asset::find($assetId)) { // Redirect to the asset management page with error @@ -331,7 +336,7 @@ class AssetsController extends Controller $status = Statuslabel::find($asset->status_id); - if($status->archived){ + if ($status && $status->archived) { $asset->assigned_to = null; } @@ -350,14 +355,26 @@ class AssetsController extends Controller } // Update the asset data - $asset_tag = $request->input('asset_tags'); + $serial = $request->input('serials'); + $asset->serial = $request->input('serials'); + + if (is_array($request->input('serials'))) { + $asset->serial = $serial[1]; + } + $asset->name = $request->input('name'); - $asset->serial = $serial[1]; $asset->company_id = Company::getIdForCurrentUser($request->input('company_id')); $asset->model_id = $request->input('model_id'); $asset->order_number = $request->input('order_number'); - $asset->asset_tag = $asset_tag[1]; + + $asset_tags = $request->input('asset_tags'); + $asset->asset_tag = $request->input('asset_tags'); + + if (is_array($request->input('asset_tags'))) { + $asset->asset_tag = $asset_tags[1]; + } + $asset->notes = $request->input('notes'); $asset = $request->handleImages($asset); @@ -369,6 +386,7 @@ class AssetsController extends Controller $model = AssetModel::find($request->get('model_id')); if (($model) && ($model->fieldset)) { foreach ($model->fieldset->fields as $field) { + if ($field->field_encrypted == '1') { if (Gate::allows('admin')) { if (is_array($request->input($field->db_column))) { @@ -387,9 +405,10 @@ class AssetsController extends Controller } } + session()->put(['redirect_option' => $request->get('redirect_option'), 'checkout_to_type' => $request->get('checkout_to_type')]); if ($asset->save()) { - return redirect()->route('hardware.show', $assetId) + return redirect()->to(Helper::getRedirectOption($request, $assetId, 'Assets')) ->with('success', trans('admin/hardware/message.update.success')); } diff --git a/app/Http/Controllers/Components/ComponentCheckinController.php b/app/Http/Controllers/Components/ComponentCheckinController.php index b59237a5d0..379882c3c5 100644 --- a/app/Http/Controllers/Components/ComponentCheckinController.php +++ b/app/Http/Controllers/Components/ComponentCheckinController.php @@ -4,6 +4,7 @@ namespace App\Http\Controllers\Components; use App\Events\CheckoutableCheckedIn; use App\Events\ComponentCheckedIn; +use App\Helpers\Helper; use App\Http\Controllers\Controller; use App\Models\Asset; use App\Models\Component; @@ -96,12 +97,10 @@ class ComponentCheckinController extends Controller $asset = Asset::find($component_assets->asset_id); event(new CheckoutableCheckedIn($component, $asset, auth()->user(), $request->input('note'), Carbon::now())); - if ($backto == 'asset'){ - return redirect()->route('hardware.show', $asset->id)->with('success', - trans('admin/components/message.checkin.success')); - } - return redirect()->route('components.index')->with('success', + session()->put(['redirect_option' => $request->get('redirect_option')]); + + return redirect()->to(Helper::getRedirectOption($request, $component->id, 'Components'))->with('success', trans('admin/components/message.checkin.success')); } diff --git a/app/Http/Controllers/Components/ComponentCheckoutController.php b/app/Http/Controllers/Components/ComponentCheckoutController.php index fc319b47de..5547b71702 100644 --- a/app/Http/Controllers/Components/ComponentCheckoutController.php +++ b/app/Http/Controllers/Components/ComponentCheckoutController.php @@ -4,6 +4,7 @@ namespace App\Http\Controllers\Components; use App\Events\CheckoutableCheckedOut; use App\Events\ComponentCheckedOut; +use App\Helpers\Helper; use App\Http\Controllers\Controller; use App\Models\Asset; use App\Models\Component; @@ -93,14 +94,14 @@ class ComponentCheckoutController extends Controller ->withInput(); } - // Check if the user exists + // Check if the asset exists $asset = Asset::find($request->input('asset_id')); // Update the component data $component->asset_id = $request->input('asset_id'); $component->assets()->attach($component->id, [ 'component_id' => $component->id, - 'user_id' => auth()->user(), + 'user_id' => auth()->user()->id, 'created_at' => date('Y-m-d H:i:s'), 'assigned_qty' => $request->input('assigned_qty'), 'asset_id' => $request->input('asset_id'), @@ -109,6 +110,11 @@ class ComponentCheckoutController extends Controller event(new CheckoutableCheckedOut($component, $asset, auth()->user(), $request->input('note'))); - return redirect()->route('components.index')->with('success', trans('admin/components/message.checkout.success')); + $request->request->add(['checkout_to_type' => 'asset']); + $request->request->add(['assigned_asset' => $asset->id]); + + session()->put(['redirect_option' => $request->get('redirect_option'), 'checkout_to_type' => $request->get('checkout_to_type')]); + + return redirect()->to(Helper::getRedirectOption($request, $component->id, 'Components'))->with('success', trans('admin/components/message.checkout.success')); } } diff --git a/app/Http/Controllers/Components/ComponentsController.php b/app/Http/Controllers/Components/ComponentsController.php index 33ebde6456..57cd0a2b45 100644 --- a/app/Http/Controllers/Components/ComponentsController.php +++ b/app/Http/Controllers/Components/ComponentsController.php @@ -86,8 +86,10 @@ class ComponentsController extends Controller $component = $request->handleImages($component); + session()->put(['redirect_option' => $request->get('redirect_option')]); + if ($component->save()) { - return redirect()->route('components.index')->with('success', trans('admin/components/message.create.success')); + return redirect()->to(Helper::getRedirectOption($request, $component->id, 'Components'))->with('success', trans('admin/components/message.create.success')); } return redirect()->back()->withInput()->withErrors($component->getErrors()); @@ -160,8 +162,10 @@ class ComponentsController extends Controller $component = $request->handleImages($component); + session()->put(['redirect_option' => $request->get('redirect_option')]); + if ($component->save()) { - return redirect()->route('components.index')->with('success', trans('admin/components/message.update.success')); + return redirect()->to(Helper::getRedirectOption($request, $component->id, 'Components'))->with('success', trans('admin/components/message.update.success')); } return redirect()->back()->withInput()->withErrors($component->getErrors()); diff --git a/app/Http/Controllers/Consumables/ConsumableCheckoutController.php b/app/Http/Controllers/Consumables/ConsumableCheckoutController.php index fd690fede8..1bdb16af92 100644 --- a/app/Http/Controllers/Consumables/ConsumableCheckoutController.php +++ b/app/Http/Controllers/Consumables/ConsumableCheckoutController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers\Consumables; use App\Events\CheckoutableCheckedOut; +use App\Helpers\Helper; use App\Http\Controllers\Controller; use App\Models\Consumable; use App\Models\User; @@ -33,7 +34,7 @@ class ConsumableCheckoutController extends Controller // Make sure there is at least one available to checkout if ($consumable->numRemaining() <= 0){ return redirect()->route('consumables.index') - ->with('error', trans('admin/consumables/message.checkout.unavailable')); + ->with('error', trans('admin/consumables/message.checkout.unavailable', ['requested' => 1, 'remaining' => $consumable->numRemaining()])); } // Return the checkout view @@ -76,7 +77,7 @@ class ConsumableCheckoutController extends Controller // Make sure there is at least one available to checkout if ($consumable->numRemaining() <= 0 || $quantity > $consumable->numRemaining()) { - return redirect()->route('consumables.index')->with('error', trans('admin/consumables/message.checkout.unavailable')); + return redirect()->route('consumables.index')->with('error', trans('admin/consumables/message.checkout.unavailable', ['requested' => $quantity, 'remaining' => $consumable->numRemaining() ])); } $admin_user = auth()->user(); @@ -101,7 +102,13 @@ class ConsumableCheckoutController extends Controller } event(new CheckoutableCheckedOut($consumable, $user, auth()->user(), $request->input('note'))); + $request->request->add(['checkout_to_type' => 'user']); + $request->request->add(['assigned_user' => $user->id]); + + session()->put(['redirect_option' => $request->get('redirect_option'), 'checkout_to_type' => $request->get('checkout_to_type')]); + + // Redirect to the new consumable page - return redirect()->route('consumables.index')->with('success', trans('admin/consumables/message.checkout.success')); + return redirect()->to(Helper::getRedirectOption($request, $consumable->id, 'Consumables'))->with('success', trans('admin/consumables/message.checkout.success')); } } diff --git a/app/Http/Controllers/Consumables/ConsumablesController.php b/app/Http/Controllers/Consumables/ConsumablesController.php index 883d5849ee..42c0766fe0 100644 --- a/app/Http/Controllers/Consumables/ConsumablesController.php +++ b/app/Http/Controllers/Consumables/ConsumablesController.php @@ -87,8 +87,10 @@ class ConsumablesController extends Controller $consumable = $request->handleImages($consumable); + session()->put(['redirect_option' => $request->get('redirect_option')]); + if ($consumable->save()) { - return redirect()->route('consumables.index')->with('success', trans('admin/consumables/message.create.success')); + return redirect()->to(Helper::getRedirectOption($request, $consumable->id, 'Consumables'))->with('success', trans('admin/consumables/message.create.success')); } return redirect()->back()->withInput()->withErrors($consumable->getErrors()); @@ -160,8 +162,10 @@ class ConsumablesController extends Controller $consumable = $request->handleImages($consumable); + session()->put(['redirect_option' => $request->get('redirect_option')]); + if ($consumable->save()) { - return redirect()->route('consumables.index')->with('success', trans('admin/consumables/message.update.success')); + return redirect()->to(Helper::getRedirectOption($request, $consumable->id, 'Consumables'))->with('success', trans('admin/consumables/message.update.success')); } return redirect()->back()->withInput()->withErrors($consumable->getErrors()); diff --git a/app/Http/Controllers/Licenses/LicenseCheckinController.php b/app/Http/Controllers/Licenses/LicenseCheckinController.php index e863aa860e..dd83d0154c 100644 --- a/app/Http/Controllers/Licenses/LicenseCheckinController.php +++ b/app/Http/Controllers/Licenses/LicenseCheckinController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers\Licenses; use App\Events\CheckoutableCheckedIn; +use App\Helpers\Helper; use App\Http\Controllers\Controller; use App\Models\License; use App\Models\LicenseSeat; @@ -100,15 +101,15 @@ class LicenseCheckinController extends Controller $licenseSeat->asset_id = null; $licenseSeat->notes = $request->input('notes'); + session()->put(['redirect_option' => $request->get('redirect_option')]); + + // Was the asset updated? if ($licenseSeat->save()) { event(new CheckoutableCheckedIn($licenseSeat, $return_to, auth()->user(), $request->input('notes'))); - if ($backTo == 'user') { - return redirect()->route('users.show', $return_to->id)->with('success', trans('admin/licenses/message.checkin.success')); - } - return redirect()->route('licenses.show', $licenseSeat->license_id)->with('success', trans('admin/licenses/message.checkin.success')); + return redirect()->to(Helper::getRedirectOption($request, $license->id, 'Licenses'))->with('success', trans('admin/licenses/message.checkin.success')); } // Redirect to the license page with error diff --git a/app/Http/Controllers/Licenses/LicenseCheckoutController.php b/app/Http/Controllers/Licenses/LicenseCheckoutController.php index 2fb0434f62..c08980fc06 100644 --- a/app/Http/Controllers/Licenses/LicenseCheckoutController.php +++ b/app/Http/Controllers/Licenses/LicenseCheckoutController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers\Licenses; use App\Events\CheckoutableCheckedOut; +use App\Helpers\Helper; use App\Http\Controllers\Controller; use App\Http\Requests\LicenseCheckoutRequest; use App\Models\Accessory; @@ -81,10 +82,27 @@ class LicenseCheckoutController extends Controller $checkoutMethod = 'checkoutTo'.ucwords(request('checkout_to_type')); - if ($this->$checkoutMethod($licenseSeat)) { - return redirect()->route('licenses.index')->with('success', trans('admin/licenses/message.checkout.success')); + + if ($request->filled('asset_id')) { + + $checkoutTarget = $this->checkoutToAsset($licenseSeat); + $request->request->add(['assigned_asset' => $checkoutTarget->id]); + session()->put(['redirect_option' => $request->get('redirect_option'), 'checkout_to_type' => 'asset']); + + } elseif ($request->filled('assigned_to')) { + $checkoutTarget = $this->checkoutToUser($licenseSeat); + $request->request->add(['assigned_user' => $checkoutTarget->id]); + session()->put(['redirect_option' => $request->get('redirect_option'), 'checkout_to_type' => 'user']); } + + + if ($checkoutTarget) { + return redirect()->to(Helper::getRedirectOption($request, $license->id, 'Licenses'))->with('success', trans('admin/licenses/message.checkout.success')); + } + + + return redirect()->route('licenses.index')->with('error', trans('Something went wrong handling this checkout.')); } @@ -120,8 +138,7 @@ class LicenseCheckoutController extends Controller } if ($licenseSeat->save()) { event(new CheckoutableCheckedOut($licenseSeat, $target, auth()->user(), request('notes'))); - - return true; + return $target; } return false; @@ -137,8 +154,7 @@ class LicenseCheckoutController extends Controller if ($licenseSeat->save()) { event(new CheckoutableCheckedOut($licenseSeat, $target, auth()->user(), request('notes'))); - - return true; + return $target; } return false; diff --git a/app/Http/Controllers/Licenses/LicensesController.php b/app/Http/Controllers/Licenses/LicensesController.php index 01de4b4d46..7a51344dd0 100755 --- a/app/Http/Controllers/Licenses/LicensesController.php +++ b/app/Http/Controllers/Licenses/LicensesController.php @@ -102,8 +102,10 @@ class LicensesController extends Controller $license->user_id = Auth::id(); $license->min_amt = $request->input('min_amt'); + session()->put(['redirect_option' => $request->get('redirect_option')]); + if ($license->save()) { - return redirect()->route('licenses.index')->with('success', trans('admin/licenses/message.create.success')); + return redirect()->to(Helper::getRedirectOption($request, $license->id, 'Licenses'))->with('success', trans('admin/licenses/message.create.success')); } return redirect()->back()->withInput()->withErrors($license->getErrors()); @@ -180,8 +182,10 @@ class LicensesController extends Controller $license->category_id = $request->input('category_id'); $license->min_amt = $request->input('min_amt'); + session()->put(['redirect_option' => $request->get('redirect_option')]); + if ($license->save()) { - return redirect()->route('licenses.show', ['license' => $licenseId])->with('success', trans('admin/licenses/message.update.success')); + return redirect()->to(Helper::getRedirectOption($request, $license->id, 'Licenses'))->with('success', trans('admin/licenses/message.update.success')); } // If we can't adjust the number of seats, the error is flashed to the session by the event handler in License.php return redirect()->back()->withInput()->withErrors($license->getErrors()); diff --git a/app/Http/Controllers/Users/UsersController.php b/app/Http/Controllers/Users/UsersController.php index 7cff29fe59..1e203e71d5 100755 --- a/app/Http/Controllers/Users/UsersController.php +++ b/app/Http/Controllers/Users/UsersController.php @@ -133,6 +133,8 @@ class UsersController extends Controller // we have to invoke the app(ImageUploadRequest::class)->handleImages($user, 600, 'avatar', 'avatars', 'avatar'); + session()->put(['redirect_option' => $request->get('redirect_option')]); + if ($user->save()) { if ($request->filled('groups')) { $user->groups()->sync($request->input('groups')); @@ -152,7 +154,7 @@ class UsersController extends Controller $user->notify(new WelcomeNotification($data)); } - return redirect()->route('users.index')->with('success', trans('admin/users/message.success.create')); + return redirect()->to(Helper::getRedirectOption($request, $user->id, 'Users'))->with('success', trans('admin/users/message.success.create')); } return redirect()->back()->withInput()->withErrors($user->getErrors()); @@ -309,10 +311,11 @@ class UsersController extends Controller // Handle uploaded avatar app(ImageUploadRequest::class)->handleImages($user, 600, 'avatar', 'avatars', 'avatar'); + session()->put(['redirect_option' => $request->get('redirect_option')]); if ($user->save()) { // Redirect to the user page - return redirect()->route('users.index') + return redirect()->to(Helper::getRedirectOption($request, $user->id, 'Users')) ->with('success', trans('admin/users/message.success.update')); } diff --git a/database/factories/ComponentFactory.php b/database/factories/ComponentFactory.php index caac70078f..2557f29c77 100644 --- a/database/factories/ComponentFactory.php +++ b/database/factories/ComponentFactory.php @@ -2,10 +2,15 @@ namespace Database\Factories; +use App\Models\Accessory; +use App\Models\Asset; use App\Models\Category; use App\Models\Company; use App\Models\Component; +use App\Models\Consumable; use App\Models\Location; +use App\Models\User; +use Carbon\Carbon; use Illuminate\Database\Eloquent\Factories\Factory; use App\Models\Supplier; @@ -97,5 +102,16 @@ class ComponentFactory extends Factory }); } + public function checkedOutToAsset(Asset $asset = null) + { + return $this->afterCreating(function (Component $component) use ($asset) { + $component->assets()->attach($component->id, [ + 'component_id' => $component->id, + 'created_at' => Carbon::now(), + 'user_id' => 1, + 'asset_id' => $asset->id ?? Asset::factory()->create()->id, + ]); + }); + } } diff --git a/resources/views/accessories/checkin.blade.php b/resources/views/accessories/checkin.blade.php index 7d1ef13262..cceb8b895b 100755 --- a/resources/views/accessories/checkin.blade.php +++ b/resources/views/accessories/checkin.blade.php @@ -71,11 +71,15 @@ - + diff --git a/resources/views/accessories/checkout.blade.php b/resources/views/accessories/checkout.blade.php index 71035a87c1..6c96e1bfa3 100755 --- a/resources/views/accessories/checkout.blade.php +++ b/resources/views/accessories/checkout.blade.php @@ -114,10 +114,16 @@ - + diff --git a/resources/views/accessories/edit.blade.php b/resources/views/accessories/edit.blade.php index 068fddc266..8e0503400f 100644 --- a/resources/views/accessories/edit.blade.php +++ b/resources/views/accessories/edit.blade.php @@ -4,6 +4,11 @@ 'helpPosition' => 'right', 'helpText' => trans('help.accessories'), 'formAction' => (isset($item->id)) ? route('accessories.update', ['accessory' => $item->id]) : route('accessories.store'), + 'index_route' => 'accessories.index', + 'options' => [ + 'index' => trans('admin/hardware/form.redirect_to_all', ['type' => 'accessories']), + 'item' => trans('admin/hardware/form.redirect_to_type', ['type' => trans('general.accessory')]), + ] ]) {{-- Page content --}} diff --git a/resources/views/blade/redirect_submit_options.blade.php b/resources/views/blade/redirect_submit_options.blade.php new file mode 100644 index 0000000000..a6b0c7fc88 --- /dev/null +++ b/resources/views/blade/redirect_submit_options.blade.php @@ -0,0 +1,38 @@ + +@props([ + 'index_route', + 'button_label', + 'disabled_select' => false, + 'options' => [], +]) + + + \ No newline at end of file diff --git a/resources/views/components/checkin.blade.php b/resources/views/components/checkin.blade.php index e195685d2a..d838744ffb 100644 --- a/resources/views/components/checkin.blade.php +++ b/resources/views/components/checkin.blade.php @@ -56,10 +56,14 @@ {!! $errors->first('note', '') !!} - + diff --git a/resources/views/components/checkout.blade.php b/resources/views/components/checkout.blade.php index f6befa2736..39890a1938 100644 --- a/resources/views/components/checkout.blade.php +++ b/resources/views/components/checkout.blade.php @@ -54,10 +54,16 @@ - + diff --git a/resources/views/components/edit.blade.php b/resources/views/components/edit.blade.php index 5279f03990..ce77b5130d 100644 --- a/resources/views/components/edit.blade.php +++ b/resources/views/components/edit.blade.php @@ -4,6 +4,11 @@ 'helpPosition' => 'right', 'helpText' => trans('help.components'), 'formAction' => (isset($item->id)) ? route('components.update', ['component' => $item->id]) : route('components.store'), + 'index_route' => 'components.index', + 'options' => [ + 'index' => trans('admin/hardware/form.redirect_to_all', ['type' => 'components']), + 'item' => trans('admin/hardware/form.redirect_to_type', ['type' => trans('general.component')]), + ] ]) diff --git a/resources/views/consumables/checkout.blade.php b/resources/views/consumables/checkout.blade.php index 29b68b6ce7..bb3023290f 100644 --- a/resources/views/consumables/checkout.blade.php +++ b/resources/views/consumables/checkout.blade.php @@ -106,10 +106,14 @@ - + diff --git a/resources/views/consumables/edit.blade.php b/resources/views/consumables/edit.blade.php index f32e74b196..300a7114d9 100644 --- a/resources/views/consumables/edit.blade.php +++ b/resources/views/consumables/edit.blade.php @@ -4,6 +4,11 @@ 'helpPosition' => 'right', 'helpText' => trans('help.consumables'), 'formAction' => (isset($item->id)) ? route('consumables.update', ['consumable' => $item->id]) : route('consumables.store'), + 'index_route' => 'consumables.index', + 'options' => [ + 'index' => trans('admin/hardware/form.redirect_to_all', ['type' => 'consumables']), + 'item' => trans('admin/hardware/form.redirect_to_type', ['type' => trans('general.consumable')]), + ] ]) {{-- Page content --}} @section('inputFields') diff --git a/resources/views/hardware/checkin.blade.php b/resources/views/hardware/checkin.blade.php index 7b52cf8614..1efd394277 100755 --- a/resources/views/hardware/checkin.blade.php +++ b/resources/views/hardware/checkin.blade.php @@ -2,132 +2,144 @@ {{-- Page title --}} @section('title') - {{ trans('admin/hardware/general.checkin') }} - @parent + {{ trans('admin/hardware/general.checkin') }} + @parent @stop {{-- Page content --}} @section('content') - + .input-group { + padding-left: 0px !important; + } + -
- -
-
-
-

- {{ trans('admin/hardware/form.tag') }} - {{ $asset->asset_tag }} -

-
+
+ +
+
+
+

+ {{ trans('admin/hardware/form.tag') }} + {{ $asset->asset_tag }} +

+
-
-
+
+
- @if ($backto == 'user') -
- @else - - @endif - {{csrf_field()}} + @if ($backto == 'user') + + @else + + @endif + {{csrf_field()}} - -
- -
+ +
+ +
-

- @if (($asset->model) && ($asset->model->name)) - {{ $asset->model->name }} - @else - +

+ @if (($asset->model) && ($asset->model->name)) + {{ $asset->model->name }} + @else + {{ trans('admin/hardware/general.model_invalid')}} - {{ trans('admin/hardware/general.model_invalid_fix')}} - - {{ trans('admin/hardware/general.edit') }} - - @endif -

+ {{ trans('admin/hardware/general.model_invalid_fix')}} + + {{ trans('admin/hardware/general.edit') }} + + @endif +

-
-
+
+
- -
- -
- - {!! $errors->first('name', '') !!} -
-
+ +
+ +
+ + {!! $errors->first('name', '') !!} +
+
- -
- -
- {{ Form::select('status_id', $statusLabel_list, '', array('class'=>'select2', 'style'=>'width:100%','id' =>'modal-statuslabel_types', 'aria-label'=>'status_id')) }} - {!! $errors->first('status_id', '') !!} -
-
+ +
+ +
+ {{ Form::select('status_id', $statusLabel_list, '', array('class'=>'select2', 'style'=>'width:100%','id' =>'modal-statuslabel_types', 'aria-label'=>'status_id')) }} + {!! $errors->first('status_id', '') !!} +
+
- @include ('partials.forms.edit.location-select', ['translated_name' => trans('general.location'), 'fieldname' => 'location_id', 'help_text' => ($asset->defaultLoc) ? trans('general.checkin_to_diff_location', ['default_location' => $asset->defaultLoc->name]) : null, 'hide_location_radio' => true]) + @include ('partials.forms.edit.location-select', ['translated_name' => trans('general.location'), 'fieldname' => 'location_id', 'help_text' => ($asset->defaultLoc) ? trans('general.checkin_to_diff_location', ['default_location' => $asset->defaultLoc->name]) : null, 'hide_location_radio' => true]) - -
- + +
+ -
-
-
- - -
- {!! $errors->first('checkin_at', '') !!} -
-
-
+
+
+
+ + +
+ {!! $errors->first('checkin_at', '') !!} +
+
+
- -
- -
- - {!! $errors->first('note', '') !!} -
-
+ +
+ +
+ + {!! $errors->first('note', '') !!} +
+
- @include ('partials.forms.redirect_submit_options', - [ - 'route' => 'hardware.index', - 'table_name' => $table_name, - 'type'=> ($asset->model ? $asset->model->name : trans('general.asset_model')), - 'checkin' => true - ]) - + + -
+
+
-
- @stop \ No newline at end of file diff --git a/resources/views/hardware/checkout.blade.php b/resources/views/hardware/checkout.blade.php index 4a1cdf5749..f91e060368 100755 --- a/resources/views/hardware/checkout.blade.php +++ b/resources/views/hardware/checkout.blade.php @@ -25,7 +25,7 @@

{{ trans('admin/hardware/form.tag') }} {{ $asset->asset_tag }}

- {{csrf_field()}} + {{csrf_field()}} @if ($asset->company && $asset->company->name)
- + {!! $errors->first('name', '') !!}
@@ -86,26 +87,30 @@
- @include ('partials.forms.checkout-selector', ['user_select' => 'true','asset_select' => 'true', 'location_select' => 'true']) + @include ('partials.forms.checkout-selector', ['user_select' => 'true','asset_select' => 'true', 'location_select' => 'true']) - @include ('partials.forms.edit.user-select', ['translated_name' => trans('general.user'), 'fieldname' => 'assigned_user', 'required'=>'true']) + @include ('partials.forms.edit.user-select', ['translated_name' => trans('general.user'), 'fieldname' => 'assigned_user', 'required'=>'true']) - - @include ('partials.forms.edit.asset-select', ['translated_name' => trans('general.asset'), 'fieldname' => 'assigned_asset', 'unselect' => 'true', 'style' => 'display:none;', 'required'=>'true']) + + @include ('partials.forms.edit.asset-select', ['translated_name' => trans('general.asset'), 'fieldname' => 'assigned_asset', 'unselect' => 'true', 'style' => 'display:none;', 'required'=>'true']) - @include ('partials.forms.edit.location-select', ['translated_name' => trans('general.location'), 'fieldname' => 'assigned_location', 'style' => 'display:none;', 'required'=>'true']) + @include ('partials.forms.edit.location-select', ['translated_name' => trans('general.location'), 'fieldname' => 'assigned_location', 'style' => 'display:none;', 'required'=>'true']) - +
-
- - +
+ +
{!! $errors->first('checkout_at', '') !!}
@@ -118,9 +123,13 @@
-
- - +
+ +
{!! $errors->first('expected_checkin', '') !!}
@@ -132,7 +141,8 @@ {{ trans('general.notes') }}
- + {!! $errors->first('note', '') !!}
@@ -164,13 +174,19 @@ @endif
- @include ('partials.forms.redirect_submit_options', - [ - 'route' => 'hardware.index', - 'table_name' => $table_name, - 'type'=> ($asset->model ? $asset->model->name : trans('general.asset_model')), - 'checkin' => false - ]) + + +
diff --git a/resources/views/hardware/edit.blade.php b/resources/views/hardware/edit.blade.php index 2a125a1c3f..f31326cc4d 100755 --- a/resources/views/hardware/edit.blade.php +++ b/resources/views/hardware/edit.blade.php @@ -6,6 +6,11 @@ 'helpText' => trans('help.assets'), 'helpPosition' => 'right', 'formAction' => ($item->id) ? route('hardware.update', ['hardware' => $item->id]) : route('hardware.store'), + 'index_route' => 'hardware.index', + 'options' => [ + 'index' => trans('admin/hardware/form.redirect_to_all', ['type' => 'assets']), + 'item' => trans('admin/hardware/form.redirect_to_type', ['type' => trans('general.asset')]), + ] ]) @@ -130,8 +135,6 @@ - -
diff --git a/resources/views/layouts/edit-form.blade.php b/resources/views/layouts/edit-form.blade.php index 791590141c..2c582ec4b5 100644 --- a/resources/views/layouts/edit-form.blade.php +++ b/resources/views/layouts/edit-form.blade.php @@ -66,7 +66,11 @@ {{ csrf_field() }} @yield('inputFields') - @include('partials.forms.edit.submit') +
diff --git a/resources/views/licenses/checkin.blade.php b/resources/views/licenses/checkin.blade.php index 8eeea6f9c4..5ef9159549 100755 --- a/resources/views/licenses/checkin.blade.php +++ b/resources/views/licenses/checkin.blade.php @@ -56,10 +56,14 @@ {!! $errors->first('notes', '') !!} - + diff --git a/resources/views/licenses/checkout.blade.php b/resources/views/licenses/checkout.blade.php index e85c677420..bfd4773099 100755 --- a/resources/views/licenses/checkout.blade.php +++ b/resources/views/licenses/checkout.blade.php @@ -105,10 +105,15 @@ @endif - + diff --git a/resources/views/licenses/edit.blade.php b/resources/views/licenses/edit.blade.php index 450e4357a4..b8429a2123 100755 --- a/resources/views/licenses/edit.blade.php +++ b/resources/views/licenses/edit.blade.php @@ -3,6 +3,11 @@ 'updateText' => trans('admin/licenses/form.update'), 'topSubmit' => true, 'formAction' => ($item->id) ? route('licenses.update', ['license' => $item->id]) : route('licenses.store'), + 'index_route' => 'licenses.index', + 'options' => [ + 'index' => trans('admin/hardware/form.redirect_to_all', ['type' => 'licenses']), + 'item' => trans('admin/hardware/form.redirect_to_type', ['type' => trans('general.license')]), + ] ]) {{-- Page content --}} diff --git a/resources/views/partials/forms/redirect_submit_options.blade.php b/resources/views/partials/forms/redirect_submit_options.blade.php deleted file mode 100644 index c960dbb860..0000000000 --- a/resources/views/partials/forms/redirect_submit_options.blade.php +++ /dev/null @@ -1,36 +0,0 @@ - - - - \ No newline at end of file diff --git a/resources/views/users/edit.blade.php b/resources/views/users/edit.blade.php index 814c2f28eb..200acb5527 100755 --- a/resources/views/users/edit.blade.php +++ b/resources/views/users/edit.blade.php @@ -596,9 +596,14 @@ - + diff --git a/tests/Feature/Assets/Ui/EditAssetTest.php b/tests/Feature/Assets/Ui/EditAssetTest.php index 9e58be2685..2c19e768b4 100644 --- a/tests/Feature/Assets/Ui/EditAssetTest.php +++ b/tests/Feature/Assets/Ui/EditAssetTest.php @@ -3,17 +3,65 @@ namespace Feature\Assets\Ui; use App\Models\Asset; +use App\Models\AssetModel; +use App\Models\StatusLabel; use App\Models\User; use Tests\TestCase; class EditAssetTest extends TestCase { + + public function testPermissionRequiredToViewLicense() + { + $asset = Asset::factory()->create(); + $this->actingAs(User::factory()->create()) + ->get(route('hardware.edit', $asset)) + ->assertForbidden(); + } + public function testPageCanBeAccessed(): void { $asset = Asset::factory()->create(); $user = User::factory()->editAssets()->create(); $response = $this->actingAs($user)->get(route('hardware.edit', $asset->id)); - $response->assertStatus(200); } + + public function testAssetEditPostIsRedirectedIfRedirectSelectionIsIndex() + { + $asset = Asset::factory()->assignedToUser()->create(); + + $this->actingAs(User::factory()->viewAssets()->editAssets()->create()) + ->from(route('hardware.edit', $asset)) + ->put(route('hardware.update', $asset), + [ + 'redirect_option' => 'index', + 'name' => 'New name', + 'asset_tags' => 'New Asset Tag', + 'status_id' => StatusLabel::factory()->create()->id, + 'model_id' => AssetModel::factory()->create()->id, + ]) + ->assertStatus(302) + ->assertRedirect(route('hardware.index')); + $this->assertDatabaseHas('assets', ['asset_tag' => 'New Asset Tag']); + } + public function testAssetEditPostIsRedirectedIfRedirectSelectionIsItem() + { + $asset = Asset::factory()->create(); + + $this->actingAs(User::factory()->viewAssets()->editAssets()->create()) + ->from(route('hardware.edit', $asset)) + ->put(route('hardware.update', $asset), [ + 'redirect_option' => 'item', + 'name' => 'New name', + 'asset_tags' => 'New Asset Tag', + 'status_id' => StatusLabel::factory()->create()->id, + 'model_id' => AssetModel::factory()->create()->id, + ]) + ->assertStatus(302) + ->assertRedirect(route('hardware.show', ['hardware' => $asset->id])); + + $this->assertDatabaseHas('assets', ['asset_tag' => 'New Asset Tag']); + } + } diff --git a/tests/Feature/Checkins/Ui/AssetCheckinTest.php b/tests/Feature/Checkins/Ui/AssetCheckinTest.php index cebd5010f1..f412d4439e 100644 --- a/tests/Feature/Checkins/Ui/AssetCheckinTest.php +++ b/tests/Feature/Checkins/Ui/AssetCheckinTest.php @@ -196,4 +196,31 @@ class AssetCheckinTest extends TestCase ->assertSessionHas('error') ->assertRedirect(route('hardware.show', ['hardware' => $asset->id])); } + + public function testAssetCheckinPagePostIsRedirectedIfRedirectSelectionIsIndex() + { + $asset = Asset::factory()->assignedToUser()->create(); + + $this->actingAs(User::factory()->admin()->create()) + ->from(route('hardware.index')) + ->post(route('hardware.checkin.store', $asset), [ + 'redirect_option' => 'index', + ]) + ->assertStatus(302) + ->assertRedirect(route('hardware.index')); + } + + public function testAssetCheckinPagePostIsRedirectedIfRedirectSelectionIsItem() + { + $asset = Asset::factory()->assignedToUser()->create(); + + $this->actingAs(User::factory()->admin()->create()) + ->from(route('hardware.index')) + ->post(route('hardware.checkin.store', $asset), [ + 'redirect_option' => 'item', + ]) + ->assertStatus(302) + ->assertSessionHasNoErrors() + ->assertRedirect(route('hardware.show', ['hardware' => $asset->id])); + } } diff --git a/tests/Feature/Checkins/Ui/ComponentCheckinTest.php b/tests/Feature/Checkins/Ui/ComponentCheckinTest.php new file mode 100644 index 0000000000..1213d65252 --- /dev/null +++ b/tests/Feature/Checkins/Ui/ComponentCheckinTest.php @@ -0,0 +1,51 @@ +actingAs(User::factory()->create()) + ->post(route('components.checkin.store', [ + 'componentID' => Component::factory()->checkedOutToAsset()->create()->id, + ])) + ->assertForbidden(); + } + + + public function testComponentCheckinPagePostIsRedirectedIfRedirectSelectionIsIndex() + { + $component = Component::factory()->checkedOutToAsset()->create(); + + $this->actingAs(User::factory()->admin()->create()) + ->from(route('components.index')) + ->post(route('components.checkin.store', $component), [ + 'redirect_option' => 'index', + 'checkin_qty' => 1, + ]) + ->assertStatus(302) + ->assertRedirect(route('components.index')); + } + + public function testComponentCheckinPagePostIsRedirectedIfRedirectSelectionIsItem() + { + $component = Component::factory()->checkedOutToAsset()->create(); + + $this->actingAs(User::factory()->admin()->create()) + ->from(route('components.index')) + ->post(route('components.checkin.store', $component), [ + 'redirect_option' => 'item', + 'checkin_qty' => 1, + ]) + ->assertStatus(302) + ->assertSessionHasNoErrors() + ->assertRedirect(route('components.show', ['component' => $component->id])); + } + + +} diff --git a/tests/Feature/Checkins/Ui/LicenseCheckinTest.php b/tests/Feature/Checkins/Ui/LicenseCheckinTest.php new file mode 100644 index 0000000000..e087cb442d --- /dev/null +++ b/tests/Feature/Checkins/Ui/LicenseCheckinTest.php @@ -0,0 +1,21 @@ +actingAs(User::factory()->create()) + ->post(route('licenses.checkin.save', [ + 'licenseId' => LicenseSeat::factory()->assignedToUser()->create()->id, + ])) + ->assertForbidden(); + } + + +} diff --git a/tests/Feature/Checkouts/Ui/AccessoryCheckoutTest.php b/tests/Feature/Checkouts/Ui/AccessoryCheckoutTest.php index e0af379db0..c06c780768 100644 --- a/tests/Feature/Checkouts/Ui/AccessoryCheckoutTest.php +++ b/tests/Feature/Checkouts/Ui/AccessoryCheckoutTest.php @@ -140,4 +140,51 @@ class AccessoryCheckoutTest extends TestCase 'Log entry either does not exist or there are more than expected' ); } + + public function testAccessoryCheckoutPagePostIsRedirectedIfRedirectSelectionIsIndex() + { + $accessory = Accessory::factory()->create(); + + $this->actingAs(User::factory()->admin()->create()) + ->from(route('accessories.index')) + ->post(route('accessories.checkout.store', $accessory), [ + 'assigned_to' => User::factory()->create()->id, + 'redirect_option' => 'index', + 'assigned_qty' => 1, + ]) + ->assertStatus(302) + ->assertRedirect(route('accessories.index')); + } + + public function testAccessoryCheckoutPagePostIsRedirectedIfRedirectSelectionIsItem() + { + $accessory = Accessory::factory()->create(); + + $this->actingAs(User::factory()->admin()->create()) + ->from(route('accessories.index')) + ->post(route('accessories.checkout.store' , $accessory), [ + 'assigned_to' => User::factory()->create()->id, + 'redirect_option' => 'item', + 'assigned_qty' => 1, + ]) + ->assertStatus(302) + ->assertSessionHasNoErrors() + ->assertRedirect(route('accessories.show', ['accessory' => $accessory->id])); + } + + public function testAccessoryCheckoutPagePostIsRedirectedIfRedirectSelectionIsTarget() + { + $user = User::factory()->create(); + $accessory = Accessory::factory()->create(); + + $this->actingAs(User::factory()->admin()->create()) + ->from(route('accessories.index')) + ->post(route('accessories.checkout.store' , $accessory), [ + 'assigned_to' => $user->id, + 'redirect_option' => 'target', + 'assigned_qty' => 1, + ]) + ->assertStatus(302) + ->assertRedirect(route('users.show', ['user' => $user])); + } } diff --git a/tests/Feature/Checkouts/Ui/AssetCheckoutTest.php b/tests/Feature/Checkouts/Ui/AssetCheckoutTest.php index eed0908c1d..165c6a4194 100644 --- a/tests/Feature/Checkouts/Ui/AssetCheckoutTest.php +++ b/tests/Feature/Checkouts/Ui/AssetCheckoutTest.php @@ -3,6 +3,7 @@ namespace Tests\Feature\Checkouts\Ui; use App\Events\CheckoutableCheckedOut; +use App\Models\Accessory; use App\Models\Asset; use App\Models\Company; use App\Models\LicenseSeat; @@ -251,20 +252,85 @@ class AssetCheckoutTest extends TestCase ->assertRedirect(route('hardware.show',['hardware' => $asset->id])); } - public function testAssetCheckoutPagePostIsRedirectedIfModelIsInvalid() + public function testAssetCheckoutPagePostIsRedirectedIfRedirectSelectionIsIndex() { $asset = Asset::factory()->create(); - $asset->model_id = 0; - $asset->forceSave(); - $user = User::factory()->create(); - + $this->actingAs(User::factory()->admin()->create()) + ->from(route('hardware.checkout.create', $asset)) ->post(route('hardware.checkout.store', $asset), [ 'checkout_to_type' => 'user', - 'assigned_user' => $user->id, + 'assigned_user' => User::factory()->create()->id, + 'redirect_option' => 'index', ]) ->assertStatus(302) - ->assertSessionHas('error') + ->assertRedirect(route('hardware.index')); + } + + public function testAssetCheckoutPagePostIsRedirectedIfRedirectSelectionIsItem() + { + $asset = Asset::factory()->create(); + + $this->actingAs(User::factory()->admin()->create()) + ->from(route('hardware.checkout.create', $asset)) + ->post(route('hardware.checkout.store' , $asset), [ + 'checkout_to_type' => 'user', + 'assigned_user' => User::factory()->create()->id, + 'redirect_option' => 'item', + ]) + ->assertStatus(302) + ->assertSessionHasNoErrors() ->assertRedirect(route('hardware.show', ['hardware' => $asset->id])); } + + public function testAssetCheckoutPagePostIsRedirectedIfRedirectSelectionIsUserTarget() + { + $user = User::factory()->create(); + $asset = Asset::factory()->create(); + + $this->actingAs(User::factory()->admin()->create()) + ->from(route('hardware.checkout.create', $asset)) + ->post(route('hardware.checkout.store' , $asset), [ + 'checkout_to_type' => 'user', + 'assigned_user' => $user->id, + 'redirect_option' => 'target', + 'assigned_qty' => 1, + ]) + ->assertStatus(302) + ->assertRedirect(route('users.show', ['user' => $user])); + } + + public function testAssetCheckoutPagePostIsRedirectedIfRedirectSelectionIsAssetTarget() + { + $target = Asset::factory()->create(); + $asset = Asset::factory()->create(); + + $this->actingAs(User::factory()->admin()->create()) + ->from(route('hardware.checkout.create', $asset)) + ->post(route('hardware.checkout.store' , $asset), [ + 'checkout_to_type' => 'asset', + 'assigned_asset' => $target->id, + 'redirect_option' => 'target', + 'assigned_qty' => 1, + ]) + ->assertStatus(302) + ->assertRedirect(route('hardware.show', ['hardware' => $target])); + } + + public function testAssetCheckoutPagePostIsRedirectedIfRedirectSelectionIsLocationTarget() + { + $target = Location::factory()->create(); + $asset = Asset::factory()->create(); + + $this->actingAs(User::factory()->admin()->create()) + ->from(route('hardware.checkout.create', $asset)) + ->post(route('hardware.checkout.store' , $asset), [ + 'checkout_to_type' => 'location', + 'assigned_location' => $target->id, + 'redirect_option' => 'target', + 'assigned_qty' => 1, + ]) + ->assertStatus(302) + ->assertRedirect(route('locations.show', ['location' => $target])); + } } diff --git a/tests/Feature/Checkouts/Ui/ComponentsCheckoutTest.php b/tests/Feature/Checkouts/Ui/ComponentsCheckoutTest.php new file mode 100644 index 0000000000..9948de7ed2 --- /dev/null +++ b/tests/Feature/Checkouts/Ui/ComponentsCheckoutTest.php @@ -0,0 +1,68 @@ +actingAs(User::factory()->create()) + ->post(route('components.checkout.store', [ + 'componentID' => Component::factory()->checkedOutToAsset()->create()->id, + ])) + ->assertForbidden(); + } + + public function testComponentCheckoutPagePostIsRedirectedIfRedirectSelectionIsIndex() + { + $component = Component::factory()->create(); + + $this->actingAs(User::factory()->admin()->create()) + ->from(route('components.index')) + ->post(route('components.checkout.store', $component), [ + 'asset_id' => Asset::factory()->create()->id, + 'redirect_option' => 'index', + 'assigned_qty' => 1, + ]) + ->assertStatus(302) + ->assertRedirect(route('components.index')); + } + + public function testComponentCheckoutPagePostIsRedirectedIfRedirectSelectionIsItem() + { + $component = Component::factory()->create(); + + $this->actingAs(User::factory()->admin()->create()) + ->from(route('components.index')) + ->post(route('components.checkout.store' , $component), [ + 'asset_id' => Asset::factory()->create()->id, + 'redirect_option' => 'item', + 'assigned_qty' => 1, + ]) + ->assertStatus(302) + ->assertRedirect(route('components.show', ['component' => $component->id])); + } + + public function testComponentCheckoutPagePostIsRedirectedIfRedirectSelectionIsTarget() + { + $asset = Asset::factory()->create(); + $component = Component::factory()->create(); + + $this->actingAs(User::factory()->admin()->create()) + ->from(route('components.index')) + ->post(route('components.checkout.store' , $component), [ + 'asset_id' => $asset->id, + 'redirect_option' => 'target', + 'assigned_qty' => 1, + ]) + ->assertStatus(302) + ->assertRedirect(route('hardware.show', ['hardware' => $asset])); + } + + +} diff --git a/tests/Feature/Checkouts/Ui/ConsumableCheckoutTest.php b/tests/Feature/Checkouts/Ui/ConsumableCheckoutTest.php index b595640493..90132fcedf 100644 --- a/tests/Feature/Checkouts/Ui/ConsumableCheckoutTest.php +++ b/tests/Feature/Checkouts/Ui/ConsumableCheckoutTest.php @@ -3,6 +3,8 @@ namespace Tests\Feature\Checkouts\Ui; use App\Models\Actionlog; +use App\Models\Asset; +use App\Models\Component; use App\Models\Consumable; use App\Models\User; use App\Notifications\CheckoutConsumableNotification; @@ -90,4 +92,51 @@ class ConsumableCheckoutTest extends TestCase 'Log entry either does not exist or there are more than expected' ); } + + public function testConsumableCheckoutPagePostIsRedirectedIfRedirectSelectionIsIndex() + { + $consumable = Consumable::factory()->create(); + + $this->actingAs(User::factory()->admin()->create()) + ->from(route('consumables.index')) + ->post(route('consumables.checkout.store', $consumable), [ + 'assigned_to' => User::factory()->create()->id, + 'redirect_option' => 'index', + 'assigned_qty' => 1, + ]) + ->assertStatus(302) + ->assertRedirect(route('consumables.index')); + } + + public function testConsumableCheckoutPagePostIsRedirectedIfRedirectSelectionIsItem() + { + $consumable = Consumable::factory()->create(); + + $this->actingAs(User::factory()->admin()->create()) + ->from(route('consumables.index')) + ->post(route('consumables.checkout.store' , $consumable), [ + 'assigned_to' => User::factory()->create()->id, + 'redirect_option' => 'item', + 'assigned_qty' => 1, + ]) + ->assertStatus(302) + ->assertRedirect(route('consumables.show', ['consumable' => $consumable->id])); + } + + public function testConsumableCheckoutPagePostIsRedirectedIfRedirectSelectionIsTarget() + { + $user = User::factory()->create(); + $consumable = Consumable::factory()->create(); + + $this->actingAs(User::factory()->admin()->create()) + ->from(route('components.index')) + ->post(route('consumables.checkout.store' , $consumable), [ + 'assigned_to' => $user->id, + 'redirect_option' => 'target', + 'assigned_qty' => 1, + ]) + ->assertStatus(302) + ->assertRedirect(route('users.show', ['user' => $user])); + } + } diff --git a/tests/Feature/Checkouts/Ui/LicenseCheckoutTest.php b/tests/Feature/Checkouts/Ui/LicenseCheckoutTest.php index 8e5cd83061..9511c3ae33 100644 --- a/tests/Feature/Checkouts/Ui/LicenseCheckoutTest.php +++ b/tests/Feature/Checkouts/Ui/LicenseCheckoutTest.php @@ -56,4 +56,62 @@ class LicenseCheckoutTest extends TestCase 'note' => 'oh hi there', ]); } + + public function testLicenseCheckoutPagePostIsRedirectedIfRedirectSelectionIsIndex() + { + $license = License::factory()->create(); + + $this->actingAs(User::factory()->admin()->create()) + ->from(route('licenses.checkout', ['licenseId' => $license->id])) + ->post(route('licenses.checkout', ['licenseId' => $license->id]), [ + 'assigned_to' => User::factory()->create()->id, + 'redirect_option' => 'index', + 'assigned_qty' => 1, + ]) + ->assertStatus(302) + ->assertRedirect(route('licenses.index')); + } + + public function testLicenseCheckoutPagePostIsRedirectedIfRedirectSelectionIsItem() + { + $license = License::factory()->create(); + + $this->actingAs(User::factory()->admin()->create()) + ->from(route('licenses.checkout', ['licenseId' => $license->id])) + ->post(route('licenses.checkout' , ['licenseId' => $license->id]), [ + 'assigned_to' => User::factory()->create()->id, + 'redirect_option' => 'item', + ]) + ->assertStatus(302) + ->assertRedirect(route('licenses.show', ['license' => $license->id])); + } + + public function testLicenseCheckoutPagePostIsRedirectedIfRedirectSelectionIsUserTarget() + { + $user = User::factory()->create(); + $license = License::factory()->create(); + + $this->actingAs(User::factory()->admin()->create()) + ->from(route('licenses.checkout', ['licenseId' => $license->id])) + ->post(route('licenses.checkout' , $license), [ + 'assigned_to' => $user->id, + 'redirect_option' => 'target', + ]) + ->assertStatus(302) + ->assertRedirect(route('users.show', ['user' => $user->id])); + } + public function testLicenseCheckoutPagePostIsRedirectedIfRedirectSelectionIsAssetTarget() + { + $asset = Asset::factory()->create(); + $license = License::factory()->create(); + + $this->actingAs(User::factory()->admin()->create()) + ->from(route('licenses.checkout', ['licenseId' => $license->id])) + ->post(route('licenses.checkout' , $license), [ + 'asset_id' => $asset->id, + 'redirect_option' => 'target', + ]) + ->assertStatus(302) + ->assertRedirect(route('hardware.show', ['hardware' => $asset->id])); + } } diff --git a/tests/Unit/Helpers/HelperTest.php b/tests/Unit/Helpers/HelperTest.php index 3ef114b798..2fb1c58e26 100644 --- a/tests/Unit/Helpers/HelperTest.php +++ b/tests/Unit/Helpers/HelperTest.php @@ -31,46 +31,135 @@ class HelperTest extends TestCase public function testGetRedirectOptionMethod() { $test_data = [ - 'Option 2: redirect for user assigned to ' => [ + 'Option target: redirect for user assigned to ' => [ 'request' =>(object) ['assigned_user' => 22], 'id' => 1, 'checkout_to_type' => 'user', - 'redirect_option' => 2, + 'redirect_option' => 'target', 'table' => 'Assets', 'route' => route('users.show', 22), ], - 'Option 2: redirect location assigned to ' => [ + 'Option target: redirect location assigned to ' => [ 'request' =>(object) ['assigned_location' => 10], 'id' => 2, 'checkout_to_type' => 'location', - 'redirect_option' => 2, + 'redirect_option' => 'target', 'table' => 'Locations', 'route' => route('locations.show', 10), ], - 'Option 2: redirect back to asset assigned to ' => [ + 'Option target: redirect back to asset assigned to ' => [ 'request' =>(object) ['assigned_asset' => 101], 'id' => 3, 'checkout_to_type' => 'asset', - 'redirect_option' => 2, + 'redirect_option' => 'target', 'table' => 'Assets', 'route' => route('hardware.show', 101), ], - 'Option 1: redirect back to asset ' => [ + 'Option item: redirect back to asset ' => [ 'request' =>(object) ['assigned_asset' => null], 'id' => 999, 'checkout_to_type' => null, - 'redirect_option' => 1, + 'redirect_option' => 'item', 'table' => 'Assets', 'route' => route('hardware.show', 999), ], - 'Option 0: redirect back to index ' => [ + 'Option index: redirect back to asset index ' => [ 'request' =>(object) ['assigned_asset' => null], 'id' => null, 'checkout_to_type' => null, - 'redirect_option' => 0, + 'redirect_option' => 'index', 'table' => 'Assets', 'route' => route('hardware.index'), ], + + 'Option item: redirect back to user ' => [ + 'request' =>(object) ['assigned_asset' => null], + 'id' => 999, + 'checkout_to_type' => null, + 'redirect_option' => 'item', + 'table' => 'Users', + 'route' => route('users.show', 999), + ], + + 'Option index: redirect back to user index ' => [ + 'request' =>(object) ['assigned_asset' => null], + 'id' => null, + 'checkout_to_type' => null, + 'redirect_option' => 'index', + 'table' => 'Users', + 'route' => route('users.index'), + ], + + 'Option item: redirect back to license ' => [ + 'request' =>(object) ['assigned_asset' => null], + 'id' => 999, + 'checkout_to_type' => null, + 'redirect_option' => 'item', + 'table' => 'Licenses', + 'route' => route('licenses.show', 999), + ], + + 'Option index: redirect back to license index ' => [ + 'request' =>(object) ['assigned_asset' => null], + 'id' => null, + 'checkout_to_type' => null, + 'redirect_option' => 'index', + 'table' => 'Licenses', + 'route' => route('licenses.index'), + ], + + 'Option item: redirect back to accessory list ' => [ + 'request' =>(object) ['assigned_asset' => null], + 'id' => 999, + 'checkout_to_type' => null, + 'redirect_option' => 'item', + 'table' => 'Accessories', + 'route' => route('accessories.show', 999), + ], + + 'Option index: redirect back to accessory index ' => [ + 'request' =>(object) ['assigned_asset' => null], + 'id' => null, + 'checkout_to_type' => null, + 'redirect_option' => 'index', + 'table' => 'Accessories', + 'route' => route('accessories.index'), + ], + 'Option item: redirect back to consumable ' => [ + 'request' =>(object) ['assigned_asset' => null], + 'id' => 999, + 'checkout_to_type' => null, + 'redirect_option' => 'item', + 'table' => 'Consumables', + 'route' => route('consumables.show', 999), + ], + + 'Option index: redirect back to consumables index ' => [ + 'request' =>(object) ['assigned_asset' => null], + 'id' => null, + 'checkout_to_type' => null, + 'redirect_option' => 'index', + 'table' => 'Consumables', + 'route' => route('consumables.index'), + ], + + 'Option item: redirect back to component ' => [ + 'request' =>(object) ['assigned_asset' => null], + 'id' => 999, + 'checkout_to_type' => null, + 'redirect_option' => 'item', + 'table' => 'Components', + 'route' => route('components.show', 999), + ], + + 'Option index: redirect back to component index ' => [ + 'request' =>(object) ['assigned_asset' => null], + 'id' => null, + 'checkout_to_type' => null, + 'redirect_option' => 'index', + 'table' => 'Components', + 'route' => route('components.index'), + ], ]; foreach ($test_data as $scenario => $data ) { @@ -78,7 +167,7 @@ class HelperTest extends TestCase Session::put('redirect_option', $data['redirect_option']); Session::put('checkout_to_type', $data['checkout_to_type']); - $redirect = Helper::getRedirectOption($data['request'],$data['id'], $data['table']); + $redirect = redirect()->to(Helper::getRedirectOption($data['request'],$data['id'], $data['table'])); $this->assertInstanceOf(RedirectResponse::class, $redirect); $this->assertEquals($data['route'], $redirect->getTargetUrl(), $scenario.'failed.');