@@ -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) {
|
||||
|
||||
@@ -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
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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))
|
||||
);
|
||||
|
||||
|
||||
|
||||
@@ -65,7 +65,7 @@ class SettingsServiceProvider extends ServiceProvider
|
||||
return 'assets/';
|
||||
});
|
||||
|
||||
app()->singleton('$maintenances_path', function () {
|
||||
app()->singleton('maintenances_path', function () {
|
||||
return 'maintenances/';
|
||||
});
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 -->
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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',
|
||||
|
||||
Reference in New Issue
Block a user