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