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/Traits/UserTrait.php
<?php

namespace App\Traits;

use App\Helpers\UserHelper;
use App\Jobs\SendMail;
use App\Mail\BaseMail;
use App\Models\Role;
use App\Repository\User\UserRepository;
use App\Services\Email\EmailTemplatesService;
use App\Services\Log\LogService;
use App\Services\PlaceholderService;
use App\Services\Service\ServiceService;
use App\User;
use Illuminate\Support\Str;

trait UserTrait
{

    public function generatePassword()
    {
        return Str::random(config('auth.passwords.length'));
    }

    public function userCreate($fields)
    {
        if (!isset($fields['access_system'])) {
            $fields['access_system'] = 0;
        }

        if (!isset($fields['lang'])) {
            $fields['lang'] = 'ru';
        }

        if (isset($fields['role'])) {
            $role = $fields['role'];
            unset($fields['role']);
        } else {
            $role = $this->getRoleIdSlug(Role::service);
        }

        $currentUser = UserHelper::getUser();
        if ($currentUser->isAdmin()) {
            $fields['branch_ids'] = [];
        } elseif ($currentUser->isManager()) {
            $fields['branch_ids'] = $currentUser->getBranchIds();
        } else {
            $fields['branch_ids'] = [$fields['branch_id']];
        }

        $password = $this->generatePassword();
        $fields['password'] = bcrypt($password);

        $user = new User();
        $user->fill($fields);
        $user->open_password = $password;
        $user->multiservice = intval(!empty($fields['service_ids']) && count($fields['service_ids']) > 1);

        $user->save();

        $user->syncBranches($fields['branch_ids']);
        $this->syncServices($user, $fields);
        $user->refresh();

        $this->setUserRole($user->id, $role);
        LogService::updatedRelations($user, 'role', $role);

        /** Email Sending **/
        $body = EmailTemplatesService::getTplForLetter('new-user', $user->lang, $user->roles()->get()->pluck('type')->first());

        if (isset($body) && $body->active) {
            $placeholders = new PlaceholderService();
            $placeholders->initRecipientPlaceholder($user);
            $placeholders->setRecipientPlaceholder('{password}', $password);

            $variables = [
                'user' => $user,
                'event' => 'new-user',
                'placeholders' => $placeholders->getRecipientPlaceholders(),
            ];

            SendMail::dispatch(new BaseMail($variables), $user->email);
        }

        return $user;
    }

    public function userUpdate($fields, $userData)
    {
        $fields['multiservice'] = intval(!empty($fields['service_ids']) && count($fields['service_ids']) > 1);

        $userData->fill($fields);

        $user = UserRepository::getQuery()->find($userData->id);
        $user->syncBranches($fields['branch_ids'] ?? []);
        $this->syncServices($user, $fields);
        $userData->update();
    }

    public function syncServices($user, $fields): void
    {
        $currentServices = $user->services()->get()->pluck('id')->toArray();
        $removeFromServices = array_diff($currentServices, $fields['service_ids'] ?? []);
        if (!empty($removeFromServices)) {
            foreach ($removeFromServices as $serviceId) {
                $service = ServiceService::getById($serviceId);
                $managers = $service->managers()->get()->pluck('id')->toArray();
                $managers = array_diff($managers, [$user->id]);
                $service->managers()->sync($managers);
                LogService::updatedRelations($service, 'managers', $managers);
            }
        }

        if (!empty($fields['service_ids'])) {
            foreach ($fields['service_ids'] as $serviceId) {
                if (!in_array($serviceId, $currentServices)) {
                    $service = ServiceService::getById($serviceId);
                    $managers = $service->managers()->get()->pluck('id')->toArray();
                    $managers[] = $user->id;
                    $service->managers()->sync($managers);
                    LogService::updatedRelations($service, 'managers', $managers);
                }
            }
        }
    }


}