Few more replcamenents

Signed-off-by: snipe <snipe@snipe.net>
This commit is contained in:
snipe
2025-08-10 14:14:21 +01:00
parent 9e8eead71e
commit deb1afd28b
14 changed files with 60 additions and 62 deletions
@@ -194,7 +194,7 @@ class SuppliersController extends Controller
public function destroy($id) : JsonResponse
{
$this->authorize('delete', Supplier::class);
$supplier = Supplier::with('asset_maintenances', 'assets', 'licenses')->withCount('asset_maintenances as asset_maintenances_count', 'assets as assets_count', 'licenses as licenses_count')->findOrFail($id);
$supplier = Supplier::with('maintenances', 'assets', 'licenses')->withCount('maintenances as maintenances_count', 'assets as assets_count', 'licenses as licenses_count')->findOrFail($id);
$this->authorize('delete', $supplier);
@@ -202,8 +202,8 @@ class SuppliersController extends Controller
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/suppliers/message.delete.assoc_assets', ['asset_count' => (int) $supplier->assets_count])));
}
if ($supplier->asset_maintenances_count > 0) {
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/suppliers/message.delete.assoc_maintenances', ['asset_maintenances_count' => $supplier->asset_maintenances_count])));
if ($supplier->maintenances_count > 0) {
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/suppliers/message.delete.assoc_maintenances', ['maintenances_count' => $supplier->maintenances_count])));
}
if ($supplier->licenses_count > 0) {
+3 -3
View File
@@ -121,7 +121,7 @@ class SuppliersController extends Controller
public function destroy($supplierId) : RedirectResponse
{
$this->authorize('delete', Supplier::class);
if (is_null($supplier = Supplier::with('asset_maintenances', 'assets', 'licenses')->withCount('asset_maintenances as asset_maintenances_count', 'assets as assets_count', 'licenses as licenses_count')->find($supplierId))) {
if (is_null($supplier = Supplier::with('maintenances', 'assets', 'licenses')->withCount('maintenances as maintenances_count', 'assets as assets_count', 'licenses as licenses_count')->find($supplierId))) {
return redirect()->route('suppliers.index')->with('error', trans('admin/suppliers/message.not_found'));
}
@@ -129,8 +129,8 @@ class SuppliersController extends Controller
return redirect()->route('suppliers.index')->with('error', trans('admin/suppliers/message.delete.assoc_assets', ['asset_count' => (int) $supplier->assets_count]));
}
if ($supplier->asset_maintenances_count > 0) {
return redirect()->route('suppliers.index')->with('error', trans('admin/suppliers/message.delete.assoc_maintenances', ['asset_maintenances_count' => $supplier->asset_maintenances_count]));
if ($supplier->maintenances_count > 0) {
return redirect()->route('suppliers.index')->with('error', trans('admin/suppliers/message.delete.assoc_maintenances', ['maintenances_count' => $supplier->maintenances_count]));
}
if ($supplier->licenses_count > 0) {
+19 -19
View File
@@ -31,7 +31,7 @@ class Maintenance extends SnipeModel implements ICompanyableChild
'asset_id' => 'required|integer',
'supplier_id' => 'nullable|integer',
'asset_maintenance_type' => 'required',
'title' => 'required|max:100',
'name' => 'required|max:100',
'is_warranty' => 'boolean',
'start_date' => 'required|date_format:Y-m-d',
'completion_date' => 'date_format:Y-m-d|nullable|after_or_equal:start_date',
@@ -46,7 +46,7 @@ class Maintenance extends SnipeModel implements ICompanyableChild
* @var array
*/
protected $fillable = [
'title',
'name',
'asset_id',
'supplier_id',
'asset_maintenance_type',
@@ -67,7 +67,7 @@ class Maintenance extends SnipeModel implements ICompanyableChild
*/
protected $searchableAttributes =
[
'title',
'name',
'notes',
'asset_maintenance_type',
'cost',
@@ -103,14 +103,14 @@ class Maintenance extends SnipeModel implements ICompanyableChild
public static function getImprovementOptions()
{
return [
trans('admin/$maintenances/general.maintenance') => trans('admin/$maintenances/general.maintenance'),
trans('admin/$maintenances/general.repair') => trans('admin/$maintenances/general.repair'),
trans('admin/$maintenances/general.upgrade') => trans('admin/$maintenances/general.upgrade'),
trans('admin/$maintenances/general.pat_test') => trans('admin/$maintenances/general.pat_test'),
trans('admin/$maintenances/general.calibration') => trans('admin/$maintenances/general.calibration'),
trans('admin/$maintenances/general.software_support') => trans('admin/$maintenances/general.software_support'),
trans('admin/$maintenances/general.hardware_support') => trans('admin/$maintenances/general.hardware_support'),
trans('admin/$maintenances/general.configuration_change') => trans('admin/$maintenances/general.configuration_change'),
trans('admin/maintenances/general.maintenance') => trans('admin/maintenances/general.maintenance'),
trans('admin/maintenances/general.repair') => trans('admin/maintenances/general.repair'),
trans('admin/maintenances/general.upgrade') => trans('admin/maintenances/general.upgrade'),
trans('admin/maintenances/general.pat_test') => trans('admin/maintenances/general.pat_test'),
trans('admin/maintenances/general.calibration') => trans('admin/maintenances/general.calibration'),
trans('admin/maintenances/general.software_support') => trans('admin/maintenances/general.software_support'),
trans('admin/maintenances/general.hardware_support') => trans('admin/maintenances/general.hardware_support'),
trans('admin/maintenances/general.configuration_change') => trans('admin/maintenances/general.configuration_change'),
];
}
@@ -192,7 +192,7 @@ class Maintenance extends SnipeModel implements ICompanyableChild
public function getDisplayNameAttribute()
{
return $this->title;
return $this->name;
}
/**
@@ -211,7 +211,7 @@ class Maintenance extends SnipeModel implements ICompanyableChild
*/
public function scopeOrderBySupplier($query, $order)
{
return $query->leftJoin('suppliers as suppliers_maintenances', '$maintenances.supplier_id', '=', 'suppliers_maintenances.id')
return $query->leftJoin('suppliers as suppliers_maintenances', 'maintenances.supplier_id', '=', 'suppliers_maintenances.id')
->orderBy('suppliers_maintenances.name', $order);
}
@@ -227,7 +227,7 @@ class Maintenance extends SnipeModel implements ICompanyableChild
*/
public function scopeOrderByTag($query, $order)
{
return $query->leftJoin('assets', '$maintenances.asset_id', '=', 'assets.id')
return $query->leftJoin('assets', 'maintenances.asset_id', '=', 'assets.id')
->orderBy('assets.asset_tag', $order);
}
@@ -241,7 +241,7 @@ class Maintenance extends SnipeModel implements ICompanyableChild
*/
public function scopeOrderByAssetName($query, $order)
{
return $query->leftJoin('assets', '$maintenances.asset_id', '=', 'assets.id')
return $query->leftJoin('assets', 'maintenances.asset_id', '=', 'assets.id')
->orderBy('assets.name', $order);
}
@@ -255,7 +255,7 @@ class Maintenance extends SnipeModel implements ICompanyableChild
*/
public function scopeOrderByAssetSerial($query, $order)
{
return $query->leftJoin('assets', '$maintenances.asset_id', '=', 'assets.id')
return $query->leftJoin('assets', 'maintenances.asset_id', '=', 'assets.id')
->orderBy('assets.serial', $order);
}
@@ -269,7 +269,7 @@ class Maintenance extends SnipeModel implements ICompanyableChild
*/
public function scopeOrderStatusName($query, $order)
{
return $query->join('assets as maintained_asset', '$maintenances.asset_id', '=', 'maintained_asset.id')
return $query->join('assets as maintained_asset', 'maintenances.asset_id', '=', 'maintained_asset.id')
->leftjoin('status_labels as maintained_asset_status', 'maintained_asset_status.id', '=', 'maintained_asset.status_id')
->orderBy('maintained_asset_status.name', $order);
}
@@ -284,7 +284,7 @@ class Maintenance extends SnipeModel implements ICompanyableChild
*/
public function scopeOrderLocationName($query, $order)
{
return $query->join('assets as maintained_asset', '$maintenances.asset_id', '=', 'maintained_asset.id')
return $query->join('assets as maintained_asset', 'maintenances.asset_id', '=', 'maintained_asset.id')
->leftjoin('locations as maintained_asset_location', 'maintained_asset_location.id', '=', 'maintained_asset.location_id')
->orderBy('maintained_asset_location.name', $order);
}
@@ -294,6 +294,6 @@ class Maintenance extends SnipeModel implements ICompanyableChild
*/
public function scopeOrderByCreatedBy($query, $order)
{
return $query->leftJoin('users as admin_sort', '$maintenances.created_by', '=', 'admin_sort.id')->select('$maintenances.*')->orderBy('admin_sort.first_name', $order)->orderBy('admin_sort.last_name', $order);
return $query->leftJoin('users as admin_sort', 'maintenances.created_by', '=', 'admin_sort.id')->select('maintenances.*')->orderBy('admin_sort.first_name', $order)->orderBy('admin_sort.last_name', $order);
}
}
+7 -7
View File
@@ -51,7 +51,7 @@ class MaintenancesPresenter extends Presenter
'field' => 'asset_name',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/$maintenances/table.asset_name'),
'title' => trans('admin/maintenances/table.asset_name'),
'formatter' => 'assetNameLinkFormatter',
], [
'field' => 'asset_tag',
@@ -98,35 +98,35 @@ class MaintenancesPresenter extends Presenter
'field' => 'asset_maintenance_type',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/$maintenances/form.asset_maintenance_type'),
'title' => trans('admin/maintenances/form.asset_maintenance_type'),
], [
'field' => 'start_date',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/$maintenances/form.start_date'),
'title' => trans('admin/maintenances/form.start_date'),
'formatter' => 'dateDisplayFormatter',
], [
'field' => 'completion_date',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/$maintenances/form.completion_date'),
'title' => trans('admin/maintenances/form.completion_date'),
'formatter' => 'dateDisplayFormatter',
], [
'field' => 'notes',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/$maintenances/form.notes'),
'title' => trans('admin/maintenances/form.notes'),
], [
'field' => 'is_warranty',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/$maintenances/table.is_warranty'),
'title' => trans('admin/maintenances/table.is_warranty'),
'formatter' => 'trueFalseFormatter'
], [
'field' => 'cost',
'searchable' => true,
'sortable' => true,
'title' => trans('admin/$maintenances/form.cost'),
'title' => trans('admin/maintenances/form.cost'),
'class' => 'text-right',
], [
'field' => 'created_by',
+2 -2
View File
@@ -415,12 +415,12 @@ class BreadcrumbsServiceProvider extends ServiceProvider
Breadcrumbs::for('maintenances.show', fn (Trail $trail, Maintenance $maintenance) =>
$trail->parent('maintenances.index', route('maintenances.index'))
->push($maintenance->title, route('maintenances.show', $maintenance))
->push($maintenance->name, route('maintenances.show', $maintenance))
);
Breadcrumbs::for('maintenances.edit', fn (Trail $trail, Maintenance $maintenance) =>
$trail->parent('maintenances.index', route('maintenances.index'))
->push(trans('general.breadcrumb_button_actions.edit_item', ['name' => $maintenance->title]), route('maintenances.edit', $maintenance))
->push(trans('general.breadcrumb_button_actions.edit_item', ['name' => $maintenance->name]), route('maintenances.edit', $maintenance))
);
+1 -1
View File
@@ -65,7 +65,7 @@ class SettingsServiceProvider extends ServiceProvider
return 'assets/';
});
app()->singleton('$maintenances_path', function () {
app()->singleton('maintenances_path', function () {
return 'maintenances/';
});
+1 -1
View File
@@ -53,7 +53,7 @@ class DatabaseSeeder extends Seeder
Model::reguard();
DB::table('imports')->truncate();
DB::table('asset_maintenances')->truncate();
DB::table('maintenances')->truncate();
DB::table('requested_assets')->truncate();
}
}
+6 -6
View File
@@ -143,7 +143,7 @@
<x-icon type="maintenances" class="fa-2x" />
</span>
<span class="hidden-xs hidden-sm">{{ trans('general.maintenances') }}
{!! ($asset->assetmaintenances()->count() > 0 ) ? '<span class="badge badge-secondary">'.number_format($asset->assetmaintenances()->count()).'</span>' : '' !!}
{!! ($asset->maintenances()->count() > 0 ) ? '<span class="badge badge-secondary">'.number_format($asset->maintenances()->count()).'</span>' : '' !!}
</span>
</a>
</li>
@@ -1327,16 +1327,16 @@
<div class="tab-pane fade" id="maintenances">
<div class="row{{($asset->assetmaintenances->count() > 0 ) ? '' : ' hidden-print'}}">
<div class="row{{($asset->maintenances->count() > 0 ) ? '' : ' hidden-print'}}">
<div class="col-md-12">
<!-- Asset Maintenance table -->
<table
data-columns="{{ \App\Presenters\AssetMaintenancesPresenter::dataTableLayout() }}"
data-columns="{{ \App\Presenters\MaintenancesPresenter::dataTableLayout() }}"
class="table table-striped snipe-table"
id="assetMaintenancesTable"
id="MaintenancesTable"
data-buttons="maintenanceButtons"
data-id-table="assetMaintenancesTable"
data-id-table="MaintenancesTable"
data-side-pagination="server"
data-toolbar="#maintenance-toolbar"
data-export-options='{
@@ -1344,7 +1344,7 @@
"ignoreColumn": ["actions","image","change","checkbox","checkincheckout","icon"]
}'
data-url="{{ route('api.maintenances.index', array('asset_id' => $asset->id)) }}"
data-cookie-id-table="assetMaintenancesTable"
data-cookie-id-table="MaintenancesTable"
data-cookie="true">
</table>
</div> <!-- /.col-md-12 -->
+1 -1
View File
@@ -820,7 +820,7 @@ dir="{{ Helper::determineLanguageDirection() }}">
{{ trans('general.license_report') }}
</a>
</li>
<li {{!! (request()->is('reports/asset_maintenances') ? ' class="active"' : '') !!}}>
<li {{!! (request()->is('reports/maintenances') ? ' class="active"' : '') !!}}>
<a href="{{ url('reports/asset_maintenances') }}">
{{ trans('general.asset_maintenance_report') }}
</a>
+1 -10
View File
@@ -43,16 +43,7 @@
<div class="box-body">
<!-- Title -->
<div class="form-group {{ $errors->has('title') ? ' has-error' : '' }}">
<label for="title" class="col-md-3 control-label">
{{ trans('admin/maintenances/form.title') }}
</label>
<div class="col-md-7">
<input class="form-control" type="text" name="title" id="title" value="{{ old('title', $item->title) }}"{{ (Helper::checkIfRequired($item, 'title')) ? ' required' : '' }} />
{!! $errors->first('title', '<span class="alert-msg" aria-hidden="true"><i class="fas fa-times" aria-hidden="true"></i> :message</span>') !!}
</div>
</div>
@include ('partials.forms.edit.name', ['translated_name' => trans('general.name'), 'required' => 'true'])
<!-- This is a new maintenance -->
@if (!$item->id)
@@ -48,12 +48,12 @@ class CreateMaintenanceTest extends TestCase
->assertStatus(200);
// Since we rename the file in the ImageUploadRequest, we have to fetch the record from the database
$maintenance = Maintenance::where('title', 'Test Maintenance')->first();
$maintenance = Maintenance::where('name', 'Test Maintenance')->first();
// Assert file was stored...
Storage::disk('public')->assertExists(app('maintenances_path').$maintenance->image);
$this->assertDatabaseHas('asset_maintenances', [
$this->assertDatabaseHas('maintenances', [
'asset_id' => $asset->id,
'supplier_id' => $supplier->id,
'asset_maintenance_type' => 'Maintenance',
@@ -48,7 +48,7 @@ class EditMaintenanceTest extends TestCase
Storage::disk('public')->assertExists(app('maintenances_path').$maintenance->image);
$this->assertDatabaseHas('asset_maintenances', [
$this->assertDatabaseHas('maintenances', [
'supplier_id' => $supplier->id,
'asset_maintenance_type' => 'Maintenance',
'name' => 'Test Maintenance',
@@ -12,6 +12,13 @@ use Tests\TestCase;
class CreateMaintenanceTest extends TestCase
{
public function testPageRequiresPermission()
{
$this->actingAs(User::factory()->create())
->get(route('maintenances.create'))
->assertForbidden();
}
public function testPageRenders()
{
$this->actingAs(User::factory()->superuser()->create())
@@ -24,12 +31,10 @@ class CreateMaintenanceTest extends TestCase
{
Storage::fake('public');
$actor = User::factory()->superuser()->create();
$asset = Asset::factory()->create();
$supplier = Supplier::factory()->create();
$this->actingAs($actor)
->followingRedirects()
->post(route('maintenances.store'), [
'name' => 'Test Maintenance',
'selected_assets' => [$asset->id],
@@ -42,7 +47,8 @@ class CreateMaintenanceTest extends TestCase
'image' => UploadedFile::fake()->image('test_image.png'),
'notes' => 'A note',
])
->assertOk();
->assertSessionHasNoErrors()
->assertRedirect(route('maintenances.index'));
// Since we rename the file in the ImageUploadRequest, we have to fetch the record from the database
$maintenance = Maintenance::where('name', 'Test Maintenance')->first();
@@ -51,7 +57,7 @@ class CreateMaintenanceTest extends TestCase
Storage::disk('public')->assertExists(app('maintenances_path').$maintenance->image);
$this->assertDatabaseHas('asset_maintenances', [
$this->assertDatabaseHas('maintenances', [
'asset_id' => $asset->id,
'supplier_id' => $supplier->id,
'asset_maintenance_type' => 'Maintenance',
@@ -40,7 +40,8 @@ class EditMaintenanceTest extends TestCase
'cost' => '100.99',
'notes' => 'A note',
])
->assertOk();
->assertSessionHasNoErrors()
->assertRedirect(route('maintenances.index'));
// Since we rename the file in the ImageUploadRequest, we have to fetch the record from the database
$maintenance = Maintenance::where('name', 'Test Maintenance')->first();
@@ -48,7 +49,7 @@ class EditMaintenanceTest extends TestCase
// Assert file was stored...
Storage::disk('public')->assertExists(app('maintenances_path').$maintenance->image);
$this->assertDatabaseHas('asset_maintenances', [
$this->assertDatabaseHas('maintenances', [
'asset_id' => $asset->id,
'supplier_id' => $supplier->id,
'asset_maintenance_type' => 'Maintenance',