%PDF- %PDF-
Direktori : /www/varak.net/mail2.varak.net_old/libraries/afterlogic/common/managers/helpdesk/ |
Current File : //www/varak.net/mail2.varak.net_old/libraries/afterlogic/common/managers/helpdesk/manager.php |
<?php /* * Copyright 2004-2014, AfterLogic Corp. * Licensed under AGPLv3 license or AfterLogic license * if commercial version of the product was purchased. * See the LICENSE file for a full license statement. */ /** * @package Helpdesk */ class CApiHelpdeskManager extends AApiManagerWithStorage { /** * @var CApiMailManager */ private $oApiMail; /** * @var CApiUsersManager */ private $oApiUsers; /** * @var CApiTenantsManager */ private $oApiTenants; /** * @param CApiGlobalManager &$oManager */ public function __construct(CApiGlobalManager &$oManager, $sForcedStorage = '') { parent::__construct('helpdesk', $oManager, $sForcedStorage); $this->inc('classes.enum'); $this->inc('classes.user'); $this->inc('classes.attachment'); $this->inc('classes.post'); $this->inc('classes.thread'); $this->oApiMail = null; $this->oApiUsers = null; $this->oApiTenants = null; } /** * @return CApiUsersManager */ private function apiUsers() { if (null === $this->oApiUsers) { $this->oApiUsers = CApi::Manager('users'); } return $this->oApiUsers; } /** * @return CApiMailManager */ private function apiMail() { if (null === $this->oApiMail) { $this->oApiMail = CApi::Manager('mail'); } return $this->oApiMail; } /** * @param string $sPath * @param string $sSubject */ private function getMessageTemplate($sPath, &$sSubject, $fCallback) { $sData = @file_get_contents($sPath); if (is_string($sData) && 0 < strlen($sData)) { $aMatch = array(); $sData = trim($sData); if ($fCallback) { $sData = call_user_func($fCallback, $sData); } if (preg_match('/^:SUBJECT:([^\n]+)/', $sData, $aMatch) && !empty($aMatch[1])) { $sSubject = trim($aMatch[1]); $sData = trim(preg_replace('/^:SUBJECT:[^\n]+/', '', $sData)); } return $sData; } return ''; } private function addHtmlBodyAndSubjectForUserMessage($sPath, &$oMessage, $oHelpdeskUser, $sSiteName, $sFrom) { $sSubject = ''; $sData = $this->getMessageTemplate($sPath, $sSubject, function ($sData) use ($oHelpdeskUser, $sSiteName, $sFrom) { return strtr($sData, array( '{{HELPDESK_SITE_NAME}}' => 0 === strlen($sSiteName) ? 'Helpdesk' : $sSiteName, '{{HELPDESK_LINK}}' => $oHelpdeskUser->HelpdeskLink(), '{{FROM_EMAIL}}' => $sFrom, '{{USER_EMAIL}}' => $oHelpdeskUser->ResultEmail(), '{{USER_PASSWORD}}' => $oHelpdeskUser->NotificationPassword, '{{FORGOT_LINK}}' => $oHelpdeskUser->ForgotLink(), '{{ACTIVATION_LINK}}' => $oHelpdeskUser->ActivationLink() )); }); if (0 < strlen($sSubject)) { $oMessage->SetSubject($sSubject); } if (is_string($sData) && 0 < strlen($sData)) { $oMessage->AddText(\MailSo\Base\HtmlUtils::ConvertHtmlToPlain($sData), false); $oMessage->AddHtml($sData, true); } } private function addHtmlBodyAndSubjectForPostMessage($sPath, &$oMessage, $oHelpdeskThreadOwnerUser, $oHelpdeskPostOwnerUser, $oThread, $oPost, $sSiteName) { $sSubject = ''; $sData = $this->getMessageTemplate($sPath, $sSubject, function ($sData) use ($oHelpdeskThreadOwnerUser, $oHelpdeskPostOwnerUser, $oThread, $oPost, $sSiteName) { $sPostOwner = \MailSo\Mime\Email::NewInstance($oHelpdeskPostOwnerUser->ResultEmail(), $oHelpdeskPostOwnerUser->Name)->ToString(); $sSubjectPrefix = ''; if ($oThread && 0 < $oThread->PostCount - 1) { $sSubjectPrefix = 'Re'.(2 < $oThread->PostCount ? '['.($oThread->PostCount - 1).']' : '').': '; } $sAttachments = ''; if ($oPost && is_array($oPost->Attachments) && 0 < count($oPost->Attachments)) { $sAttachmentsNames = array(); foreach ($oPost->Attachments as $oAttachment) { if ($oAttachment) { $sAttachmentsNames[] = $oAttachment->FileName; } } $sAttachments = '<br /><br />Attachments: '.implode(', ', $sAttachmentsNames).'<br />'; } return strtr($sData, array( '{{HELPDESK_SITE_NAME}}' => 0 === strlen($sSiteName) ? 'Helpdesk' : $sSiteName, '{{MESSAGE_SUBJECT}}' => $sSubjectPrefix.$oThread->Subject, '{{THREAD_SUBJECT}}' => $oThread->Subject, '{{THREAD_OWNER}}' => $oHelpdeskThreadOwnerUser && 0 < \strlen($oHelpdeskThreadOwnerUser->Name) ? ' '.$oHelpdeskThreadOwnerUser->Name : '', '{{POST_OWNER}}' => $sPostOwner, '{{THREAD_LINK}}' => $oThread->ThreadLink(), '{{THREAD_ID}}' => $oThread->IdHelpdeskThread, '{{THREAD_HASH}}' => $oThread->StrHelpdeskThreadHash, '{{POST_ATTACHMENTS}}' => $sAttachments, '{{LOGIN_LINK}}' => $oThread->LoginLink(), '{{POST_TEXT}}' => $oPost ? $oPost->Text : '', '{{POST_HTML}}' => $oPost ? \MailSo\Base\HtmlUtils::ConvertPlainToHtml($oPost->Text) : '' )); }); if (0 < strlen($sSubject)) { $oMessage->SetSubject($sSubject.' [#'.$oThread->StrHelpdeskThreadHash.'#]'); } if (is_string($sData) && 0 < strlen($sData)) { $oMessage->AddText(\MailSo\Base\HtmlUtils::ConvertHtmlToPlain($sData), false); $oMessage->AddHtml($sData, true); } } /** * @param string $sFrom * @param string $sTo * @param string $sSubject * @param string $sCc = '' * @param string $sBcc = '' * @param string $sMessageID = '' * @param string $sReferences = '' * * @return \MailSo\Mime\Message */ private function buildMail($sFrom, $sTo, $sSubject, $sCc = '', $sBcc = '', $sMessageID = '', $sReferences = '') { $oMessage = \MailSo\Mime\Message::NewInstance(); if (empty($sMessageID)) { $oMessage->RegenerateMessageId(); } else { $oMessage->SetMessageId($sMessageID); } if (!empty($sReferences)) { $oMessage->SetReferences($sReferences); } $sXMailer = \CApi::GetConf('webmail.xmailer-value', ''); if (0 < strlen($sXMailer)) { $oMessage->SetXMailer($sXMailer); } $oMessage ->SetFrom(\MailSo\Mime\Email::NewInstance($sFrom)) ->SetSubject($sSubject) ; $oToEmails = \MailSo\Mime\EmailCollection::NewInstance($sTo); if ($oToEmails && $oToEmails->Count()) { $oMessage->SetTo($oToEmails); } $oCcEmails = \MailSo\Mime\EmailCollection::NewInstance($sCc); if ($oCcEmails && $oCcEmails->Count()) { $oMessage->SetCc($oCcEmails); } $oBccEmails = \MailSo\Mime\EmailCollection::NewInstance($sBcc); if ($oBccEmails && $oBccEmails->Count()) { $oMessage->SetBcc($oBccEmails); } return $oMessage; } private function initMessageIdAndReferences($oThread, &$sMessageID, &$sReferences) { if ($oThread && 0 < $oThread->PostCount) { $sReferences = ''; if (1 < $oThread->PostCount) { for ($iIndex = 1, $iLen = $oThread->PostCount; $iIndex < $iLen; $iIndex++) { $sReferences .= ' <'.md5($oThread->IdHelpdeskThread.$oThread->IdTenant.$iIndex).'@hdsystem>'; } } $sReferences = trim($sReferences); $sMessageID = '<'.md5($oThread->IdHelpdeskThread.$oThread->IdTenant.$oThread->PostCount).'@hdsystem>'; } } /** * @param string $sFrom * @param string $sTo * * @return \MailSo\Mime\Message */ private function buildPostMail($sPath, $sFrom, $sTo, $sSubject, $sCc, $sBcc, $oHelpdeskThreadOwnerUser, $oHelpdeskPostOwnerUser, $oThread, $oPost, $sSiteName) { $sMessageID = ''; $sReferences = ''; $this->initMessageIdAndReferences($oThread, $sMessageID, $sReferences); $oMessage = $this->buildMail($sFrom, $sTo, $sSubject, $sCc, $sBcc, $sMessageID, $sReferences); $this->addHtmlBodyAndSubjectForPostMessage($sPath, $oMessage, $oHelpdeskThreadOwnerUser, $oHelpdeskPostOwnerUser, $oThread, $oPost, $sSiteName ); return $oMessage; } /** * @param string $sFrom * @param string $sTo * * @return \MailSo\Mime\Message */ private function buildUserMail($sPath, $sFrom, $sTo, $sSubject, $sCc, $sBcc, $oHelpdeskUser, $sSiteName) { $oMessage = $this->buildMail($sFrom, $sTo, $sSubject, $sCc, $sBcc); $this->addHtmlBodyAndSubjectForUserMessage($sPath, $oMessage, $oHelpdeskUser, $sSiteName, $sFrom); return $oMessage; } /** * @param CHelpdeskUser $oHelpdeskUser * @param bool $bCreateFromFetcher = false * @return bool */ public function CreateUser(CHelpdeskUser &$oHelpdeskUser, $bCreateFromFetcher = false) { $bResult = false; try { if ($oHelpdeskUser->Validate()) { if (!$this->UserExists($oHelpdeskUser)) { if (!$this->oStorage->CreateUser($oHelpdeskUser)) { throw new CApiManagerException(Errs::HelpdeskManager_UserCreateFailed); } else if (!$oHelpdeskUser->Activated) { $this->NotifyRegistration($oHelpdeskUser, $bCreateFromFetcher); } } else { throw new CApiManagerException(Errs::HelpdeskManager_UserAlreadyExists); } } $bResult = true; } catch (CApiBaseException $oException) { $bResult = false; $this->setLastException($oException); } return $bResult; } /** * @param int $iIdTenant * @param int $iHelpdeskUserId * * @return CHelpdeskUser|false */ public function GetUserById($iIdTenant, $iHelpdeskUserId) { $oUser = null; try { $oUser = $this->oStorage->GetUserById($iIdTenant, $iHelpdeskUserId); } catch (CApiBaseException $oException) { $oUser = false; $this->setLastException($oException); } return $oUser; } /** * @param int $iHelpdeskUserId * * @return CHelpdeskUser|false */ public function GetUserByIdWithoutTenantID($iHelpdeskUserId) { $oUser = null; try { $oUser = $this->oStorage->GetUserByIdWithoutTenantID($iHelpdeskUserId); } catch (CApiBaseException $oException) { $oUser = false; $this->setLastException($oException); } return $oUser; } /** * @param int $iIdTenant * @param string $sActivateHash * * @return CHelpdeskUser|false */ public function GetUserByActivateHash($iIdTenant, $sActivateHash) { $oUser = null; try { $oUser = $this->oStorage->GetUserByActivateHash($iIdTenant, $sActivateHash); } catch (CApiBaseException $oException) { $oUser = false; $this->setLastException($oException); } return $oUser; } /** * @param int $iIdTenant * * @return CHelpdeskUser|false */ public function GetHelpdeskMainSettings($iIdTenant) { $oApiTenant = CApi::Manager('tenants'); $oTenant = /* @var $oTenant CTenant */ $oApiTenant ? (0 < $iIdTenant ? $oApiTenant->GetTenantById($iIdTenant) : $oApiTenant->GetDefaultGlobalTenant()) : null; $sClientIframeUrl = ''; $sAdminEmailAccount = ''; $sAgentIframeUrl = ''; $sSiteName = ''; $bStyleAllow = false; $sStyleImage = ''; $sStyleText = ''; $bFacebookAllow = false; $sFacebookId = ''; $sFacebookSecret = ''; $bGoogleAllow = false; $sGoogleId = ''; $sGoogleSecret = ''; $bTwitterAllow = false; $sTwitterId = ''; $sTwitterSecret = ''; $iHelpdeskFetcherType = 0; if ($oTenant) { $sAdminEmailAccount = $oTenant->HelpdeskAdminEmailAccount; $sClientIframeUrl = $oTenant->HelpdeskClientIframeUrl; $sAgentIframeUrl = $oTenant->HelpdeskAgentIframeUrl; $sSiteName = $oTenant->HelpdeskSiteName; $bStyleAllow = $oTenant->HelpdeskStyleAllow; $sStyleImage = $oTenant->HelpdeskStyleImage; $sStyleText = $oTenant->GetHelpdeskStyleText(); $iHelpdeskFetcherType = $oTenant->HelpdeskFetcherType; $bFacebookAllow = $oTenant->SocialFacebookAllow; $sFacebookId = $oTenant->SocialFacebookId; $sFacebookSecret = $oTenant->SocialFacebookSecret; $bGoogleAllow = $oTenant->SocialGoogleAllow; $sGoogleId = $oTenant->SocialGoogleId; $sGoogleSecret = $oTenant->SocialGoogleSecret; $bTwitterAllow = $oTenant->SocialTwitterAllow; $sTwitterId = $oTenant->SocialTwitterId; $sTwitterSecret = $oTenant->SocialTwitterSecret; } return array( 'AdminEmailAccount' => $sAdminEmailAccount, 'ClientIframeUrl' => $sClientIframeUrl, 'AgentIframeUrl' => $sAgentIframeUrl, 'SiteName' => $sSiteName, 'StyleAllow' => $bStyleAllow, 'StyleImage' => $sStyleImage, 'StyleText' => $sStyleText, 'HelpdeskFetcherType' => $iHelpdeskFetcherType, 'FacebookAllow' => $bFacebookAllow, 'FacebookId' => $sFacebookId, 'FacebookSecret' => $sFacebookSecret, 'GoogleAllow' => $bGoogleAllow, 'GoogleId' => $sGoogleSecret, 'GoogleSecret' => $sGoogleId, 'TwitterAllow' => $bTwitterAllow, 'TwitterId' => $sTwitterId, 'TwitterSecret' => $sTwitterSecret, ); } /** * @param int $iIdTenant * @param array $aExcludeEmails = array() * * @return array */ public function GetAgentsEmailsForNotification($iIdTenant, $aExcludeEmails = array()) { $aResult = array(); try { $aResult = $this->oStorage->GetAgentsEmailsForNotification($iIdTenant, $aExcludeEmails); } catch (CApiBaseException $oException) { $this->setLastException($oException); } return $aResult; } /** * @param int $iIdTenant * @param string $sEmail * * @return CHelpdeskUser|null|false */ public function GetUserByEmail($iIdTenant, $sEmail) { $oUser = null; try { $oUser = $this->oStorage->GetUserByEmail($iIdTenant, $sEmail); } catch (CApiBaseException $oException) { $oUser = false; $this->setLastException($oException); } return $oUser; } /** * @param int $iIdTenant * @param string $sEmail * * @return CHelpdeskUser|null|false */ public function GetUserByNotificationEmail($iIdTenant, $sEmail) { $oUser = null; try { $oUser = $this->oStorage->GetUserByNotificationEmail($iIdTenant, $sEmail); } catch (CApiBaseException $oException) { $oUser = false; $this->setLastException($oException); } return $oUser; } public function GetUserBySocialId($iIdTenant, $sSocialId) { $oUser = null; try { $oUser = $this->oStorage->GetUserBySocialId($iIdTenant, $sSocialId); } catch (CApiBaseException $oException) { $oUser = false; $this->setLastException($oException); } return $oUser; } /** * @param CHelpdeskUser $oHelpdeskUser * @return bool */ public function ForgotUser($oHelpdeskUser) { $this->NotifyForgot($oHelpdeskUser); return true; } /** * @param CHelpdeskUser $oHelpdeskUser * @return bool */ public function UserExists(CHelpdeskUser $oHelpdeskUser) { $bResult = false; if(!$oHelpdeskUser->SocialId) { try { $bResult = $this->oStorage->UserExists($oHelpdeskUser); } catch (CApiBaseException $oException) { $bResult = false; $this->setLastException($oException); } } return $bResult; } /** * @param CHelpdeskUser $oHelpdeskUser * @param array $aIdList * * @return array|bool */ public function UserInformation(CHelpdeskUser $oHelpdeskUser, $aIdList) { $mResult = false; try { $mResult = $this->oStorage->UserInformation($oHelpdeskUser, $aIdList); } catch (CApiBaseException $oException) { $mResult = false; $this->setLastException($oException); } return $mResult; } /** * @param CHelpdeskUser $oHelpdeskUser * @return bool */ public function UpdateUser(CHelpdeskUser $oHelpdeskUser) { $bResult = false; try { if ($oHelpdeskUser->Validate()) { $bResult = $this->oStorage->UpdateUser($oHelpdeskUser); if (!$bResult) { $this->moveStorageExceptionToManager(); throw new CApiManagerException(Errs::HelpdeskManager_UserUpdateFailed); } } } catch (CApiBaseException $oException) { $bResult = false; $this->setLastException($oException); } return $bResult; } /** * @param int $iIdTenant * @param int $iIdHelpdeskUser * @return bool */ public function SetUserAsBlocked($iIdTenant, $iIdHelpdeskUser) { $bResult = false; try { $bResult = $this->oStorage->SetUserAsBlocked($iIdTenant, $iIdHelpdeskUser); } catch (CApiBaseException $oException) { $bResult = false; $this->setLastException($oException); } return $bResult; } /** * @param CHelpdeskUser $oHelpdeskUser * @return bool */ public function DeleteUser(CHelpdeskUser $oHelpdeskUser) { $bResult = false; try { $bResult = $this->oStorage->DeleteUser($oHelpdeskUser); // if ($bResult) // { // // TODO // } } catch (CApiBaseException $oException) { $bResult = false; $this->setLastException($oException); } return $bResult; } /** * @param CHelpdeskUser $oHelpdeskUser * @param CHelpdeskThread $oThread * @param array $aPostIds * * @return bool */ public function DeletePosts(CHelpdeskUser $oHelpdeskUser, $oThread, $aPostIds) { $bResult = false; try { if ($oThread instanceof CHelpdeskThread && 0 < count($aPostIds)) { $bResult = $this->oStorage->DeletePosts($oHelpdeskUser, $oThread, $aPostIds); if ($bResult) { $oThread->PostCount = $this->GetPostsCount($oHelpdeskUser, $oThread); $bResult = $this->UpdateThread($oHelpdeskUser, $oThread); } } } catch (CApiBaseException $oException) { $bResult = false; $this->setLastException($oException); } return $bResult; } /** * @param CHelpdeskUser $oHelpdeskUser * @param array $aThreadIds * * @return bool */ public function VerifyThreadIdsBelongToUser(CHelpdeskUser $oHelpdeskUser, $aThreadIds) { $bResult = false; try { if (0 < count($aThreadIds)) { $bResult = $this->oStorage->VerifyThreadIdsBelongToUser($oHelpdeskUser, $aThreadIds); } } catch (CApiBaseException $oException) { $bResult = false; $this->setLastException($oException); } return $bResult; } /** * @param CHelpdeskUser $oHelpdeskUser * @param array $aPostIds * * @return bool */ public function VerifyPostIdsBelongToUser(CHelpdeskUser $oHelpdeskUser, $aPostIds) { $bResult = false; try { if (0 < count($aPostIds)) { $bResult = $this->oStorage->VerifyPostIdsBelongToUser($oHelpdeskUser, $aPostIds); } } catch (CApiBaseException $oException) { $bResult = false; $this->setLastException($oException); } return $bResult; } /** * @param CHelpdeskUser $oHelpdeskUser * @param array $aThreadIds * @param bool $bSetArchive = true * * @return bool */ public function ArchiveThreads(CHelpdeskUser $oHelpdeskUser, $aThreadIds, $bSetArchive = true) { $bResult = false; try { if (0 < count($aThreadIds)) { $bResult = $this->oStorage->ArchiveThreads($oHelpdeskUser, $aThreadIds, $bSetArchive); } } catch (CApiBaseException $oException) { $bResult = false; $this->setLastException($oException); } return $bResult; } /** * @return bool */ public function ArchiveOutdatedThreads() { $bResult = false; try { $bResult = $this->oStorage->ArchiveOutdatedThreads(); } catch (CApiBaseException $oException) { $bResult = false; $this->setLastException($oException); } return $bResult; } /** * @return bool */ public function NotificateOutdatedThreads() { $bResult = false; try { $iIdOwner = 0; $iIdHelpdeskThread = $this->oStorage->NotificateOutdatedThreadID($iIdOwner); if ($iIdHelpdeskThread && $iIdOwner) { $oHelpdeskUser = $this->GetUserByIdWithoutTenantID($iIdOwner); if ($oHelpdeskUser) { $oThread = $this->GetThreadById($oHelpdeskUser, $iIdHelpdeskThread); if ($oThread) { $this->NotifyOutdated($oThread); } } } } catch (CApiBaseException $oException) { $bResult = false; $this->setLastException($oException); } return $bResult; } /** * @param CHelpdeskUser $oHelpdeskUser * @param int $iIdThread * * @return CHelpdeskThread|false */ public function GetThreadById($oHelpdeskUser, $iIdThread) { $oThread = null; try { $oThread = $this->oStorage->GetThreadById($oHelpdeskUser, $iIdThread); if ($oThread) { $aThreadLastPostIds = $this->GetThreadsLastPostIds($oHelpdeskUser, array($oThread->IdHelpdeskThread)); if (isset($aThreadLastPostIds[$oThread->IdHelpdeskThread]) && $oThread->LastPostId === $aThreadLastPostIds[$oThread->IdHelpdeskThread]) { $oThread->IsRead = true; } } } catch (CApiBaseException $oException) { $oThread = false; $this->setLastException($oException); } return $oThread; } /** * @param int $iTenantID * @param string $sHash * * @return int */ public function GetThreadIdByHash($iTenantID, $sHash) { $iThreadID = 0; try { $iThreadID = $this->oStorage->GetThreadIdByHash($iTenantID, $sHash); } catch (CApiBaseException $oException) { $iThreadID = 0; $this->setLastException($oException); } return $iThreadID; } /** * @param CHelpdeskUser $oHelpdeskUser * @param CHelpdeskThread $oHelpdeskThread * @return bool */ public function CreateThread(CHelpdeskUser $oHelpdeskUser, CHelpdeskThread &$oHelpdeskThread) { $bResult = false; try { $bResult = $this->oStorage->CreateThread($oHelpdeskUser, $oHelpdeskThread); if (!$bResult) { $this->moveStorageExceptionToManager(); throw new CApiManagerException(Errs::HelpdeskManager_ThreadCreateFailed); } } catch (CApiBaseException $oException) { $bResult = false; $this->setLastException($oException); } return $bResult; } /** * @param CHelpdeskUser $oHelpdeskUser * @param CHelpdeskThread $oHelpdeskThread * @return bool */ public function UpdateThread(CHelpdeskUser $oHelpdeskUser, CHelpdeskThread $oHelpdeskThread) { $bResult = false; try { $bResult = $this->oStorage->UpdateThread($oHelpdeskUser, $oHelpdeskThread); if (!$bResult) { $this->moveStorageExceptionToManager(); throw new CApiManagerException(Errs::HelpdeskManager_ThreadUpdateFailed); } } catch (CApiBaseException $oException) { $bResult = false; $this->setLastException($oException); } return $bResult; } /** * @return bool|int */ public function GetNextHelpdeskIdForMonitoring() { $mResult = false; if (CApi::GetConf('helpdesk', false)) { if (CApi::GetConf('tenant', false)) { try { $mResult = $this->oStorage->GetNextHelpdeskIdForMonitoring( (int) CApi::GetConf('helpdesk.fetcher-time-limit-in-min', 5)); if (0 >= $mResult) { $mResult = false; } } catch (CApiBaseException $oException) { $this->setLastException($oException); } } else { $mResult = 0; } } return $mResult; } /** * @return bool */ public function StartHelpdesksMailboxMonitor() { $iIdTenant = $this->GetNextHelpdeskIdForMonitoring(); if (false !== $iIdTenant) { $this->oStorage->UpdateHelpdeskFetcherTimer($iIdTenant); $this->StartMailboxMonitor($iIdTenant); } return true; } /** * @return int */ public function GetHelpdeskMailboxLastUid($iIdTenant, $sEmail) { $iResult = 0; try { $iResult = $this->oStorage->GetHelpdeskMailboxLastUid($iIdTenant, $sEmail); } catch (CApiBaseException $oException) { $this->setLastException($oException); } return $iResult; } /** * @return bool */ public function SetHelpdeskMailboxLastUid($iIdTenant, $sEmail, $iLastUid) { $bResult = false; try { $bResult = $this->oStorage->SetHelpdeskMailboxLastUid($iIdTenant, $sEmail, $iLastUid); } catch (CApiBaseException $oException) { $this->setLastException($oException); } return $bResult; } /** * @todo * @return bool */ public function StartMailboxMonitor($iIdTenant) { $aMainSettingsData = $this->GetHelpdeskMainSettings($iIdTenant); if (!empty($aMainSettingsData['AdminEmailAccount']) && 0 < $aMainSettingsData['HelpdeskFetcherType']) { $oApiUsers = $this->apiUsers(); $oApiMail = $this->apiMail(); $oApiFileCache = /* @var $oApiFileCache \CApiFilecacheManager */ \CApi::Manager('filecache'); $oApiFilestorage = /* @var $oApiFileCache \CApiFilestorageManager */ \CApi::Manager('filestorage'); $oApiIntegrator = /* @var $oApiIntegrator \CApiIntegratorManager */ \CApi::Manager('integrator'); if ($oApiUsers && $oApiMail && $oApiFileCache) { $oAccount = $oApiUsers->GetAccountOnLogin($aMainSettingsData['AdminEmailAccount']); if ($oAccount) { $iPrevLastUid = $this->GetHelpdeskMailboxLastUid($iIdTenant, \strtolower($oAccount->Email)); $iLastUid = 0; $aData = $oApiMail->HelpdeskMessagesHelper($oAccount, 0 < $iPrevLastUid ? $iPrevLastUid + 1 : 0, $iLastUid); if (0 < $iLastUid) { $this->SetHelpdeskMailboxLastUid($iIdTenant, \strtolower($oAccount->Email), $iLastUid); } if (is_array($aData) && 0 < count($aData)) { foreach ($aData as $oMessage) { $aMatch = array(); $oFrom = $oMessage->From(); $aFrom = $oFrom ? $oFrom->GetAsArray() : array(); $oAttachments = $oMessage->Attachments(); $aAttachments = $oAttachments ? $oAttachments->GetAsArray() : array(); $sSubject = $oMessage->Subject(); if ( is_array($aFrom) && 0 < count($aFrom) && ( (EHelpdeskFetcherType::REPLY === $aMainSettingsData['HelpdeskFetcherType'] && !empty($sSubject) && preg_match('/\[#([a-zA-Z0-9]+)#\]/', $sSubject, $aMatch)) || (EHelpdeskFetcherType::ALL === $aMainSettingsData['HelpdeskFetcherType']) )) { $sThreadHash = ''; $aMatch = array(); if (preg_match('/\[#([a-zA-Z0-9]+)#\]/', $sSubject, $aMatch) && !empty($aMatch[1])) { $sThreadHash = (string) $aMatch[1]; } $oEmail = $aFrom[0]; $sEmail = $oEmail ? $oEmail->GetEmail() : ''; $oHelpdeskUser = null; if (0 < \strlen($sEmail)) { $oHelpdeskUser = $this->GetUserByEmail($iIdTenant, $sEmail); if (!$oHelpdeskUser) { $sPassword = md5(microtime(true)); $oHelpdeskUser = $oApiIntegrator->RegisterHelpdeskAccount($iIdTenant, $sEmail, '', $sPassword, true); } if ($oHelpdeskUser) { $oThread = null; if (!empty($sThreadHash)) { $iThreadID = $this->GetThreadIdByHash($iIdTenant, $sThreadHash); if (0 < $iThreadID) { $oThread = $this->GetThreadById($oHelpdeskUser, $iThreadID); } } else { $oThread = new \CHelpdeskThread(); $oThread->IdTenant = $iIdTenant; $oThread->IdOwner = $oHelpdeskUser->IdHelpdeskUser; $oThread->Type = \EHelpdeskThreadType::Pending; $oThread->Subject = $sSubject; if (!$this->CreateThread($oHelpdeskUser, $oThread)) { $oThread = null; } } if ($oThread) { $sText = trim($oMessage->Html()); if (0 === strlen($sText)) { $sText = trim($oMessage->Plain()); } else { $sText = \MailSo\Base\HtmlUtils::ConvertHtmlToPlain($sText); } $oPost = new \CHelpdeskPost(); $oPost->IdTenant = $oHelpdeskUser->IdTenant; $oPost->IdOwner = $oHelpdeskUser->IdHelpdeskUser; $oPost->IdHelpdeskThread = $oThread->IdHelpdeskThread; $oPost->Type = \EHelpdeskPostType::Normal; $oPost->SystemType = \EHelpdeskPostSystemType::None; $oPost->Text = $sText; $aResultAttachment = array(); if (is_array($aAttachments) && 0 < count($aAttachments)) { foreach ($aAttachments as /* @var $oAttachment CApiMailAttachment */ $oAttachment) { $sUploadName = $oAttachment->FileName(true); $sTempName = md5($sUploadName.rand(1000, 9999)); $oApiMail->MessageMimeStream($oAccount, function($rResource, $sContentType, $sFileName, $sMimeIndex = '') use ($oHelpdeskUser, &$sTempName, $oApiFileCache) { if (!$oApiFileCache->PutFile($oHelpdeskUser, $sTempName, $rResource)) { $sTempName = ''; } }, $oAttachment->Folder(), $oAttachment->Uid(), $oAttachment->MimeIndex()); $rData = 0 < \strlen($sTempName) ? $oApiFileCache->GetFile($oHelpdeskUser, $sTempName) : null; if ($rData) { $iFileSize = $oApiFileCache->FileSize($oHelpdeskUser, $sTempName); $sThreadID = (string) $oThread->IdHelpdeskThread; $sThreadID = str_pad($sThreadID, 2, '0', STR_PAD_LEFT); $sThreadIDSubFolder = substr($sThreadID, 0, 2); $sThreadFolderName = API_HELPDESK_PUBLIC_NAME.'/'.$sThreadIDSubFolder.'/'.$sThreadID; $oApiFilestorage->CreateFolder($oHelpdeskUser, \EFileStorageType::Corporate, '', $sThreadFolderName); $oApiFilestorage->CreateFile($oHelpdeskUser, \EFileStorageType::Corporate, $sThreadFolderName, $sUploadName, $rData, false); if (is_resource($rData)) { @fclose($rData); } $oAttachment = new \CHelpdeskAttachment(); $oAttachment->IdHelpdeskThread = $oThread->IdHelpdeskThread; $oAttachment->IdHelpdeskPost = $oPost->IdHelpdeskPost; $oAttachment->IdOwner = $oHelpdeskUser->IdHelpdeskUser; $oAttachment->IdTenant = $oHelpdeskUser->IdTenant; $oAttachment->FileName = $sUploadName; $oAttachment->SizeInBytes = $iFileSize; $oAttachment->EncodeHash($oHelpdeskUser, $sThreadFolderName); $oApiFileCache->Clear($oHelpdeskUser, $sTempName); $aResultAttachment[] = $oAttachment; } } if (is_array($aResultAttachment) && 0 < count($aResultAttachment)) { $oPost->Attachments = $aResultAttachment; } } $this->CreatePost($oHelpdeskUser, $oThread, $oPost, false, false); } } } } unset($oMessage); } } } } } return true; } /** * @return bool */ public function StartMailboxMonitorPrev($iIdTenant) { $aData = $this->GetHelpdeskMainSettings($iIdTenant); if (!empty($aData['AdminEmailAccount']) && 0 < $aData['HelpdeskFetcherType']) { $oApiUsers = $this->apiUsers(); $oApiMail = $this->apiMail(); $oApiFileCache = /* @var $oApiFileCache \CApiFilecacheManager */ \CApi::Manager('filecache'); $oApiFilestorage = /* @var $oApiFileCache \CApiFilestorageManager */ \CApi::Manager('filestorage'); if ($oApiUsers && $oApiMail && $oApiFileCache) { $oAccount = $oApiUsers->GetAccountOnLogin($aData['AdminEmailAccount']); if ($oAccount) { $iPrevLastUid = $this->GetHelpdeskMailboxLastUid($iIdTenant, \strtolower($oAccount->Email)); $iLastUid = 0; $aData = $oApiMail->HelpdeskMessagesHelper($oAccount, 0 < $iPrevLastUid ? $iPrevLastUid + 1 : 0, $iLastUid); if (0 < $iLastUid) { $this->SetHelpdeskMailboxLastUid($iIdTenant, \strtolower($oAccount->Email), $iLastUid); } if (is_array($aData) && 0 < count($aData)) { foreach ($aData as $oMessage) { $aMatch = array(); $oFrom = $oMessage->From(); $aFrom = $oFrom ? $oFrom->GetAsArray() : array(); $oAttachments = $oMessage->Attachments(); $aAttachments = $oAttachments ? $oAttachments->GetAsArray() : array(); $sSubject = $oMessage->Subject(); if (is_array($aFrom) && 0 < count($aFrom) && !empty($sSubject) && preg_match('/\[#([a-zA-Z0-9]+)#\]/', $sSubject, $aMatch) && !empty($aMatch[1])) { $oEmail = $aFrom[0]; $sEmail = $oEmail ? $oEmail->GetEmail() : ''; if (0 < \strlen($sEmail)) { $oHelpdeskUser = $this->GetUserByEmail($iIdTenant, $sEmail); if ($oHelpdeskUser) { $sThreadHash = (string) $aMatch[1]; if (!empty($sThreadHash)) { $iThreadID = $this->GetThreadIdByHash($iIdTenant, $sThreadHash); if (0 < $iThreadID) { $oThread = $this->GetThreadById($oHelpdeskUser, $iThreadID); if ($oThread) { $sText = trim($oMessage->Html()); if (0 === strlen($sText)) { $sText = trim($oMessage->Plain()); } else { $sText = \MailSo\Base\HtmlUtils::ConvertHtmlToPlain($sText); } $oPost = new \CHelpdeskPost(); $oPost->IdTenant = $oHelpdeskUser->IdTenant; $oPost->IdOwner = $oHelpdeskUser->IdHelpdeskUser; $oPost->IdHelpdeskThread = $oThread->IdHelpdeskThread; $oPost->Type = \EHelpdeskPostType::Normal; $oPost->SystemType = \EHelpdeskPostSystemType::None; $oPost->Text = $sText; $aResultAttachment = array(); if (is_array($aAttachments) && 0 < count($aAttachments)) { foreach ($aAttachments as /* @var $oAttachment CApiMailAttachment */ $oAttachment) { $sUploadName = $oAttachment->FileName(true); $sTempName = md5($sUploadName.rand(1000, 9999)); $oApiMail->MessageMimeStream($oAccount, function($rResource, $sContentType, $sFileName, $sMimeIndex = '') use ($oHelpdeskUser, &$sTempName, $oApiFileCache) { if (!$oApiFileCache->PutFile($oHelpdeskUser, $sTempName, $rResource)) { $sTempName = ''; } }, $oAttachment->Folder(), $oAttachment->Uid(), $oAttachment->MimeIndex()); $rData = 0 < \strlen($sTempName) ? $oApiFileCache->GetFile($oHelpdeskUser, $sTempName) : null; if ($rData) { $iFileSize = $oApiFileCache->FileSize($oHelpdeskUser, $sTempName); $sThreadID = (string) $oThread->IdHelpdeskThread; $sThreadID = str_pad($sThreadID, 2, '0', STR_PAD_LEFT); $sThreadIDSubFolder = substr($sThreadID, 0, 2); $sThreadFolderName = API_HELPDESK_PUBLIC_NAME.'/'.$sThreadIDSubFolder.'/'.$sThreadID; $oApiFilestorage->CreateFolder($oHelpdeskUser, \EFileStorageType::Corporate, '', $sThreadFolderName); $oApiFilestorage->CreateFile($oHelpdeskUser, \EFileStorageType::Corporate, $sThreadFolderName, $sUploadName, $rData, false); if (is_resource($rData)) { @fclose($rData); } $oAttachment = new \CHelpdeskAttachment(); $oAttachment->IdHelpdeskThread = $oThread->IdHelpdeskThread; $oAttachment->IdHelpdeskPost = $oPost->IdHelpdeskPost; $oAttachment->IdOwner = $oHelpdeskUser->IdHelpdeskUser; $oAttachment->IdTenant = $oHelpdeskUser->IdTenant; $oAttachment->FileName = $sUploadName; $oAttachment->SizeInBytes = $iFileSize; $oAttachment->EncodeHash($oHelpdeskUser, $sThreadFolderName); $oApiFileCache->Clear($oHelpdeskUser, $sTempName); $aResultAttachment[] = $oAttachment; } } if (is_array($aResultAttachment) && 0 < count($aResultAttachment)) { $oPost->Attachments = $aResultAttachment; } } $this->CreatePost($oHelpdeskUser, $oThread, $oPost, false, false); } } } } } } unset($oMessage); } } } } } return true; } private function getOwnerFromSearch($iIdTenant, &$sSearch) { $aMatch = array(); $sSearch = trim($sSearch); if (0 < strlen($sSearch) && preg_match('/owner:[\s]?([^\s]+@[^\s]+)/', $sSearch, $aMatch) && !empty($aMatch[0]) && !empty($aMatch[1])) { $sSearch = trim(str_replace($aMatch[0], '', $sSearch)); $sEmail = trim($aMatch[1]); $oUser = $this->GetUserByEmail($iIdTenant, $sEmail); if (!$oUser) { $oUser = $this->GetUserByNotificationEmail($iIdTenant, $sEmail); } return $oUser ? $oUser->IdHelpdeskUser : 0; } return 0; } /** * @param CHelpdeskUser $oHelpdeskUser * @param int $iFilter = EHelpdeskThreadFilterType::All * @param string $sSearch = '' * * @return int */ public function GetThreadsCount(CHelpdeskUser $oHelpdeskUser, $iFilter = EHelpdeskThreadFilterType::All, $sSearch = '') { $iResult = 0; try { $iSearchOwner = $this->getOwnerFromSearch($oHelpdeskUser->IdTenant, $sSearch); $iResult = $this->oStorage->GetThreadsCount($oHelpdeskUser, $iFilter, $sSearch, $iSearchOwner); } catch (CApiBaseException $oException) { $this->setLastException($oException); } return $iResult; } /** * @param CHelpdeskUser $oHelpdeskUser * @param int $iOffset = 0 * @param int $iLimit = 20 * @param int $iFilter = EHelpdeskThreadFilterType::All * @param string $sSearch = '' * * @return array|bool */ public function GetThreads(CHelpdeskUser $oHelpdeskUser, $iOffset = 0, $iLimit = 20, $iFilter = EHelpdeskThreadFilterType::All, $sSearch = '') { $aResult = null; try { $iSearchOwner = $this->getOwnerFromSearch($oHelpdeskUser->IdTenant, $sSearch); $aResult = $this->oStorage->GetThreads($oHelpdeskUser, $iOffset, $iLimit, $iFilter, $sSearch, $iSearchOwner); if (is_array($aResult) && 0 < count($aResult)) { $aThreadsIdList = array(); foreach ($aResult as $oItem) { $aThreadsIdList[] = $oItem->IdHelpdeskThread; } $aThreadLastPostIds = $this->GetThreadsLastPostIds($oHelpdeskUser, $aThreadsIdList); if (is_array($aThreadLastPostIds) && 0 < count($aThreadLastPostIds)) { foreach ($aResult as &$oItem) { if (isset($aThreadLastPostIds[$oItem->IdHelpdeskThread]) && $oItem->LastPostId === $aThreadLastPostIds[$oItem->IdHelpdeskThread]) { $oItem->IsRead = true; } } } } } catch (CApiBaseException $oException) { $this->setLastException($oException); } return $aResult; } /** * @param CHelpdeskUser $oHelpdeskUser * @param CHelpdeskThread $oThread * * @return int */ public function GetPostsCount(CHelpdeskUser $oHelpdeskUser, $oThread) { $iResult = 0; try { $iResult = $this->oStorage->GetPostsCount($oHelpdeskUser, $oThread); } catch (CApiBaseException $oException) { $this->setLastException($oException); } return $iResult; } /** * @param CHelpdeskUser $oHelpdeskUser * @param array $aThreadIds * * @return array|bool */ public function GetThreadsLastPostIds(CHelpdeskUser $oHelpdeskUser, $aThreadIds) { $mResult = false; try { $mResult = $this->oStorage->GetThreadsLastPostIds($oHelpdeskUser, $aThreadIds); } catch (CApiBaseException $oException) { $this->setLastException($oException); } return $mResult; } /** * @param CHelpdeskUser $oHelpdeskUser * @param CHelpdeskThread $oHelpdeskThread * * @return array|bool */ public function GetAttachments(CHelpdeskUser $oHelpdeskUser, CHelpdeskThread $oHelpdeskThread) { $aResult = null; try { $aResult = $this->oStorage->GetAttachments($oHelpdeskUser, $oHelpdeskThread); } catch (CApiBaseException $oException) { $this->setLastException($oException); } return $aResult; } /** * @param CHelpdeskUser $oHelpdeskUser * @param CHelpdeskThread $oThread * @param int $iStartFromId = 0 * @param int $iLimit = 20 * * @return array|bool */ public function GetPosts(CHelpdeskUser $oHelpdeskUser, $oThread, $iStartFromId = 0, $iLimit = 20) { $aResult = null; try { $aResult = $this->oStorage->GetPosts($oHelpdeskUser, $oThread, $iStartFromId, $iLimit); } catch (CApiBaseException $oException) { $this->setLastException($oException); } return $aResult; } /** * @param int $iTimeoutInMin = 15 * * @return bool */ public function ClearAllOnline($iTimeoutInMin = 15) { $bResult = false; if (0 < $iTimeoutInMin) { try { $bResult = $this->oStorage->ClearAllOnline($iTimeoutInMin); } catch (CApiBaseException $oException) { $this->setLastException($oException); } } return $bResult; } /** * @param CHelpdeskUser $oHelpdeskUser * @param int $iThreadID * * @return array|bool */ public function GetOnline(CHelpdeskUser $oHelpdeskUser, $iThreadID) { $aResult = false; if ($oHelpdeskUser && $oHelpdeskUser->IsAgent) { try { $aResult = $this->oStorage->GetOnline($oHelpdeskUser, $iThreadID); } catch (CApiBaseException $oException) { $this->setLastException($oException); } } return $aResult; } /** * @param CHelpdeskUser $oHelpdeskUser * @param int $iThreadID * * @return bool */ public function SetOnline(CHelpdeskUser $oHelpdeskUser, $iThreadID) { $bResult = false; if ($oHelpdeskUser) { try { $bResult = $this->oStorage->SetOnline($oHelpdeskUser, $iThreadID); } catch (CApiBaseException $oException) { $this->setLastException($oException); } } return $bResult; } /** * @param CHelpdeskUser $oUser * * @return bool */ public function NotifyForgot($oUser) { if ($oUser) { $oFromAccount = null; $aData = $this->GetHelpdeskMainSettings($oUser->IdTenant); if (!empty($aData['AdminEmailAccount'])) { $oApiUsers = $this->apiUsers(); if ($oApiUsers) { $oFromAccount = $oApiUsers->GetAccountOnLogin($aData['AdminEmailAccount']); } } $sSiteName = isset($aData['SiteName']) ? $aData['SiteName'] : $sSiteName; if ($oFromAccount) { $oApiMail = $this->apiMail(); if ($oApiMail) { $sEmail = $oUser->ResultEmail(); if (empty($sEmail)) { return false; } $oFromEmail = \MailSo\Mime\Email::NewInstance($oFromAccount->Email, $sSiteName); $oToEmail = \MailSo\Mime\Email::NewInstance($sEmail, $oUser->Name); $oUserMessage = $this->buildUserMail(PSEVEN_APP_ROOT_PATH.'templates/helpdesk/user.forgot.html', $oFromEmail->ToString(), $oToEmail->ToString(), 'Forgot', '', '', $oUser, $sSiteName); $oApiMail->MessageSend($oFromAccount, $oUserMessage); } } } } /** * @param CHelpdeskUser $oUser * @param bool $bCreateFromFetcher = false * * @return bool */ public function NotifyRegistration($oUser, $bCreateFromFetcher = false) { if ($oUser) { $oFromAccount = null; $aData = $this->GetHelpdeskMainSettings($oUser->IdTenant); if (!empty($aData['AdminEmailAccount'])) { $oApiUsers = $this->apiUsers(); if ($oApiUsers) { $oFromAccount = $oApiUsers->GetAccountOnLogin($aData['AdminEmailAccount']); } } $sSiteName = isset($aData['SiteName']) ? $aData['SiteName'] : $sSiteName; if ($oFromAccount) { $oApiMail = $this->apiMail(); if ($oApiMail) { $sEmail = $oUser->ResultEmail(); if (empty($sEmail)) { return false; } $oFromEmail = \MailSo\Mime\Email::NewInstance($oFromAccount->Email, $sSiteName); $oToEmail = \MailSo\Mime\Email::NewInstance($sEmail, $oUser->Name); $oUserMessage = $this->buildUserMail(PSEVEN_APP_ROOT_PATH.'templates/helpdesk/user.registration'.($bCreateFromFetcher ? '.fetcher' : '').'.html', $oFromEmail->ToString(), $oToEmail->ToString(), 'Registration', '', '', $oUser, $sSiteName); $oApiMail->MessageSend($oFromAccount, $oUserMessage); } } } } /** * @param CHelpdeskThread $oThread * @param CHelpdeskPost $oPost * @param bool $bIsNew = false * * @return bool */ public function NotifyPost($oThread, $oPost, $bIsNew = false) { if ($oThread && $oPost) { $oFromAccount = null; $aData = $this->GetHelpdeskMainSettings($oPost->IdTenant); if (!empty($aData['AdminEmailAccount'])) { $oApiUsers = $this->apiUsers(); if ($oApiUsers) { $oFromAccount = $oApiUsers->GetAccountOnLogin($aData['AdminEmailAccount']); } } $sSiteName = isset($aData['SiteName']) ? $aData['SiteName'] : ''; $oHelpdeskThreadOwnerUser = $this->GetUserById($oThread->IdTenant, $oThread->IdOwner); // mail notifications if ($oFromAccount && $oHelpdeskThreadOwnerUser) { $oApiMail = $this->apiMail(); if ($oApiMail) { $oHelpdeskPostOwnerUser = $this->GetUserById($oPost->IdTenant, $oPost->IdOwner); $aDeMail = array(); $sEmail = $oHelpdeskThreadOwnerUser->ResultEmail(); if (empty($sEmail)) { return false; } $oHelpdeskSenderEmail = \MailSo\Mime\Email::NewInstance($oFromAccount->Email, $sSiteName); $oThreadOwnerEmail = \MailSo\Mime\Email::NewInstance($sEmail, $oHelpdeskThreadOwnerUser->Name); if (EHelpdeskPostType::Normal === $oPost->Type && ($bIsNew || $oHelpdeskThreadOwnerUser->IdHelpdeskUser !== $oPost->IdOwner)) { $oUserMessage = $this->buildPostMail(PSEVEN_APP_ROOT_PATH.'templates/helpdesk/user.post'.($bIsNew ? '.new' : '').'.html', $oHelpdeskSenderEmail->ToString(), $oThreadOwnerEmail->ToString(), 'New Post', '', '', $oHelpdeskThreadOwnerUser, $oHelpdeskPostOwnerUser, $oThread, $oPost, $sSiteName); if ($oUserMessage) { $aDeMail[] = $oHelpdeskThreadOwnerUser->ResultEmail(); $oApiMail->MessageSend($oFromAccount, $oUserMessage); } } if (EHelpdeskPostType::Internal === $oPost->Type || $oHelpdeskThreadOwnerUser->IdHelpdeskUser === $oPost->IdOwner) { $aDeMail[] = $oHelpdeskThreadOwnerUser->ResultEmail(); } if (0 < count($aDeMail)) { $aDeMail = array_unique($aDeMail); } $aAgents = $this->GetAgentsEmailsForNotification($oPost->IdTenant, $aDeMail); if (is_array($aAgents) && 0 < count($aAgents)) { $oAgentMessage = $this->buildPostMail(PSEVEN_APP_ROOT_PATH.'templates/helpdesk/agent.post.html', $oHelpdeskSenderEmail->ToString(), is_array($aAgents) && 0 < count($aAgents) ? implode(', ', $aAgents) : '', 'New Post', '', '', $oHelpdeskThreadOwnerUser, $oHelpdeskPostOwnerUser, $oThread, $oPost, $sSiteName); if ($oAgentMessage) { $oApiMail->MessageSend($oFromAccount, $oAgentMessage); } } } } } } /** * @param CHelpdeskThread $oThread * * @return bool */ public function NotifyOutdated($oThread) { if ($oThread) { $oFromAccount = null; $aData = $this->GetHelpdeskMainSettings($oThread->IdTenant); if (!empty($aData['AdminEmailAccount'])) { $oApiUsers = $this->apiUsers(); if ($oApiUsers) { $oFromAccount = $oApiUsers->GetAccountOnLogin($aData['AdminEmailAccount']); } } $sSiteName = isset($aData['SiteName']) ? $aData['SiteName'] : ''; $oHelpdeskThreadOwnerUser = $this->GetUserById($oThread->IdTenant, $oThread->IdOwner); // mail notifications if ($oFromAccount && $oHelpdeskThreadOwnerUser) { $oApiMail = $this->apiMail(); if ($oApiMail) { $oHelpdeskPostOwnerUser = $this->GetUserById($oThread->IdTenant, $oThread->IdOwner); $sEmail = $oHelpdeskThreadOwnerUser->ResultEmail(); if (empty($sEmail)) { return false; } $oHelpdeskSenderEmail = \MailSo\Mime\Email::NewInstance($oFromAccount->Email, $sSiteName); $oThreadOwnerEmail = \MailSo\Mime\Email::NewInstance($sEmail, $oHelpdeskThreadOwnerUser->Name); if ($oHelpdeskThreadOwnerUser->IdHelpdeskUser === $oThread->IdOwner) { $oUserMessage = $this->buildPostMail(PSEVEN_APP_ROOT_PATH.'templates/helpdesk/user.post.notification.html', $oHelpdeskSenderEmail->ToString(), $oThreadOwnerEmail->ToString(), 'New Post', '', '', $oHelpdeskThreadOwnerUser, $oHelpdeskPostOwnerUser, $oThread, null, $sSiteName); if ($oUserMessage) { $oApiMail->MessageSend($oFromAccount, $oUserMessage); } } } } } } /** * @param CHelpdeskUser $oHelpdeskUser * @param CHelpdeskThread $oThread * @param CHelpdeskPost $oPost * @param bool $bIsNew = false * @param bool $bSendNotify = true * * @return bool */ public function CreatePost(CHelpdeskUser $oHelpdeskUser, $oThread, CHelpdeskPost $oPost, $bIsNew = false, $bSendNotify = true) { $bResult = false; try { if ($oPost->Validate()) { if ($oPost->Type === EHelpdeskPostType::Internal && !$oHelpdeskUser->IsAgent) { $oPost->Type = EHelpdeskPostType::Normal; } if ($oHelpdeskUser->IsAgent && !$bIsNew && $oHelpdeskUser->IdHelpdeskUser !== $oThread->IdOwner) { if ($oPost->Type !== EHelpdeskPostType::Internal) { $oThread->Type = EHelpdeskThreadType::Answered; } } else { $oThread->Type = EHelpdeskThreadType::Pending; } $bResult = $this->oStorage->CreatePost($oHelpdeskUser, $oPost); if (!$bResult) { $this->moveStorageExceptionToManager(); throw new CApiManagerException(Errs::HelpdeskManager_PostCreateFailed); } else { if (is_array($oPost->Attachments) && 0 < count($oPost->Attachments)) { $this->oStorage->AddAttachments($oHelpdeskUser, $oThread, $oPost, $oPost->Attachments); } $oThread->Updated = time(); $oThread->PostCount = $this->GetPostsCount($oHelpdeskUser, $oThread); $oThread->LastPostId = $oPost->IdHelpdeskPost; $oThread->LastPostOwnerId = $oPost->IdOwner; $oThread->Notificated = false; if (!$oThread->HasAttachments) { $oThread->HasAttachments = is_array($oPost->Attachments) && 0 < count($oPost->Attachments); } $bResult = $this->UpdateThread($oHelpdeskUser, $oThread); $this->SetThreadSeen($oHelpdeskUser, $oThread); if ($bSendNotify) { $this->NotifyPost($oThread, $oPost, $bIsNew); } } } } catch (CApiBaseException $oException) { $bResult = false; $this->setLastException($oException); } return $bResult; } /** * @param CHelpdeskUser $oHelpdeskUser * @param CHelpdeskThread $oHelpdeskThread * * @return bool */ public function SetThreadSeen(CHelpdeskUser $oHelpdeskUser, $oHelpdeskThread) { $bResult = false; try { $bResult = $this->oStorage->SetThreadSeen($oHelpdeskUser, $oHelpdeskThread); } catch (CApiBaseException $oException) { $bResult = false; $this->setLastException($oException); } return $bResult; } /** * @return bool */ public function ClearUnregistredUsers() { $mResult = false; try { $mResult = $this->oStorage->ClearUnregistredUsers(); } catch (CApiBaseException $oException) { $this->setLastException($oException); } return $mResult; } }