Skip to content

Commit 665c13e

Browse files
authored
Merge pull request #17957 from marcusmoore/fixes/17956-handle-force-deleted-model-in-asset-edit
Fixed #17956 - handle accessing deleted model during asset update
2 parents 3693241 + 8a667b2 commit 665c13e

File tree

3 files changed

+32
-4
lines changed

3 files changed

+32
-4
lines changed

app/Http/Controllers/Assets/AssetsController.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,7 @@ public function update(ImageUploadRequest $request, Asset $asset) : RedirectResp
363363
$asset->purchase_cost = $request->input('purchase_cost', null);
364364
$asset->purchase_date = $request->input('purchase_date', null);
365365
$asset->next_audit_date = $request->input('next_audit_date', null);
366-
if ($request->filled('purchase_date') && !$request->filled('asset_eol_date') && ($asset->model->eol > 0)) {
366+
if ($request->filled('purchase_date') && !$request->filled('asset_eol_date') && ($asset->model?->eol > 0)) {
367367
$asset->purchase_date = $request->input('purchase_date', null);
368368
$asset->asset_eol_date = Carbon::parse($request->input('purchase_date'))->addMonths($asset->model->eol)->format('Y-m-d');
369369
$asset->eol_explicit = false;
@@ -379,7 +379,7 @@ public function update(ImageUploadRequest $request, Asset $asset) : RedirectResp
379379
} else {
380380
$asset->eol_explicit = true;
381381
}
382-
} elseif (!$request->filled('asset_eol_date') && (($asset->model->eol) == 0)) {
382+
} elseif (!$request->filled('asset_eol_date') && (($asset->model?->eol) == 0)) {
383383
$asset->asset_eol_date = null;
384384
$asset->eol_explicit = false;
385385
}

app/Observers/AssetObserver.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ public function restoring(Asset $asset)
168168
public function saving(Asset $asset)
169169
{
170170
// determine if calculated eol and then calculate it - this should only happen on a new asset
171-
if (is_null($asset->asset_eol_date) && !is_null($asset->purchase_date) && ($asset->model->eol > 0)){
171+
if (is_null($asset->asset_eol_date) && !is_null($asset->purchase_date) && ($asset->model?->eol > 0)) {
172172
$asset->asset_eol_date = $asset->purchase_date->addMonths($asset->model->eol)->format('Y-m-d');
173173
$asset->eol_explicit = false;
174174
}
@@ -184,9 +184,9 @@ public function saving(Asset $asset)
184184
} elseif (!is_null($asset->asset_eol_date) && is_null($asset->purchase_date)) {
185185
$asset->eol_explicit = true;
186186
}
187+
187188
if ((!is_null($asset->asset_eol_date)) && (!is_null($asset->purchase_date)) && (is_null($asset->model?->eol) || ($asset->model?->eol == 0))) {
188189
$asset->eol_explicit = true;
189190
}
190-
191191
}
192192
}

tests/Feature/Assets/Ui/EditAssetTest.php

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,4 +125,32 @@ public function testCurrentLocationIsNotUpdatedOnEdit()
125125
$this->assertEquals($currentLocation->id, $asset->location_id);
126126
}
127127

128+
129+
public function test_handles_model_being_deleted()
130+
{
131+
$this->withoutExceptionHandling();
132+
133+
$newStatus = StatusLabel::factory()->create();
134+
135+
$asset = Asset::factory()->create();
136+
137+
$asset->model()->forceDelete();
138+
139+
$this->actingAs(User::factory()->viewAssets()->editAssets()->create())
140+
->from(route('hardware.edit', $asset))
141+
->put(route('hardware.update', $asset), [
142+
'redirect_option' => 'index',
143+
'purchase_date' => '2025-08-30',
144+
'name' => 'New name',
145+
'asset_tags' => 'New Asset Tag',
146+
'status_id' => $newStatus->id,
147+
// triggers potential issue in AssetObserver's saving method
148+
'model_id' => AssetModel::factory()->create()->id,
149+
]);
150+
151+
$this->assertDatabaseHas('assets', [
152+
'id' => $asset->id,
153+
'status_id' => $newStatus->id,
154+
]);
155+
}
128156
}

0 commit comments

Comments
 (0)