diff --git a/app/Models/Maintenance.php b/app/Models/Maintenance.php index dadc205a57..7d580fdae6 100644 --- a/app/Models/Maintenance.php +++ b/app/Models/Maintenance.php @@ -169,6 +169,21 @@ class Maintenance extends SnipeModel implements ICompanyableChild return $this->belongsTo(\App\Models\Asset::class, 'asset_id') ->withTrashed(); } + + /** + * Get the asset's logs + * + * @author [A. Gianotto] [] + * @since [v2.0] + * @return \Illuminate\Database\Eloquent\Relations\Relation + */ + public function assetlog() + { + return $this->hasMany(\App\Models\Actionlog::class, 'item_id') + ->where('item_type', '=', self::class) + ->orderBy('created_at', 'desc') + ->withTrashed(); + } /** diff --git a/app/Observers/ComponentObserver.php b/app/Observers/ComponentObserver.php index cd2c58c367..dfc5091b3d 100644 --- a/app/Observers/ComponentObserver.php +++ b/app/Observers/ComponentObserver.php @@ -20,7 +20,11 @@ class ComponentObserver $logAction->item_type = Component::class; $logAction->item_id = $component->id; $logAction->created_at = date('Y-m-d H:i:s'); + $logAction->action_date = date('Y-m-d H:i:s'); $logAction->created_by = auth()->id(); + if($component->imported) { + $logAction->setActionSource('importer'); + } $logAction->logaction('update'); } @@ -37,6 +41,7 @@ class ComponentObserver $logAction->item_type = Component::class; $logAction->item_id = $component->id; $logAction->created_at = date('Y-m-d H:i:s'); + $logAction->action_date = date('Y-m-d H:i:s'); $logAction->created_by = auth()->id(); if($component->imported) { $logAction->setActionSource('importer'); @@ -56,6 +61,7 @@ class ComponentObserver $logAction->item_type = Component::class; $logAction->item_id = $component->id; $logAction->created_at = date('Y-m-d H:i:s'); + $logAction->action_date = date('Y-m-d H:i:s'); $logAction->created_by = auth()->id(); $logAction->logaction('delete'); } diff --git a/app/Observers/MaintenanceObserver.php b/app/Observers/MaintenanceObserver.php new file mode 100644 index 0000000000..7e59d1dbc0 --- /dev/null +++ b/app/Observers/MaintenanceObserver.php @@ -0,0 +1,74 @@ +item_type = Maintenance::class; + $logAction->item_id = $maintenance->id; + $logAction->target_type = Asset::class; + $logAction->target_id = $maintenance->asset_id; + $logAction->created_at = date('Y-m-d H:i:s'); + $logAction->action_date = date('Y-m-d H:i:s'); + $logAction->created_by = auth()->id(); + if($maintenance->imported) { + $logAction->setActionSource('importer'); + } + $logAction->logaction('update'); + } + + /** + * Listen to the Component created event when + * a new component is created. + * + * @param Maintenance $maintenance + * @return void + */ + public function created(Maintenance $maintenance) + { + $logAction = new Actionlog(); + $logAction->item_type = Maintenance::class; + $logAction->item_id = $maintenance->id; + $logAction->target_type = Asset::class; + $logAction->target_id = $maintenance->asset_id; + $logAction->created_at = date('Y-m-d H:i:s'); + $logAction->action_date = date('Y-m-d H:i:s'); + $logAction->created_by = auth()->id(); + if($maintenance->imported) { + $logAction->setActionSource('importer'); + } + $logAction->logaction('create'); + } + + /** + * Listen to the Component deleting event. + * + * @param Maintenance $maintenance + * @return void + */ + public function deleting(Maintenance $maintenance) + { + $logAction = new Actionlog(); + $logAction->item_type = Maintenance::class; + $logAction->item_id = $maintenance->id; + $logAction->target_type = Asset::class; + $logAction->target_id = $maintenance->asset_id; + $logAction->created_at = date('Y-m-d H:i:s'); + $logAction->action_date = date('Y-m-d H:i:s'); + $logAction->created_by = auth()->id(); + $logAction->logaction('delete'); + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index aa2604bce5..ba81ffb721 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -7,6 +7,7 @@ use App\Models\Asset; use App\Models\Component; use App\Models\Consumable; use App\Models\License; +use App\Models\Maintenance; use App\Models\User; use App\Models\Setting; use App\Models\SnipeSCIMConfig; @@ -17,6 +18,7 @@ use App\Observers\ComponentObserver; use App\Observers\ConsumableObserver; use App\Observers\LicenseObserver; use App\Observers\SettingObserver; +use App\Observers\MaintenanceObserver; use Illuminate\Routing\UrlGenerator; use Illuminate\Support\Facades\Schema; use Illuminate\Support\ServiceProvider; @@ -67,6 +69,7 @@ class AppServiceProvider extends ServiceProvider Schema::defaultStringLength(191); Asset::observe(AssetObserver::class); + Maintenance::observe(MaintenanceObserver::class); User::observe(UserObserver::class); Accessory::observe(AccessoryObserver::class); Component::observe(ComponentObserver::class); diff --git a/resources/views/partials/bootstrap-table.blade.php b/resources/views/partials/bootstrap-table.blade.php index b12250a8fe..765e1a34d1 100644 --- a/resources/views/partials/bootstrap-table.blade.php +++ b/resources/views/partials/bootstrap-table.blade.php @@ -368,12 +368,12 @@ // Add some overrides for any funny urls we have var dest = destination; - var dpolymorphicItemFormatterest = ''; + var polymorphicItemFormatterDest; if (destination=='fieldsets') { - var dpolymorphicItemFormatterest = 'fields/'; + var polymorphicItemFormatterDest = 'fields/'; } - return '' + value.name + ''; + return '' + value.name + ''; } }; } @@ -438,8 +438,6 @@ if (row.name) { var name_for_box = row.name - } else if (row.title) { - var name_for_box = row.title } else if (row.asset_tag) { var name_for_box = row.asset_tag } @@ -503,6 +501,9 @@ } else if (value.type == 'location') { item_destination = 'locations' item_icon = 'fas fa-map-marker-alt'; + } else if (value.type == 'maintenance') { + item_destination = 'maintenances' + item_icon = 'fa-solid fa-screwdriver-wrench'; } else if (value.type == 'model') { item_destination = 'models' item_icon = ''; @@ -618,25 +619,26 @@ var formatters = [ - 'hardware', 'accessories', - 'consumables', - 'components', - 'locations', - 'users', - 'manufacturers', - 'maintenances', - 'statuslabels', - 'models', - 'licenses', 'categories', - 'suppliers', - 'departments', 'companies', + 'components', + 'consumables', + 'departments', 'depreciations', 'fieldsets', 'groups', - 'kits' + 'hardware', + 'kits', + 'licenses', + 'locations', + 'maintenances', + 'maintenances', + 'manufacturers', + 'models', + 'statuslabels', + 'suppliers', + 'users', ]; for (var i in formatters) { diff --git a/tests/Feature/Maintenances/Api/CreateMaintenanceTest.php b/tests/Feature/Maintenances/Api/CreateMaintenanceTest.php index ecd08e01cc..594d89466f 100644 --- a/tests/Feature/Maintenances/Api/CreateMaintenanceTest.php +++ b/tests/Feature/Maintenances/Api/CreateMaintenanceTest.php @@ -65,6 +65,8 @@ class CreateMaintenanceTest extends TestCase 'image' => $maintenance->image, 'created_by' => $actor->id, ]); + + $this->assertHasTheseActionLogs($maintenance, ['create']); } diff --git a/tests/Feature/Maintenances/Api/DeleteMaintenancesTest.php b/tests/Feature/Maintenances/Api/DeleteMaintenancesTest.php index eac8c25ba7..3cc187cdd7 100644 --- a/tests/Feature/Maintenances/Api/DeleteMaintenancesTest.php +++ b/tests/Feature/Maintenances/Api/DeleteMaintenancesTest.php @@ -55,6 +55,7 @@ class DeleteMaintenancesTest extends TestCase implements TestsFullMultipleCompan $this->assertNotSoftDeleted($maintenanceA); $this->assertNotSoftDeleted($maintenanceB); $this->assertSoftDeleted($maintenanceC); + $this->assertHasTheseActionLogs($maintenanceC, ['create', 'delete']); } public function testCanDeleteMaintenance() @@ -66,5 +67,7 @@ class DeleteMaintenancesTest extends TestCase implements TestsFullMultipleCompan ->assertStatusMessageIs('success'); $this->assertSoftDeleted($maintenance); + + $this->assertHasTheseActionLogs($maintenance, ['create', 'delete']); } } diff --git a/tests/Feature/Maintenances/Api/EditMaintenanceTest.php b/tests/Feature/Maintenances/Api/EditMaintenanceTest.php index 6edb47ba27..4ca589bec2 100644 --- a/tests/Feature/Maintenances/Api/EditMaintenanceTest.php +++ b/tests/Feature/Maintenances/Api/EditMaintenanceTest.php @@ -59,5 +59,7 @@ class EditMaintenanceTest extends TestCase 'notes' => 'A note', 'image' => $maintenance->image, ]); + + $this->assertHasTheseActionLogs($maintenance, ['create', 'update']); } } diff --git a/tests/Feature/Maintenances/Ui/CreateMaintenanceTest.php b/tests/Feature/Maintenances/Ui/CreateMaintenanceTest.php index ba35199a9e..de1201e17f 100644 --- a/tests/Feature/Maintenances/Ui/CreateMaintenanceTest.php +++ b/tests/Feature/Maintenances/Ui/CreateMaintenanceTest.php @@ -71,5 +71,7 @@ class CreateMaintenanceTest extends TestCase 'image' => $maintenance->image, 'created_by' => $actor->id, ]); + + $this->assertHasTheseActionLogs($maintenance, ['create']); } } diff --git a/tests/Feature/Maintenances/Ui/EditMaintenanceTest.php b/tests/Feature/Maintenances/Ui/EditMaintenanceTest.php index 23ef55ba87..ad8aea4a56 100644 --- a/tests/Feature/Maintenances/Ui/EditMaintenanceTest.php +++ b/tests/Feature/Maintenances/Ui/EditMaintenanceTest.php @@ -60,6 +60,8 @@ class EditMaintenanceTest extends TestCase 'notes' => 'A note', 'cost' => '100.99', ]); + + $this->assertHasTheseActionLogs($maintenance, ['create', 'update']); } }