PATH:
home
/
letacommog
/
crmleta
/
modules
/
MailManager
/
views
<?php /*+********************************************************************************** * The contents of this file are subject to the vtiger CRM Public License Version 1.1 * ("License"); You may not use this file except in compliance with the License * The Original Code is: vtiger CRM Open Source * The Initial Developer of the Original Code is vtiger. * Portions created by vtiger are Copyright (C) vtiger. * All Rights Reserved. ************************************************************************************/ include_once 'config.php'; require_once 'include/utils/utils.php'; include_once 'include/Webservices/Query.php'; require_once 'include/Webservices/QueryRelated.php'; require_once 'includes/runtime/Cache.php'; include_once 'include/Webservices/DescribeObject.php'; require_once 'modules/Vtiger/helpers/Util.php'; include_once 'modules/Settings/MailConverter/handlers/MailScannerAction.php'; include_once 'modules/Settings/MailConverter/handlers/MailAttachmentMIME.php'; include_once 'modules/MailManager/MailManager.php'; class MailManager_Relation_View extends MailManager_Abstract_View { /** * Used to check the MailBox connection * @var Boolean */ protected $skipConnection = false; /** To avoid working with mailbox */ protected function getMailboxModel() { if ($this->skipConnection) return false; return parent::getMailboxModel(); } /** * List of modules used to match the Email address * @var Array */ static $MODULES = array ( 'Contacts', 'Accounts', 'Leads', 'HelpDesk', 'Potentials'); /** * Process the request to perform relationship operations * @global Users Instance $currentUserModel * @global PearDataBase Instance $adb * @global String $currentModule * @param Vtiger_Request $request * @return boolean */ public function process(Vtiger_Request $request) { $currentUserModel = Users_Record_Model::getCurrentUserModel(); $response = new MailManager_Response(true); $viewer = $this->getViewer($request); if ('find' == $this->getOperationArg($request)) { // Check if the message is already linked. $msgUid = $request->get('_msguid'); if(!empty($msgUid)) { $linkedto = MailManager_Relate_Action::associatedLink($request->get('_msguid')); } // If the message was not linked, lookup for matching records, using FROM address if (empty($linkedto)) { $results = array(); $allowedModules = $this->getCurrentUserMailManagerAllowedModules(); foreach (self::$MODULES as $MODULE) { if(!in_array($MODULE, $allowedModules)) continue; //lookup will be from email other than sent mail folder $lookupEmail = $request->get('_mfrom'); $foldername = $request->get('_folder'); $connector = $this->getConnector($foldername); $folder = $connector->folderInstance($foldername); $isSentFolder = $folder->isSentFolder(); //if its sent folder, lookup email will be first TO email if($isSentFolder) { $toEmail = $request->get('_mto'); $toEmail = explode(',', $toEmail); $lookupEmail = $toEmail[0]; } if(empty($lookupEmail)) continue; $lookupResults = $this->lookupModuleRecordsWithEmail($MODULE, $lookupEmail); foreach ($lookupResults as $lookupResult) { if(array_key_exists('parent', $lookupResult)) { $results[getSalesEntityType($lookupResult['id'])][] = $lookupResult; }else{ $results[$MODULE][] = $lookupResult; } } } $viewer->assign('LOOKUPS', $results); } else { $viewer->assign('LINKEDTO', $linkedto); } $jsFileNames = array("~libraries/jquery/instaFilta/instafilta.min.js"); $jsScriptInstances = $this->checkAndConvertJsScripts($jsFileNames); $viewer->assign('HEADER_SCRIPTS', $jsScriptInstances); $viewer->assign('LINK_TO_AVAILABLE_ACTIONS', $this->linkToAvailableActions()); $viewer->assign('ALLOWED_MODULES', $allowedModules); $viewer->assign('MSGNO', $request->get('_msgno')); $viewer->assign('FOLDER', $request->get('_folder')); $response->setResult( array( 'ui' => $viewer->view( 'Relationship.tpl', 'MailManager', true ) ) ); } else if ('link' == $this->getOperationArg($request)) { $linkto = $request->get('_mlinkto'); $foldername = $request->get('_folder'); $connector = $this->getConnector($foldername); // This is to handle larger uploads $memory_limit = MailManager_Config_Model::get('MEMORY_LIMIT'); ini_set('memory_limit', $memory_limit); $mail = $connector->openMail($request->get('_msgno'), $foldername); $mail->attachments(); // Initialize attachments $linkedto = MailManager_Relate_Action::associate($mail, $linkto); $viewer->assign('LINK_TO_AVAILABLE_ACTIONS', $this->linkToAvailableActions()); $viewer->assign('ALLOWED_MODULES', $this->getCurrentUserMailManagerAllowedModules()); $viewer->assign('LINKEDTO', $linkedto); $viewer->assign('MSGNO', $request->get('_msgno')); $viewer->assign('FOLDER', $foldername); $response->setResult( array( 'ui' => $viewer->view( 'Relationship.tpl', 'MailManager', true ) ) ); } else if ('create_wizard' == $this->getOperationArg($request)) { $moduleName = $request->get('_mlinktotype'); if(!vtlib_isModuleActive($moduleName) && $moduleName != 'Events') { $response->setResult(array('error'=>vtranslate('LBL_OPERATION_NOT_PERMITTED', $moduleName))); return $response; } if($moduleName == 'Events' && !vtlib_isModuleActive('Calendar')) { $response->setResult(array('error'=>vtranslate('LBL_OPERATION_NOT_PERMITTED', $moduleName))); return $response; } $parent = $request->get('_mlinkto'); $foldername = $request->get('_folder'); $connector = $this->getConnector($foldername); $mail = $connector->openMail($request->get('_msgno'), $foldername); $folder = $connector->folderInstance($foldername); $isSentFolder = $folder->isSentFolder(); $formData = $this->processFormData($mail, $isSentFolder); foreach ($formData as $key => $value) { $request->set($key, $value); } $linkedto = MailManager_Relate_Action::getSalesEntityInfo($parent); switch ($moduleName) { case 'HelpDesk' : $from = $mail->from(); if ($parent) { if($linkedto['module'] == 'Contacts') { $referenceFieldName = 'contact_id'; } elseif ($linkedto['module'] == 'Accounts') { $referenceFieldName = 'parent_id'; } $request->set($referenceFieldName, $this->setParentForHelpDesk($parent, $from)); } break; case 'Potentials' : if ($parent) { if($linkedto['module'] == 'Contacts') { $referenceFieldName = 'contact_id'; } elseif ($linkedto['module'] == 'Accounts') { $referenceFieldName = 'related_to'; } $request->set($referenceFieldName, $request->get('_mlinkto')); } break; case 'Events' : case 'Calendar' : if ($parent) { if($linkedto['module'] == 'Contacts') { $referenceFieldName = 'contact_id'; } elseif ($linkedto['module'] == 'Accounts') { $referenceFieldName = 'parent_id'; } $request->set($referenceFieldName, $parent); } break; } $request->set('module', $moduleName); // Delegate QuickCreate FormUI to the target view controller of module. $quickCreateviewClassName = $moduleName . '_QuickCreateAjax_View'; if (!class_exists($quickCreateviewClassName)) { $quickCreateviewClassName = 'Vtiger_QuickCreateAjax_View'; } $quickCreateViewController = new $quickCreateviewClassName(); $quickCreateViewController->process($request); // UI already sent $response = false; } else if ('create' == $this->getOperationArg($request)) { $linkModule = $request->get('_mlinktotype'); if(!vtlib_isModuleActive($linkModule)) { $response->setResult(array('ui'=>'', 'error'=>vtranslate('LBL_OPERATION_NOT_PERMITTED', $moduleName))); return $response; } $parent = $request->get('_mlinkto'); $foldername = $request->get('_folder'); if(!empty($foldername)) { // This is to handle larger uploads $memory_limit = MailManager_Config_Model::get('MEMORY_LIMIT'); ini_set('memory_limit', $memory_limit); $connector = $this->getConnector($foldername); $mail = $connector->openMail($request->get('_msgno'), $foldername); $attachments = $mail->attachments(); // Initialize attachments } $linkedto = MailManager_Relate_Action::getSalesEntityInfo($parent); $recordModel = Vtiger_Record_Model::getCleanInstance($linkModule); $fields = $recordModel->getModule()->getFields(); foreach ($fields as $fieldName => $fieldModel) { if ($request->has($fieldName)) { $fieldValue = $request->get($fieldName); $fieldDataType = $fieldModel->getFieldDataType(); if($fieldDataType == 'time') { $fieldValue = Vtiger_Time_UIType::getTimeValueWithSeconds($fieldValue); } $recordModel->set($fieldName, $fieldValue); } } // Newly added field for source of created record if($linkModule != "ModComments"){ $recordModel->set('source','Mail Manager'); } switch ($linkModule) { case 'Calendar' : $activityType = $recordModel->get('activitytype'); if (!$activityType) { $activityType = 'Task'; } $recordModel->set('activitytype', $activityType); //Start Date and Time values $startTime = Vtiger_Time_UIType::getTimeValueWithSeconds($request->get('time_start')); $startDateTime = Vtiger_Datetime_UIType::getDBDateTimeValue($request->get('date_start')." ".$startTime); list($startDate, $startTime) = explode(' ', $startDateTime); $recordModel->set('date_start', $startDate); $recordModel->set('time_start', $startTime); //End Date and Time values $endDate = Vtiger_Date_UIType::getDBInsertedValue($request->get('due_date')); if ($activityType != 'Task') { $endTime = Vtiger_Time_UIType::getTimeValueWithSeconds($request->get('time_end')); $endDateTime = Vtiger_Datetime_UIType::getDBDateTimeValue($request->get('due_date')." ".$endTime); list($endDate, $endTime) = explode(' ', $endDateTime); } else { $endTime = ''; } $recordModel->set('time_end', $endTime); $recordModel->set('due_date', $endDate); if($parent) { if($linkedto['module'] == 'Contacts') { $recordModel->set('contact_id', $parent); } else { $recordModel->set('parent_id', $parent); } } $recordModel->set('visibility', 'Public'); break; case 'HelpDesk' : $from = $mail->from(); if ($parent) { if($linkedto['module'] == 'Contacts') { $referenceFieldName = 'contact_id'; } elseif ($linkedto['module'] == 'Accounts') { $referenceFieldName = 'parent_id'; } } if(!$request->has($referenceFieldName)) { $recordModel->set($referenceFieldName, $this->setParentForHelpDesk($parent, $from)); } break; case 'ModComments': $recordModel->set('assigned_user_id', $currentUserModel->getId()); $recordModel->set('commentcontent', $request->getRaw('commentcontent')); $recordModel->set('userid', $currentUserModel->getId()); $recordModel->set('creator', $currentUserModel->getId()); $recordModel->set('related_to', $parent); break; } try { $recordModel->save(); // This condition is added so that emails are not created for Tickets and Todo without Parent, // as there is no way to relate them if(empty($parent) && $linkModule != 'HelpDesk' && $linkModule != 'Calendar') { $linkedto = MailManager_Relate_Action::associate($mail, $recordModel->getId()); } if ($linkModule === 'Calendar') { // Handled to save follow up event $followupMode = $request->get('followup'); //Start Date and Time values $startTime = Vtiger_Time_UIType::getTimeValueWithSeconds($request->get('followup_time_start')); $startDateTime = Vtiger_Datetime_UIType::getDBDateTimeValue($request->get('followup_date_start') . " " . $startTime); list($startDate, $startTime) = explode(' ', $startDateTime); $subject = $request->get('subject'); if($followupMode == 'on' && $startTime != '' && $startDate != '') { $recordModel->set('eventstatus', 'Planned'); $recordModel->set('subject', '[Followup] '.$subject); $recordModel->set('date_start', $startDate); $recordModel->set('time_start', $startTime); $currentUser = Users_Record_Model::getCurrentUserModel(); $activityType = $recordModel->get('activitytype'); if($activityType == 'Call') { $minutes = $currentUser->get('callduration'); } else { $minutes = $currentUser->get('othereventduration'); } $dueDateTime = date('Y-m-d H:i:s', strtotime("$startDateTime+$minutes minutes")); list($startDate, $startTime) = explode(' ', $dueDateTime); $recordModel->set('due_date', $startDate); $recordModel->set('time_end', $startTime); $recordModel->set('recurringtype', ''); $recordModel->set('mode', 'create'); $recordModel->save(); } } // add attachments to the tickets as Documents if($linkModule == 'HelpDesk' && !empty($attachments)) { $relationController = new MailManager_Relate_Action(); $relationController->__SaveAttachements($mail, $linkModule, $recordModel); } $viewer->assign('MSGNO', $request->get('_msgno')); $viewer->assign('LINKEDTO', $linkedto); $viewer->assign('ALLOWED_MODULES', $this->getCurrentUserMailManagerAllowedModules()); $viewer->assign('LINK_TO_AVAILABLE_ACTIONS', $this->linkToAvailableActions()); $viewer->assign('FOLDER', $foldername); $response->setResult( array( 'ui' => $viewer->view( 'Relationship.tpl', 'MailManager', true ) ) ); } catch (DuplicateException $e) { $response->setResult(array('ui' => '', 'error' => $e, 'title' => $e->getMessage(), 'message' => $e->getDuplicationMessage())); } catch(Exception $e) { $response->setResult( array( 'ui' => '', 'error' => $e )); } } else if ('savedraft' == $this->getOperationArg($request)) { $connector = $this->getConnector('__vt_drafts'); $draftResponse = $connector->saveDraft($request); $response->setResult($draftResponse); } else if ('saveattachment' == $this->getOperationArg($request)) { $connector = $this->getConnector('__vt_drafts'); $uploadResponse = $connector->saveAttachment($request); $response->setResult($uploadResponse); } else if ('commentwidget' == $this->getOperationArg($request)) { $viewer->assign('LINKMODULE', $request->get('_mlinktotype')); $viewer->assign('PARENT', $request->get('_mlinkto')); $viewer->assign('MSGNO', $request->get('_msgno')); $viewer->assign('FOLDER', $request->get('_folder')); $viewer->assign('MODULE', $request->getModule()); $viewer->view( 'MailManagerCommentWidget.tpl', 'MailManager' ); $response = false; } return $response; } /** * Returns the Parent for Tickets module * @global Users Instance $currentUserModel * @param Integer $parent - crmid of Parent * @param Email Address $from - Email Address of the received mail * @return Integer - Parent(crmid) */ public function setParentForHelpDesk($parent, $from) { $currentUserModel = Users_Record_Model::getCurrentUserModel(); if(empty($parent)) { if(!empty($from)) { $parentInfo = MailManager::lookupMailInVtiger($from[0], $currentUserModel); if(!empty($parentInfo[0]['record'])) { $parentId = vtws_getIdComponents($parentInfo[0]['record']); return $parentId[1]; } } } else { return $parent; } } /** * Function used to set the record fields with the information from mail. * @param Array $qcreate_array * @param MailManager_Message_Model $mail * @return Array */ public function processFormData($mail, $isSentFolder = false) { $subject = $mail->subject(); $email = $mail->from(); if($isSentFolder) { $email = $mail->to(); if(!empty($email)) $mail_address = implode(',', $email); } else { if(!empty($email)) $mail_address = implode(',', $email); } if(!empty($mail_address)) $name = explode('@', $mail_address); if(!empty($name[1])) $companyName = explode('.', $name[1]); $defaultFieldValueMap = array( 'lastname' => $name[0], 'email' => $email[0], 'email1' => $email[0], 'accountname' => $companyName[0], 'company' => $companyName[0], 'ticket_title' => $subject, 'potentialname' => $subject, 'subject' => $subject, 'title' => $subject, ); return $defaultFieldValueMap; } /** * Returns the available List of accessible modules for Mail Manager * @return Array */ public function getCurrentUserMailManagerAllowedModules() { $moduleListForCreateRecordFromMail = array('Contacts', 'Accounts', 'Leads', 'HelpDesk', 'Calendar', 'Potentials'); foreach($moduleListForCreateRecordFromMail as $module) { if(MailManager::checkModuleWriteAccessForCurrentUser($module)) { $mailManagerAllowedModules[] = $module; } } return $mailManagerAllowedModules; } /** * Returns the list of accessible modules on which Actions(Relationship) can be taken. * @return string */ public function linkToAvailableActions() { $moduleListForLinkTo = array('Calendar','HelpDesk','ModComments','Emails','Potentials'); foreach($moduleListForLinkTo as $module) { if(MailManager::checkModuleWriteAccessForCurrentUser($module)) { $mailManagerAllowedModules[] = $module; } } return $mailManagerAllowedModules; } /** * Helper function to scan for relations */ protected $wsDescribeCache = array(); public function ws_describe($module) { $currentUserModel = Users_Record_Model::getCurrentUserModel(); if (!isset($this->wsDescribeCache[$module])) { $this->wsDescribeCache[$module] = vtws_describe( $module, $currentUserModel); } return $this->wsDescribeCache[$module]; } /** * Funtion used to build Web services query * @param String $module - Name of the module * @param String $text - Search String * @param String $type - Tyoe of fields Phone, Email etc * @return String */ public function buildSearchQuery($module, $text, $type) { $describe = $this->ws_describe($module); // to check whether fields are accessible to current_user or not $labelFields = explode(',',$describe['labelFields']); //overwrite labelfields with field names instead of column names $currentUserModel = vglobal('current_user'); $handler = vtws_getModuleHandlerFromName($module, $currentUserModel); $meta = $handler->getMeta(); $fieldColumnMapping = $meta->getFieldColumnMapping(); $columnFieldMapping = array_flip($fieldColumnMapping); foreach ($labelFields as $i => $columnname) { $labelFields[$i] = $columnFieldMapping[$columnname]; } foreach($labelFields as $fieldName){ foreach($describe['fields'] as $describefield){ if($describefield['name'] == $fieldName){ $searchFields[] = $fieldName; break; } } } $whereClause = ''; foreach($describe['fields'] as $field) { if (strcasecmp($type, $field['type']['name']) === 0) { $whereClause .= sprintf( " %s LIKE '%%%s%%' OR", $field['name'], $text ); } } return sprintf( "SELECT %s FROM %s WHERE %s;", implode(',',$searchFields), $module, rtrim($whereClause, 'OR') ); } /** * Returns the List of Matching records with the Email Address * @global Users Instance $currentUserModel * @param String $module * @param Email Address $email * @return Array */ public function lookupModuleRecordsWithEmail($module, $email) { $currentUserModel = vglobal('current_user'); $results = array(); $activeEmailFields = null; $handler = vtws_getModuleHandlerFromName($module, $currentUserModel); $meta = $handler->getMeta(); $emailFields = $meta->getEmailFields(); $moduleFields = $meta->getModuleFields(); foreach($emailFields as $emailFieldName){ $emailFieldInstance = $moduleFields[$emailFieldName]; if(!(((int)$emailFieldInstance->getPresence()) == 1)) { $activeEmailFields[] = $emailFieldName; } } //before calling vtws_query, need to check Active Email Fields are there or not if(count($activeEmailFields) > 0) { $query = $this->buildSearchQuery($module, $email, 'EMAIL'); $qresults = vtws_query( $query, $currentUserModel ); $describe = $this->ws_describe($module); $labelFields = explode(',', $describe['labelFields']); //overwrite labelfields with field names instead of column names $fieldColumnMapping = $meta->getFieldColumnMapping(); $columnFieldMapping = array_flip($fieldColumnMapping); foreach ($labelFields as $i => $columnname) { $labelFields[$i] = $columnFieldMapping[$columnname]; } foreach($qresults as $qresult) { $labelValues = array(); foreach($labelFields as $fieldname) { if(isset($qresult[$fieldname])) $labelValues[] = $qresult[$fieldname]; } $ids = vtws_getIdComponents($qresult['id']); $results[] = array( 'wsid' => $qresult['id'], 'id' => $ids[1], 'label' => implode(' ', $labelValues)); } } if(!empty($results)) { foreach ($results as $result) { $relResults = $this->lookupRelModuleRecords($result['wsid']); $results = array_merge($results, $relResults); } } return $results; } /** * Function to lookup rel records(which supports emails only) of records * @param <string> $wsId * @return <array> $results */ public function lookupRelModuleRecords($wsId) { $currentUser = vglobal('current_user'); $results = array(); /* Harcoded to fecth only project records. In future we should treat * below $relModules array as modules which support emails and related to * parent module. */ $relModules = array('Project'); $db = PearDatabase::getInstance(); $wsObject = VtigerWebserviceObject::fromId($db, $wsId); $entityName = $wsObject->getEntityName(); foreach ($relModules as $relModule) { $relation = Vtiger_Relation_Model::getInstanceByModuleName($entityName, $relModule); if(!$relation) { continue; } $relDescribe = $this->ws_describe($relModule); $labelFields = explode(',', $relDescribe['labelFields']); $relHandler = vtws_getModuleHandlerFromName($relModule, $currentUser); $relMeta = $relHandler->getMeta(); //overwrite labelfields with field names instead of column names $fieldColumnMapping = $relMeta->getFieldColumnMapping(); $columnFieldMapping = array_flip($fieldColumnMapping); foreach ($labelFields as $i => $columnname) { $labelFields[$i] = $columnFieldMapping[$columnname]; } $sql = sprintf("SELECT %s FROM %s", implode(',', $labelFields),$relModule); $relQResults = vtws_query_related($sql, $wsId, $relation->get('label'), $currentUser); foreach($relQResults as $qresult) { $labelValues = array(); foreach($labelFields as $fieldname) { if(isset($qresult[$fieldname])) $labelValues[] = $qresult[$fieldname]; } $ids = vtws_getIdComponents($qresult['id']); $results[] = array( 'wsid' => $qresult['id'], 'id' => $ids[1], 'label' => implode(' ', $labelValues),'parent' => $wsId); } } return $results; } public function validateRequest(Vtiger_Request $request) { return $request->validateWriteAccess(); } } ?>
[+]
..
[-] Search.php
[edit]
[-] Relation.php
[edit]
[-] ComposeEmail.php
[edit]
[-] Draft.php
[edit]
[-] MassActionAjax.php
[edit]
[-] List.php
[edit]
[-] Mail.php
[edit]
[-] MainUI.php
[edit]
[-] Abstract.php
[edit]
[-] Folder.php
[edit]
[-] Index.php
[edit]
[-] Settings.php
[edit]