diff --git a/app/Http/Controllers/Assets/AssetsController.php b/app/Http/Controllers/Assets/AssetsController.php index 13201c51ec81..65b64ef0daa0 100755 --- a/app/Http/Controllers/Assets/AssetsController.php +++ b/app/Http/Controllers/Assets/AssetsController.php @@ -363,7 +363,7 @@ public function update(ImageUploadRequest $request, Asset $asset) : RedirectResp $asset->purchase_cost = $request->input('purchase_cost', null); $asset->purchase_date = $request->input('purchase_date', null); $asset->next_audit_date = $request->input('next_audit_date', null); - if ($request->filled('purchase_date') && !$request->filled('asset_eol_date') && ($asset->model->eol > 0)) { + if ($request->filled('purchase_date') && !$request->filled('asset_eol_date') && ($asset->model?->eol > 0)) { $asset->purchase_date = $request->input('purchase_date', null); $asset->asset_eol_date = Carbon::parse($request->input('purchase_date'))->addMonths($asset->model->eol)->format('Y-m-d'); $asset->eol_explicit = false; @@ -379,7 +379,7 @@ public function update(ImageUploadRequest $request, Asset $asset) : RedirectResp } else { $asset->eol_explicit = true; } - } elseif (!$request->filled('asset_eol_date') && (($asset->model->eol) == 0)) { + } elseif (!$request->filled('asset_eol_date') && (($asset->model?->eol) == 0)) { $asset->asset_eol_date = null; $asset->eol_explicit = false; } diff --git a/app/Observers/AssetObserver.php b/app/Observers/AssetObserver.php index dda03f2a635e..adb9292dc162 100644 --- a/app/Observers/AssetObserver.php +++ b/app/Observers/AssetObserver.php @@ -168,7 +168,7 @@ public function restoring(Asset $asset) public function saving(Asset $asset) { // determine if calculated eol and then calculate it - this should only happen on a new asset - if (is_null($asset->asset_eol_date) && !is_null($asset->purchase_date) && ($asset->model->eol > 0)){ + if (is_null($asset->asset_eol_date) && !is_null($asset->purchase_date) && ($asset->model?->eol > 0)) { $asset->asset_eol_date = $asset->purchase_date->addMonths($asset->model->eol)->format('Y-m-d'); $asset->eol_explicit = false; } @@ -184,9 +184,9 @@ public function saving(Asset $asset) } elseif (!is_null($asset->asset_eol_date) && is_null($asset->purchase_date)) { $asset->eol_explicit = true; } + if ((!is_null($asset->asset_eol_date)) && (!is_null($asset->purchase_date)) && (is_null($asset->model?->eol) || ($asset->model?->eol == 0))) { $asset->eol_explicit = true; } - } } diff --git a/tests/Feature/Assets/Ui/EditAssetTest.php b/tests/Feature/Assets/Ui/EditAssetTest.php index a2645f732057..0fe29c6936cd 100644 --- a/tests/Feature/Assets/Ui/EditAssetTest.php +++ b/tests/Feature/Assets/Ui/EditAssetTest.php @@ -125,4 +125,32 @@ public function testCurrentLocationIsNotUpdatedOnEdit() $this->assertEquals($currentLocation->id, $asset->location_id); } + + public function test_handles_model_being_deleted() + { + $this->withoutExceptionHandling(); + + $newStatus = StatusLabel::factory()->create(); + + $asset = Asset::factory()->create(); + + $asset->model()->forceDelete(); + + $this->actingAs(User::factory()->viewAssets()->editAssets()->create()) + ->from(route('hardware.edit', $asset)) + ->put(route('hardware.update', $asset), [ + 'redirect_option' => 'index', + 'purchase_date' => '2025-08-30', + 'name' => 'New name', + 'asset_tags' => 'New Asset Tag', + 'status_id' => $newStatus->id, + // triggers potential issue in AssetObserver's saving method + 'model_id' => AssetModel::factory()->create()->id, + ]); + + $this->assertDatabaseHas('assets', [ + 'id' => $asset->id, + 'status_id' => $newStatus->id, + ]); + } }