From cc7dcc6e81ea01dfcb4b556305760153c2254d8e Mon Sep 17 00:00:00 2001 From: snipe Date: Sat, 14 Jun 2025 13:39:18 +0100 Subject: [PATCH 01/13] Disallow multiple on editing a maintenance Signed-off-by: snipe --- .../AssetMaintenancesController.php | 16 +++------- app/Models/AssetMaintenance.php | 14 +++++++++ .../views/asset_maintenances/edit.blade.php | 31 +++++++++++++------ .../forms/edit/asset-select.blade.php | 2 +- 4 files changed, 41 insertions(+), 22 deletions(-) diff --git a/app/Http/Controllers/AssetMaintenancesController.php b/app/Http/Controllers/AssetMaintenancesController.php index 184014b76e..a076c6b5d3 100644 --- a/app/Http/Controllers/AssetMaintenancesController.php +++ b/app/Http/Controllers/AssetMaintenancesController.php @@ -133,26 +133,18 @@ class AssetMaintenancesController extends Controller * * @see AssetMaintenancesController::postEdit() method that stores the data * @author Vincent Sposato - * @param int $assetMaintenanceId * @version v1.0 * @since [v1.8] */ public function edit(AssetMaintenance $maintenance) : View | RedirectResponse { $this->authorize('update', Asset::class); - if ((!$maintenance->asset) || ($maintenance->asset->deleted_at!='')) { - return redirect()->route('maintenances.index')->with('error', 'asset does not exist'); - } elseif (! Company::isCurrentUserHasAccess($maintenance->asset)) { - return static::getInsufficientPermissionsRedirect(); - } - - // Prepare Improvement Type List - $assetMaintenanceType = ['' => trans('general.select')] + AssetMaintenance::getImprovementOptions(); return view('asset_maintenances/edit') - ->with('selectedAsset', null) - ->with('assetMaintenanceType', $assetMaintenanceType) - ->with('item', $maintenance); + ->with('selected_assets', $maintenance->asset->pluck('id')->toArray()) + ->with('asset_ids', request()->input('asset_ids', [])) + ->with('assetMaintenanceType', AssetMaintenance::getImprovementOptions()) + ->with('item', $maintenance); } /** diff --git a/app/Models/AssetMaintenance.php b/app/Models/AssetMaintenance.php index d08e04a76c..438801c246 100644 --- a/app/Models/AssetMaintenance.php +++ b/app/Models/AssetMaintenance.php @@ -167,6 +167,20 @@ class AssetMaintenance extends Model implements ICompanyableChild ->withTrashed(); } + /** + * asset + * Get asset for this improvement + * + * @return mixed + * @author Vincent Sposato + * @version v1.0 + */ + public function assets() + { + return $this->hasMany(Asset::class, 'asset_id') + ->withTrashed(); + } + /** * Get the admin who created the maintenance * diff --git a/resources/views/asset_maintenances/edit.blade.php b/resources/views/asset_maintenances/edit.blade.php index c284e57e5a..f13029f430 100644 --- a/resources/views/asset_maintenances/edit.blade.php +++ b/resources/views/asset_maintenances/edit.blade.php @@ -53,17 +53,30 @@ + + @if (!$item->id) + @include ('partials.forms.edit.asset-select', [ + 'translated_name' => trans('general.assets'), + 'fieldname' => 'selected_assets[]', + 'multiple' => true, + 'required' => true, + 'select_id' => 'assigned_assets_select', + 'asset_selector_div_id' => 'assets_for_maintenance_div', + 'asset_ids' => $item->id ? $item->asset()->pluck('id')->toArray() : old('selected_assets'), + 'asset_id' => $item->id ? $item->asset()->pluck('id')->toArray() : null + ]) + @else + +
+

+ {{ $item->asset() ? $item->asset->present()->fullName : '' }} +

+
- @include ('partials.forms.edit.asset-select', [ - 'translated_name' => trans('general.assets'), - 'fieldname' => 'selected_assets[]', - 'multiple' => true, - 'required' => true, - 'select_id' => 'assigned_assets_select', - 'asset_selector_div_id' => 'assets_to_checkout_div', - 'asset_ids' => old('selected_assets') - ]) + @endif @include ('partials.forms.edit.maintenance_type') diff --git a/resources/views/partials/forms/edit/asset-select.blade.php b/resources/views/partials/forms/edit/asset-select.blade.php index b793bfbed5..9b7caa85f1 100644 --- a/resources/views/partials/forms/edit/asset-select.blade.php +++ b/resources/views/partials/forms/edit/asset-select.blade.php @@ -10,7 +10,7 @@ name="{{ $fieldname }}" style="width: 100%" id="{{ (isset($select_id)) ? $select_id : 'assigned_asset_select' }}" - {{ (isset($multiple)) ? ' multiple' : '' }} + {{ ((isset($multiple)) && ($multiple === true)) ? ' multiple' : '' }} {!! (!empty($asset_status_type)) ? ' data-asset-status-type="' . $asset_status_type . '"' : '' !!} {!! (!empty($company_id)) ? ' data-company-id="' .$company_id.'"' : '' !!} {{ ((isset($required) && ($required =='true'))) ? ' required' : '' }} From 957faa6651137b728e1f692a89ff0677fb031fc7 Mon Sep 17 00:00:00 2001 From: snipe Date: Sat, 14 Jun 2025 14:03:52 +0100 Subject: [PATCH 02/13] Fixed datepicker prepopulating with start_date Signed-off-by: snipe --- resources/views/asset_maintenances/edit.blade.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/views/asset_maintenances/edit.blade.php b/resources/views/asset_maintenances/edit.blade.php index f13029f430..ed7c113cee 100644 --- a/resources/views/asset_maintenances/edit.blade.php +++ b/resources/views/asset_maintenances/edit.blade.php @@ -107,7 +107,7 @@
From 9dd3eee65c980494879c2d821160060c2c718ddb Mon Sep 17 00:00:00 2001 From: snipe Date: Sat, 14 Jun 2025 14:04:09 +0100 Subject: [PATCH 03/13] Pull incorrect check for company scoping Signed-off-by: snipe --- .../AssetMaintenancesController.php | 29 +++++-------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/app/Http/Controllers/AssetMaintenancesController.php b/app/Http/Controllers/AssetMaintenancesController.php index a076c6b5d3..a7f5bd7a04 100644 --- a/app/Http/Controllers/AssetMaintenancesController.php +++ b/app/Http/Controllers/AssetMaintenancesController.php @@ -88,6 +88,7 @@ class AssetMaintenancesController extends Controller $assets = Asset::whereIn('id', $request->input('selected_assets'))->get(); + // Loop through the selected assets foreach ($assets as $asset) { if ((! Company::isCurrentUserHasAccess($asset)) && ($asset != null)) { return static::getInsufficientPermissionsRedirect(); @@ -160,33 +161,22 @@ class AssetMaintenancesController extends Controller public function update(Request $request, AssetMaintenance $maintenance) : View | RedirectResponse { $this->authorize('update', Asset::class); - - if ((!$maintenance->asset) || ($maintenance->asset->deleted_at!='')) { - return redirect()->route('maintenances.index')->with('error', 'asset does not exist'); - } elseif (! Company::isCurrentUserHasAccess($maintenance->asset)) { - return static::getInsufficientPermissionsRedirect(); - } + $asset = Asset::find(request('asset_id')); + $this->authorize('update', $asset); $maintenance->supplier_id = $request->input('supplier_id'); - $maintenance->is_warranty = $request->input('is_warranty'); + $maintenance->is_warranty = $request->input('is_warranty', 0); $maintenance->cost = $request->input('cost'); $maintenance->notes = $request->input('notes'); - - $asset = Asset::find(request('asset_id')); - - if (! Company::isCurrentUserHasAccess($asset)) { - return static::getInsufficientPermissionsRedirect(); - } - - // Save the asset maintenance data - $maintenance->asset_id = $request->input('asset_id'); $maintenance->asset_maintenance_type = $request->input('asset_maintenance_type'); $maintenance->title = $request->input('title'); $maintenance->start_date = $request->input('start_date'); $maintenance->completion_date = $request->input('completion_date'); - if (($maintenance->completion_date == null) - ) { + + // Todo - put this in a getter/setter? + if (($maintenance->completion_date == null)) + { if (($maintenance->asset_maintenance_time !== 0) || (! is_null($maintenance->asset_maintenance_time)) ) { @@ -203,10 +193,7 @@ class AssetMaintenancesController extends Controller $maintenance->asset_maintenance_time = (int) $completionDate->diffInDays($startDate, true); } - // Was the asset maintenance created? if ($maintenance->save()) { - - // Redirect to the new asset maintenance page return redirect()->route('maintenances.index') ->with('success', trans('admin/asset_maintenances/message.edit.success')); } From 970ff25e5e5389f33e1aee6be4e5c10f9d2e145a Mon Sep 17 00:00:00 2001 From: snipe Date: Sat, 14 Jun 2025 14:30:27 +0100 Subject: [PATCH 04/13] Added model and company to manufacturer view Signed-off-by: snipe --- .../views/asset_maintenances/view.blade.php | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/resources/views/asset_maintenances/view.blade.php b/resources/views/asset_maintenances/view.blade.php index 91165b3834..231e2bde16 100644 --- a/resources/views/asset_maintenances/view.blade.php +++ b/resources/views/asset_maintenances/view.blade.php @@ -49,6 +49,31 @@ use Carbon\Carbon;
+ @if ($assetMaintenance->asset->model) +
+
+ {{ trans('general.asset_model') }} +
+ +
+ @endif + + @if ($assetMaintenance->asset->company) +
+
+ {{ trans('general.company') }} +
+ +
+ @endif @if ($assetMaintenance->supplier) From b264fde165798eda39a91e09df2acd383f27a830 Mon Sep 17 00:00:00 2001 From: snipe Date: Sat, 14 Jun 2025 14:30:43 +0100 Subject: [PATCH 05/13] =?UTF-8?q?Show=20title=20if=20it=E2=80=99s=20an=20e?= =?UTF-8?q?dit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: snipe --- .../views/asset_maintenances/edit.blade.php | 35 ++++++++++++++----- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/resources/views/asset_maintenances/edit.blade.php b/resources/views/asset_maintenances/edit.blade.php index ed7c113cee..2c45d8ee31 100644 --- a/resources/views/asset_maintenances/edit.blade.php +++ b/resources/views/asset_maintenances/edit.blade.php @@ -32,13 +32,14 @@ {{ csrf_field() }}
-
-

- @if ($item) - {{ $item->name }} - @endif -

-
+ + @if ($item->id) +
+

+ {{ $item->title }} +

+
+ @endif
@@ -53,8 +54,10 @@
- + @if (!$item->id) + + @include ('partials.forms.edit.asset-select', [ 'translated_name' => trans('general.assets'), 'fieldname' => 'selected_assets[]', @@ -66,13 +69,27 @@ 'asset_id' => $item->id ? $item->asset()->pluck('id')->toArray() : null ]) @else + + @if ($item->asset->company) + + +
+

+ {{ ($item->asset && $item->asset->company) ? $item->asset->company->name : '' }} +

+
+ @endif + +

- {{ $item->asset() ? $item->asset->present()->fullName : '' }} + {{ $item->asset ? $item->asset->present()->fullName : '' }}

From 2d404fdadca5c443d23efe5aecbf099a64d45ec6 Mon Sep 17 00:00:00 2001 From: snipe Date: Sat, 14 Jun 2025 14:30:52 +0100 Subject: [PATCH 06/13] Fixed breadcrumbs Signed-off-by: snipe --- app/Providers/BreadcrumbsServiceProvider.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/Providers/BreadcrumbsServiceProvider.php b/app/Providers/BreadcrumbsServiceProvider.php index 52f9346b06..64430b2511 100644 --- a/app/Providers/BreadcrumbsServiceProvider.php +++ b/app/Providers/BreadcrumbsServiceProvider.php @@ -418,9 +418,9 @@ class BreadcrumbsServiceProvider extends ServiceProvider ->push($maintenance->title, route('maintenances.show', $maintenance)) ); - Breadcrumbs::for('manufacturers.edit', fn (Trail $trail, Manufacturer $manufacturer) => - $trail->parent('manufacturers.index', route('manufacturers.index')) - ->push(trans('general.breadcrumb_button_actions.edit_item', ['name' => $manufacturer->name]), route('manufacturers.edit', $manufacturer)) + Breadcrumbs::for('maintenances.edit', fn (Trail $trail, AssetMaintenance $maintenance) => + $trail->parent('maintenances.index', route('maintenances.index')) + ->push(trans('general.breadcrumb_button_actions.edit_item', ['name' => $maintenance->name]), route('maintenances.edit', $maintenance)) ); From 6d98878c7211ddb817b204b1a76d4d38da55ea45 Mon Sep 17 00:00:00 2001 From: snipe Date: Sat, 14 Jun 2025 14:31:15 +0100 Subject: [PATCH 07/13] Removed redirect Signed-off-by: snipe --- .../AssetMaintenancesController.php | 40 +++---------------- 1 file changed, 5 insertions(+), 35 deletions(-) diff --git a/app/Http/Controllers/AssetMaintenancesController.php b/app/Http/Controllers/AssetMaintenancesController.php index a7f5bd7a04..0e46118af7 100644 --- a/app/Http/Controllers/AssetMaintenancesController.php +++ b/app/Http/Controllers/AssetMaintenancesController.php @@ -19,19 +19,6 @@ use \Illuminate\Http\RedirectResponse; */ class AssetMaintenancesController extends Controller { - /** - * Checks for permissions for this action. - * - * @todo This should be replaced with middleware and/or policies - * @author Vincent Sposato - * @version v1.0 - * @since [v1.8] - */ - private static function getInsufficientPermissionsRedirect(): RedirectResponse - { - return redirect()->route('maintenances.index') - ->with('error', trans('general.insufficient_permissions')); - } /** * Returns a view that invokes the ajax tables which actually contains @@ -90,9 +77,6 @@ class AssetMaintenancesController extends Controller // Loop through the selected assets foreach ($assets as $asset) { - if ((! Company::isCurrentUserHasAccess($asset)) && ($asset != null)) { - return static::getInsufficientPermissionsRedirect(); - } $assetMaintenance = new AssetMaintenance(); $assetMaintenance->supplier_id = $request->input('supplier_id'); @@ -140,6 +124,7 @@ class AssetMaintenancesController extends Controller public function edit(AssetMaintenance $maintenance) : View | RedirectResponse { $this->authorize('update', Asset::class); + $this->authorize('update', $maintenance->asset); return view('asset_maintenances/edit') ->with('selected_assets', $maintenance->asset->pluck('id')->toArray()) @@ -161,8 +146,7 @@ class AssetMaintenancesController extends Controller public function update(Request $request, AssetMaintenance $maintenance) : View | RedirectResponse { $this->authorize('update', Asset::class); - $asset = Asset::find(request('asset_id')); - $this->authorize('update', $asset); + $this->authorize('update', $maintenance->asset); $maintenance->supplier_id = $request->input('supplier_id'); $maintenance->is_warranty = $request->input('is_warranty', 0); @@ -209,21 +193,12 @@ class AssetMaintenancesController extends Controller * @version v1.0 * @since [v1.8] */ - public function destroy($assetMaintenanceId) : RedirectResponse + public function destroy(AssetMaintenance $maintenance) : RedirectResponse { $this->authorize('update', Asset::class); - // Check if the asset maintenance exists - if (is_null($assetMaintenance = AssetMaintenance::find($assetMaintenanceId))) { - // Redirect to the asset maintenance management page - return redirect()->route('maintenances.index') - ->with('error', trans('admin/asset_maintenances/message.not_found')); - } elseif (! Company::isCurrentUserHasAccess($assetMaintenance->asset)) { - return static::getInsufficientPermissionsRedirect(); - } - + $this->authorize('update', $maintenance->asset); // Delete the asset maintenance - $assetMaintenance->delete(); - + $maintenance->delete(); // Redirect to the asset_maintenance management page return redirect()->route('maintenances.index') ->with('success', trans('admin/asset_maintenances/message.delete.success')); @@ -239,11 +214,6 @@ class AssetMaintenancesController extends Controller */ public function show(AssetMaintenance $maintenance) : View | RedirectResponse { - $this->authorize('view', Asset::class); - if (! Company::isCurrentUserHasAccess($maintenance->asset)) { - return static::getInsufficientPermissionsRedirect(); - } - return view('asset_maintenances/view')->with('assetMaintenance', $maintenance); } } From 0801d1473c668cd9f67a24ebfb84ab25867940a3 Mon Sep 17 00:00:00 2001 From: snipe Date: Sat, 14 Jun 2025 14:57:55 +0100 Subject: [PATCH 08/13] Use forem group div Signed-off-by: snipe --- .../views/asset_maintenances/edit.blade.php | 43 +++++++++++-------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/resources/views/asset_maintenances/edit.blade.php b/resources/views/asset_maintenances/edit.blade.php index 2c45d8ee31..e12e8ee7f5 100644 --- a/resources/views/asset_maintenances/edit.blade.php +++ b/resources/views/asset_maintenances/edit.blade.php @@ -71,27 +71,30 @@ @else @if ($item->asset->company) - +
+ -
-

- {{ ($item->asset && $item->asset->company) ? $item->asset->company->name : '' }} -

+
+

+ {{ ($item->asset && $item->asset->company) ? $item->asset->company->name : '' }} +

+
@endif +
+ - - -
-

- {{ $item->asset ? $item->asset->present()->fullName : '' }} -

-
+
+

+ {{ $item->asset ? $item->asset->present()->fullName : '' }} +

+
+
@endif @@ -102,9 +105,11 @@
- + -
+
-
+
Date: Sat, 14 Jun 2025 15:53:05 +0100 Subject: [PATCH 09/13] Fixed breadcrumbs Signed-off-by: snipe --- app/Providers/BreadcrumbsServiceProvider.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Providers/BreadcrumbsServiceProvider.php b/app/Providers/BreadcrumbsServiceProvider.php index 64430b2511..eda242fbe5 100644 --- a/app/Providers/BreadcrumbsServiceProvider.php +++ b/app/Providers/BreadcrumbsServiceProvider.php @@ -414,13 +414,13 @@ class BreadcrumbsServiceProvider extends ServiceProvider ); Breadcrumbs::for('maintenances.show', fn (Trail $trail, AssetMaintenance $maintenance) => - $trail->parent('maintenances.index', route('locations.index')) + $trail->parent('maintenances.index', route('maintenances.index')) ->push($maintenance->title, route('maintenances.show', $maintenance)) ); Breadcrumbs::for('maintenances.edit', fn (Trail $trail, AssetMaintenance $maintenance) => $trail->parent('maintenances.index', route('maintenances.index')) - ->push(trans('general.breadcrumb_button_actions.edit_item', ['name' => $maintenance->name]), route('maintenances.edit', $maintenance)) + ->push(trans('general.breadcrumb_button_actions.edit_item', ['name' => $maintenance->title]), route('maintenances.edit', $maintenance)) ); From b1ba3376aa9b34be2da97bc841e8e522f92de19a Mon Sep 17 00:00:00 2001 From: snipe Date: Sat, 14 Jun 2025 16:13:57 +0100 Subject: [PATCH 10/13] Validation for completion date Signed-off-by: snipe --- app/Models/AssetMaintenance.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Models/AssetMaintenance.php b/app/Models/AssetMaintenance.php index 438801c246..fd03c76677 100644 --- a/app/Models/AssetMaintenance.php +++ b/app/Models/AssetMaintenance.php @@ -31,7 +31,7 @@ class AssetMaintenance extends Model implements ICompanyableChild 'title' => 'required|max:100', 'is_warranty' => 'boolean', 'start_date' => 'required|date_format:Y-m-d', - 'completion_date' => 'date_format:Y-m-d|nullable', + 'completion_date' => 'date_format:Y-m-d|nullable|after_or_equal:start_date', 'notes' => 'string|nullable', 'cost' => 'numeric|nullable', ]; From 47afb1597093ecd945124932294191a239bf1ea4 Mon Sep 17 00:00:00 2001 From: snipe Date: Sat, 14 Jun 2025 16:24:05 +0100 Subject: [PATCH 11/13] Updated HTML Signed-off-by: snipe --- .../views/asset_maintenances/edit.blade.php | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/resources/views/asset_maintenances/edit.blade.php b/resources/views/asset_maintenances/edit.blade.php index e12e8ee7f5..6ff7d7001b 100644 --- a/resources/views/asset_maintenances/edit.blade.php +++ b/resources/views/asset_maintenances/edit.blade.php @@ -78,7 +78,7 @@

- {{ ($item->asset && $item->asset->company) ? $item->asset->company->name : '' }} + {{ $item->asset->company->name }}

@@ -96,6 +96,20 @@
+ @if ($item->asset->location) +
+ + +
+

+ {{ $item->asset->location->name }} +

+
+
+ @endif + @endif From 090399b33627c44172b1b27ef491aa4ed0c6655d Mon Sep 17 00:00:00 2001 From: snipe Date: Sat, 14 Jun 2025 16:34:12 +0100 Subject: [PATCH 12/13] Fixed test Signed-off-by: snipe --- .../Ui/EditAssetMaintenanceTest.php | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/tests/Feature/AssetMaintenances/Ui/EditAssetMaintenanceTest.php b/tests/Feature/AssetMaintenances/Ui/EditAssetMaintenanceTest.php index 0e0f5b81c3..a622a5dec7 100644 --- a/tests/Feature/AssetMaintenances/Ui/EditAssetMaintenanceTest.php +++ b/tests/Feature/AssetMaintenances/Ui/EditAssetMaintenanceTest.php @@ -20,27 +20,26 @@ class EditAssetMaintenanceTest extends TestCase public function testCanUpdateAssetMaintenance() { $actor = User::factory()->superuser()->create(); - - $assetMaintenance = AssetMaintenance::factory()->create(); - $asset = Asset::factory()->create(); + $assetMaintenance = AssetMaintenance::factory()->create(['asset_id' => $asset]); $supplier = Supplier::factory()->create(); $this->actingAs($actor) ->followingRedirects() - ->put(route('maintenances.update', $assetMaintenance->id), [ + ->put(route('maintenances.update', $assetMaintenance), [ 'title' => 'Test Maintenance', 'asset_id' => $asset->id, 'supplier_id' => $supplier->id, 'asset_maintenance_type' => 'Maintenance', 'start_date' => '2021-01-01', 'completion_date' => '2021-01-10', - 'is_warranty' => '1', - 'cost' => '100.00', + 'is_warranty' => 1, + 'cost' => '100.99', 'notes' => 'A note', ]) ->assertOk(); + $this->assertDatabaseHas('asset_maintenances', [ 'asset_id' => $asset->id, 'supplier_id' => $supplier->id, @@ -51,7 +50,7 @@ class EditAssetMaintenanceTest extends TestCase 'completion_date' => '2021-01-10', 'asset_maintenance_time' => '9', 'notes' => 'A note', - 'cost' => '100.00', + 'cost' => '100.99', ]); } From 0a4a6e7ba34a6c7dea941d473e9e5e0c05e8b2bb Mon Sep 17 00:00:00 2001 From: snipe Date: Sat, 14 Jun 2025 16:37:44 +0100 Subject: [PATCH 13/13] Removed unusued relationship Signed-off-by: snipe --- app/Models/AssetMaintenance.php | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/app/Models/AssetMaintenance.php b/app/Models/AssetMaintenance.php index fd03c76677..1c07496225 100644 --- a/app/Models/AssetMaintenance.php +++ b/app/Models/AssetMaintenance.php @@ -166,20 +166,7 @@ class AssetMaintenance extends Model implements ICompanyableChild return $this->belongsTo(\App\Models\Asset::class, 'asset_id') ->withTrashed(); } - - /** - * asset - * Get asset for this improvement - * - * @return mixed - * @author Vincent Sposato - * @version v1.0 - */ - public function assets() - { - return $this->hasMany(Asset::class, 'asset_id') - ->withTrashed(); - } + /** * Get the admin who created the maintenance