Skip to content

Commit 739980a

Browse files
authored
Merge pull request #16947 from Godmartinz/add-require-serial-to-models
Adds require serial as Asset Model option
2 parents afde594 + 2b8ea9a commit 739980a

File tree

15 files changed

+188
-10
lines changed

15 files changed

+188
-10
lines changed

app/Http/Controllers/Api/AssetModelsController.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ public function index(Request $request) : JsonResponse | array
5050
'fieldset',
5151
'deleted_at',
5252
'updated_at',
53+
'require_serial',
5354
];
5455

5556
$assetmodels = AssetModel::select([
@@ -69,6 +70,7 @@ public function index(Request $request) : JsonResponse | array
6970
'models.fieldset_id',
7071
'models.deleted_at',
7172
'models.updated_at',
73+
'models.require_serial'
7274
])
7375
->with('category', 'depreciation', 'manufacturer', 'fieldset.fields.defaultValues', 'adminuser')
7476
->withCount('assets as assets_count');

app/Http/Controllers/AssetModelsController.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ public function store(StoreAssetModelRequest $request) : RedirectResponse
8282
$model->notes = $request->input('notes');
8383
$model->created_by = auth()->id();
8484
$model->requestable = $request->has('requestable');
85+
$model->require_serial = $request->input('require_serial', 0);
8586

