2016-03-25 01:18:05 -07:00
< ? php
2021-06-10 20:15:52 +00:00
2016-03-25 01:18:05 -07:00
namespace App\Models ;
2016-12-26 18:17:46 -05:00
use App\Helpers\Helper ;
2025-08-28 18:23:26 +01:00
use App\Models\Traits\CompanyableChildTrait ;
use App\Models\Traits\HasUploads ;
2025-10-21 16:45:58 +01:00
use App\Models\Traits\Loggable ;
2018-07-16 23:13:07 +02:00
use App\Models\Traits\Searchable ;
2025-08-08 12:37:03 +01:00
use App\Presenters\Presentable ;
2021-06-10 20:19:27 +00:00
use Illuminate\Database\Eloquent\Factories\HasFactory ;
2016-03-25 01:18:05 -07:00
use Illuminate\Database\Eloquent\SoftDeletes ;
2026-02-18 16:26:13 +00:00
use Illuminate\Support\Facades\Gate ;
2016-03-25 01:18:05 -07:00
use Watson\Validating\ValidatingTrait ;
2026-02-18 16:26:13 +00:00
use App\Presenters\MaintenancesPresenter ;
2016-03-25 01:18:05 -07:00
2016-04-07 13:21:09 -07:00
/**
* Model for Asset Maintenances .
*
2025-07-09 21:48:53 +01:00
* @ version v1 . 0
2016-04-07 13:21:09 -07:00
*/
2025-08-10 12:30:50 +01:00
class Maintenance extends SnipeModel implements ICompanyableChild
2016-03-25 01:18:05 -07:00
{
2021-06-10 20:17:44 +00:00
use HasFactory ;
2025-08-08 12:37:03 +01:00
use HasUploads ;
2016-03-25 01:18:05 -07:00
use SoftDeletes ;
use CompanyableChildTrait ;
2016-06-16 22:22:07 -04:00
use ValidatingTrait ;
2025-08-08 12:37:03 +01:00
use Loggable , Presentable ;
2023-12-07 19:36:12 +00:00
2026-02-18 16:26:13 +00:00
protected $presenter = MaintenancesPresenter :: class ;
2025-08-10 12:30:50 +01:00
protected $table = 'maintenances' ;
2016-03-25 01:18:05 -07:00
protected $rules = [
'asset_id' => 'required|integer' ,
2025-06-06 15:41:41 +01:00
'supplier_id' => 'nullable|integer' ,
2016-03-25 01:18:05 -07:00
'asset_maintenance_type' => 'required' ,
2025-09-03 15:03:49 +01:00
'name' => 'required|max:100' ,
2016-03-25 01:18:05 -07:00
'is_warranty' => 'boolean' ,
2023-12-07 19:36:12 +00:00
'start_date' => 'required|date_format:Y-m-d' ,
2025-06-14 16:13:57 +01:00
'completion_date' => 'date_format:Y-m-d|nullable|after_or_equal:start_date' ,
2016-12-19 13:04:28 -06:00
'notes' => 'string|nullable' ,
2025-09-03 15:06:27 +01:00
'cost' => 'numeric|nullable|gte:0|max:99999999999999999.99' ,
2025-10-07 11:49:10 +01:00
'url' => 'nullable|url|max:255' ,
2016-03-25 01:18:05 -07:00
];
2023-12-07 19:36:12 +00:00
/**
* The attributes that are mass assignable .
*
* @ var array
*/
protected $fillable = [
2025-08-10 14:14:21 +01:00
'name' ,
2023-12-07 19:36:12 +00:00
'asset_id' ,
'supplier_id' ,
'asset_maintenance_type' ,
'is_warranty' ,
'start_date' ,
2023-12-08 08:58:45 +00:00
'completion_date' ,
2023-12-07 19:36:12 +00:00
'asset_maintenance_time' ,
'notes' ,
'cost' ,
2025-10-07 12:05:37 +01:00
'url' ,
2023-12-07 19:36:12 +00:00
];
2018-07-16 23:13:07 +02:00
use Searchable ;
2021-06-10 20:15:52 +00:00
2018-07-16 23:13:07 +02:00
/**
* The attributes that should be included when searching the model .
2021-06-10 20:15:52 +00:00
*
2018-07-16 23:13:07 +02:00
* @ var array
*/
2024-02-14 09:59:10 +00:00
protected $searchableAttributes =
[
2025-08-10 14:14:21 +01:00
'name' ,
2024-02-14 09:59:10 +00:00
'notes' ,
'asset_maintenance_type' ,
'cost' ,
'start_date' ,
'completion_date'
];
2018-07-16 23:13:07 +02:00
/**
* The relations and their attributes that should be included when searching the model .
2021-06-10 20:15:52 +00:00
*
2018-07-16 23:13:07 +02:00
* @ var array
*/
2018-08-01 18:24:52 -07:00
protected $searchableRelations = [
2024-02-14 09:59:10 +00:00
'asset' => [ 'name' , 'asset_tag' , 'serial' ],
2018-08-01 18:24:52 -07:00
'asset.model' => [ 'name' , 'model_number' ],
2024-01-08 14:22:35 -08:00
'asset.supplier' => [ 'name' ],
2024-02-14 09:59:10 +00:00
'asset.assetstatus' => [ 'name' ],
2024-01-10 13:16:07 +00:00
'supplier' => [ 'name' ],
2018-08-01 18:24:52 -07:00
];
2018-07-16 23:13:07 +02:00
2016-03-25 01:18:05 -07:00
public function getCompanyableParents ()
{
2021-06-10 20:15:52 +00:00
return [ 'asset' ];
2016-03-25 01:18:05 -07:00
}
/**
2021-06-10 20:15:52 +00:00
* getImprovementOptions
*
2025-07-09 21:48:53 +01:00
* @ return array
2021-06-10 20:15:52 +00:00
* @ author Vincent Sposato < vincent . sposato @ gmail . com >
* @ version v1 . 0
*/
2016-03-25 01:18:05 -07:00
public static function getImprovementOptions ()
{
return [
2025-08-10 14:14:21 +01:00
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' ),
2016-03-25 01:18:05 -07:00
];
}
2026-02-18 16:26:13 +00:00
public function isDeletable ()
{
return Gate :: allows ( 'delete' , $this );
}
2016-12-26 18:17:46 -05:00
public function setIsWarrantyAttribute ( $value )
{
2016-12-29 14:02:18 -08:00
if ( $value == '' ) {
2016-12-26 18:17:46 -05:00
$value = 0 ;
}
$this -> attributes [ 'is_warranty' ] = $value ;
}
/**
* @ param $value
*/
public function setCostAttribute ( $value )
{
2023-03-29 09:56:34 +02:00
$value = Helper :: ParseCurrency ( $value );
if ( $value == 0 ) {
2016-12-26 18:17:46 -05:00
$value = null ;
}
$this -> attributes [ 'cost' ] = $value ;
}
/**
* @ param $value
*/
public function setNotesAttribute ( $value )
{
2016-12-29 14:02:18 -08:00
if ( $value == '' ) {
2016-12-26 18:17:46 -05:00
$value = null ;
}
$this -> attributes [ 'notes' ] = $value ;
}
/**
* @ param $value
*/
public function setCompletionDateAttribute ( $value )
{
2021-06-10 20:15:52 +00:00
if ( $value == '' || $value == '0000-00-00' ) {
2016-12-26 18:17:46 -05:00
$value = null ;
}
$this -> attributes [ 'completion_date' ] = $value ;
}
2016-03-25 01:18:05 -07:00
/**
2021-06-10 20:15:52 +00:00
* asset
* Get asset for this improvement
*
2025-07-09 21:48:53 +01:00
* @ return mixed
2021-06-10 20:15:52 +00:00
* @ author Vincent Sposato < vincent . sposato @ gmail . com >
* @ version v1 . 0
*/
2016-03-25 01:18:05 -07:00
public function asset ()
{
2021-06-10 20:16:56 +00:00
return $this -> belongsTo ( \App\Models\Asset :: class , 'asset_id' )
2025-07-09 21:48:53 +01:00
-> withTrashed ();
2016-03-25 01:18:05 -07:00
}
2025-08-10 15:51:48 +01:00
/**
2025-08-10 15:53:53 +01:00
* Get the maintenance logs
2025-08-10 15:51:48 +01:00
*
* @ author [ A . Gianotto ] [ < snipe @ snipe . net > ]
2025-08-10 15:53:53 +01:00
* @ since [ v8 . 2.2 ]
2025-08-10 15:51:48 +01:00
* @ 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 ();
}
2025-06-14 16:37:44 +01:00
2025-06-14 13:39:18 +01:00
2016-06-22 17:04:47 -07:00
/**
* Get the admin who created the maintenance
*
2025-07-09 21:48:53 +01:00
* @ return mixed
2016-06-22 17:04:47 -07:00
* @ author A . Gianotto < snipe @ snipe . net >
* @ version v3 . 0
*/
2024-09-19 17:01:48 +01:00
public function adminuser ()
2016-06-22 17:04:47 -07:00
{
2024-10-11 11:16:24 +01:00
return $this -> belongsTo ( \App\Models\User :: class , 'created_by' )
2016-06-22 17:04:47 -07:00
-> withTrashed ();
}
2016-03-25 01:18:05 -07:00
public function supplier ()
{
2021-06-10 20:16:56 +00:00
return $this -> belongsTo ( \App\Models\Supplier :: class , 'supplier_id' )
2025-07-09 21:48:53 +01:00
-> withTrashed ();
2016-03-25 01:18:05 -07:00
}
2025-08-08 12:54:36 +01:00
public function getDisplayNameAttribute ()
{
2025-08-10 14:14:21 +01:00
return $this -> name ;
2025-08-08 12:54:36 +01:00
}
2016-03-25 01:18:05 -07:00
/**
2021-06-10 20:15:52 +00:00
* -----------------------------------------------
* BEGIN QUERY SCOPES
* -----------------------------------------------
**/
2016-06-22 17:04:47 -07:00
2022-06-14 16:11:43 -07:00
/**
* Query builder scope to order on a supplier
*
2025-07-09 21:48:53 +01:00
* @ param \Illuminate\Database\Query\Builder $query Query builder instance
* @ param string $order Order
2022-06-14 16:11:43 -07:00
*
* @ return \Illuminate\Database\Query\Builder Modified query builder
*/
public function scopeOrderBySupplier ( $query , $order )
{
2025-08-10 14:14:21 +01:00
return $query -> leftJoin ( 'suppliers as suppliers_maintenances' , 'maintenances.supplier_id' , '=' , 'suppliers_maintenances.id' )
2022-06-14 16:11:43 -07:00
-> orderBy ( 'suppliers_maintenances.name' , $order );
}
2024-02-14 09:59:10 +00:00
2018-03-05 16:26:40 -08:00
/**
* Query builder scope to order on asset tag
*
2025-07-09 21:48:53 +01:00
* @ param \Illuminate\Database\Query\Builder $query Query builder instance
* @ param string $order Order
2018-03-05 16:26:40 -08:00
*
2018-08-01 18:24:52 -07:00
* @ return \Illuminate\Database\Query\Builder Modified query builder
2018-03-05 16:26:40 -08:00
*/
public function scopeOrderByTag ( $query , $order )
{
2025-08-10 14:14:21 +01:00
return $query -> leftJoin ( 'assets' , 'maintenances.asset_id' , '=' , 'assets.id' )
2018-03-05 16:26:40 -08:00
-> orderBy ( 'assets.asset_tag' , $order );
}
/**
* Query builder scope to order on asset tag
*
2025-07-09 21:48:53 +01:00
* @ param \Illuminate\Database\Query\Builder $query Query builder instance
* @ param string $order Order
2018-03-05 16:26:40 -08:00
*
2018-08-01 18:24:52 -07:00
* @ return \Illuminate\Database\Query\Builder Modified query builder
2018-03-05 16:26:40 -08:00
*/
public function scopeOrderByAssetName ( $query , $order )
{
2025-08-10 14:14:21 +01:00
return $query -> leftJoin ( 'assets' , 'maintenances.asset_id' , '=' , 'assets.id' )
2018-03-05 16:26:40 -08:00
-> orderBy ( 'assets.name' , $order );
}
2024-02-14 09:59:10 +00:00
/**
* Query builder scope to order on serial
*
2025-07-09 21:48:53 +01:00
* @ param \Illuminate\Database\Query\Builder $query Query builder instance
* @ param string $order Order
2024-02-14 09:59:10 +00:00
*
* @ return \Illuminate\Database\Query\Builder Modified query builder
*/
public function scopeOrderByAssetSerial ( $query , $order )
{
2025-08-10 14:14:21 +01:00
return $query -> leftJoin ( 'assets' , 'maintenances.asset_id' , '=' , 'assets.id' )
2024-02-14 09:59:10 +00:00
-> orderBy ( 'assets.serial' , $order );
}
/**
* Query builder scope to order on status label name
*
2025-07-09 21:48:53 +01:00
* @ param \Illuminate\Database\Query\Builder $query Query builder instance
* @ param text $order Order
2024-02-14 09:59:10 +00:00
*
* @ return \Illuminate\Database\Query\Builder Modified query builder
*/
public function scopeOrderStatusName ( $query , $order )
{
2025-08-10 14:14:21 +01:00
return $query -> join ( 'assets as maintained_asset' , 'maintenances.asset_id' , '=' , 'maintained_asset.id' )
2024-02-14 09:59:10 +00:00
-> leftjoin ( 'status_labels as maintained_asset_status' , 'maintained_asset_status.id' , '=' , 'maintained_asset.status_id' )
-> orderBy ( 'maintained_asset_status.name' , $order );
}
2024-09-19 17:01:48 +01:00
2025-06-22 19:38:39 +01:00
/**
* Query builder scope to order on status label name
*
2025-07-09 21:48:53 +01:00
* @ param \Illuminate\Database\Query\Builder $query Query builder instance
* @ param text $order Order
2025-06-22 19:38:39 +01:00
*
* @ return \Illuminate\Database\Query\Builder Modified query builder
*/
public function scopeOrderLocationName ( $query , $order )
{
2025-08-10 14:14:21 +01:00
return $query -> join ( 'assets as maintained_asset' , 'maintenances.asset_id' , '=' , 'maintained_asset.id' )
2025-06-22 19:38:39 +01:00
-> leftjoin ( 'locations as maintained_asset_location' , 'maintained_asset_location.id' , '=' , 'maintained_asset.location_id' )
-> orderBy ( 'maintained_asset_location.name' , $order );
}
2024-09-19 17:01:48 +01:00
/**
* Query builder scope to order on the user that created it
*/
public function scopeOrderByCreatedBy ( $query , $order )
{
2025-08-10 14:14:21 +01:00
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 );
2024-09-19 17:01:48 +01:00
}
2026-02-25 14:19:01 +00:00
public function scopeOrderByAssetModelName ( $query , $order )
{
return $query -> join ( 'assets as maintained_asset' , 'maintenances.asset_id' , '=' , 'maintained_asset.id' )
-> leftjoin ( 'models as maintained_asset_model' , 'maintained_asset_model.id' , '=' , 'maintained_asset.model_id' )
-> orderBy ( 'maintained_asset_model.name' , $order );
}
public function scopeOrderByAssetModelNumber ( $query , $order )
{
return $query -> join ( 'assets as maintained_asset' , 'maintenances.asset_id' , '=' , 'maintained_asset.id' )
-> leftjoin ( 'models as maintained_asset_model' , 'maintained_asset_model.id' , '=' , 'maintained_asset.model_id' )
-> orderBy ( 'maintained_asset_model.model_number' , $order );
}
2016-03-25 01:18:05 -07:00
}