function mail_update_7_8() { $sent_mails = MailContents::findAll(array('conditions' => "`state`=3 AND `has_attachments`=1")); foreach ($sent_mails as $mail) { if (!$mail instanceof MailContent) { continue; } /* @var $mail MailContent */ $attachments = array(); MailUtilities::parseMail($mail->getContent(), $decoded, $parsedEmail, $warnings); if (isset($parsedEmail['Attachments'])) { $attachments = $parsedEmail['Attachments']; } else { if ($mail->getHasAttachments() && !in_array($parsedEmail['Type'], array('html', 'text', 'delivery-status')) && isset($parsedEmail['FileName'])) { // if the email is the attachment $attachments = array(array('Data' => $parsedEmail['Data'], 'Type' => $parsedEmail['Type'], 'FileName' => $parsedEmail['FileName'])); } } foreach ($attachments as $att) { $file = ProjectFiles::getByFilename($att['FileName']); /* @var $file ProjectFile */ if ($file instanceof ProjectFile) { $file->setMailId($mail->getId()); $file->setMarkTimestamps(false); // dont change updated_on date $file->save(); $file->addToSharingTable(); } } } DB::executeAll("UPDATE " . TABLE_PREFIX . "objects o INNER JOIN " . TABLE_PREFIX . "project_files f ON f.object_id=o.id\n\t\t\tSET o.updated_by_id=o.created_by_id, o.updated_on=o.created_on\n\t\t\tWHERE f.mail_id>0;"); }
function mail_do_mark_as_read_unread_objects($ids_to_mark, $read) { $all_accounts = array(); $all_accounts_ids = array(); foreach ($ids_to_mark as $id) { $obj = Objects::findObject($id); if ($obj instanceof MailContent && logged_user() instanceof Contact) { //conversation set the rest of the conversation $uds_to_mark_from_conver = array(); if (user_config_option('show_emails_as_conversations')) { $emails_in_conversation = MailContents::getMailsFromConversation($obj); foreach ($emails_in_conversation as $email) { //$id is marked on object controller only mark the rest of the conversation if ($id != $email->getId()) { $email->setIsRead(logged_user()->getId(), $read); $uds_to_mark_from_conver[] = $email->getUid(); } } } //make the array with accounts and uids to send to the mail server //accounts if (!in_array($obj->getAccountId(), $all_accounts_ids)) { $account = $obj->getAccount(); //if logged user is owner of this account and is imap if ($account instanceof MailAccount && $account->getContactId() == logged_user()->getId() && $account->getIsImap()) { $all_accounts_ids[] = $obj->getAccountId(); $all_accounts[$account->getId()]['account'] = $account; } } //uids if (in_array($obj->getAccountId(), $all_accounts_ids)) { //add conversations uids //mientras ande mal el uid de los mails enviados si estan sincronizados no usar esta parte /*if (user_config_option('show_emails_as_conversations')) { foreach ($uds_to_mark_from_conver as $uid_conver){ $all_accounts[$obj->getAccountId()]['uids'][] = $uid_conver; } }*/ $all_accounts[$obj->getAccountId()]['folders'][$obj->getImapFolderName()][] = $obj->getUid(); } } } //foreach account send uids by folder to mark in the mail server foreach ($all_accounts as $account_data) { $account = $account_data['account']; $folders = $account_data['folders']; foreach ($folders as $key => $folder) { $folder_name = $key; $uids = $folder; if (!empty($folder_name)) { try { MailUtilities::setReadUnreadImapMails($account, $folder_name, $uids, $read); } catch (Exception $e) { Logger::log("Could not set mail as read on mail server, exception:\n" . $e->getMessage()); } } } } }
/** * search according to the conditions of mail rules * @param string $condition * @return object */ function getConditionsRules($condition) { return MailContents::findAll(array('conditions' => $condition, 'join' => array('table' => MailDatas::instance()->getTableName(), 'jt_field' => 'id', 'e_field' => 'object_id'))); }
function countUserInboxUnreadEmails() { $tp = TABLE_PREFIX; $uid = logged_user()->getId(); $sql = "SELECT count(*) `c` FROM `{$tp}mail_contents` `a`, `{$tp}read_objects` `b` WHERE `b`.`rel_object_manager` = 'MailContents' AND `b`.`rel_object_id` = `a`.`id` AND `b`.`user_id` = '{$uid}' AND `b`.`is_read` = '1' AND `a`.`trashed_on` = '0000-00-00 00:00:00' AND `a`.`is_deleted` = 0 AND `a`.`archived_by_id` = 0 AND (`a`.`state` = '0' OR `a`.`state` = '5') AND " . permissions_sql_for_listings(MailContents::instance(), ACCESS_LEVEL_READ, logged_user(), null, '`a`'); $rows = DB::executeAll($sql); $read = $rows[0]['c']; $sql = "SELECT count(*) `c` FROM `{$tp}mail_contents` `a` WHERE `a`.`trashed_on` = '0000-00-00 00:00:00' AND `a`.`is_deleted` = 0 AND `a`.`archived_by_id` = 0 AND (`a`.`state` = '0' OR `a`.`state` = '5') AND " . permissions_sql_for_listings(MailContents::instance(), ACCESS_LEVEL_READ, logged_user(), null, '`a`'); $rows = DB::executeAll($sql); $all = $rows[0]['c']; return $all - $read; }
<?php $genid = gen_id(); ?> <form id='formClassify' name='formClassify' style='height:100%;background-color:white' class="internalForm" action="<?php echo get_url('mail','classify', array('id'=>$email->getId())) ?>" method="post"> <div class="classify"> <?php render_member_selectors(MailContents::instance()->getObjectTypeId(), $genid, $email->getMemberIds()); ?> </div> <input type="hidden" name="id" value="<?php echo $email->getId() ?>" /> <input type="hidden" name="submit" value="1" /> <?php echo submit_button(lang('classify'), 's', array('tabindex' => '50')) ?> </form>
/** * Add new task * * @access public * @param void * @return null */ function add_task() { if (logged_user()->isGuest()) { flash_error(lang('no access permissions')); ajx_current("empty"); return; } $notAllowedMember = ''; if (!ProjectTask::canAdd(logged_user(), active_context(), $notAllowedMember)) { if (str_starts_with($notAllowedMember, '-- req dim --')) { flash_error(lang('must choose at least one member of', str_replace_first('-- req dim --', '', $notAllowedMember, $in))); } else { flash_error(lang('no context permissions to add', lang("tasks"), $notAllowedMember)); } ajx_current("empty"); return; } // if $task = new ProjectTask(); $task_data = array_var($_POST, 'task'); if (!is_array($task_data)) { $dd = getDateValue(array_var($_POST, 'task_due_date', '')); if ($dd instanceof DateTimeValue) { $duetime = getTimeValue(array_var($_POST, 'task_due_time')); if (is_array($duetime)) { $dd->setHour(array_var($duetime, 'hours')); $dd->setMinute(array_var($duetime, 'mins')); } $task->setUseDueTime(is_array($duetime)); } $sd = getDateValue(array_var($_POST, 'task_start_date', '')); if ($sd instanceof DateTimeValue) { $starttime = getTimeValue(array_var($_POST, 'task_start_time')); if (is_array($starttime)) { $sd->setHour(array_var($starttime, 'hours')); $sd->setMinute(array_var($starttime, 'mins')); } $task->setUseStartTime(is_array($starttime)); } $time_estimate = array_var($_POST, 'hours', 0) * 60 + array_var($_POST, 'minutes', 0); $task_data = array('milestone_id' => array_var($_POST, 'milestone_id', 0), 'project_id' => 1, 'name' => array_var($_POST, 'name', ''), 'assigned_to_contact_id' => array_var($_POST, 'assigned_to_contact_id', '0'), 'parent_id' => array_var($_POST, 'parent_id', 0), 'priority' => array_var($_POST, 'priority', ProjectTasks::PRIORITY_NORMAL), 'text' => array_var($_POST, 'text', ''), 'start_date' => $sd, 'due_date' => $dd, 'time_estimate' => $time_estimate, 'is_template' => array_var($_POST, "is_template", array_var($_GET, "is_template", false)), 'percent_completed' => array_var($_POST, "percent_completed", ''), 'object_subtype' => array_var($_POST, "object_subtype", config_option('default task co type')), 'send_notification' => array_var($_POST, 'notify') && array_var($_POST, 'notify') == 'true'); // array if (Plugins::instance()->isActivePlugin('mail')) { $from_email = array_var($_GET, 'from_email'); $email = MailContents::findById($from_email); if ($email instanceof MailContent) { $task_data['name'] = $email->getSubject(); $task_data['text'] = lang('create task from email description', $email->getSubject(), $email->getFrom(), $email->getTextBody()); tpl_assign('from_email', $email); } } } // if if (array_var($_GET, 'replace')) { ajx_replace(true); } tpl_assign('task_data', $task_data); tpl_assign('task', $task); tpl_assign('pending_task_id', 0); $subtasks = array(); if (array_var($_POST, 'multi_assignment')) { $json_subtasks = json_decode(array_var($_POST, 'multi_assignment')); $line = 0; if (count($json_subtasks) > 0) { foreach ($json_subtasks as $json_subtask) { $subtasks[$line]['assigned_to_contact_id'] = $json_subtask->assigned_to_contact_id; $subtasks[$line]['name'] = $json_subtask->name; $subtasks[$line]['time_estimate_hours'] = $json_subtask->time_estimate_hours; $subtasks[$line]['time_estimate_minutes'] = $json_subtask->time_estimate_minutes; $line++; } } } tpl_assign('multi_assignment', $subtasks); if (is_array(array_var($_POST, 'task'))) { // order $task->setOrder(ProjectTasks::maxOrder(array_var($task_data, "parent_id", 0), array_var($task_data, "milestone_id", 0))); $task_data['due_date'] = getDateValue(array_var($_POST, 'task_due_date')); $task_data['start_date'] = getDateValue(array_var($_POST, 'task_start_date')); if ($task_data['due_date'] instanceof DateTimeValue) { $duetime = getTimeValue(array_var($_POST, 'task_due_time')); if (is_array($duetime)) { $task_data['due_date']->setHour(array_var($duetime, 'hours')); $task_data['due_date']->setMinute(array_var($duetime, 'mins')); } $task_data['due_date']->advance(logged_user()->getTimezone() * -3600); $task_data['use_due_time'] = is_array($duetime); } if ($task_data['start_date'] instanceof DateTimeValue) { $starttime = getTimeValue(array_var($_POST, 'task_start_time')); if (is_array($starttime)) { $task_data['start_date']->setHour(array_var($starttime, 'hours')); $task_data['start_date']->setMinute(array_var($starttime, 'mins')); } $task_data['start_date']->advance(logged_user()->getTimezone() * -3600); $task_data['use_start_time'] = is_array($starttime); } try { $err_msg = $this->setRepeatOptions($task_data); if ($err_msg) { flash_error($err_msg); ajx_current("empty"); return; } if (config_option("wysiwyg_tasks")) { $task_data['type_content'] = "html"; $task_data['text'] = preg_replace("/[\n|\r|\n\r]/", '', array_var($task_data, 'text')); } else { $task_data['type_content'] = "text"; } $task_data['object_type_id'] = $task->getObjectTypeId(); $member_ids = json_decode(array_var($_POST, 'members')); $task->setFromAttributes($task_data); if (!can_task_assignee(logged_user())) { flash_error(lang('no access permissions')); ajx_current("empty"); return; } $totalMinutes = array_var($task_data, 'time_estimate_hours', 0) * 60 + array_var($task_data, 'time_estimate_minutes', 0); $task->setTimeEstimate($totalMinutes); $id = array_var($_GET, 'id', 0); $parent = ProjectTasks::findById($id); if ($parent instanceof ProjectTask) { $task->setParentId($id); $member_ids = $parent->getMemberIds(); if ($parent->getIsTemplate()) { $task->setIsTemplate(true); } } if ($task->getParentId() > 0 && $task->hasChild($task->getParentId())) { flash_error(lang('task child of child error')); ajx_current("empty"); return; } DB::beginWork(); $task->save(); // dependencies if (config_option('use tasks dependencies')) { $previous_tasks = array_var($task_data, 'previous'); if (is_array($previous_tasks)) { foreach ($previous_tasks as $ptask) { if ($ptask == $task->getId()) { continue; } $dep = ProjectTaskDependencies::findById(array('previous_task_id' => $ptask, 'task_id' => $task->getId())); if (!$dep instanceof ProjectTaskDependency) { $dep = new ProjectTaskDependency(); $dep->setPreviousTaskId($ptask); $dep->setTaskId($task->getId()); $dep->save(); } } } } if (array_var($_GET, 'copyId', 0) > 0) { // copy remaining stuff from the task with id copyId $toCopy = ProjectTasks::findById(array_var($_GET, 'copyId')); if ($toCopy instanceof ProjectTask) { ProjectTasks::copySubTasks($toCopy, $task, array_var($task_data, 'is_template', false)); } } // if task is added from task view -> add subscribers if (array_var($task_data, 'inputtype') == 'taskview') { if (!isset($_POST['subscribers'])) { $_POST['subscribers'] = array(); } $_POST['subscribers']['user_' . logged_user()->getId()] = 'checked'; if ($task->getAssignedToContactId() > 0 && Contacts::instance()->findById($task->getAssignedToContactId())->getUserType()) { $_POST['subscribers']['user_' . $task->getAssignedToContactId()] = 'checked'; } } // Add assigned user to the subscibers list if (isset($_POST['subscribers']) && $task->getAssignedToContactId() > 0 && Contacts::instance()->findById($task->getAssignedToContactId())) { $_POST['subscribers']['user_' . $task->getAssignedToContactId()] = 'checked'; } //Link objects $object_controller = new ObjectController(); $object_controller->add_to_members($task, $member_ids); $object_controller->add_subscribers($task); $object_controller->link_to_new_object($task); $object_controller->add_custom_properties($task); $object_controller->add_reminders($task); ApplicationLogs::createLog($task, ApplicationLogs::ACTION_ADD); if (config_option('repeating_task') == 1) { $opt_rep_day['saturday'] = false; $opt_rep_day['sunday'] = false; if (array_var($task_data, 'repeat_saturdays', false)) { $opt_rep_day['saturday'] = true; } if (array_var($task_data, 'repeat_sundays', false)) { $opt_rep_day['sunday'] = true; } $this->repetitive_task($task, $opt_rep_day); } if (config_option('multi_assignment') && Plugins::instance()->isActivePlugin('crpm')) { $subtasks = array_var($_POST, 'multi_assignment'); Hook::fire('save_subtasks', $task, $subtasks); } DB::commit(); // notify asignee if (array_var($task_data, 'send_notification') == 'checked') { try { Notifier::taskAssigned($task); } catch (Exception $e) { evt_add("debug", $e->getMessage()); } // try } if ($task->getIsTemplate()) { flash_success(lang('success add template', $task->getObjectName())); } else { flash_success(lang('success add task list', $task->getObjectName())); } if (array_var($task_data, 'inputtype') != 'taskview') { ajx_current("back"); } else { ajx_current("reload"); } } catch (Exception $e) { DB::rollback(); flash_error($e->getMessage()); ajx_current("empty"); } // try } // if }
echo yes_no_widget('mailAccount[mark_read_on_server]', 'mailAccountMarkReadOnServer', $mark_read_on_server > 0, lang('yes'), lang('no'), 130); ?> </div> <div class="mail-account-item dataBlock"> <label> <?php echo lang('classify mails on workspace'); ?> </label> <?php if ($mailAccount->isNew()) { render_member_selectors(MailContents::instance()->getObjectTypeId(), $genid, null, array('select_current_context' => true, 'hide_label' => true)); } else { render_member_selectors(MailContents::instance()->getObjectTypeId(), $genid, explode(',', $mailAccount->getMemberId())); } ?> <span class="desc"><?php echo lang('classify mails on workspace desc'); ?> </span> </div> <div class="clear"></div> </div> <div id="<?php echo $genid; ?>
function deleteMailsFromServer(MailAccount $account) { $count = 0; if ($account->getDelFromServer() > 0) { $max_date = DateTimeValueLib::now(); $max_date->add('d', -1 * $account->getDelFromServer()); if ($account->getIsImap()) { if ($account->getIncomingSsl()) { $imap = new Net_IMAP($ret, "ssl://" . $account->getServer(), $account->getIncomingSslPort()); } else { $imap = new Net_IMAP($ret, "tcp://" . $account->getServer()); } if (PEAR::isError($ret)) { Logger::log($ret->getMessage()); throw new Exception($ret->getMessage()); } $ret = $imap->login($account->getEmail(), self::ENCRYPT_DECRYPT($account->getPassword())); $result = array(); if ($ret === true) { $mailboxes = MailAccountImapFolders::getMailAccountImapFolders($account->getId()); if (is_array($mailboxes)) { foreach ($mailboxes as $box) { if ($box->getCheckFolder()) { $numMessages = $imap->getNumberOfMessages(utf8_decode($box->getFolderName())); for ($i = 1; $i <= $numMessages; $i++) { $summary = $imap->getSummary($i); if (is_array($summary)) { $m_date = DateTimeValueLib::makeFromString($summary[0]['INTERNALDATE']); if ($m_date instanceof DateTimeValue && $max_date->getTimestamp() > $m_date->getTimestamp()) { if (MailContents::mailRecordExists($account->getId(), $summary[0]['UID'], $box->getFolderName(), null)) { $imap->deleteMessages($i); $count++; } } else { break; } } } $imap->expunge(); } } } } } else { //require_once "Net/POP3.php"; $pop3 = new Net_POP3(); // Connect to mail server if ($account->getIncomingSsl()) { $pop3->connect("ssl://" . $account->getServer(), $account->getIncomingSslPort()); } else { $pop3->connect($account->getServer()); } if (PEAR::isError($ret = $pop3->login($account->getEmail(), self::ENCRYPT_DECRYPT($account->getPassword()), 'USER'))) { throw new Exception($ret->getMessage()); } $emails = $pop3->getListing(); foreach ($emails as $email) { if (MailContents::mailRecordExists($account->getId(), $email['uidl'], null, null)) { $headers = $pop3->getParsedHeaders($email['msg_id']); $date = DateTimeValueLib::makeFromString(array_var($headers, 'Date')); if ($date instanceof DateTimeValue && $max_date->getTimestamp() > $date->getTimestamp()) { $pop3->deleteMsg($email['msg_id']); $count++; } } } $pop3->disconnect(); } } return $count; }
/** * This function will return all mails in project * * @param void * @return array */ function getAllMails() { if (is_null($this->all_mails)) { $this->all_mails = MailContents::getProjectMails($this); } // if return $this->all_mails; }
<?php if (logged_user()->hasMailAccounts()) { $limit = 10; $result = MailContents::instance()->listing(array("order" => "sent_date", "order_dir" => "desc", "start" => 0, "limit" => $limit)); $active_members = array(); $context = active_context(); foreach ($context as $selection) { if ($selection instanceof Member) { $active_members[] = $selection; } } if (count($active_members) > 0) { $mnames = array(); $allowed_contact_ids = array(); foreach ($active_members as $member) { $mnames[] = clean($member->getName()); } $widget_title = lang('unread emails') . ' ' . lang('in') . ' ' . implode(", ", $mnames); } $total = $result->total; $emails = $result->objects; $genid = gen_id(); if ($total > 0) { include_once 'template.php'; } }
<label> <?php echo lang('classify mails on workspace'); ?> <span class="desc"><?php echo lang('classify mails on workspace desc'); ?> </span> </label> <?php //alert_r($mailAccount); // TODO context PEPE if ($mailAccount->isNew()) { render_dimension_trees(MailContents::instance()->getObjectTypeId(), $genid, null, array('select_current_context' => true)); } else { render_dimension_trees(MailContents::instance()->getObjectTypeId(), $genid, $mailAccount->getMemberIds()); } ?> </div> </fieldset> <fieldset id="<?php echo $genid; ?> smtp_settings_div"> <legend><?php echo lang('smtp settings'); ?> </legend> <div class="mail-account-item">
/** * * */ function addToSharingTable() { // if classified or not belongs to an email $member_ids = array(); $members = $this->getMembers(); foreach ($members as $m) { $d = $m->getDimension(); if ($d instanceof Dimension && $d->getIsManageable()) { $member_ids[] = $m->getId(); } } if ($this->getMailId() == 0 || count($member_ids) > 0) { $revisions = $this->getRevisions(); if (is_array($revisions)) { foreach ($revisions as $revision) { $revision->addToSharingTable(); } } parent::addToSharingTable(); } else { // if not classified and belongs to an email $mail = MailContents::findById($this->getMailId()); if ($mail instanceof MailContent) { DB::execute("DELETE FROM " . TABLE_PREFIX . "sharing_table WHERE object_id=" . $this->getId()); $macs = MailAccountContacts::findAll(array('conditions' => array('`account_id` = ?', $mail->getAccountId()))); foreach ($macs as $mac) { $c = Contacts::findById($mac->getContactId()); if ($c instanceof Contact) { $values = "(" . $c->getPermissionGroupId() . "," . $this->getId() . ")"; DB::execute("INSERT INTO " . TABLE_PREFIX . "sharing_table (group_id, object_id) VALUES {$values} ON DUPLICATE KEY UPDATE group_id=group_id;"); } } } } }
function untag() { if (logged_user()->isGuest()) { flash_error(lang('no access permissions')); ajx_current("empty"); return; } ajx_current("empty"); $csvids = array_var($_GET, 'ids'); $tag = trim(array_var($_GET, 'tag', '')); $all = array_var($_GET, 'all'); if (!$tag && !$all) { flash_error(lang("no tag specified")); return; } $ids = explode(",", $csvids); $count = 0; $err = 0; foreach ($ids as $id) { try { $parts = explode(":", $id); $object = get_object_by_manager_and_id($parts[1], $parts[0]); if ($object instanceof ProjectDataObject && $object->canEdit(logged_user())) { if ($object instanceof MailContent && user_config_option('show_emails_as_conversations', true, logged_user()->getId())) { $emails = MailContents::getMailsFromConversation($object); foreach ($emails as $email) { if ($all) { $email->clearTags(); } else { $email->deleteTag($tag); } ApplicationLogs::createLog($email, $email->getWorkspaces(), ApplicationLogs::ACTION_UNTAG); } } else { if ($all) { $object->clearTags(); } else { $object->deleteTag($tag); } ApplicationLogs::createLog($object, $object->getWorkspaces(), ApplicationLogs::ACTION_UNTAG); } $count++; } else { $err++; } } catch (Exception $e) { $err++; } } if ($err > 0) { flash_error(lang("error untag objects", $err)); } else { flash_success(lang("success untag objects", $count)); } }
?> <select name="<?php echo 'parameterValues[' . $parameter['name'] . ']'; ?> "> <?php $context = active_context(); if (isset($member_id) && $member_id > 0) { // filter by context passed by parameter $additional_member = Members::findById($member_id); if ($additional_member instanceof Member) { $context = array($additional_member); } } if (array_var($_REQUEST, 'from_email')) { $from_email = MailContents::findById(array_var($_REQUEST, 'from_email')); if ($from_email instanceof MailContent) { $context = $from_email->getMembers(); } } $companies = allowed_users_to_assign($context); foreach ($companies as $c) { if (config_option('can_assign_tasks_to_companies')) { ?> <option value="<?php echo $c['id']; ?> "> <?php echo $c['name']; ?> </option>
/** * Used for Drag & Drop, adds objects to a member * @author alvaro */ function add_objects_to_member() { $ids = json_decode(array_var($_POST, 'objects')); $mem_id = array_var($_POST, 'member'); if (!is_array($ids) || count($ids) == 0) { ajx_current("empty"); return; } $member = Members::findById($mem_id); try { DB::beginWork(); $objects = array(); $from = array(); foreach ($ids as $oid) { /* @var $obj ContentDataObject */ $obj = Objects::findObject($oid); if ($obj instanceof ContentDataObject && $obj->canAddToMember(logged_user(), $member, active_context())) { $dim_obj_type_content = DimensionObjectTypeContents::findOne(array('conditions' => array('`dimension_id`=? AND `dimension_object_type_id`=? AND `content_object_type_id`=?', $member->getDimensionId(), $member->getObjectTypeId(), $obj->getObjectTypeId()))); if (!($dim_obj_type_content instanceof DimensionObjectTypeContent)) continue; if (!$dim_obj_type_content->getIsMultiple() || array_var($_POST, 'remove_prev')) { $db_res = DB::execute("SELECT group_concat(om.member_id) as old_members FROM ".TABLE_PREFIX."object_members om INNER JOIN ".TABLE_PREFIX."members m ON om.member_id=m.id WHERE m.dimension_id=".$member->getDimensionId()." AND om.object_id=".$obj->getId()); $row = $db_res->fetchRow(); if (array_var($row, 'old_members') != "") $from[$obj->getId()] = $row['old_members']; // remove from previous members ObjectMembers::delete('`object_id` = ' . $obj->getId() . ' AND `member_id` IN (SELECT `m`.`id` FROM `'.TABLE_PREFIX.'members` `m` WHERE `m`.`dimension_id` = '.$member->getDimensionId().')'); } $obj->addToMembers(array($member)); $obj->addToSharingTable(); $objects[] = $obj; if ($obj->allowsTimeslots()) { $timeslots = $obj->getTimeslots(); foreach ($timeslots as $timeslot) { $ts_mids = ObjectMembers::getMemberIdsByObject($timeslot->getId()); // if classified then reclassify if (count($ts_mids)) { if (array_var($_POST, 'remove_prev')) { ObjectMembers::delete('`object_id` = ' . $timeslot->getId() . ' AND `member_id` IN (SELECT `m`.`id` FROM `'.TABLE_PREFIX.'members` `m` WHERE `m`.`dimension_id` = '.$member->getDimensionId().')'); } $timeslot->addToMembers(array($member)); $timeslot->addToSharingTable(); $objects[] = $timeslot; } } } if ($obj instanceof MailContent) { $conversation = MailContents::getMailsFromConversation($obj); foreach ($conversation as $conv_email) { if (array_var($_POST, 'attachment') && $conv_email->getHasAttachments()) { MailUtilities::parseMail($conv_email->getContent(), $decoded, $parsedEmail, $warnings); $classification_data = array(); for ($j=0; $j < count(array_var($parsedEmail, "Attachments", array())); $j++) { $classification_data["att_".$j] = true; } MailController::classifyFile($classification_data, $conv_email, $parsedEmail, array($member), array_var($_POST, 'remove_prev')); } } } } else { throw new Exception(lang('you dont have permissions to classify object in member', $obj->getName(), $member->getName())); } } Hook::fire('after_dragdrop_classify', $objects, $member); DB::commit(); // add to application logs foreach ($objects as $object) { $action = array_var($from, $obj->getId()) ? ApplicationLogs::ACTION_MOVE : ApplicationLogs::ACTION_COPY; $log_data = (array_var($from, $obj->getId()) ? "from:" . array_var($from, $obj->getId()) . ";" : "") . "to:" . $member->getId(); ApplicationLogs::instance()->createLog($object, $action, false, true, true, $log_data); } $lang_key = count($ids)>1 ? 'objects moved to member success' : 'object moved to member success'; flash_success(lang($lang_key, $member->getName())); if (array_var($_POST, 'reload')) ajx_current('reload'); else ajx_current('empty'); } catch (Exception $e) { DB::rollback(); ajx_current("empty"); flash_error($e->getMessage()); } }
function download() { $this->setTemplate(get_template_path('back')); $id = array_var($_GET, 'id'); $email = MailContents::findById($id); if (!$email instanceof MailContent) { flash_error(lang('email dnx')); return; } if (!$email->canView(logged_user())) { flash_error(lang('no access permissions')); return; } if ($email->getContent()) { download_contents($email->getContent(), 'message/rfc822', $email->getSubject() . ".eml", strlen($email->getContent()), true); die; } else { download_from_repository($email->getContentFileId(), 'message/rfc822', $email->getSubject() . ".eml", true); die; } }
/** * This function will return paginated result. Result is an array where first element is * array of returned object and second populated pagination object that can be used for * obtaining and rendering pagination data using various helpers. * * Items and pagination array vars are indexed with 0 for items and 1 for pagination * because you can't use associative indexing with list() construct * * @access public * @param array $arguments Query argumens (@see find()) Limit and offset are ignored! * @param integer $items_per_page Number of items per page * @param integer $current_page Current page number * @return array */ function paginate($arguments = null, $items_per_page = 10, $current_page = 1, $count = null) { if(isset($this) && instance_of($this, 'MailContents')) { return parent::paginate($arguments, $items_per_page, $current_page, $count); } else { return MailContents::instance()->paginate($arguments, $items_per_page, $current_page, $count); } // if } // paginate
static function prepareTrashAndArchivedConditions($trashed, $archived){ $trashed_cond = "`o`.`trashed_on` " .($trashed ? ">" : "="). " " . DB::escape(EMPTY_DATETIME); if ($trashed) { $archived_cond = ""; } else { $archived_cond = "AND `o`.`archived_on` " .($archived ? ">" : "="). " " . DB::escape(EMPTY_DATETIME); } if ($trashed && Plugins::instance()->isActivePlugin('mail')) { $mcot_id = MailContents::instance()->getObjectTypeId(); $trashed_cond .= " AND IF(o.object_type_id=$mcot_id, NOT (SELECT mcx.is_deleted FROM ".TABLE_PREFIX."mail_contents mcx WHERE mcx.object_id=o.id), 1)"; } return array($trashed_cond, $archived_cond); }
function do_mark_as_read_unread_objects($ids, $read, $mark_conversation = false) { $err = 0; // count errors $succ = 0; // count updated objects foreach ($ids as $id) { try { $obj = Objects::findObject($id); if ($obj instanceof ContentDataObject && logged_user() instanceof Contact) { $obj->setIsRead(logged_user()->getId(), $read); if (Plugins::instance()->isActivePlugin('mail')) { if ($obj instanceof MailContent && $mark_conversation) { $emails_in_conversation = MailContents::getMailsFromConversation($obj); foreach ($emails_in_conversation as $email) { $email->setIsRead(logged_user()->getId(), $read); } } } } $succ++; } catch (Exception $e) { $err++; } // try } return array($succ, $err); }
function delete($deleteMails = false) { MailAccountUsers::deleteByAccount($this); if ($deleteMails) { session_commit(); LinkedObjects::delete(array("(`object_id` IN (SELECT `id` FROM `" . TABLE_PREFIX . "mail_contents` WHERE `account_id` = " . DB::escape($this->getId()) . ") and `object_manager` = 'MailContents') \n\t\t\t\tor (`rel_object_id` IN (SELECT `id` FROM `" . TABLE_PREFIX . "mail_contents` WHERE `account_id` = " . DB::escape($this->getId()) . ") and `rel_object_manager` = 'MailContents')")); SearchableObjects::delete(array("`rel_object_manager` = 'MailContents' AND `rel_object_id` IN (SELECT `id` FROM `" . TABLE_PREFIX . "mail_contents` WHERE `account_id` = " . DB::escape($this->getId()) . ") ")); ReadObjects::delete("`rel_object_manager` = 'MailContents' AND `rel_object_id` IN (SELECT `id` FROM `" . TABLE_PREFIX . "mail_contents` WHERE `account_id` = " . DB::escape($this->getId()) . ") "); $account_emails = MailContents::findAll(array('conditions' => '`account_id` = ' . DB::escape($this->getId()), 'include_trashed' => true)); foreach ($account_emails as $email) { $email->delete(); } //MailContents::delete('`account_id` = ' . DB::escape($this->getId())); } if ($this->getIsImap()) { MailAccountImapFolders::delete('account_id = ' . $this->getId()); } parent::delete(); }
/** * Used for Drag & Drop, adds objects to a member * @author alvaro */ function add_objects_to_member() { $ids = json_decode(array_var($_POST, 'objects')); $mem_id = array_var($_POST, 'member'); if (!is_array($ids) || count($ids) == 0) { ajx_current("empty"); return; } try { DB::beginWork(); if ($mem_id) { $user_ids = array(); $member = Members::findById($mem_id); $objects = array(); $from = array(); foreach ($ids as $oid) { /* @var $obj ContentDataObject */ $obj = Objects::findObject($oid); if ($obj instanceof ContentDataObject && $obj->canAddToMember(logged_user(), $member, active_context())) { $dim_obj_type_content = DimensionObjectTypeContents::findOne(array('conditions' => array('`dimension_id`=? AND `dimension_object_type_id`=? AND `content_object_type_id`=?', $member->getDimensionId(), $member->getObjectTypeId(), $obj->getObjectTypeId()))); if (!$dim_obj_type_content instanceof DimensionObjectTypeContent) { continue; } if (!$dim_obj_type_content->getIsMultiple() || array_var($_POST, 'remove_prev')) { $db_res = DB::execute("SELECT group_concat(om.member_id) as old_members FROM " . TABLE_PREFIX . "object_members om INNER JOIN " . TABLE_PREFIX . "members m ON om.member_id=m.id WHERE m.dimension_id=" . $member->getDimensionId() . " AND om.object_id=" . $obj->getId()); $row = $db_res->fetchRow(); if (array_var($row, 'old_members') != "") { $from[$obj->getId()] = $row['old_members']; } // remove from previous members ObjectMembers::delete('`object_id` = ' . $obj->getId() . ' AND `member_id` IN (SELECT `m`.`id` FROM `' . TABLE_PREFIX . 'members` `m` WHERE `m`.`dimension_id` = ' . $member->getDimensionId() . ')'); } $obj->addToMembers(array($member)); $obj->addToSharingTable(); $objects[] = $obj; if (Plugins::instance()->isActivePlugin('mail') && $obj instanceof MailContent) { $conversation = MailContents::getMailsFromConversation($obj); foreach ($conversation as $conv_email) { if (array_var($_POST, 'attachment') && $conv_email->getHasAttachments()) { MailUtilities::parseMail($conv_email->getContent(), $decoded, $parsedEmail, $warnings); $classification_data = array(); for ($j = 0; $j < count(array_var($parsedEmail, "Attachments", array())); $j++) { $classification_data["att_" . $j] = true; } MailController::classifyFile($classification_data, $conv_email, $parsedEmail, array($member), array_var($_POST, 'remove_prev'), false); } } } // if object is contact ask to add default permissions in member if ($obj instanceof Contact && $obj->isUser() && can_manage_security(logged_user())) { $user_ids[] = $obj->getId(); } } else { throw new Exception(lang('you dont have permissions to classify object in member', $obj->getName(), $member->getName())); } } // if object is contact ask to add default permissions in member if (can_manage_security(logged_user()) && count($user_ids) > 0 && $member->getDimension()->getDefinesPermissions()) { evt_add('ask to assign default permissions', array('user_ids' => $user_ids, 'member' => array('id' => $member->getId(), 'name' => clean($member->getName())), '')); } Hook::fire('after_dragdrop_classify', $objects, $member); $display_name = $member->getName(); $lang_key = count($ids) > 1 ? 'objects moved to member success' : 'object moved to member success'; $log_datas = array(); $actions = array(); // add to application logs foreach ($objects as $obj) { $actions[$obj->getId()] = array_var($from, $obj->getId()) ? ApplicationLogs::ACTION_MOVE : ApplicationLogs::ACTION_COPY; $log_datas[$obj->getId()] = (array_var($from, $obj->getId()) ? "from:" . array_var($from, $obj->getId()) . ";" : "") . "to:" . $member->getId(); } } else { if ($dim_id = array_var($_POST, 'dimension')) { $dimension = Dimensions::getDimensionById($dim_id); $from = array(); foreach ($ids as $oid) { /* @var $obj ContentDataObject */ $obj = Objects::findObject($oid); if ($obj instanceof ContentDataObject) { $db_res = DB::execute("SELECT group_concat(om.member_id) as old_members FROM " . TABLE_PREFIX . "object_members om INNER JOIN " . TABLE_PREFIX . "members m ON om.member_id=m.id WHERE m.dimension_id=" . $dim_id . " AND om.object_id=" . $obj->getId()); $row = $db_res->fetchRow(); if (array_var($row, 'old_members') != "") { $from[$obj->getId()] = $row['old_members']; } // remove from previous members ObjectMembers::delete('`object_id` = ' . $obj->getId() . ' AND `member_id` IN ( SELECT `m`.`id` FROM `' . TABLE_PREFIX . 'members` `m` WHERE `m`.`dimension_id` = ' . $dim_id . ')'); } $obj->addToMembers(array()); $obj->addToSharingTable(); $objects[] = $obj; } $display_name = $dimension->getName(); $lang_key = count($ids) > 1 ? 'objects removed from' : 'object removed from'; $log_datas = array(); $actions = array(); // add to application logs foreach ($objects as $obj) { $actions[$obj->getId()] = array_var($from, $obj->getId()) ? ApplicationLogs::ACTION_MOVE : ApplicationLogs::ACTION_COPY; $log_datas[$obj->getId()] = array_var($from, $obj->getId()) ? "from:" . array_var($from, $obj->getId()) . ";" : ""; } } } DB::commit(); foreach ($objects as $object) { ApplicationLogs::instance()->createLog($object, $actions[$object->getId()], false, true, true, $log_datas[$object->getId()]); } flash_success(lang($lang_key, $display_name)); if (array_var($_POST, 'reload')) { ajx_current('reload'); } else { ajx_current('empty'); } } catch (Exception $e) { DB::rollback(); ajx_current("empty"); flash_error($e->getMessage()); } }
/** * * */ public function activity_feed() { ajx_set_no_back(true); require_javascript("og/modules/dashboardComments.js"); require_javascript("jquery/jquery.scrollTo-min.js"); /* get query parameters */ $filesPerPage = config_option('files_per_page'); $start = array_var($_GET, 'start') ? (int) array_var($_GET, 'start') : 0; $limit = array_var($_GET, 'limit') ? array_var($_GET, 'limit') : $filesPerPage; $order = array_var($_GET, 'sort'); $orderdir = array_var($_GET, 'dir'); $page = (int) ($start / $limit) + 1; $hide_private = !logged_user()->isMemberOfOwnerCompany(); $typeCSV = array_var($_GET, 'type'); $types = null; if ($typeCSV) { $types = explode(",", $typeCSV); } $name_filter = array_var($_GET, 'name'); $linked_obj_filter = array_var($_GET, 'linkedobject'); $object_ids_filter = ''; if (!is_null($linked_obj_filter)) { $linkedObject = Objects::findObject($linked_obj_filter); $objs = $linkedObject->getLinkedObjects(); foreach ($objs as $obj) { $object_ids_filter .= ($object_ids_filter == '' ? '' : ',') . $obj->getId(); } } $filters = array(); if (!is_null($types)) { $filters['types'] = $types; } if (!is_null($name_filter)) { $filters['name'] = $name_filter; } if ($object_ids_filter != '') { $filters['object_ids'] = $object_ids_filter; } $user = array_var($_GET, 'user'); $trashed = array_var($_GET, 'trashed', false); $archived = array_var($_GET, 'archived', false); /* if there's an action to execute, do so */ if (array_var($_GET, 'action') == 'delete') { $ids = explode(',', array_var($_GET, 'objects')); $result = Objects::getObjectsFromContext(active_context(), null, null, false, false, array('object_ids' => implode(",", $ids))); $objects = $result->objects; list($succ, $err) = $this->do_delete_objects($objects); if ($err > 0) { flash_error(lang('error delete objects', $err)); } else { flash_success(lang('success delete objects', $succ)); } } else { if (array_var($_GET, 'action') == 'delete_permanently') { $ids = explode(',', array_var($_GET, 'objects')); $result = Objects::getObjectsFromContext(active_context(), null, null, true, false, array('object_ids' => implode(",", $ids))); $objects = $result->objects; list($succ, $err) = $this->do_delete_objects($objects, true); if ($err > 0) { flash_error(lang('error delete objects', $err)); } if ($succ > 0) { flash_success(lang('success delete objects', $succ)); } } else { if (array_var($_GET, 'action') == 'markasread') { $ids = explode(',', array_var($_GET, 'objects')); list($succ, $err) = $this->do_mark_as_read_unread_objects($ids, true); } else { if (array_var($_GET, 'action') == 'markasunread') { $ids = explode(',', array_var($_GET, 'objects')); list($succ, $err) = $this->do_mark_as_read_unread_objects($ids, false); } else { if (array_var($_GET, 'action') == 'empty_trash_can') { $result = Objects::getObjectsFromContext(active_context(), 'trashed_on', 'desc', true); $objects = $result->objects; list($succ, $err) = $this->do_delete_objects($objects, true); if ($err > 0) { flash_error(lang('error delete objects', $err)); } if ($succ > 0) { flash_success(lang('success delete objects', $succ)); } } else { if (array_var($_GET, 'action') == 'archive') { $ids = explode(',', array_var($_GET, 'objects')); list($succ, $err) = $this->do_archive_unarchive_objects($ids, 'archive'); if ($err > 0) { flash_error(lang('error archive objects', $err)); } else { flash_success(lang('success archive objects', $succ)); } } else { if (array_var($_GET, 'action') == 'unarchive') { $ids = explode(',', array_var($_GET, 'objects')); list($succ, $err) = $this->do_archive_unarchive_objects($ids, 'unarchive'); if ($err > 0) { flash_error(lang('error unarchive objects', $err)); } else { flash_success(lang('success unarchive objects', $succ)); } } else { if (array_var($_GET, 'action') == 'unclassify') { $ids = explode(',', array_var($_GET, 'objects')); $err = 0; $succ = 0; foreach ($ids as $id) { $split = explode(":", $id); $type = $split[0]; if ($type == 'MailContents') { $email = MailContents::findById($split[1]); if (isset($email) && !$email->isDeleted() && $email->canEdit(logged_user())) { if (MailController::do_unclassify($email)) { $succ++; } else { $err++; } } else { $err++; } } } if ($err > 0) { flash_error(lang('error unclassify emails', $err)); } else { flash_success(lang('success unclassify emails', $succ)); } } else { if (array_var($_GET, 'action') == 'restore') { $errorMessage = null; $ids = explode(',', array_var($_GET, 'objects')); $success = 0; $error = 0; foreach ($ids as $id) { $obj = Objects::findObject($id); if ($obj->canDelete(logged_user())) { try { $obj->untrash($errorMessage); ApplicationLogs::createLog($obj, ApplicationLogs::ACTION_UNTRASH); $success++; } catch (Exception $e) { $error++; } } else { $error++; } } if ($success > 0) { flash_success(lang("success untrash objects", $success)); } if ($error > 0) { $errorString = is_null($errorMessage) ? lang("error untrash objects", $error) : $errorMessage; flash_error($errorString); } } } } } } } } } } /*FIXME else if (array_var($_GET, 'action') == 'move') { $wsid = array_var($_GET, "moveTo"); $destination = Projects::findById($wsid); if (!$destination instanceof Project) { $resultMessage = lang('project dnx'); $resultCode = 1; } else if (!can_add(logged_user(), $destination, 'ProjectMessages')) { $resultMessage = lang('no access permissions'); $resultCode = 1; } else { $ids = explode(',', array_var($_GET, 'objects')); $count = 0; DB::beginWork(); foreach ($ids as $id) { $split = explode(":", $id); $type = $split[0]; $obj = Objects::findObject($split[1]); $mantainWs = array_var($_GET, "mantainWs"); if ($type != 'Projects' && $obj->canEdit(logged_user())) { if ($type == 'MailContents') { $email = MailContents::findById($split[1]); $conversation = MailContents::getMailsFromConversation($email); foreach ($conversation as $conv_email) { $count += MailController::addEmailToWorkspace($conv_email->getId(), $destination, $mantainWs); if (array_var($_GET, 'classify_atts') && $conv_email->getHasAttachments()) { MailUtilities::parseMail($conv_email->getContent(), $decoded, $parsedEmail, $warnings); $classification_data = array(); for ($j=0; $j < count(array_var($parsedEmail, "Attachments", array())); $j++) { $classification_data["att_".$j] = true; } $tags = implode(",", $conv_email->getTagNames()); MailController::classifyFile($classification_data, $conv_email, $parsedEmail, array($destination), $mantainWs, $tags); } } $count++; } else { if (!$mantainWs || $type == 'ProjectTasks' || $type == 'ProjectMilestones') { $removed = ""; $ws = $obj->getWorkspaces(); foreach ($ws as $w) { if (can_add(logged_user(), $w, $type)) { $obj->removeFromWorkspace($w); $removed .= $w->getId() . ","; } } $removed = substr($removed, 0, -1); $log_action = ApplicationLogs::ACTION_MOVE; $log_data = ($removed == "" ? "" : "from:$removed;") . "to:$wsid"; } else { $log_action = ApplicationLogs::ACTION_COPY; $log_data = "to:$wsid"; } $obj->addToWorkspace($destination); ApplicationLogs::createLog($obj, $log_action, false, null, true, $log_data); $count++; } } } if ($count > 0) { $reload = true; DB::commit(); flash_success(lang("success move objects", $count)); } else { DB::rollback(); } } }*/ $filterName = array_var($_GET, 'name'); $result = null; $context = active_context(); $obj_type_types = array('content_object'); if (array_var($_GET, 'include_comments')) { $obj_type_types[] = 'comment'; } $pagination = Objects::getObjects($context, $start, $limit, $order, $orderdir, $trashed, $archived, $filters, $start, $limit, $obj_type_types); $result = $pagination->objects; $total_items = $pagination->total; if (!$result) { $result = array(); } /* prepare response object */ $info = array(); foreach ($result as $obj) { $info_elem = $obj->getArrayInfo($trashed, $archived); $instance = Objects::instance()->findObject($info_elem['object_id']); $info_elem['url'] = $instance->getViewUrl(); if (method_exists($instance, "getText")) { $info_elem['content'] = $instance->getText(); } $info_elem['picture'] = $instance->getCreatedBy()->getPictureUrl(); $info_elem['friendly_date'] = friendly_date($instance->getCreatedOn()); $info_elem['comment'] = $instance->getComments(); /* @var $instance Contact */ if ($instance instanceof Contact) { if ($instance->isCompany()) { $info_elem['icon'] = 'ico-company'; $info_elem['type'] = 'company'; } } $info_elem['isRead'] = $instance->getIsRead(logged_user()->getId()); $info_elem['manager'] = get_class($instance->manager()); $info[] = $info_elem; } $listing = array("totalCount" => $total_items, "start" => $start, "objects" => $info); tpl_assign("feeds", $listing); }
$pass = $account->getSyncPass(); $server = $account->getSyncServer(); $folder = $account->getSyncFolder(); $address = $account->getSyncAddr(); if($pass == null || $server == null || $folder == null || $address == null) { echo(lang('cant sync account')); ?><br><a href="<?php echo ROOT_URL?>/index.php?c=access&a=index" target="_top">Go back to Feng Office</a><?php return; } $conditions = array("conditions" => array("`sync`=0 AND `state` = 3 AND `account_id` =".$account->getId())); $check_sync_box = MailUtilities::checkSyncMailbox($server, $account->getSyncSsl(), $account->getOutgoingTrasnportType(), $account->getSyncSslPort(), $folder, $address, $pass); if ($check_sync_box){ $sent_mails = MailContents::findAll($conditions); if (count($sent_mails)==0){ echo(lang('mails on imap acc already sync')); ?><br><a href="<?php echo ROOT_URL?>/index.php?c=access&a=index" target="_top">Go back to Feng Office</a><?php return; } foreach ($sent_mails as $mail){ try{ DB::beginWork(); $content = $mail->getContent(); MailUtilities::sendToServerThroughIMAP($server, $account->getSyncSsl(), $account->getOutgoingTrasnportType(), $account->getSyncSslPort(), $folder, $address, $pass, $content); $mail->setSync(true); $mail->save(); DB::commit(); } catch(Exception $e){
function delete($deleteMails = false){ MailAccountContacts::deleteByAccount($this); if ($deleteMails) { session_commit(); ini_set('memory_limit', '1024M'); LinkedObjects::delete(array("(`object_id` IN (SELECT `object_id` FROM `".TABLE_PREFIX."mail_contents` WHERE `account_id` = " . DB::escape($this->getId()).")) or (`rel_object_id` IN (SELECT `object_id` FROM `".TABLE_PREFIX."mail_contents` WHERE `account_id` = " . DB::escape($this->getId())."))")); SearchableObjects::delete(array("`rel_object_id` IN (SELECT `object_id` FROM `".TABLE_PREFIX."mail_contents` WHERE `account_id` = " . DB::escape($this->getId()).") ")); ReadObjects::delete("`rel_object_id` IN (SELECT `object_id` FROM `".TABLE_PREFIX."mail_contents` WHERE `account_id` = " . DB::escape($this->getId()).") "); $account_email_ids = MailContents::findAll(array('id' => true, 'conditions' => '`account_id` = ' . DB::escape($this->getId()), 'include_trashed' => true)); if (count($account_email_ids) > 0) { MailDatas::delete('id IN ('.implode(',', $account_email_ids).')'); MailContents::delete('`account_id` = ' . DB::escape($this->getId())); } } if ($this->getIsImap()) { MailAccountImapFolders::delete('account_id = ' . $this->getId()); } parent::delete(); }
static function prepareTrashAndArchivedConditions($trashed, $archived) { $trashed_cond = "`o`.`trashed_on` " . ($trashed ? ">" : "=") . " " . DB::escape(EMPTY_DATETIME); if ($trashed) { $archived_cond = ""; } else { $archived_cond = "AND `o`.`archived_on` " . ($archived ? ">" : "=") . " " . DB::escape(EMPTY_DATETIME); } if ($trashed && Plugins::instance()->isActivePlugin('mail')) { $mail_accounts = MailAccounts::getMailAccountsByUser(logged_user()); $mail_account_ids = array(); foreach ($mail_accounts as $account) { $mail_account_ids[] = $account->getId(); } $mcot_id = MailContents::instance()->getObjectTypeId(); if (empty($mail_account_ids)) { $trashed_cond .= " AND IF(o.object_type_id={$mcot_id}, 0, 1)"; } else { $trashed_cond .= " AND IF(o.object_type_id={$mcot_id}, NOT (SELECT mcx.is_deleted FROM " . TABLE_PREFIX . "mail_contents mcx WHERE mcx.object_id=o.id) AND EXISTS (SELECT mct.object_id FROM " . TABLE_PREFIX . "mail_contents mct WHERE mct.object_id=o.id AND mct.account_id IN(" . implode(',', $mail_account_ids) . ")), 1)"; } } return array($trashed_cond, $archived_cond); }
/** * Add new task * * @access public * @param void * @return null */ function add_task() { //is template task? $isTemplateTask = false; if (array_var($_REQUEST, 'template_task') == true) { $isTemplateTask = true; if (array_var($_REQUEST, 'template_id')) { $template_id = array_var($_REQUEST, 'template_id'); } else { $template_id = 0; } tpl_assign('template_id', $template_id); tpl_assign('additional_tt_params', array_var($_REQUEST, 'additional_tt_params')); } if (logged_user()->isGuest()) { flash_error(lang('no access permissions')); ajx_current("empty"); return; } $email = null; $context = active_context(); $member_ids = json_decode(array_var($_POST, 'members', null)); if (is_array($member_ids) && count($member_ids) > 0) { $context = Members::findAll(array('conditions' => 'id IN (' . implode(',', $member_ids) . ')')); } $notAllowedMember = ''; if (!ProjectTask::canAdd(logged_user(), $context, $notAllowedMember) && !$isTemplateTask && is_array(array_var($_POST, 'task'))) { if (str_starts_with($notAllowedMember, '-- req dim --')) { $msg = lang('must choose at least one member of', str_replace_first('-- req dim --', '', $notAllowedMember, $in)); } else { trim($notAllowedMember) == "" ? $msg = lang('you must select where to keep', lang('the task')) : ($msg = lang('no context permissions to add', lang("tasks"), $notAllowedMember)); } if (array_var($_REQUEST, 'modal')) { $this->setLayout("json"); $this->setTemplate(get_template_path("empty")); $params = array('errorMessage' => $msg, 'errorCode' => 1, 'showMessage' => 1, 'reload' => array_var($_REQUEST, 'reload')); print_modal_json_response($params, true, array_var($_REQUEST, 'use_ajx')); } else { flash_success($msg); } ajx_current("empty"); return; } //is template task? if (array_var($_REQUEST, 'template_task') == true) { $task = new TemplateTask(); $this->setTemplate(get_template_path('add_template_task', 'template_task')); } else { $task = new ProjectTask(); } $task_data = array_var($_POST, 'task'); if (is_array($task_data)) { foreach ($task_data as $k => &$v) { $v = remove_scripts($v); } } if (!is_array($task_data)) { // set layout for modal form if (array_var($_REQUEST, 'modal')) { $this->setLayout("json"); tpl_assign('modal', true); } $dd = getDateValue(array_var($_POST, 'task_due_date', '')); if ($dd instanceof DateTimeValue) { $duetime = getTimeValue(array_var($_POST, 'task_due_time')); if (is_array($duetime)) { $dd->setHour(array_var($duetime, 'hours')); $dd->setMinute(array_var($duetime, 'mins')); } $task->setUseDueTime(is_array($duetime)); } $sd = getDateValue(array_var($_POST, 'task_start_date', '')); if ($sd instanceof DateTimeValue) { $starttime = getTimeValue(array_var($_POST, 'task_start_time')); if (is_array($starttime)) { $sd->setHour(array_var($starttime, 'hours')); $sd->setMinute(array_var($starttime, 'mins')); } $task->setUseStartTime(is_array($starttime)); } $time_estimate = array_var($_POST, 'hours', 0) * 60 + array_var($_POST, 'minutes', 0); if (config_option("wysiwyg_tasks")) { $text_post = preg_replace("/[\n|\r|\n\r]/", '', array_var($_POST, 'text', '')); } else { $text_post = array_var($_POST, 'text', ''); } $task_data = array('milestone_id' => array_var($_REQUEST, 'milestone_id', 0), 'project_id' => 1, 'name' => array_var($_REQUEST, 'name', ''), 'assigned_to_contact_id' => array_var($_REQUEST, 'assigned_to_contact_id', '0'), 'selected_members_ids' => json_decode(array_var($_POST, 'members', null)), 'parent_id' => array_var($_REQUEST, 'parent_id', 0), 'priority' => array_var($_POST, 'priority', ProjectTasks::PRIORITY_NORMAL), 'text' => $text_post, 'start_date' => $sd, 'due_date' => $dd, 'time_estimate' => $time_estimate, 'is_template' => array_var($_POST, "is_template", array_var($_GET, "is_template", false)), 'percent_completed' => array_var($_POST, "percent_completed", ''), 'object_subtype' => array_var($_POST, "object_subtype", config_option('default task co type')), 'send_notification_subscribers' => user_config_option("can notify subscribers")); // array if (Plugins::instance()->isActivePlugin('mail')) { $from_email = array_var($_GET, 'from_email'); $email = MailContents::findById($from_email); if ($email instanceof MailContent) { $task_data['name'] = $email->getSubject(); $task_data['text'] = lang('create task from email description', $email->getSubject(), $email->getFrom(), $email->getTextBody()); $task_data['selected_members_ids'] = $email->getMemberIds(); tpl_assign('from_email', $email); } } tpl_assign('additional_onsubmit', array_var($_REQUEST, 'additional_onsubmit')); } // if if (array_var($_GET, 'replace')) { ajx_replace(true); } tpl_assign('task_data', $task_data); tpl_assign('task', $task); tpl_assign('pending_task_id', 0); $subtasks = array(); if (array_var($_POST, 'multi_assignment')) { $subtasks = json_decode(array_var($_POST, 'multi_assignment'), true); } tpl_assign('multi_assignment', $subtasks); if (is_array(array_var($_POST, 'task'))) { try { // order $task->setOrder(ProjectTasks::maxOrder(array_var($task_data, "parent_id", 0), array_var($task_data, "milestone_id", 0))); try { $task_data['due_date'] = getDateValue(array_var($_POST, 'task_due_date')); $task_data['start_date'] = getDateValue(array_var($_POST, 'task_start_date')); } catch (Exception $e) { throw new Exception(lang('date format error', date_format_tip(user_config_option('date_format')))); } if ($task_data['due_date'] instanceof DateTimeValue) { $duetime = getTimeValue(array_var($_POST, 'task_due_time')); if (is_array($duetime)) { $task_data['due_date']->setHour(array_var($duetime, 'hours')); $task_data['due_date']->setMinute(array_var($duetime, 'mins')); $task_data['due_date']->advance(logged_user()->getTimezone() * -3600); } $task_data['use_due_time'] = is_array($duetime); } if ($task_data['start_date'] instanceof DateTimeValue) { $starttime = getTimeValue(array_var($_POST, 'task_start_time')); if (is_array($starttime)) { $task_data['start_date']->setHour(array_var($starttime, 'hours')); $task_data['start_date']->setMinute(array_var($starttime, 'mins')); $task_data['start_date']->advance(logged_user()->getTimezone() * -3600); } $task_data['use_start_time'] = is_array($starttime); } $err_msg = $this->setRepeatOptions($task_data); if ($err_msg) { throw new Exception($err_msg); } if (config_option("wysiwyg_tasks")) { $task_data['type_content'] = "html"; $task_data['text'] = str_replace(array("\r", "\n", "\r\n"), array('', '', ''), array_var($task_data, 'text')); } else { $task_data['type_content'] = "text"; } $task_data['object_type_id'] = $task->getObjectTypeId(); $member_ids = json_decode(array_var($_POST, 'members')); $task->setFromAttributes($task_data); if (!can_task_assignee(logged_user())) { flash_error(lang('no access permissions')); ajx_current("empty"); return; } $totalMinutes = array_var($task_data, 'time_estimate_hours', 0) * 60 + array_var($task_data, 'time_estimate_minutes', 0); $task->setTimeEstimate($totalMinutes); $id = array_var($_GET, 'id', 0); if ($task instanceof TemplateTask) { //evt_add("template task added", array("id_template_task" => $file->getId())); $parent = TemplateTasks::findById($id); if ($parent instanceof TemplateTask) { $task->setParentId($id); $member_ids = $parent->getMemberIds(); } //template id $task->setTemplateId($template_id); } else { $parent = ProjectTasks::findById($id); if ($parent instanceof ProjectTask) { $task->setParentId($id); $member_ids = $parent->getMemberIds(); } } if ($task->getParentId() > 0 && $task->hasChild($task->getParentId())) { flash_error(lang('task child of child error')); ajx_current("empty"); return; } if ($task instanceof TemplateTask) { $task->setSessionId(logged_user()->getId()); } DB::beginWork(); $task->save(); // dependencies if (config_option('use tasks dependencies')) { $previous_tasks = array_var($task_data, 'previous'); if (is_array($previous_tasks)) { foreach ($previous_tasks as $ptask) { if ($ptask == $task->getId()) { continue; } $dep = ProjectTaskDependencies::findById(array('previous_task_id' => $ptask, 'task_id' => $task->getId())); if (!$dep instanceof ProjectTaskDependency) { $dep = new ProjectTaskDependency(); $dep->setPreviousTaskId($ptask); $dep->setTaskId($task->getId()); $dep->save(); } } } } if (array_var($_GET, 'copyId', 0) > 0) { // copy remaining stuff from the task with id copyId $toCopy = ProjectTasks::findById(array_var($_GET, 'copyId')); if ($toCopy instanceof ProjectTask) { ProjectTasks::copySubTasks($toCopy, $task, array_var($task_data, 'is_template', false)); } } // if task is added from task view -> add subscribers if (array_var($task_data, 'inputtype') == 'taskview') { if (!isset($_POST['subscribers'])) { $_POST['subscribers'] = array(); } $_POST['subscribers']['user_' . logged_user()->getId()] = '1'; if ($task->getAssignedToContactId() > 0 && Contacts::instance()->findById($task->getAssignedToContactId())->getUserType()) { $_POST['subscribers']['user_' . $task->getAssignedToContactId()] = '1'; } } // Add assigned user to the subscibers list if (isset($_POST['subscribers']) && $task->getAssignedToContactId() > 0 && Contacts::instance()->findById($task->getAssignedToContactId())) { $_POST['subscribers']['user_' . $task->getAssignedToContactId()] = '1'; } //Link objects $object_controller = new ObjectController(); if ($task instanceof TemplateTask) { //if(!empty($member_ids)){ $object_controller->add_to_members($task, $member_ids, null, false); //} } else { $object_controller->add_to_members($task, $member_ids); } $is_template = $task instanceof TemplateTask; $object_controller->add_subscribers($task, null, !$is_template); $object_controller->link_to_new_object($task); $object_controller->add_custom_properties($task); $object_controller->add_reminders($task); if (config_option('repeating_task') == 1) { $opt_rep_day['saturday'] = false; $opt_rep_day['sunday'] = false; if (array_var($task_data, 'repeat_saturdays', false)) { $opt_rep_day['saturday'] = true; } if (array_var($task_data, 'repeat_sundays', false)) { $opt_rep_day['sunday'] = true; } $this->repetitive_task($task, $opt_rep_day); } if (config_option('multi_assignment') && Plugins::instance()->isActivePlugin('crpm')) { $subtasks = array_var($_POST, 'multi_assignment'); Hook::fire('save_subtasks', $task, $subtasks); } //for calculate member status we save de task again after the object have the members $task->save(); DB::commit(); // save subtasks added in 'subtasks' tab DB::beginWork(); $sub_tasks_to_log = $this->saveSubtasks($task, array_var($task_data, 'subtasks'), $member_ids); DB::commit(); foreach ($sub_tasks_to_log['add'] as $st_to_log) { ApplicationLogs::createLog($st_to_log, ApplicationLogs::ACTION_ADD); } foreach ($sub_tasks_to_log['edit'] as $st_to_log) { ApplicationLogs::createLog($st_to_log, ApplicationLogs::ACTION_EDIT); } foreach ($sub_tasks_to_log['trash'] as $st_to_log) { ApplicationLogs::createLog($st_to_log, ApplicationLogs::ACTION_TRASH); } //Send Template task to view if ($task instanceof TemplateTask) { $objectId = $task->getObjectId(); $id = $task->getId(); $objectTypeName = $task->getObjectTypeName(); $objectName = $task->getObjectName(); $manager = get_class($task->manager()); $milestoneId = $task instanceof TemplateTask ? $task->getMilestoneId() : '0'; $subTasks = array(); $parentId = $task->getParentId(); $ico = "ico-task"; $action = "add"; $object = TemplateController::prepareObject($objectId, $id, $objectName, $objectTypeName, $manager, $action, $milestoneId, $subTasks, $parentId, $ico); $template_task_data = array('object' => $object); if (array_var($_REQUEST, 'additional_tt_params')) { $additional_tt_params = json_decode(str_replace("'", '"', array_var($_REQUEST, 'additional_tt_params')), true); foreach ($additional_tt_params as $k => $v) { $template_task_data[$k] = $v; } } if (!array_var($_REQUEST, 'modal')) { evt_add("template object added", $template_task_data); } } // notify asignee if (array_var($task_data, 'send_notification')) { if ($task instanceof ProjectTask && $task->getAssignedToContactId() != $task->getAssignedById()) { try { Notifier::taskAssigned($task); } catch (Exception $e) { evt_add("debug", $e->getMessage()); } // try } // notify asignee for subtasks foreach ($sub_tasks_to_log['assigned'] as $st_to_log) { if ($st_to_log instanceof ProjectTask && $st_to_log->getAssignedToContactId() != $st_to_log->getAssignedById()) { try { Notifier::taskAssigned($st_to_log); } catch (Exception $e) { evt_add("debug", $e->getMessage()); } // try } } } //notify subscribers $isSilent = true; if (array_var($task_data, 'send_notification_subscribers')) { $isSilent = false; } ApplicationLogs::createLog($task, ApplicationLogs::ACTION_ADD, null, $isSilent); if (array_var($_REQUEST, 'modal')) { ajx_current("empty"); $this->setLayout("json"); $this->setTemplate(get_template_path("empty")); // reload task info because plugins may have updated some task info (for example: name prefix) if ($is_template) { $task = TemplateTasks::findById($task->getId()); } else { $task = ProjectTasks::findById($task->getId()); } $params = array('msg' => lang('success add task list', $task->getObjectName()), 'task' => $task->getArrayInfo(), 'reload' => array_var($_REQUEST, 'reload')); if ($task instanceof TemplateTask) { $params['msg'] = lang('success add template', $task->getObjectName()); $params['object'] = $template_task_data['object']; } print_modal_json_response($params, true, array_var($_REQUEST, 'use_ajx')); } else { if ($task instanceof TemplateTask) { flash_success(lang('success add template', $task->getObjectName())); } else { flash_success(lang('success add task list', $task->getObjectName())); } if (array_var($task_data, 'inputtype') != 'taskview') { ajx_current("back"); } else { ajx_current("reload"); } } } catch (Exception $e) { DB::rollback(); if (array_var($_REQUEST, 'modal')) { $this->setLayout("json"); $this->setTemplate(get_template_path("empty")); print_modal_json_response(array('errorCode' => 1, 'errorMessage' => $e->getMessage(), 'showMessage' => 1), true, array_var($_REQUEST, 'use_ajx')); } else { flash_error($e->getMessage()); } ajx_current("empty"); } // try } // if }
$icon = "unknown.png"; $download_url = get_url('mail', 'download_attachment', array('email_id' => $email->getId(), 'attachment_id' => $c)); include_once ROOT . "/library/browser/Browser.php"; if (Browser::instance()->getBrowser() == Browser::BROWSER_IE) { $download_url = "javascript:location.href = '$download_url';"; } $description .= '<img src="' . get_image_url("filetypes/" . $icon) .'"></td> <td><a target="_self" href="' . $download_url . '">' . clean($fName) . " ($size)" . '</a></td></tr>'; } $c++; } $description .= '</table></div></fieldset></td></tr>'; } //if $description .= '</table></div>'; if (($email_count = MailContents::countMailsInConversation($email)) > 1) { $emails_info = MailContents::getMailsFromConversation($email); $conversation_block = ''; $conversation_block .= '<div id="'.$genid.'conversation" style="margin-bottom:10px;' . (count($emails_info) > 6 ? 'max-height:101px;overflow:auto' : '' ) . '"><table style="width:100%;">'; $unread = 0; foreach($emails_info as $count => $info) { $row_cls = $count % 2 ? 'odd' : 'even'; $is_current = $info->getId() == $email->getId(); $style = $is_current ? "style='background-color:#FFDD78'" : ""; $conversation_block .= '<tr class="'.$row_cls.'" ' . $style . '>'; $state = $info->getState(); $show_user_icon = false; if ($state == 1 || $state == 3 || $state == 5) { if ($info->getCreatedById() == logged_user()->getId()) {
/** * Add new task * * @access public * @param void * @return null */ function add_task() { if (logged_user()->isGuest()) { flash_error(lang('no access permissions')); ajx_current("empty"); return; } $project = active_or_personal_project(); if (!ProjectTask::canAdd(logged_user(), $project)) { flash_error(lang('no access permissions')); ajx_current("empty"); return; } // if $task = new ProjectTask(); $task_data = array_var($_POST, 'task'); if (!is_array($task_data)) { $task_data = array('milestone_id' => array_var($_POST, 'milestone_id', 0), 'project_id' => array_var($_POST, 'project_id', active_or_personal_project()->getId()), 'title' => array_var($_POST, 'title', ''), 'assigned_to' => array_var($_POST, 'assigned_to', '0:0'), 'parent_id' => array_var($_POST, 'parent_id', 0), 'priority' => array_var($_POST, 'priority', ProjectTasks::PRIORITY_NORMAL), 'text' => array_var($_POST, 'text', ''), 'start_date' => getDateValue(array_var($_POST, 'task_start_date', '')), 'due_date' => getDateValue(array_var($_POST, 'task_due_date', '')), 'is_template' => array_var($_POST, "is_template", array_var($_GET, "is_template", false)), 'tags' => array_var($_POST, "tags", ''), 'object_subtype' => array_var($_POST, "object_subtype", config_option('default task co type')), 'send_notification' => array_var($_POST, 'notify') && array_var($_POST, 'notify') == 'true'); // array $from_email = array_var($_GET, 'from_email'); $email = MailContents::findById($from_email); if ($email instanceof MailContent) { $task_data['title'] = $email->getSubject(); $task_data['text'] = lang('create task from email description', $email->getSubject(), $email->getFrom(), $email->getTextBody()); $task_data['tags'] = implode(", ", $email->getTagNames()); tpl_assign('from_email', $email); } } // if if (array_var($_GET, 'replace')) { ajx_replace(true); } tpl_assign('task_data', $task_data); tpl_assign('task', $task); if (is_array(array_var($_POST, 'task'))) { $proj = Projects::findById(array_var($task_data, 'project_id')); if ($proj instanceof Project) { $project = $proj; } // order $task->setOrder(ProjectTasks::maxOrder(array_var($task_data, "parent_id", 0), array_var($task_data, "milestone_id", 0))); $task_data['due_date'] = getDateValue(array_var($_POST, 'task_due_date')); $task_data['start_date'] = getDateValue(array_var($_POST, 'task_start_date')); try { $err_msg = $this->setRepeatOptions($task_data); if ($err_msg) { flash_error($err_msg); ajx_current("empty"); return; } $task->setFromAttributes($task_data); $totalMinutes = array_var($task_data, 'time_estimate_hours', 0) * 60 + array_var($task_data, 'time_estimate_minutes', 0); $task->setTimeEstimate($totalMinutes); $task->setIsPrivate(false); // Not used, but defined as not null. // Set assigned to $assigned_to = explode(':', array_var($task_data, 'assigned_to', '')); $company_id = array_var($assigned_to, 0, 0); $user_id = array_var($assigned_to, 1, 0); $can_assign = can_assign_task_to_company_user(logged_user(), $task, $company_id, $user_id); if ($can_assign !== true) { flash_error($can_assign); ajx_current("empty"); return; } $task->setAssignedToCompanyId($company_id); $task->setAssignedToUserId($user_id); $id = array_var($_GET, 'id', 0); $parent = ProjectTasks::findById($id); if ($parent instanceof ProjectTask) { $task->setParentId($id); if ($parent->getIsTemplate()) { $task->setIsTemplate(true); } } if ($task->getParentId() > 0 && $task->hasChild($task->getParentId())) { flash_error(lang('task child of child error')); ajx_current("empty"); return; } //Add handins $handins = array(); for ($i = 0; $i < 4; $i++) { if (isset($task_data["handin{$i}"]) && is_array($task_data["handin{$i}"]) && trim(array_var($task_data["handin{$i}"], 'title')) != '') { $assigned_to = explode(':', array_var($task_data["handin{$i}"], 'assigned_to', '')); $handins[] = array('title' => array_var($task_data["handin{$i}"], 'title'), 'responsible_company_id' => array_var($assigned_to, 0, 0), 'responsible_user_id' => array_var($assigned_to, 1, 0)); // array } // if } // for DB::beginWork(); $task->save(); //$task->setProject($project); //echo 'pepe'; DB::rollback(); die(); $task->setTagsFromCSV(array_var($task_data, 'tags')); foreach ($handins as $handin_data) { $handin = new ObjectHandin(); $handin->setFromAttributes($handin_data); $handin->setObjectId($task->getId()); $handin->setObjectManager(get_class($task->manager())); $handin->save(); } // foreach*/ if (array_var($_GET, 'copyId', 0) > 0) { // copy remaining stuff from the task with id copyId $toCopy = ProjectTasks::findById(array_var($_GET, 'copyId')); if ($toCopy instanceof ProjectTask) { ProjectTasks::copySubTasks($toCopy, $task, array_var($task_data, 'is_template', false)); } } //Link objects $object_controller = new ObjectController(); if ($parent instanceof ProjectTask) { // task is being added as subtask of another, so place in same workspace $task->addToWorkspace($parent->getProject()); } else { $object_controller->add_to_workspaces($task); } $object_controller->link_to_new_object($task); $object_controller->add_subscribers($task); $object_controller->add_custom_properties($task); $object_controller->add_reminders($task); ApplicationLogs::createLog($task, $task->getWorkspaces(), ApplicationLogs::ACTION_ADD); DB::commit(); // notify asignee if (array_var($task_data, 'send_notification') == 'checked') { try { Notifier::taskAssigned($task); } catch (Exception $e) { evt_add("debug", $e->getMessage()); } // try } if ($task->getIsTemplate()) { flash_success(lang('success add template', $task->getTitle())); } else { flash_success(lang('success add task list', $task->getTitle())); } if (array_var($task_data, 'inputtype') != 'taskview') { ajx_current("back"); } else { ajx_current("reload"); } } catch (Exception $e) { DB::rollback(); flash_error($e->getMessage()); ajx_current("empty"); } // try } // if }
function getLinkedObjects() { $conv_emails = MailContents::getMailsFromConversation($this); $objects = array(); foreach ($conv_emails as $mail){ if(logged_user()->isMemberOfOwnerCompany()) { $mail_objects = $mail->getAllLinkedObjects(); } else { if (is_null($mail->linked_objects)) { $mail->linked_objects = LinkedObjects::getLinkedObjectsByObject($this, true); } $mail_objects = $mail->linked_objects; } if (is_array($mail_objects)){ foreach ($mail_objects as $mo){ $objects[] = $mo; } } } if ($this->isTrashed()) { $include_trashed = true; } else { $include_trashed = false; } if ($include_trashed) { return $objects; } else { $ret = array(); if (is_array($objects) && count($objects)) { foreach ($objects as $o) { if (!$o instanceof ContentDataObject || !$o->isTrashed()) { $ret[] = $o; } } } return $ret; } }
<?php $icon_class = $linked_object->getObjectTypeName(); $belongs_to_conversation = MailContents::countMailsInConversation($linked_object) > 1; ?> <tr class="<?php echo $counter % 2 ? 'even' : 'odd' ?>"> <td style="padding-left:1px;vertical-align:middle;width:22px"> <a class="internalLink" href="<?php echo $linked_object->getObjectUrl() ?>"> <div class="db-ico unknown ico-<?php echo clean($icon_class) ?>" title="<?php echo clean($linked_object->getObjectTypeName()) ?>"></div> </a></td> <td><a class="internalLink" href="<?php echo $linked_object->getObjectUrl() ?>" title="<?php echo clean($linked_object->getObjectName()) ?>"> <span><?php if ($linked_object->getState() == 2) {?><span style="color:red;font-weight:bold"><?php echo lang('draft') ?></span> - <?php } ?><?php echo clean($linked_object->getObjectName()) ?></span></a></td> <td><span class="desc"><?php echo lang('from')?>: </span><?php echo $linked_object->getFrom()?></td> <?php $date_str = $linked_object->getSentDate() instanceof DateTimeValue ? ($linked_object->getSentDate()->isToday() ? format_time($linked_object->getSentDate(), null, logged_user()->getTimezone()) : format_datetime($linked_object->getSentDate(), $date_format, logged_user()->getTimezone())) : lang('n/a') ?> <td><span class="desc"><?php echo lang('date')?>: </span><?php echo $date_str ?></td> <td> <?php if ($belongs_to_conversation) { ?> <div onclick="og.loadConversation('<?php echo $genid ?>', <?php echo $linked_object->getId()?>);" class="db-ico ico-comment" style="cursor: pointer;"></div> <?php } ?> </td> <td style="text-align:right;"> <?php if ($linked_objects_object->canUnlinkObject(logged_user(), $linked_object)) { echo '<a class="internalLink" href="' . $linked_objects_object->getUnlinkObjectUrl($linked_object) . '" onclick="return confirm(\'' . escape_single_quotes(lang('confirm unlink object')) . '\')" title="' . lang('unlink object') . '">' . lang('unlink') . '</a>'; } ?>