/** * Process the request to perform relationship operations * @global Users Instance $current_user * @global PearDataBase Instance $adb * @global String $currentModule * @param MailManager_Request $request * @return boolean */ function process(MailManager_Request $request) { global $current_user, $adb; $response = new MailManager_Response(true); $viewer = $this->getViewer(); if ('find' == $request->getOperationArg()) { $this->skipConnection = true; // No need to connect to mailbox here, improves performance // Check if the message is already linked. //$linkedto = MailManager_RelationControllerAction::associatedLink($request->get('_msguid')); // If the message was not linked, lookup for matching records, using FROM address //if (empty($linkedto)) { $msguid = $request->get('_msguid'); $results = array(); $modules = array(); $allowedModules = $this->getCurrentUserMailManagerAllowedModules(); foreach (self::$MODULES as $MODULE) { if (!in_array($MODULE, $allowedModules)) { continue; } $from = $request->get('_mfrom'); if (empty($from)) { continue; } $results[$MODULE] = $this->lookupModuleRecordsWithEmail($MODULE, $from, $msguid); $describe = $this->ws_describe($MODULE); $modules[$MODULE] = array('label' => $describe['label'], 'name' => textlength_check($describe['name']), 'id' => $describe['idPrefix']); // If look is found in a module, skip rest. - for performance //if (!empty($results[$MODULE])) break; } $viewer->assign('LOOKUPS', $results); $viewer->assign('MODULES', $modules); //} else { // $viewer->assign('LINKEDTO', $linkedto); //} $viewer->assign('LinkToAvailableActions', $this->linkToAvailableActions()); $viewer->assign('AllowedModules', $allowedModules); $viewer->assign('MSGNO', $request->get('_msgno')); $viewer->assign('FOLDER', $request->get('_folder')); $response->setResult(array('ui' => $viewer->fetch($this->getModuleTpl('Relationship.tpl')))); } else { if ('link' == $request->getOperationArg()) { $linkto = $request->get('_mlinkto'); $foldername = $request->get('_folder'); $connector = $this->getConnector($foldername); // This is to handle larger uploads $memory_limit = ConfigPrefs::get('MEMORY_LIMIT'); ini_set('memory_limit', $memory_limit); $mail = $connector->openMail($request->get('_msgno')); $mail->attachments(); // Initialize attachments $linkedto = MailManager_RelationControllerAction::associate($mail, $linkto); $viewer->assign('LinkToAvailableActions', $this->linkToAvailableActions()); $viewer->assign('AllowedModules', $this->getCurrentUserMailManagerAllowedModules()); $viewer->assign('LINKEDTO', $linkedto); $viewer->assign('MSGNO', $request->get('_msgno')); $viewer->assign('FOLDER', $foldername); $response->setResult(array('ui' => $viewer->fetch($this->getModuleTpl('Relationship.tpl')))); } else { if ('create_wizard' == $request->getOperationArg()) { global $currentModule; $moduleName = $request->get('_mlinktotype'); $parent = $request->get('_mlinkto'); $foldername = $request->get('_folder'); $connector = $this->getConnector($foldername); $mail = $connector->openMail($request->get('_msgno')); $qcreate_array = QuickCreate($moduleName); $validationData = $qcreate_array['data']; $data = split_validationdataArray($validationData); $qcreate_array['form'] = $this->processFormData($qcreate_array['form'], $mail); $viewer->assign("QUICKCREATE", $qcreate_array['form']); if ($moduleName == 'Calendar') { $viewer->assign("QCMODULE", getTranslatedString('Todo', 'Calendar')); } elseif ($moduleName == "HelpDesk") { $viewer->assign("QCMODULE", getTranslatedString('Ticket', 'HelpDesk')); } else { $viewer->assign("QCMODULE", getTranslatedString("SINGLE_" . $moduleName, $moduleName)); } $viewer->assign("PARENT", $parent); $viewer->assign("MODULE", $moduleName); $viewer->assign('MSGNO', $request->get('_msgno')); $viewer->assign('FOLDER', $foldername); $viewer->assign("VALIDATION_DATA_FIELDNAME", $data['fieldname']); $viewer->assign("VALIDATION_DATA_FIELDDATATYPE", $data['datatype']); $viewer->assign("VALIDATION_DATA_FIELDLABEL", $data['fieldlabel']); $viewer->display($this->getModuleTpl('Relationship.CreateWizard.tpl')); $response = false; } else { if ('create' == $request->getOperationArg()) { $linkModule = $request->get('_mlinktotype'); $parent = $request->get('_mlinkto'); $focus = CRMEntity::getInstance($linkModule); // This is added as ModComments module has a bug that will not initialize column_fields // Basically $currentModule is set to MailManager, so the fields are not set properly. if (empty($focus->column_fields)) { $focus->column_fields = getColumnFields($linkModule); } setObjectValuesFromRequest($focus); if ($request->get('assigntype') == 'U') { $focus->column_fields['assigned_user_id'] = $request->get('assigned_user_id'); } elseif ($request->get('assigntype') == 'T') { $focus->column_fields['assigned_user_id'] = $request->get('assigned_group_id'); } $foldername = $request->get('_folder'); if (!empty($foldername)) { // This is to handle larger uploads $memory_limit = ConfigPrefs::get('MEMORY_LIMIT'); ini_set('memory_limit', $memory_limit); $connector = $this->getConnector($foldername); $mail = $connector->openMail($request->get('_msgno')); $attachments = $mail->attachments(); // Initialize attachments } $linkedto = MailManager_RelationControllerAction::getSalesEntityInfo($parent); switch ($linkModule) { case 'Calendar': if (empty($focus->column_fields['activitytype'])) { $focus->column_fields['activitytype'] = 'Task'; } if (empty($focus->column_fields['due_date'])) { if (!empty($focus->column_fields['date_start'])) { $dateStart = getValidDBInsertDateValue($focus->column_fields['date_start']); $focus->column_fields['due_date'] = date("Y-m-d", strtotime(date("Y-m-d", strtotime($dateStart)) . " +1 day")); } else { $focus->column_fields['due_date'] = date('Y-m-d', strtotime("+1 day")); } } if (!empty($parent)) { if ($linkedto['module'] == 'Contacts') { $focus->column_fields['contact_id'] = $parent; } else { $focus->column_fields['parent_id'] = $parent; } } break; case 'HelpDesk': $from = $mail->from(); $focus->column_fields['parent_id'] = $this->setParentForHelpDesk($parent, $from); break; case 'ModComments': $focus->column_fields['assigned_user_id'] = $current_user->id; $focus->column_fields['creator'] = $current_user->id; $focus->column_fields['related_to'] = $parent; break; } try { $focus->save($linkModule); // This condition is added so that emails are not created for Todo without Parent, // as there is no way to relate them if (empty($parent) && $linkModule != 'Calendar') { $linkedto = MailManager_RelationControllerAction::associate($mail, $focus->id); } // add attachments to the tickets as Documents if (in_array($linkModule, array('HelpDesk', 'Potentials', 'Project', 'ProjectTask')) && !empty($attachments)) { $relationController = new MailManager_RelationControllerAction(); $relationController->__SaveAttachements($mail, $linkModule, $focus); } $viewer->assign('MSGNO', $request->get('_msgno')); $viewer->assign('LINKEDTO', $linkedto); $viewer->assign('AllowedModules', $this->getCurrentUserMailManagerAllowedModules()); $viewer->assign('LinkToAvailableActions', $this->linkToAvailableActions()); $viewer->assign('FOLDER', $foldername); $response->setResult(array('ui' => $viewer->fetch($this->getModuleTpl('Relationship.tpl')))); } catch (Exception $e) { $response->setResult(array('ui' => '', 'error' => $e)); } } else { if ('savedraft' == $request->getOperationArg()) { $connector = $this->getConnector('__vt_drafts'); $draftResponse = $connector->saveDraft($request); $response->setResult($draftResponse); } else { if ('saveattachment' == $request->getOperationArg()) { $connector = $this->getConnector('__vt_drafts'); $uploadResponse = $connector->saveAttachment($request); $response->setResult($uploadResponse); } else { if ('commentwidget' == $request->getOperationArg()) { $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->display($this->getModuleTpl('MailManager.CommentWidget.tpl')); $response = false; } } } } } } } return $response; }