getModuleName();
if ($moduleName == 'HelpDesk') {
$ticketId = $entityData->getId();
$adb->pquery('UPDATE vtiger_ticketcf SET from_portal=0 WHERE ticketid=?', array($ticketId));
}
}
// Создаем уведомление при создании новой заявки
// Используем aftersave.final, чтобы ID точно был присвоен
if($eventName == 'vtiger.entity.aftersave.final') {
$moduleName = $entityData->getModuleName();
if ($moduleName == 'HelpDesk' && $entityData->isNew()) {
try {
$this->createTicketNotification($entityData);
} catch (Exception $e) {
// Логируем ошибку, но не останавливаем создание заявки
file_put_contents('logs/helpdesk_notifications.log', date('Y-m-d H:i:s').' - ОШИБКА: '.$e->getMessage().PHP_EOL, FILE_APPEND);
}
}
}
}
/**
* Создание уведомления для ответственного при создании новой заявки
*/
function createTicketNotification($entityData) {
global $adb;
// getId() в этом контексте возвращает уже числовой ID, а не WebService ID
$ticketId = $entityData->getId();
if (empty($ticketId)) {
return false;
}
$ticketNo = $entityData->get('ticket_no');
$ticketTitle = $entityData->get('ticket_title');
$wsAssignedUserId = $entityData->get('assigned_user_id');
if (empty($wsAssignedUserId)) {
return false;
}
// assigned_user_id может быть как в WebService формате (19x8), так и просто числом (8)
if (strpos($wsAssignedUserId, 'x') !== false) {
$userIdParts = explode('x', $wsAssignedUserId);
$userId = $userIdParts[1];
} else {
$userId = $wsAssignedUserId;
}
// Формируем текст уведомления
// Обрезаем заголовок до 80 символов для краткости
$shortTitle = mb_strlen($ticketTitle) > 80 ? mb_substr($ticketTitle, 0, 80) . '...' : $ticketTitle;
$notificationTitle = "Новая заявка " . $ticketNo . " - " . $shortTitle;
// Формируем ссылку на заявку (VDNotifierPro убирает index.php? из ссылки)
$ticketLink = "module=HelpDesk&view=Detail&record=" . $ticketId;
// Проверяем, нет ли уже непрочитанного уведомления для этой заявки
$checkQuery = "SELECT id FROM vtiger_vdnotifierpro WHERE userid = ? AND crmid = ? AND modulename = 'HelpDesk' AND status = 5";
$checkResult = $adb->pquery($checkQuery, array($userId, $ticketId));
if ($adb->num_rows($checkResult) > 0) {
// Обновляем существующее уведомление
$existingId = $adb->query_result($checkResult, 0, 'id');
$updateQuery = "UPDATE vtiger_vdnotifierpro SET title = ?, modifiedtime = NOW() WHERE id = ?";
$adb->pquery($updateQuery, array($notificationTitle, $existingId));
return $existingId;
} else {
// Создаем новое уведомление
$insertQuery = "INSERT INTO vtiger_vdnotifierpro (userid, modulename, crmid, modiuserid, link, title, action, modifiedtime, status) VALUES (?, 'HelpDesk', ?, 0, ?, ?, '', NOW(), 5)";
$adb->pquery($insertQuery, array($userId, $ticketId, $ticketLink, $notificationTitle));
$notificationId = $adb->getLastInsertID();
return $notificationId;
}
}
}
function HelpDesk_nofifyOnPortalTicketCreation($entityData) {
global $HELPDESK_SUPPORT_NAME,$HELPDESK_SUPPORT_EMAIL_ID;
$adb = PearDatabase::getInstance();
$moduleName = $entityData->getModuleName();
$wsId = $entityData->getId();
$parts = explode('x', $wsId);
$entityId = $parts[1];
$ownerIdInfo = getRecordOwnerId($entityId);
if(!empty($ownerIdInfo['Users'])) {
$ownerId = $ownerIdInfo['Users'];
$to_email = getUserEmailId('id',$ownerId);
}
if(!empty($ownerIdInfo['Groups'])) {
$ownerId = $ownerIdInfo['Groups'];
$to_email = implode(',', getDefaultAssigneeEmailIds($ownerId));
}
$wsParentId = $entityData->get('contact_id');
$parentIdParts = explode('x', $wsParentId);
$parentId = $parentIdParts[1];
//SalesPlatform.ru begin
$subject = " [ ".getTranslatedString('Ticket No', $moduleName)." ".$entityData->get('ticket_no')." ] ".$entityData->get('ticket_title');
$contents = " ".getTranslatedString('Ticket No', $moduleName)." ".$entityData->get('ticket_no'). "
".getTranslatedString('Ticket ID', $moduleName).": ".$entityId."
".getTranslatedString('Ticket Title', $moduleName).": ".
$entityData->get('ticket_title')."
".$entityData->get('description');
/*$subject = "[From Portal] " .$entityData->get('ticket_no')." [ Ticket ID : $entityId ] ".$entityData->get('ticket_title');
$contents = ' Ticket No : '.$entityData->get('ticket_no'). '
Ticket ID : '.$entityId.'
Ticket Title : '.
$entityData->get('ticket_title').'
'.$entityData->get('description');*/
//SalesPlatform.ru end
//get the contact email id who creates the ticket from portal and use this email as from email id in email
$result = $adb->pquery("SELECT email, concat (firstname,' ',lastname) as name FROM vtiger_contactdetails WHERE contactid=?", array($parentId));
$contact_email = $adb->query_result($result,0,'email');
$name = $adb->query_result($result, 0, 'name');
$from_email = $contact_email;
//send mail to assigned to user
$mail_status = send_mail('HelpDesk',$to_email,$name,$HELPDESK_SUPPORT_EMAIL_ID,$subject,$contents);
//send mail to the customer(contact who creates the ticket from portal)
$mail_status = send_mail('Contacts',$contact_email,$HELPDESK_SUPPORT_NAME,$HELPDESK_SUPPORT_EMAIL_ID,$subject,$contents);
}
function HelpDesk_notifyOnPortalTicketComment($entityData) {
$adb = PearDatabase::getInstance();
$moduleName = $entityData->getModuleName();
$wsId = $entityData->getId();
$parts = explode('x', $wsId);
$entityId = $parts[1];
$ownerIdInfo = getRecordOwnerId($entityId);
if(!empty($ownerIdInfo['Users'])) {
$ownerId = $ownerIdInfo['Users'];
$ownerName = getOwnerName($ownerId);
$to_email = getUserEmailId('id',$ownerId);
}
if(!empty($ownerIdInfo['Groups'])) {
$ownerId = $ownerIdInfo['Groups'];
$groupInfo = getGroupName($ownerId);
$ownerName = $groupInfo[0];
$to_email = implode(',', getDefaultAssigneeEmailIds($ownerId));
}
$wsParentId = $entityData->get('contact_id');
$parentIdParts = explode('x', $wsParentId);
$parentId = $parentIdParts[1];
$entityDelta = new VTEntityDelta();
$oldComments = $entityDelta->getOldValue($entityData->getModuleName(), $entityId, 'comments');
$newComments = $entityDelta->getCurrentValue($entityData->getModuleName(), $entityId, 'comments');
$commentDiff = str_replace($oldComments, '', $newComments);
$latestComment = strip_tags($commentDiff);
//send mail to the assigned to user when customer add comment
$subject = getTranslatedString('LBL_RESPONSE_TO_TICKET_NUMBER', $moduleName). ' : ' .$entityData->get('ticket_no'). ' ' .getTranslatedString('LBL_CUSTOMER_PORTAL', $moduleName);
$contents = getTranslatedString('Dear', $moduleName)." ".$ownerName.","."
"
.getTranslatedString('LBL_CUSTOMER_COMMENTS', $moduleName)."
".$latestComment."
"
.getTranslatedString('LBL_RESPOND', $moduleName)."
"
.getTranslatedString('LBL_REGARDS', $moduleName)."
"
.getTranslatedString('LBL_SUPPORT_ADMIN', $moduleName);
//get the contact email id who creates the ticket from portal and use this email as from email id in email
$result = $adb->pquery("SELECT lastname, firstname, email FROM vtiger_contactdetails WHERE contactid=?", array($parentId));
$customername = $adb->query_result($result,0,'firstname').' '.$adb->query_result($result,0,'lastname');
$customername = decode_html($customername);//Fix to display the original UTF-8 characters in sendername instead of ascii characters
$from_email = $adb->query_result($result,0,'email');
send_mail('HelpDesk',$to_email,'',$from_email,$subject,$contents);
}
function HelpDesk_notifyParentOnTicketChange($entityData) {
global $HELPDESK_SUPPORT_NAME,$HELPDESK_SUPPORT_EMAIL_ID;
$adb = PearDatabase::getInstance();
$moduleName = $entityData->getModuleName();
$wsId = $entityData->getId();
$parts = explode('x', $wsId);
$entityId = $parts[1];
$isNew = $entityData->isNew();
if(!$isNew) {
$reply = 'Re : ';
} else {
$reply = '';
}
// SalesPlatform.ru begin
$subject = ' [ '.getTranslatedString('Ticket No', $moduleName)
.' '.$entityData->get('ticket_no').' ] '.$reply.$entityData->get('ticket_title');
$bodysubject = getTranslatedString('Ticket No', $moduleName) ." " . $entityData->get('ticket_no') . "
"
.getTranslatedString('LBL_SUBJECT', $moduleName) . " " . $entityData->get('ticket_title') . "
"
.getTranslatedString('Status', $moduleName) . ": " . getTranslatedString($entityData->get('ticketstatus'), $moduleName);
// $subject = $entityData->get('ticket_no') . " [ Ticket Id : $entityId ] " . $reply . $entityData->get('ticket_title');
// SalesPlatform.ru end
$emailoptout = 0;
$wsContactId = $entityData->get('contact_id');
$contactId = explode('x', $wsContactId);
$wsAccountId = $entityData->get('parent_id');
$accountId = explode('x', $wsAccountId);
//To get the emailoptout vtiger_field value and then decide whether send mail about the tickets or not
if(!empty($contactId[0])) {
$result = $adb->pquery('SELECT email, emailoptout, lastname, firstname FROM vtiger_contactdetails WHERE
contactid=?', array($contactId[1]));
$emailoptout = $adb->query_result($result,0,'emailoptout');
$parent_email = $contact_mailid = $adb->query_result($result,0,'email');
$parentname = $adb->query_result($result,0,'firstname').' '.$adb->query_result($result,0,'firstname');
//Get the status of the vtiger_portal user. if the customer is active then send the vtiger_portal link in the mail
if($parent_email != '') {
$sql = "SELECT * FROM vtiger_portalinfo WHERE user_name=?";
$isPortalUser = $adb->query_result($adb->pquery($sql, array($contact_mailid)),0,'isactive');
}
} elseif(!empty($accountId[0])) {
$result = $adb->pquery("SELECT accountname, emailoptout, email1 FROM vtiger_account WHERE accountid=?",
array($accountId[1]));
$emailoptout = $adb->query_result($result,0,'emailoptout');
$parent_email = $adb->query_result($result,0,'email1');
$parentname = $adb->query_result($result,0,'accountname');
}
//added condition to check the emailoptout(this is for contacts and vtiger_accounts.)
if($emailoptout == 0) {
if($isPortalUser == 1) {
$email_body = HelpDesk::getTicketEmailContents($entityData);
} else {
$email_body = HelpDesk::getTicketEmailContents($entityData);
}
if($isNew) {
// SalesPlatform.ru begin
//send_mail('HelpDesk',$parent_email,$HELPDESK_SUPPORT_NAME,$HELPDESK_SUPPORT_EMAIL_ID,$subject,$email_body);
if($isPortalUser == 1){
$url = "".$mod_strings['LBL_TICKET_DETAILS']."";
$email_body = $bodysubject.'
'.HelpDesk::getPortalTicketEmailContents($entityData, true);
} else {
$email_body = HelpDesk::getTicketEmailContents($entityData);
}
$mail_status = send_mail('HelpDesk',$parent_email,$HELPDESK_SUPPORT_NAME,$HELPDESK_SUPPORT_EMAIL_ID,$subject,$email_body);
// SalesPlatform.ru end
} else {
$entityDelta = new VTEntityDelta();
$statusHasChanged = $entityDelta->hasChanged($entityData->getModuleName(), $entityId, 'ticketstatus');
$solutionHasChanged = $entityDelta->hasChanged($entityData->getModuleName(), $entityId, 'solution');
$descriptionHasChanged = $entityDelta->hasChanged($entityData->getModuleName(), $entityId, 'description');
// SalesPlatform.ru begin
if(($statusHasChanged && $entityData->get('ticketstatus') == "Closed") || $commentsHasChanged || $solutionHasChanged) {
if($isPortalUser == 1){
$url = "".$mod_strings['LBL_TICKET_DETAILS']."";
$email_body = $bodysubject.'
'.HelpDesk::getPortalTicketEmailContents($entityData, false, $statusHasChanged, $solutionHasChanged, $ownerHasChanged, $commentsHasChanged);
} else {
$email_body = HelpDesk::getTicketEmailContents($entityData);
}
//if(($statusHasChanged && $entityData->get('ticketstatus') == "Closed") || $solutionHasChanged || $descriptionHasChanged) {
// SalesPlatform.ru end
send_mail('HelpDesk',$parent_email,$HELPDESK_SUPPORT_NAME,$HELPDESK_SUPPORT_EMAIL_ID,$subject,$email_body);
}
}
}
}
function HelpDesk_notifyOwnerOnTicketChange($entityData) {
global $HELPDESK_SUPPORT_NAME,$HELPDESK_SUPPORT_EMAIL_ID;
$moduleName = $entityData->getModuleName();
$wsId = $entityData->getId();
$parts = explode('x', $wsId);
$entityId = $parts[1];
$isNew = $entityData->isNew();
if(!$isNew) {
$reply = 'Re : ';
} else {
$reply = '';
}
// SalesPlatform.ru begin
$subject = ' [ '.getTranslatedString('Ticket No', $moduleName)
.' '.$entityData->get('ticket_no').' ] '.$reply.$entityData->get('ticket_title');
//$subject = getTranslatedString('LBL_TICKET_NUMBER', $moduleName). ' : ' .$entityData->get('ticket_no'). ' ' .$reply.$entityData->get('ticket_title');
// SalesPlatform.ru end
$email_body = HelpDesk::getTicketEmailContents($entityData, true);
if(PerformancePrefs::getBoolean('NOTIFY_OWNER_EMAILS', true) === true){
//send mail to the assigned to user and the parent to whom this ticket is assigned
require_once('modules/Emails/mail.php');
$wsAssignedUserId = $entityData->get('assigned_user_id');
$userIdParts = explode('x', $wsAssignedUserId);
$ownerId = $userIdParts[1];
$ownerType = vtws_getOwnerType($ownerId);
if($ownerType == 'Users') {
$to_email = getUserEmailId('id',$ownerId);
}
if($ownerType == 'Groups') {
$to_email = implode(',', getDefaultAssigneeEmailIds($ownerId));
}
if($to_email != '') {
if($isNew) {
$mail_status = send_mail('HelpDesk',$to_email,$HELPDESK_SUPPORT_NAME,$HELPDESK_SUPPORT_EMAIL_ID,$subject,$email_body);
} else {
$entityDelta = new VTEntityDelta();
$statusHasChanged = $entityDelta->hasChanged($entityData->getModuleName(), $entityId, 'ticketstatus');
$solutionHasChanged = $entityDelta->hasChanged($entityData->getModuleName(), $entityId, 'solution');
$ownerHasChanged = $entityDelta->hasChanged($entityData->getModuleName(), $entityId, 'assigned_user_id');
$descriptionHasChanged = $entityDelta->hasChanged($entityData->getModuleName(), $entityId, 'description');
if(($statusHasChanged && $entityData->get('ticketstatus') == "Closed") || $solutionHasChanged || $ownerHasChanged || $descriptionHasChanged) {
$mail_status = send_mail('HelpDesk',$to_email,$HELPDESK_SUPPORT_NAME,$HELPDESK_SUPPORT_EMAIL_ID,$subject,$email_body);
}
}
$mail_status_str = $to_email."=".$mail_status."&&&";
} else {
$mail_status_str = "'".$to_email."'=0&&&";
}
if ($mail_status != '') {
$mail_error_status = getMailErrorString($mail_status_str);
}
}
}
?>