ultimatepos/Modules/AssetManagement/Entities/Asset.php

124 lines
3.7 KiB
PHP

<?php
namespace Modules\AssetManagement\Entities;
use DB;
use Illuminate\Database\Eloquent\Model;
class Asset extends Model
{
/**
* The attributes that aren't mass assignable.
*
* @var array
*/
protected $guarded = ['id'];
/**
* user added asset.
*/
public function createdBy()
{
return $this->belongsTo(\App\User::class, 'created_by');
}
/**
* get business location for asset
*/
public function businessLocation()
{
return $this->belongsTo(\App\BusinessLocation::class, 'location_id');
}
public function media()
{
return $this->morphMany(\App\Media::class, 'model');
}
public static function forDropdown($business_id, $include_attributes = false, $check_qty = true)
{
$allocation = AssetTransaction::where('business_id', $business_id)
->where('transaction_type', 'allocate')
->select(DB::raw('SUM(COALESCE(quantity, 0)) as allocated'), 'asset_id')
->groupBy('asset_id');
$revocation = AssetTransaction::where('business_id', $business_id)
->where('transaction_type', 'revoke')
->select(DB::raw('SUM(COALESCE(quantity, 0)) as revoked'), 'asset_id')
->groupBy('asset_id');
$query = Asset::leftJoinSub($allocation, 'allocation', function ($join) {
$join->on('assets.id', '=', 'allocation.asset_id');
})
->leftJoinSub($revocation, 'revocation', function ($join) {
$join->on('assets.id', '=', 'revocation.asset_id');
})
->where('assets.business_id', $business_id)
->where('is_allocatable', 1)
->select('assets.name as name', 'assets.id as id', DB::raw('assets.quantity - COALESCE(allocated, 0) + COALESCE(revoked, 0) as quantity'));
if ($check_qty) {
$query->havingRaw('quantity > 0');
}
$query = $query->groupBy('assets.id')
->get();
$assets = [];
foreach ($query as $key => $asset) {
$assets[$asset->id] = $asset->name.'('.(int) $asset->quantity.')';
}
//Add quantity as attribute
$quantity_attr = null;
if ($include_attributes) {
$quantity_attr = collect($query)->mapWithKeys(function ($asset) {
return [$asset->id => ['data-quantity' => $asset->quantity, 'disabled' => ($asset->quantity < 1) ? true : false]];
})->all();
}
$output = ['assets' => $assets, 'asset_quantity' => $quantity_attr];
return $output;
}
public function warranties()
{
return $this->hasMany(\Modules\AssetManagement\Entities\AssetWarranty::class);
}
public function maintenances()
{
return $this->hasMany(\Modules\AssetManagement\Entities\AssetMaintenance::class);
}
public function project()
{
return $this->belongsTo(\Modules\Project\Entities\Project::class, 'project_id');
}
public function maintenanceEquipment()
{
if (! class_exists(\Modules\Maintenance\Models\Equipment::class)) {
return null;
}
return $this->hasOne(\Modules\Maintenance\Models\Equipment::class, 'fixed_asset_id');
}
public function getIsInWarrantyAttribute()
{
$now = \Carbon::now();
foreach ($this->warranties as $w) {
$start_date = \Carbon::parse($w->start_date);
$end_date = \Carbon::parse($w->end_date);
if ($now->between($start_date, $end_date)) {
return $w;
}
}
return null;
}
}