8687
if ($request->input('fieldset_id') != '') {
8788
$model->fieldset_id = $request->input('fieldset_id');
@@ -155,7 +156,7 @@ public function update(StoreAssetModelRequest $request, AssetModel $model) : Red
155156
$model->category_id = $request->input('category_id');
156157
$model->notes = $request->input('notes');
157158
$model->requestable = $request->input('requestable', '0');
158-
159+
$model->require_serial = $request->input('require_serial', 0);
159160
$model->fieldset_id = $request->input('fieldset_id');
160161

161162
if ($model->save()) {

app/Http/Controllers/Assets/AssetsController.php

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -110,17 +110,35 @@ public function store(ImageUploadRequest $request) : RedirectResponse
110110
// This is only necessary on create, not update, since bulk editing is handled
111111
// differently
112112
$asset_tags = $request->input('asset_tags');
113+
$model = AssetModel::find($request->input('model_id'));
114+
$serial_errors = [];
115+
$serials = $request->input('serials');
113116

114117
$settings = Setting::getSettings();
115118

119+
//Validate required serial based on model setting
120+
for ($a = 1, $aMax = count($asset_tags); $a <= $aMax; $a++) {
121+
if ($model && $model->require_serial === 1 && empty($serials[$a])) {
122+
$serial_errors["serials.$a"] = trans('admin/hardware/form.serial_required', ['number' => $a]);
123+
}
124+
125+
}
126+
127+
if (!empty($serial_errors)) {
128+
return redirect()->back()
129+
->withInput()
130+
->withErrors($serial_errors);
131+
}
132+
133+
$asset = null;
134+
$companyId = Company::getIdForCurrentUser($request->input('company_id'));
116135
$successes = [];
117136
$failures = [];
118-
$serials = $request->input('serials');
119-
$asset = null;
120137

121-
for ($a = 1; $a <= count($asset_tags); $a++) {
138+
for ($a = 1, $aMax = count($asset_tags); $a <= $aMax; $a++) {
122139
$asset = new Asset();
123-
$asset->model()->associate(AssetModel::find($request->input('model_id')));
140+
141+
$asset->model()->associate($model);
124142
$asset->name = $request->input('name');
125143

126144
// Check for a corresponding serial
@@ -132,7 +150,7 @@ public function store(ImageUploadRequest $request) : RedirectResponse
132150
$asset->asset_tag = $asset_tags[$a];
133151
}
134152

135-
$asset->company_id = Company::getIdForCurrentUser($request->input('company_id'));
153+
$asset->company_id = $companyId;
136154
$asset->model_id = $request->input('model_id');
137155
$asset->order_number = $request->input('order_number');
138156
$asset->notes = $request->input('notes');
@@ -172,7 +190,6 @@ public function store(ImageUploadRequest $request) : RedirectResponse
172190

173191
// Update custom fields in the database.
174192
// Validation for these fields is handled through the AssetRequest form request
175-
$model = AssetModel::find($request->get('model_id'));
176193

177194
if (($model) && ($model->fieldset)) {
178195
foreach ($model->fieldset->fields as $field) {
@@ -453,6 +470,13 @@ public function update(ImageUploadRequest $request, Asset $asset) : RedirectResp
453470
]);
454471

455472

473+
//Validate required serial based on model setting
474+
if ($model && $model->require_serial === 1 && empty($serial[1])) {
475+
return redirect()->to(Helper::getRedirectOption($request, $asset->id, 'Assets'))
476+
->with('warning', trans('admin/hardware/form.serial_required_post_model_update', [
477+
'asset_model' => $model->name
478+
]));
479+
}
456480
if ($asset->save()) {
457481
return Helper::getRedirectOption($request, $asset->id, 'Assets')
458482
->with('success', trans('admin/hardware/message.update.success'));

app/Http/Controllers/BulkAssetModelsController.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,9 @@ public function update(Request $request): View | RedirectResponse
9292
$update_array['min_amt'] = $request->input('min_amt');
9393
}
9494

95-
95+
if ($request->filled('require_serial')) {
96+
$update_array['require_serial'] = $request->input('require_serial');
97+
}
9698

9799
if (count($update_array) > 0) {
98100
AssetModel::whereIn('id', $models_raw_array)->update($update_array);

app/Http/Transformers/AssetModelsTransformer.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ public function transformAssetModel(AssetModel $assetmodel)
6565
'default_fieldset_values' => $default_field_values,
6666
'eol' => ($assetmodel->eol > 0) ? $assetmodel->eol.' months' : 'None',
6767
'requestable' => ($assetmodel->requestable == '1') ? true : false,
68+
'require_serial' => $assetmodel->require_serial,
6869
'notes' => Helper::parseEscapedMarkedownInline($assetmodel->notes),
6970
'created_by' => ($assetmodel->adminuser) ? [
7071
'id' => (int) $assetmodel->adminuser->id,

app/Models/AssetModel.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ class AssetModel extends SnipeModel
7171
'name',
7272
'notes',
7373
'requestable',
74+
'require_serial'
7475
];
7576

7677
use Searchable;

app/Presenters/AssetModelPresenter.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,14 @@ public static function dataTableLayout()
143143
'title' => trans('admin/hardware/general.requestable'),
144144
'formatter' => 'trueFalseFormatter',
145145
],
146+
[
147+
'field' => 'require_serial',
148+
'searchable' => false,
149+
'sortable' => true,
150+
'visible' => false,
151+
'title' => trans('admin/hardware/general.require_serial'),
152+
'formatter' => 'trueFalseFormatter',
153+
],
146154
[
147155
'field' => 'notes',
148156
'searchable' => true,

database/factories/AssetModelFactory.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public function definition()
3333
'category_id' => Category::factory(),
3434
'model_number' => $this->faker->creditCardNumber(),
3535
'notes' => 'Created by demo seeder',
36+
'require_serial' => 0,
3637

3738
];
3839
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
use Illuminate\Database\Migrations\Migration;
4+
use Illuminate\Database\Schema\Blueprint;
5+
use Illuminate\Support\Facades\Schema;
6+
7+
return new class extends Migration
8+
{
9+
/**
10+
* Run the migrations.
11+
*/
12+
public function up(): void
13+
{
14+
Schema::table('models', function (Blueprint $table) {
15+
$table->boolean( 'require_serial')->after('category_id')->default(0);
16+
});
17+
}
18+
19+
/**
20+
* Reverse the migrations.
21+
*/
22+
public function down(): void
23+
{
24+
Schema::table('models', function (Blueprint $table) {
25+
$table->dropColumn('require_serial');
26+
});
27+
}
28+
};

resources/lang/en-US/admin/hardware/form.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@
4444
'redirect_to_checked_out_to' => 'Go to Checked Out to',
4545
'select_statustype' => 'Select Status Type',
4646
'serial' => 'Serial',
47+
'serial_required' => 'Asset :number requires a serial number',
48+
'serial_required_post_model_update' => ':asset_model have been updated to require a serial number. Please add a serial number for this asset.',
4749
'status' => 'Status',
4850
'tag' => 'Asset Tag',
4951
'update' => 'Asset Update',

0 commit comments

Comments
 (0)