File: /var/www/ipsremont-demo/app/Models/Service/Service.php
<?php
namespace App\Models\Service;
use App\Helpers\UserHelper;
use App\Models\Address;
use App\Models\BaseModel;
use App\Models\Branch;
use App\Models\Permission;
use App\Models\RepairPrice;
use App\Repository\Service\ServiceRepository;
use App\Services\Service\ServiceService;
use App\Traits\Displayed;
use App\Traits\My;
use App\Traits\Sortable;
use App\User;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Concerns\HasEvents;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes;
/**
* @property int $id
* @property string $name
* @property string $inn
* @property string $additional_info
* @property int $branch_id
* @property string $display
* @property string $external_id
* @property string $deleted_at
* @property string $created_at
* @property string $updated_at
* @property string $last_action_at
* @property int $notice
* @property string $external_warehouse_id
* @property int $branch_warehouse_id
* @property int $user_id
* @property float $balance @depricated
* @property int $leftovers_btn
*
* @property Branch $branch
* @property User $user
* @property Collection|ServiceListAction $lastActions
*/
class Service extends BaseModel
{
use SoftDeletes, Sortable, Displayed, HasEvents, My;
protected $table = 'services';
const TYPE_CDEK = 'cdek';
const TYPE_PEK = 'pek';
const TYPE_DPD = 'dpd';
protected $fillable = [
'name',
'inn',
'additional_info',
'branch_id',
'display',
'additional_info',
'external_id',
'external_warehouse_id',
'balance',
'last_action_at',
];
protected $casts = [
'last_action_at' => 'datetime',
];
protected static $labels = [
'name' => 'services.name',
'country' => 'services.country',
'city' => 'services.city',
'physical_address' => 'services.physical_address',
'inn' => 'services.inn',
'additional_info' => 'services.additional_info',
'branch_id' => 'services.branch_id',
'display' => 'services.activeNotActive',
'managers' => 'services.selectManagers',
'role' => 'admins.users.role',
'external_id' => 'services.external_id',
'external_warehouse_id' => 'services.external_warehouse_id',
'balance' => 'services.balance',
];
public static function columns()
{
$columns = [
"fields" => [
[
"displayName" => 'grid.name',
"field" => "name",
"sort" => true,
"sortType" => 'asc',
],
[
"displayName" => 'grid.contacts',
"field" => "contact",
"sort" => false,
"sortType" => 'asc',
],
[
"displayName" => 'grid.phone',
"field" => "phone",
"sort" => true,
"sortType" => 'asc',
],
[
"displayName" => 'grid.branches',
"field" => "branch_id",
"sort" => false,
"sortType" => 'asc',
],
[
"displayName" => 'grid.managers',
"field" => "manager",
"sort" => false,
"sortType" => 'asc',
],
[
"displayName" => 'grid.status',
"field" => "display",
"sort" => true,
"sortType" => 'asc',
],
[
"displayName" => '',
"field" => 'action',
"sort" => false,
],
],
"sortDefault" => [
[
"field" => 'display',
"sort" => 'desc',
],
[
"field" => 'name',
"sort" => 'asc',
],
],
];
$fields = [];
foreach ($columns['fields'] as $key => $field) {
$fields[$field['field']] = $field;
}
$columns['fields'] = $fields;
if (can(Permission::branchesAll)) {
} elseif (can(Permission::servicesAll)) {
unset($columns['fields']['branch_id']);
} else {
unset($columns['fields']['branch_id'], $columns['fields']['manager']);
}
return $columns;
}
public function managers()
{
return $this->belongsToMany(User::class, 'managers_services')->withPivot('user_id', 'service_id');
}
public function getManagersNames()
{
$managers = $this->managers()->get()->pluck('name', 'id')->toArray();
return implode(', ', $managers);
}
/**
* Scope a query to only filtered by Manager
*
* @param \Illuminate\Database\Eloquent\Builder $query
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeForManagerId($query, $id)
{
$query->whereHas('managers', function ($q) use ($id) {
$q->where('users.id', $id);
});
}
/**
* Scope a query to only include My items
*
* @param \Illuminate\Database\Eloquent\Builder $query
*/
public function scopeMy($query)
{
$user = UserHelper::getUser();
if (is_null($user)) {
return;
}
if (!can(Permission::servicesAll) && $user->isManager()) {
$query->forManagerId($user->getAuthIdentifier());
}
if (!can(Permission::branchesAll)) {
$query->whereIn('branch_id', $user->getBranchIds());
}
if ($user->isService()) {
$query->where('user_id', $user->getAuthIdentifier());
}
}
public function eventUpdated()
{
$this->fireModelEvent('updated');
}
public function getName(): string
{
return htmlspecialchars_decode($this->name);
}
public function getInn()
{
return $this->inn;
}
public function getPrice()
{
return $this->hasMany(RepairPrice::class)->orderBy('repair_category_1');
}
/**
* @return Address|object
*/
public function getAddress()
{
return Address::query()->where('service_id', $this->id)->where('main', 1)->first();
}
public function getBalance(): float
{
return round(ServiceRepository::getStartBalance($this->id), 2);
}
public function getOldService()
{
return ServiceService::getAvailable()
->where('user_id', $this->user_id)
->where('display', 0)
->orderBy('updated_at', 'desc')->first();
}
// MARK: - Relations
public function branch(): BelongsTo
{
return $this->belongsTo(Branch::class, 'branch_id');
}
public function user(): BelongsTo
{
return $this->belongsTo(User::class, 'user_id');
}
public function lastActions(): HasMany
{
return $this->hasMany(ServiceListAction::class, 'service_id', 'id')->orderByDesc('created_at')->limit(10);
}
}