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/Services/Service/ServiceService.php
<?php

namespace App\Services\Service;

use App\Http\Requests\Service\IndexServiceRequest;
use App\Http\Requests\Service\UpdateServiceRequest;
use App\Models\Repair\Repair;
use App\Models\RepairPrice;
use App\Models\Service\Service;
use App\Models\ServicePrice;
use App\Repository\Address\AddressRepository;
use App\Repository\Device\DeviceRepository;
use App\Repository\Service\ServiceRepository;
use App\Services\Address\AddressService;
use App\Services\Branch\BranchService;
use App\Services\User\UserService;
use App\User;


class ServiceService
{

    /** @var ServiceRepository */
    protected static ServiceRepository $repository;

    public static function setRepository()
    {
        self::$repository = new ServiceRepository();
    }

    /**
     * @return ServiceRepository
     */
    public static function getRepository()
    {
        self::setRepository();

        return self::$repository;
    }

    /**
     * Service constructor.
     */
    public function __construct()
    {
        self::setRepository();
    }

    /**
     * @param $id
     *
     * @return mixed
     */
    public static function getById($id)
    {
        return self::getRepository()::getById($id);
    }

    public static function getDisplayed()
    {
        return self::getRepository()::getDisplayed();
    }

    public static function getAvailable()
    {
        return self::getRepository()::getAvailable();
    }

    public function delete($id)
    {
        self::getRepository()->delete($id);
    }

    public function deleteByBranch($id)
    {
        $items = self::getRepository()::getAvailable()->where(['branch_id' => $id])->get('id');
        foreach ($items as $item) {
            self::getRepository()->delete($item->id);
        }
    }

    /**
     * @param IndexServiceRequest $request
     *
     * @return mixed
     */
    public function search(IndexServiceRequest $request)
    {
        return self::getRepository()->search($request);
    }

    /**
     * Return active items available for me, and filtered by Branch converted for ajax select
     *
     * @param $type = 'inline', 'avail' = use getAvailable()
     *
     * @return array
     */
    public static function getByBranchAjax($branchIds = [], $search = null, $type = null)
    {
        $query = ServiceRepository::getByBranch($branchIds, $type);
        if ($search) {
            $query->where('name', 'like', '%' . $search . '%');
        }

        if (substr_count($type, 'inline')) {
            return $query->get()->pluck('name', 'id')->toArray();
        } else {
            return $query->get(['name as text', 'id'])->toArray();
        }
    }

    public static function getAddress($service_id)
    {
        return AddressRepository::getByServiceId($service_id)->get()->pluck('full_address')->toArray();
    }

    public static function getSimpleAddress($service_id)
    {
        return AddressRepository::getByServiceId($service_id)->get()->pluck('full_simple_address', 'id')->toArray();
    }

    public static function savePriceFromCsv($service, $data)
    {
        $categories = Repair::getCategories();
        $name = trim($data[0]);

        $enc = mb_detect_encoding($name);
        if ($enc && $enc <> 'UTF-8') {
            $name = iconv($enc, 'UTF-8//IGNORE', $name);
        }

        $price = trim($data[1]);
        $price = str_replace(',', '.', $price);
        $price = (float) $price;
        if ($key = array_search($name, $categories)) {
            ServicePrice::updateOrCreate(
                ['service_id' => $service->id, 'category_id' => $key],
                ['price' => $price,]
            );

            return 'success';
        }

        return 'category_not_found';
    }

    public static function getPrices(int $serviceId): array
    {
        $data = [['Артикул', 'ТМЦ', 'Ремонт 1 категории', 'Ремонт 2 категории', 'Ремонт 3 категории']];

        $prices = RepairPrice::query()->where('service_id', $serviceId)->get();
        foreach ($prices as $price) {
            $device = DeviceRepository::getByExternalId($price->device_external_id);
            $data[] = [
                $price->device_external_id ?? '',
                $device->name ?? '',
                $price->repair_category_1 ?? '',
                $price->repair_category_2 ?? '',
                $price->repair_category_3 ?? '',
            ];
        }

        return $data;
    }

    public static function import($item)
    {
        $branch = BranchService::getByCode($item->code_subdivision);
        if (empty($branch)) {
            return ['result' => 'Branch: ' . $item->code_subdivision . ' does not exist'];
        }

        $service = Service::updateOrCreate(['inn' => $item->INN],
            [
                'name' => $item->name,
                'inn' => $item->INN,
                'additional_info' => $item->FullName,
                'branch_id' => $branch->id,
                'display' => 1,
                'external_id' => $item->code,
            ]
        );

        $createUser = [
            'service_id' => $service->id,
            'name' => $item->name,
            'email' => $item->email ?? '',
            'phone' => $item->phone ?? '',
        ];

        if (empty($service->user_id)) {
            $userService = new UserService();
            $user = $userService->userCreate($createUser);
            $user->refresh();

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

                return $service;
            });
        }

        $hasAddress = AddressRepository::getByServiceId($service->id)->get()->pluck('full_address')->toArray();
        if (empty($hasAddress)) {
            AddressService::saveFirstAddress([
                'name' => $item->name,
                'country' => $item->country ?? '',
                'city' => $item->city ?? '',
                'physical_address' => $item->adres,
            ], $service->id, $service->user);
        }

        return ['id' => $service->id];
    }

    public function save($fields, $managers, $createUser = null)
    {
        $serviceModel = self::getRepository()->save($fields, $managers, $createUser);

        AddressService::saveFirstAddress($fields, $serviceModel->id, $serviceModel->user);

        return $serviceModel;
    }

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

    }

    public static function isActiveService($serviceId, $model = null)
    {
        if (!$model) {
            $model = self::getById((int) $serviceId);
        }

        if (!$model) {
            return false;
        }

        return (bool) $model->display;
    }

    public static function updateDisplay($model)
    {
        $model->refresh();
        if ($model->display) {
            Service::where('id', '<>', $model->id)
                ->where('user_id', $model->user_id)
                ->where('display', 1)
                ->update(['display' => 0]);
        }
    }

    public static function fillStorage(array $data)
    {
        ServiceRepository::fillStorage($data);
    }

    public static function fillLeftovers($data)
    {
        ServiceRepository::fillLeftovers($data);
    }

    public static function getByCode($code)
    {
        return self::getRepository()::getByCode($code);
    }

}