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/Repository/Service/ServiceRepository.php
<?php

namespace App\Repository\Service;

use App\Http\Requests\Service\IndexServiceRequest;
use App\Models\BalanceTransaction;
use App\Models\PartsStorage;
use App\Models\Service\Service;
use App\Repository\BaseRepository;
use App\Repository\User\UserRepository;
use App\Services\Log\LogService;
use App\Services\Service\ServiceService;
use App\Services\User\UserService;
use App\Traits\GridTrait;
use App\User;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\DB;

class ServiceRepository extends BaseRepository
{

    use GridTrait;

    public static function getQuery(): Builder
    {
        return Service::query();
    }

    /**
     * @param IndexServiceRequest $request
     *
     * @return mixed
     */
    public function search(IndexServiceRequest $request)
    {
        $query = self::getAvailable();

        $this->makeQueryOrdered(Service::class, $query, $request);

        $query->with(['user', 'branch']);

        if (isset($request->sortable) && $request->sortable == true && Service::sortable($request->field)) {
            $sort = $request->sort == 'asc' ? 'asc' : 'desc';

            if ($request->field == 'contact') {
                $query->whereHas('user', function ($q) use ($sort) {
                    $q->orderBy('name', $sort);
                });
            }

            if ($request->field == 'phone') {
                $query->whereHas('user', function ($q) use ($sort) {
                    $q->orderBy(\request()->field, $sort);
                });
            }

            if ($request->field == 'branch_id') {
                $query->whereHas('branch', function ($q) use ($sort) {
                    $q->orderBy('name', $sort);
                });
            }
        }

        if (isset($request->manager_id) && !empty($request->manager_id)) {
            $query->forManagerId((int) $request->manager_id);
        }

        if (isset($request->name) && !empty($request->name)) {
            $query->where('name', 'like', '%' . $request->name . '%');
        }
        if (isset($request->email) && !empty($request->email)) {
            $query->whereHas('user', function ($q) use ($request) {
                $q->where('email', 'like', '%' . $request->email . '%');
            });
        }
        if (isset($request->branch_id)) {
            $query->where('branch_id', (int) $request->branch_id);
        }

        $perPage = $request->per_page ?? config('crud.defaultPerPage');
        $data = $query->paginate((int) $perPage)->appends($request->all());

        return $data;
    }

    /**
     * @param $id
     */
    public function delete($id)
    {
        $service = self::getById($id);

        if (!empty($service->user_id)) {
            $userRepository = new UserRepository();
            $user = $userRepository::getById($service->user_id);
            if ($user) {
                $service->user()->delete();
            }
        }

        if ($service) {
            $service->delete();
        }
    }

    /**
     * Return items available for me, and available to login
     *
     * @param integer|array $branchId
     *
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public static function getByBranch($branchIds = [], $type = null)
    {
        $query = ($type && $type == 'avail') ? self::getAvailable() : self::getDisplayed();

        if (is_array($branchIds)) {
            $query->whereIn('branch_id', $branchIds);
        } else {
            $branchIds = (int) $branchIds;
            $query->where('branch_id', $branchIds);
        }

        return $query;
    }

    /**
     * @param $id
     */
    public static function save($fields, $managers = [], $createUser = null)
    {
        $serviceModel = new Service();
        $serviceModel->fill($fields);
        $serviceModel->user_id = $fields['user_id'] ?? 0;
        $serviceModel->save();

        $serviceModel->refresh();
        if (!empty($managers)) {
            $serviceModel->managers()->sync($managers);
            LogService::updatedRelations($serviceModel, 'managers', $managers);
        }

        //
        if ($createUser) {
            $createUser['service_id'] = $serviceModel->id;

            $userService = new UserService();
            $user = $userService->userCreate($createUser);
            $user->refresh();

            $serviceModel->user_id = $user->id;
            User::withoutEvents(function () use ($serviceModel) {
                $serviceModel->save();

                return $serviceModel;
            });

        } else {
            if ($serviceModel->user_id) {
                //
                $user = User::where('id', $serviceModel->user_id)->first();
                if (!$user->isMultiService()) {
                    $services = ServiceService::getAvailable()
                        ->where('user_id', $user->id)
                        ->orderBy('id', 'desc')->count();

                    if ($services > 1) {
                        $user->multiservice = 1;

                        User::withoutEvents(function () use ($user) {
                            $user->save();

                            return $user;
                        });
                    }
                }
            }
        }

        return $serviceModel;
    }

    /**
     * @param $id
     *
     * @deprecated
     * @TODO Дописать
     */
    public static function update()
    {

    }

    public static function fillStorage(array $data)
    {
        $sql = 'INSERT INTO repair_prices (device_external_id, service_id, repair_category_1, repair_category_2, repair_category_3)';
        $sql .= 'VALUES(' . join(', ', [$data['sku'], $data['serviceId'], $data['category1'], $data['category2'], $data['category3']]) . ')';
        $sql .= 'ON DUPLICATE KEY UPDATE repair_category_1 = ' . $data['category1'] . ', repair_category_2 = ' . $data['category2'] . ', repair_category_3 = ' . $data['category3'] . ';';
        DB::statement($sql);
    }

    public static function fillLeftovers($data)
    {
        $service = PartsStorage::service;
        DB::statement(
            "INSERT INTO parts_storage
            (`part_id`, `warehouse_id`, `amount`, `type`, `external_warehouse_id`)
            values($data[4], $data[3], $data[1],'$service', '$data[2]')
            ON DUPLICATE KEY UPDATE `amount` = $data[1]"
        );
    }

    public static function getByCode($code)
    {
        return Service::where('external_id', $code)->first();
    }

    public static function getStartBalance(int $serviceId): float
    {
        return BalanceTransaction::query()->where('service_id', $serviceId)->sum('amount');
    }

    public static function setBalance(int $serviceId, float $newBalance, ?int $userId = null): void
    {
        $unitBalance = self::getStartBalance($serviceId);
        if ($newBalance == $unitBalance) {
            return;
        }

        if (empty($userId)) {
            /** @var User $user */
            $user = Auth()->user();
            $userId = $user->id;
        }

        $newTransaction = new BalanceTransaction(['service_id' => $serviceId, 'user_id' => $userId]);
        $newTransaction->amount = $newBalance - $unitBalance;
        $newTransaction->save();
    }

}