From 0b1be3e63b641f20e0016854c0acb3c5978172fd Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Mon, 12 May 2025 11:44:34 -0700 Subject: [PATCH 01/14] add migration, model and controller update --- .../Controllers/AssetModelsController.php | 3 +- app/Http/Controllers/LabelsController.php | 2 +- app/Models/AssetModel.php | 1 + ...03_add_req_serial_bool_to_models_table.php | 28 +++++++++++++++++++ 4 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 database/migrations/2025_05_12_183803_add_req_serial_bool_to_models_table.php diff --git a/app/Http/Controllers/AssetModelsController.php b/app/Http/Controllers/AssetModelsController.php index 0795588776..1e387f149b 100755 --- a/app/Http/Controllers/AssetModelsController.php +++ b/app/Http/Controllers/AssetModelsController.php @@ -82,6 +82,7 @@ class AssetModelsController extends Controller $model->notes = $request->input('notes'); $model->created_by = auth()->id(); $model->requestable = $request->has('requestable'); + $model->require_serial = $request->has('require_serial'); if ($request->input('fieldset_id') != '') { $model->fieldset_id = $request->input('fieldset_id'); @@ -142,7 +143,7 @@ class AssetModelsController extends Controller $model->category_id = $request->input('category_id'); $model->notes = $request->input('notes'); $model->requestable = $request->input('requestable', '0'); - + $model->require_serial = $request->has('require_serial'); $model->fieldset_id = $request->input('fieldset_id'); if ($model->save()) { diff --git a/app/Http/Controllers/LabelsController.php b/app/Http/Controllers/LabelsController.php index ce5bf7d249..ed1574b77c 100755 --- a/app/Http/Controllers/LabelsController.php +++ b/app/Http/Controllers/LabelsController.php @@ -32,7 +32,7 @@ class LabelsController extends Controller $exampleAsset->id = 999999; $exampleAsset->name = 'JEN-867-5309'; - $exampleAsset->asset_tag = '100001'; + $exampleAsset->asset_tag = 'Inet Workstation (13th Gen)'; $exampleAsset->serial = 'SN9876543210'; $exampleAsset->asset_eol_date = '2025-01-01'; $exampleAsset->order_number = '12345'; diff --git a/app/Models/AssetModel.php b/app/Models/AssetModel.php index 8d60474b96..fc32e8a60f 100755 --- a/app/Models/AssetModel.php +++ b/app/Models/AssetModel.php @@ -69,6 +69,7 @@ class AssetModel extends SnipeModel 'name', 'notes', 'requestable', + 'req_serial' ]; use Searchable; diff --git a/database/migrations/2025_05_12_183803_add_req_serial_bool_to_models_table.php b/database/migrations/2025_05_12_183803_add_req_serial_bool_to_models_table.php new file mode 100644 index 0000000000..8288d25d95 --- /dev/null +++ b/database/migrations/2025_05_12_183803_add_req_serial_bool_to_models_table.php @@ -0,0 +1,28 @@ +boolean( 'require_serial')->after('category_id')->default(false); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('models', function (Blueprint $table) { + $table->dropColumn('require_serial'); + }); + } +}; From b48f309ab63bba0304c9f63e25fa088f5d2a1e80 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Tue, 13 May 2025 10:58:05 -0700 Subject: [PATCH 02/14] add require_serial to bulk asset model blades and lang --- .../Controllers/BulkAssetModelsController.php | 4 +++- .../lang/en-US/admin/hardware/general.php | 2 ++ resources/views/models/bulk-edit.blade.php | 20 +++++++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/BulkAssetModelsController.php b/app/Http/Controllers/BulkAssetModelsController.php index 5f64ea0838..c1ecf309fb 100644 --- a/app/Http/Controllers/BulkAssetModelsController.php +++ b/app/Http/Controllers/BulkAssetModelsController.php @@ -92,7 +92,9 @@ class BulkAssetModelsController extends Controller $update_array['min_amt'] = $request->input('min_amt'); } - + if ($request->filled('require_serial')) { + $update_array['require_serial'] = $request->input('require_serial'); + } if (count($update_array) > 0) { AssetModel::whereIn('id', $models_raw_array)->update($update_array); diff --git a/resources/lang/en-US/admin/hardware/general.php b/resources/lang/en-US/admin/hardware/general.php index 6740476574..85d6d19480 100644 --- a/resources/lang/en-US/admin/hardware/general.php +++ b/resources/lang/en-US/admin/hardware/general.php @@ -21,6 +21,8 @@ return [ 'requested' => 'Requested', 'not_requestable' => 'Not Requestable', 'requestable_status_warning' => 'Do not change requestable status', + 'require_serial' => 'Require Serial Number', + 'require_serial_help' => 'A serial number will be required when creating an asset of this model.', 'restore' => 'Restore Asset', 'pending' => 'Pending', 'undeployable' => 'Undeployable', diff --git a/resources/views/models/bulk-edit.blade.php b/resources/views/models/bulk-edit.blade.php index 8131a470bc..2e8d4925b4 100644 --- a/resources/views/models/bulk-edit.blade.php +++ b/resources/views/models/bulk-edit.blade.php @@ -91,7 +91,27 @@ @include ('partials.forms.edit.minimum_quantity') + +
+ + +
From f2bca9491cd6f43085609e184b9303bd9917f104 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Tue, 13 May 2025 10:59:02 -0700 Subject: [PATCH 03/14] changed name of field in model fillable --- app/Models/AssetModel.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Models/AssetModel.php b/app/Models/AssetModel.php index fc32e8a60f..cd1376c475 100755 --- a/app/Models/AssetModel.php +++ b/app/Models/AssetModel.php @@ -69,7 +69,7 @@ class AssetModel extends SnipeModel 'name', 'notes', 'requestable', - 'req_serial' + 'require_serial' ]; use Searchable; From fcbfbca6d01666909c3202ecd07891950da81f88 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Tue, 13 May 2025 11:10:46 -0700 Subject: [PATCH 04/14] add checkbox to model edit and create --- .../Controllers/AssetModelsController.php | 4 ++-- .../lang/en-US/admin/hardware/general.php | 2 +- resources/views/models/edit.blade.php | 21 +++++++++++++++++++ 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/AssetModelsController.php b/app/Http/Controllers/AssetModelsController.php index 1e387f149b..e99641d68a 100755 --- a/app/Http/Controllers/AssetModelsController.php +++ b/app/Http/Controllers/AssetModelsController.php @@ -82,7 +82,7 @@ class AssetModelsController extends Controller $model->notes = $request->input('notes'); $model->created_by = auth()->id(); $model->requestable = $request->has('requestable'); - $model->require_serial = $request->has('require_serial'); + $model->require_serial = $request->input('require_serial'); if ($request->input('fieldset_id') != '') { $model->fieldset_id = $request->input('fieldset_id'); @@ -143,7 +143,7 @@ class AssetModelsController extends Controller $model->category_id = $request->input('category_id'); $model->notes = $request->input('notes'); $model->requestable = $request->input('requestable', '0'); - $model->require_serial = $request->has('require_serial'); + $model->require_serial = $request->input('require_serial'); $model->fieldset_id = $request->input('fieldset_id'); if ($model->save()) { diff --git a/resources/lang/en-US/admin/hardware/general.php b/resources/lang/en-US/admin/hardware/general.php index 85d6d19480..235e1a3dc5 100644 --- a/resources/lang/en-US/admin/hardware/general.php +++ b/resources/lang/en-US/admin/hardware/general.php @@ -22,7 +22,7 @@ return [ 'not_requestable' => 'Not Requestable', 'requestable_status_warning' => 'Do not change requestable status', 'require_serial' => 'Require Serial Number', - 'require_serial_help' => 'A serial number will be required when creating an asset of this model.', + 'require_serial_help' => 'A serial number will be required when creating a new asset of this model.', 'restore' => 'Restore Asset', 'pending' => 'Pending', 'undeployable' => 'Undeployable', diff --git a/resources/views/models/edit.blade.php b/resources/views/models/edit.blade.php index 9c72107ef8..6bc187a1b3 100755 --- a/resources/views/models/edit.blade.php +++ b/resources/views/models/edit.blade.php @@ -17,6 +17,27 @@ @include ('partials.forms.edit.depreciation') @include ('partials.forms.edit.minimum_quantity') + +
+ + +
+
+ require_serial)) id="require_serial" aria-label="require_serial" /> + + + {{ trans('admin/hardware/general.require_serial_help') }} + +
+
+
From 7fd93645b3928a7889ca8a12ea9a2bec7654655a Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Tue, 13 May 2025 12:17:58 -0700 Subject: [PATCH 05/14] valdiation fires for asset creation --- app/Http/Controllers/Assets/AssetsController.php | 11 ++++++++++- resources/lang/en-US/admin/hardware/form.php | 1 + resources/views/partials/forms/edit/serial.blade.php | 6 +++++- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Assets/AssetsController.php b/app/Http/Controllers/Assets/AssetsController.php index 12cb93ff3e..35cfade51e 100755 --- a/app/Http/Controllers/Assets/AssetsController.php +++ b/app/Http/Controllers/Assets/AssetsController.php @@ -120,9 +120,18 @@ class AssetsController extends Controller for ($a = 1; $a <= count($asset_tags); $a++) { $asset = new Asset(); - $asset->model()->associate(AssetModel::find($request->input('model_id'))); + $model = AssetModel::find($request->input('model_id')); + $asset->model()->associate($model); $asset->name = $request->input('name'); + //Validate required serial based on model setting + if ($model && $model->require_serial === 1 && empty($serials[$a] ?? null)) { + return redirect()->back() + ->withInput() + ->withErrors([ + "serials.$a" => trans('admin/hardware/form.serial_required'), + ]); + } // Check for a corresponding serial if (($serials) && (array_key_exists($a, $serials))) { $asset->serial = $serials[$a]; diff --git a/resources/lang/en-US/admin/hardware/form.php b/resources/lang/en-US/admin/hardware/form.php index 8fbd0b4e87..b741e1ba1a 100644 --- a/resources/lang/en-US/admin/hardware/form.php +++ b/resources/lang/en-US/admin/hardware/form.php @@ -44,6 +44,7 @@ return [ 'redirect_to_checked_out_to' => 'Go to Checked Out to', 'select_statustype' => 'Select Status Type', 'serial' => 'Serial', + 'serial_required' => 'This asset model requires a serial number', 'status' => 'Status', 'tag' => 'Asset Tag', 'update' => 'Asset Update', diff --git a/resources/views/partials/forms/edit/serial.blade.php b/resources/views/partials/forms/edit/serial.blade.php index 636204a564..4ed4ad66a1 100644 --- a/resources/views/partials/forms/edit/serial.blade.php +++ b/resources/views/partials/forms/edit/serial.blade.php @@ -3,6 +3,10 @@
- {!! $errors->first('serial', '') !!} + @error($old_val_name ?? $fieldname) + + @enderror
From 720a4bc4a248a6372a0d3bc5b91c9c25ab32dd2e Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Tue, 13 May 2025 12:54:28 -0700 Subject: [PATCH 06/14] add warning to update method for missing a serial --- app/Http/Controllers/Assets/AssetsController.php | 7 +++++++ resources/lang/en-US/admin/hardware/form.php | 1 + 2 files changed, 8 insertions(+) diff --git a/app/Http/Controllers/Assets/AssetsController.php b/app/Http/Controllers/Assets/AssetsController.php index 35cfade51e..da59fdb1a1 100755 --- a/app/Http/Controllers/Assets/AssetsController.php +++ b/app/Http/Controllers/Assets/AssetsController.php @@ -422,6 +422,13 @@ class AssetsController extends Controller session()->put(['redirect_option' => $request->get('redirect_option'), 'checkout_to_type' => $request->get('checkout_to_type')]); + //Validate required serial based on model setting + if ($model && $model->require_serial === 1 && empty($serial[1] ?? null)) { + return redirect()->to(Helper::getRedirectOption($request, $asset->id, 'Assets')) + ->with('warning', trans('admin/hardware/form.serial_required_post_model_update', [ + 'asset_model' => $model->name + ])); + } if ($asset->save()) { return redirect()->to(Helper::getRedirectOption($request, $asset->id, 'Assets')) ->with('success', trans('admin/hardware/message.update.success')); diff --git a/resources/lang/en-US/admin/hardware/form.php b/resources/lang/en-US/admin/hardware/form.php index b741e1ba1a..0516ecbc18 100644 --- a/resources/lang/en-US/admin/hardware/form.php +++ b/resources/lang/en-US/admin/hardware/form.php @@ -45,6 +45,7 @@ return [ 'select_statustype' => 'Select Status Type', 'serial' => 'Serial', 'serial_required' => 'This asset model requires a serial number', + 'serial_required_post_model_update' => ':asset_model have been updated to require a serial number. Please add a serial number for this asset.', 'status' => 'Status', 'tag' => 'Asset Tag', 'update' => 'Asset Update', From 8c0281bf70387e4373f414bb389ab7121a112138 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Wed, 14 May 2025 12:31:27 -0700 Subject: [PATCH 07/14] adds tests for requiring serial to asset model --- tests/Feature/Assets/Ui/StoreAssetsTest.php | 61 +++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/tests/Feature/Assets/Ui/StoreAssetsTest.php b/tests/Feature/Assets/Ui/StoreAssetsTest.php index 8abea545cf..baa9babcc0 100644 --- a/tests/Feature/Assets/Ui/StoreAssetsTest.php +++ b/tests/Feature/Assets/Ui/StoreAssetsTest.php @@ -2,6 +2,8 @@ namespace Tests\Feature\Assets\Ui; +use App\Models\Asset; +use App\Models\AssetModel; use App\Models\User; use Tests\TestCase; @@ -13,4 +15,63 @@ class StoreAssetsTest extends TestCase ->get(route('hardware.create')) ->assertOk(); } + + public function testAssetCanBeStoredWithSerialRequiredAndSerialProvided() + { + $user = User::factory()->superuser()->create(); + $this->actingAs($user); + + $model = AssetModel::factory()->create([ + 'require_serial' => 1, + ]); + + $response = $this->post(route('hardware.store'), [ + 'model_id' => $model->id, + 'serials' => [1 => 'ABC123'], + 'asset_tags' =>[1 => '1234'], + 'status_id' => 1, + // other required fields... + ]); + + $response->assertRedirect(); + $response->assertSessionHas('success-unescaped'); + $this->assertNotEquals( + trans('admin/hardware/form.serial_required'), + session('error') + ); + $this->assertDatabaseHas('assets', [ + 'model_id' => $model->id, + 'serial' => 'ABC123', + 'asset_tag' => '1234', + ]); + + + } + + public function testAssetCannotBeStoredIfSerialRequiredAndMissing() + { + $user = User::factory()->superuser()->create(); + $this->actingAs($user); + + $model = AssetModel::factory()->create([ + 'require_serial' => 1, + ]); + + $response = $this->post(route('hardware.store'), [ + 'model_id' => $model->id, + 'serials' => [], // ← serial missing + 'asset_tags' => [1 => '1234'], + 'status_id' => 1, + ]); + + $response->assertRedirect(); + $response->assertSessionHasErrors(['serials.1']); + + $this->assertDatabaseMissing('assets', [ + 'model_id' => $model->id, + 'asset_tag' => '1234', + ]); + + $response->assertSessionMissing('success-unescaped'); + } } From c22efc2c3db08cddac74709b42bbdf57afbc0af7 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Wed, 14 May 2025 12:55:41 -0700 Subject: [PATCH 08/14] add to present and transformer and api --- app/Http/Controllers/Api/AssetModelsController.php | 2 ++ app/Http/Transformers/AssetModelsTransformer.php | 1 + app/Presenters/AssetModelPresenter.php | 8 ++++++++ 3 files changed, 11 insertions(+) diff --git a/app/Http/Controllers/Api/AssetModelsController.php b/app/Http/Controllers/Api/AssetModelsController.php index 954da30870..ad1ddf6543 100644 --- a/app/Http/Controllers/Api/AssetModelsController.php +++ b/app/Http/Controllers/Api/AssetModelsController.php @@ -50,6 +50,7 @@ class AssetModelsController extends Controller 'fieldset', 'deleted_at', 'updated_at', + 'require_serial', ]; $assetmodels = AssetModel::select([ @@ -69,6 +70,7 @@ class AssetModelsController extends Controller 'models.fieldset_id', 'models.deleted_at', 'models.updated_at', + 'models.require_serial' ]) ->with('category', 'depreciation', 'manufacturer', 'fieldset.fields.defaultValues', 'adminuser') ->withCount('assets as assets_count'); diff --git a/app/Http/Transformers/AssetModelsTransformer.php b/app/Http/Transformers/AssetModelsTransformer.php index 2d47ca47db..9c21d72422 100644 --- a/app/Http/Transformers/AssetModelsTransformer.php +++ b/app/Http/Transformers/AssetModelsTransformer.php @@ -65,6 +65,7 @@ class AssetModelsTransformer 'default_fieldset_values' => $default_field_values, 'eol' => ($assetmodel->eol > 0) ? $assetmodel->eol.' months' : 'None', 'requestable' => ($assetmodel->requestable == '1') ? true : false, + 'require_serial' => $assetmodel->require_serial, 'notes' => Helper::parseEscapedMarkedownInline($assetmodel->notes), 'created_by' => ($assetmodel->adminuser) ? [ 'id' => (int) $assetmodel->adminuser->id, diff --git a/app/Presenters/AssetModelPresenter.php b/app/Presenters/AssetModelPresenter.php index 2ed019eaea..601a59fabe 100644 --- a/app/Presenters/AssetModelPresenter.php +++ b/app/Presenters/AssetModelPresenter.php @@ -142,6 +142,14 @@ class AssetModelPresenter extends Presenter 'title' => trans('admin/hardware/general.requestable'), 'formatter' => 'trueFalseFormatter', ], + [ + 'field' => 'require_serial', + 'searchable' => false, + 'sortable' => true, + 'visible' => false, + 'title' => trans('admin/hardware/general.require_serial'), + 'formatter' => 'trueFalseFormatter', + ], [ 'field' => 'notes', 'searchable' => true, From 3fbbff5a4733d81ac0355aed9dd8e71f2dc369f4 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Wed, 14 May 2025 12:57:01 -0700 Subject: [PATCH 09/14] revert unnecessary change to laels --- app/Http/Controllers/LabelsController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/LabelsController.php b/app/Http/Controllers/LabelsController.php index ed1574b77c..ce5bf7d249 100755 --- a/app/Http/Controllers/LabelsController.php +++ b/app/Http/Controllers/LabelsController.php @@ -32,7 +32,7 @@ class LabelsController extends Controller $exampleAsset->id = 999999; $exampleAsset->name = 'JEN-867-5309'; - $exampleAsset->asset_tag = 'Inet Workstation (13th Gen)'; + $exampleAsset->asset_tag = '100001'; $exampleAsset->serial = 'SN9876543210'; $exampleAsset->asset_eol_date = '2025-01-01'; $exampleAsset->order_number = '12345'; From 9200de5032a368dc5abdb9d3c1a9a9271449a436 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Mon, 19 May 2025 09:58:37 -0700 Subject: [PATCH 10/14] made require_serial column nullable --- .../2025_05_12_183803_add_req_serial_bool_to_models_table.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/migrations/2025_05_12_183803_add_req_serial_bool_to_models_table.php b/database/migrations/2025_05_12_183803_add_req_serial_bool_to_models_table.php index 8288d25d95..58a57a871a 100644 --- a/database/migrations/2025_05_12_183803_add_req_serial_bool_to_models_table.php +++ b/database/migrations/2025_05_12_183803_add_req_serial_bool_to_models_table.php @@ -12,7 +12,7 @@ return new class extends Migration public function up(): void { Schema::table('models', function (Blueprint $table) { - $table->boolean( 'require_serial')->after('category_id')->default(false); + $table->boolean( 'require_serial')->after('category_id')->default(0)->nullable(); }); } From d45bd67cae267727690bc25f97a9526592a2e9f2 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Tue, 20 May 2025 09:51:02 -0700 Subject: [PATCH 11/14] added corrections --- app/Http/Controllers/AssetModelsController.php | 4 ++-- app/Http/Controllers/Assets/AssetsController.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/AssetModelsController.php b/app/Http/Controllers/AssetModelsController.php index e99641d68a..0bbe19bdc6 100755 --- a/app/Http/Controllers/AssetModelsController.php +++ b/app/Http/Controllers/AssetModelsController.php @@ -82,7 +82,7 @@ class AssetModelsController extends Controller $model->notes = $request->input('notes'); $model->created_by = auth()->id(); $model->requestable = $request->has('requestable'); - $model->require_serial = $request->input('require_serial'); + $model->require_serial = $request->input('require_serial', 0); if ($request->input('fieldset_id') != '') { $model->fieldset_id = $request->input('fieldset_id'); @@ -143,7 +143,7 @@ class AssetModelsController extends Controller $model->category_id = $request->input('category_id'); $model->notes = $request->input('notes'); $model->requestable = $request->input('requestable', '0'); - $model->require_serial = $request->input('require_serial'); + $model->require_serial = $request->input('require_serial', 0); $model->fieldset_id = $request->input('fieldset_id'); if ($model->save()) { diff --git a/app/Http/Controllers/Assets/AssetsController.php b/app/Http/Controllers/Assets/AssetsController.php index da59fdb1a1..dd369f07b8 100755 --- a/app/Http/Controllers/Assets/AssetsController.php +++ b/app/Http/Controllers/Assets/AssetsController.php @@ -125,7 +125,7 @@ class AssetsController extends Controller $asset->name = $request->input('name'); //Validate required serial based on model setting - if ($model && $model->require_serial === 1 && empty($serials[$a] ?? null)) { + if ($model && $model->require_serial === 1 && empty($serials[$a])) { return redirect()->back() ->withInput() ->withErrors([ @@ -423,7 +423,7 @@ class AssetsController extends Controller session()->put(['redirect_option' => $request->get('redirect_option'), 'checkout_to_type' => $request->get('checkout_to_type')]); //Validate required serial based on model setting - if ($model && $model->require_serial === 1 && empty($serial[1] ?? null)) { + if ($model && $model->require_serial === 1 && empty($serial[1])) { return redirect()->to(Helper::getRedirectOption($request, $asset->id, 'Assets')) ->with('warning', trans('admin/hardware/form.serial_required_post_model_update', [ 'asset_model' => $model->name From 732c3dae899bab46c18bdc206f0440cd334619b8 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Tue, 20 May 2025 09:53:51 -0700 Subject: [PATCH 12/14] added require_serial to model factory --- database/factories/AssetModelFactory.php | 1 + .../2025_05_12_183803_add_req_serial_bool_to_models_table.php | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/database/factories/AssetModelFactory.php b/database/factories/AssetModelFactory.php index 3adb933e3e..ac31b57984 100644 --- a/database/factories/AssetModelFactory.php +++ b/database/factories/AssetModelFactory.php @@ -33,6 +33,7 @@ class AssetModelFactory extends Factory 'category_id' => Category::factory(), 'model_number' => $this->faker->creditCardNumber(), 'notes' => 'Created by demo seeder', + 'require_serial' => 0, ]; } diff --git a/database/migrations/2025_05_12_183803_add_req_serial_bool_to_models_table.php b/database/migrations/2025_05_12_183803_add_req_serial_bool_to_models_table.php index 58a57a871a..ee0e37a628 100644 --- a/database/migrations/2025_05_12_183803_add_req_serial_bool_to_models_table.php +++ b/database/migrations/2025_05_12_183803_add_req_serial_bool_to_models_table.php @@ -12,7 +12,7 @@ return new class extends Migration public function up(): void { Schema::table('models', function (Blueprint $table) { - $table->boolean( 'require_serial')->after('category_id')->default(0)->nullable(); + $table->boolean( 'require_serial')->after('category_id')->default(0); }); } From b0067fee510de306655e45e0c08fedb15245e281 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Tue, 20 May 2025 12:31:34 -0700 Subject: [PATCH 13/14] remove some N+1s, collect an array of missing serial errors --- .../Controllers/Assets/AssetsController.php | 36 +++++++++++-------- resources/lang/en-US/admin/hardware/form.php | 2 +- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/app/Http/Controllers/Assets/AssetsController.php b/app/Http/Controllers/Assets/AssetsController.php index dd369f07b8..7f10f6ff62 100755 --- a/app/Http/Controllers/Assets/AssetsController.php +++ b/app/Http/Controllers/Assets/AssetsController.php @@ -110,28 +110,37 @@ class AssetsController extends Controller // This is only necessary on create, not update, since bulk editing is handled // differently $asset_tags = $request->input('asset_tags'); + $model = AssetModel::find($request->input('model_id')); + $serial_errors = []; + $serials = $request->input('serials'); $settings = Setting::getSettings(); + //Validate required serial based on model setting + for ($a = 1, $aMax = count($asset_tags); $a <= $aMax; $a++) { + if ($model && $model->require_serial === 1 && empty($serials[$a])) { + $serial_errors["serials.$a"] = trans('admin/hardware/form.serial_required', ['number' => $a]); + } + + } + + if (!empty($serial_errors)) { + return redirect()->back() + ->withInput() + ->withErrors($serial_errors); + } + + $asset = null; + $companyId = Company::getIdForCurrentUser($request->input('company_id')); $successes = []; $failures = []; - $serials = $request->input('serials'); - $asset = null; - for ($a = 1; $a <= count($asset_tags); $a++) { + for ($a = 1, $aMax = count($asset_tags); $a <= $aMax; $a++) { $asset = new Asset(); - $model = AssetModel::find($request->input('model_id')); + $asset->model()->associate($model); $asset->name = $request->input('name'); - //Validate required serial based on model setting - if ($model && $model->require_serial === 1 && empty($serials[$a])) { - return redirect()->back() - ->withInput() - ->withErrors([ - "serials.$a" => trans('admin/hardware/form.serial_required'), - ]); - } // Check for a corresponding serial if (($serials) && (array_key_exists($a, $serials))) { $asset->serial = $serials[$a]; @@ -141,7 +150,7 @@ class AssetsController extends Controller $asset->asset_tag = $asset_tags[$a]; } - $asset->company_id = Company::getIdForCurrentUser($request->input('company_id')); + $asset->company_id = $companyId; $asset->model_id = $request->input('model_id'); $asset->order_number = $request->input('order_number'); $asset->notes = $request->input('notes'); @@ -173,7 +182,6 @@ class AssetsController extends Controller // 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 (($model) && ($model->fieldset)) { foreach ($model->fieldset->fields as $field) { diff --git a/resources/lang/en-US/admin/hardware/form.php b/resources/lang/en-US/admin/hardware/form.php index 0516ecbc18..dc4754e71a 100644 --- a/resources/lang/en-US/admin/hardware/form.php +++ b/resources/lang/en-US/admin/hardware/form.php @@ -44,7 +44,7 @@ return [ 'redirect_to_checked_out_to' => 'Go to Checked Out to', 'select_statustype' => 'Select Status Type', 'serial' => 'Serial', - 'serial_required' => 'This asset model requires a serial number', + 'serial_required' => 'Asset :number requires a serial number', 'serial_required_post_model_update' => ':asset_model have been updated to require a serial number. Please add a serial number for this asset.', 'status' => 'Status', 'tag' => 'Asset Tag', From 2b8ea9a233a4c26267de7c37538c9ee736bd65d7 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Mon, 7 Jul 2025 10:46:54 -0700 Subject: [PATCH 14/14] add required to input validation --- resources/views/partials/forms/edit/serial.blade.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/views/partials/forms/edit/serial.blade.php b/resources/views/partials/forms/edit/serial.blade.php index 4ed4ad66a1..057fae0eea 100644 --- a/resources/views/partials/forms/edit/serial.blade.php +++ b/resources/views/partials/forms/edit/serial.blade.php @@ -2,7 +2,7 @@
- + model && $item->model->require_serial)) ? ' required' : '' }} maxlength="191" /> @error($old_val_name ?? $fieldname)