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);
}
}
}
}
}