HEX
Server: nginx/1.18.0
System: Linux test-ipsremont 5.4.0-214-generic #234-Ubuntu SMP Fri Mar 14 23:50:27 UTC 2025 x86_64
User: ips (1000)
PHP: 8.0.30
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
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);
    }

}