portal.mkgtu.ru/common/modules/abiturient/models/chat/AbiturientChatUser.php

333 lines
9.0 KiB
PHP
Raw Normal View History

2024-03-28 09:51:45 +03:00
<?php
namespace common\modules\abiturient\models\chat;
use backend\models\ManagerAllowChat;
use common\models\User;
use common\modules\abiturient\models\bachelor\ApplicationType;
use common\modules\abiturient\models\bachelor\BachelorApplication;
use common\modules\abiturient\models\PersonalData;
use Yii;
use yii\bootstrap4\Html;
use yii\db\ActiveQuery;
use yii\helpers\ArrayHelper;
class AbiturientChatUser extends ChatUserBase
{
public static function getUserRoles(): array
{
return [User::ROLE_ABITURIENT];
}
public static function getNickname(User $user): string
{
return $user->fullName;
}
public static function buildNewUser(User $user): AbiturientChatUser
{
$chatUser = parent::buildNewUser($user);
$chatUser->nickname = AbiturientChatUser::getNickname($user);
return $chatUser;
}
public static function getAvailableAbitsWithoutChatsQuery(User $user): ActiveQuery
{
$tnUser = User::tableName();
$tnChatFiles = ChatFileBase::tableName();
$tnChatUser = AbiturientChatUser::tableName();
$tnChatMessages = ChatMessageBase::tableName();
$subQuery = parent::getAvailableUsersWithoutChatsQuery($user)
->select("{$tnUser}.id");
return AbiturientChatUser::find()
->joinWith('chatFiles')
->joinWith('chatMessages')
->andWhere(['IN', "{$tnChatUser}.user_id", $subQuery])
->andWhere([
'OR',
['NOT IN', "{$tnChatFiles}.id", [0, null]],
['NOT IN', "{$tnChatMessages}.id", [0, null]],
]);
}
public static function getAvailableUsersWithoutChatsQuery(User $user): ActiveQuery
{
$tnChat = ChatBase::tableName();
return static::getAvailableAbitsWithoutChatsQuery($user)
->joinWith('chat')
->andWhere([
'NOT IN',
"{$tnChat}.status",
[ChatBase::STATUS_ENDING, ChatBase::STATUS_ACTIVE, ChatBase::STATUS_OPEN_AGAIN]
]);
}
public static function getAvailableUsersWithoutChats(User $user): array
{
return static::getAvailableUsersWithoutChatsQuery($user)->all();
}
public static function getAvailableUsersWithEndingChatsQuery(User $user): ActiveQuery
{
$tnChat = ChatBase::tableName();
return static::getAvailableAbitsWithoutChatsQuery($user)
->joinWith('chat')
->andWhere(["{$tnChat}.status" => ChatBase::STATUS_ENDING]);
}
public static function getAvailableUsersWithEndingChats(User $user): array
{
return static::getAvailableUsersWithEndingChatsQuery($user)->all();
}
public static function getSearchModel(User $user): ChatSearchModel
{
return new ChatSearchModel();
}
public static function getOtherManagers(): array
{
$tnUser = User::tableName();
$tnManagerAllowChat = ManagerAllowChat::tableName();
return User::find()
->leftJoin($tnManagerAllowChat, "{$tnManagerAllowChat}.manager_id = {$tnUser}.id")
->andWhere(['!=', "{$tnUser}.id", Yii::$app->user->id])
->andWhere(['NOT IN', "{$tnManagerAllowChat}.id", [0, null]])
->all();
}
public function processDataForRenderHeader(): array
{
$parentList = parent::processDataForRenderHeader();
$destinationUserId = (int) $parentList['destinationUserId'];
$avatarLink = AbiturientChatUser::getAvatarLink($destinationUserId);
$otherManagerLinks = AbiturientChatUser::buildOtherManagersList($destinationUserId);
$additionalUserInfoList = AbiturientChatUser::buildAdditionalUserInfoList($destinationUserId);
return array_merge(
$parentList,
[
'avatarLink' => $avatarLink,
'otherManagers' => $otherManagerLinks,
'additionalUserInfoList' => $additionalUserInfoList,
]
);
}
public static function getAvatarLink(int $destinationUserId): ?string
{
return ArrayHelper::getValue(
User::findOne(['id' => $destinationUserId]),
'abiturientQuestionary.abiturientAvatar.fileDownloadUrl'
);
}
private static function buildOtherManagersList(int $destinationUserId): array
{
$otherManagerLinks = [];
$otherManager = AbiturientChatUser::getOtherManagers();
foreach ($otherManager as $user) {
$otherManagerLinks[] = [
'label' => ManagerChatUser::buildNewUser($user)->nickname,
'url' => [
'/manager-chat/redirect-chat',
'destination_id' => $destinationUserId,
'other_manager_id' => $user->id,
],
];
}
return $otherManagerLinks;
}
private static function buildAdditionalUserInfoList(int $destinationUserId): array
{
$destinationUser = User::findOne(['id' => $destinationUserId]);
if (!$destinationUser) {
return [];
}
$additionalUserInfoList = [
[
'label' => Yii::t('_partial/chat/additional_user_info', 'Подпись поля "ФИО" доп. информации об пользователе, в блоке заголовка контакта: `ФИО`'),
'value' => $destinationUser->fullName,
],
[
'label' => Yii::t('_partial/chat/additional_user_info', 'Подпись поля "почта" доп. информации об пользователе, в блоке заголовка контакта: `Электронная почта`'),
'value' => Html::a($destinationUser->email, "mailto:{$destinationUser->email}"),
],
];
$additionalUserInfoList = AbiturientChatUser::buildAdditionalUserPhoneInfo($additionalUserInfoList, $destinationUser);
$additionalUserInfoList = AbiturientChatUser::buildAdditionalUserApplicationsInfo($additionalUserInfoList, $destinationUser);
return $additionalUserInfoList;
}
private static function buildAdditionalUserApplicationsInfo(array $additionalUserInfoList, User $destinationUser): array
{
$tnApplicationType = ApplicationType::tableName();
$tnBachelorApplication = BachelorApplication::tableName();
$applicationTypes = ApplicationType::find()
->select(["{$tnApplicationType}.name"])
->joinWith('applications')
->andWhere([
"{$tnApplicationType}.archive" => false,
"{$tnBachelorApplication}.archive" => false,
"{$tnBachelorApplication}.user_id" => $destinationUser->id,
])
->groupBy(["{$tnApplicationType}.name"])
->all();
if ($applicationTypes) {
$applications = trim(
array_reduce(
$applicationTypes,
function ($carry, ApplicationType $applicationType) {
return $carry .= "{$applicationType->name}, ";
}
),
', '
);
if (!empty($applications)) {
$additionalUserInfoList[] = [
'label' => Yii::t('_partial/chat/additional_user_info', 'Подпись поля "ПК" доп. информации об пользователе, в блоке заголовка контакта: `Приёмные кампании`'),
'value' => $applications,
];
}
}
return $additionalUserInfoList;
}
private static function buildAdditionalUserPhoneInfo(array $additionalUserInfoList, User $destinationUser): array
{
$personalData = ArrayHelper::getValue($destinationUser, 'abiturientQuestionary.personalData');
if ($personalData) {
$phones = trim(
array_reduce(
[$personalData->main_phone, $personalData->secondary_phone],
function ($carry, $phone) {
if (!$phone) {
return $carry;
}
$linkPhone = Html::a($phone, "tel:{$phone}");
return $carry .= "{$linkPhone}, ";
}
),
', '
);
if (!empty($phones)) {
$additionalUserInfoList[] = [
'label' => Yii::t('_partial/chat/additional_user_info', 'Подпись поля "телефоны" доп. информации об пользователе, в блоке заголовка контакта: `Контактные телефоны`'),
'value' => $phones,
];
}
}
return $additionalUserInfoList;
}
}