private function _sendForwards($event, $is_inbound) { @($ticket_id = $event->params['ticket_id']); @($send_worker_id = $event->params['worker_id']); $url_writer = DevblocksPlatform::getUrlService(); $ticket = DAO_Ticket::get($ticket_id); // (Action) Forward Email To: // Sanitize and combine all the destination addresses $context_workers = CerberusContexts::getWorkers(CerberusContexts::CONTEXT_TICKET, $ticket->id); if (!is_array($context_workers)) { return; } foreach ($context_workers as $next_worker) { $notify_emails = $next_worker->email; if (empty($notify_emails)) { continue; } } // [TODO] This could be more efficient $messages = DAO_Message::getMessagesByTicket($ticket_id); $message = end($messages); // last message unset($messages); $headers = $message->getHeaders(); // The whole flipping Swift section needs wrapped to catch exceptions try { $settings = DevblocksPlatform::getPluginSettingsService(); $reply_to = $settings->get('cerberusweb.core', CerberusSettings::DEFAULT_REPLY_FROM, CerberusSettingsDefaults::DEFAULT_REPLY_FROM); // See if we need a group-specific reply-to if (!empty($ticket->team_id)) { @($group_from = DAO_GroupSettings::get($ticket->team_id, DAO_GroupSettings::SETTING_REPLY_FROM, '')); if (!empty($group_from)) { $reply_to = $group_from; } } $sender = DAO_Address::get($message->address_id); $sender_email = strtolower($sender->email); $sender_split = explode('@', $sender_email); if (!is_array($sender_split) || count($sender_split) != 2) { return; } // If return-path is blank if (isset($headers['return-path']) && $headers['return-path'] == '<>') { return; } // Ignore bounces if ($sender_split[0] == "postmaster" || $sender_split[0] == "mailer-daemon") { return; } // Ignore autoresponses autoresponses if (isset($headers['auto-submitted']) && $headers['auto-submitted'] != 'no') { return; } // Attachments $attachments = $message->getAttachments(); $mime_attachments = array(); if (is_array($attachments)) { foreach ($attachments as $attachment) { if (0 == strcasecmp($attachment->display_name, 'original_message.html')) { continue; } $attachment_path = APP_STORAGE_PATH . '/attachments/'; // [TODO] This is highly redundant in the codebase if (!file_exists($attachment_path . $attachment->filepath)) { continue; } $attach = Swift_Attachment::fromPath($attachment_path . $attachment->filepath); if (!empty($attachment->display_name)) { $attach->setFilename($attachment->display_name); } $mime_attachments[] = $attach; } } // Send copies $mail_service = DevblocksPlatform::getMailService(); $mailer = $mail_service->getMailer(CerberusMail::getMailerDefaults()); $mail = $mail_service->createMessage(); /* @var $mail Swift_Message */ $mail->setTo(array($notify_emails)); $mail->setFrom(array($sender->email)); $mail->setReplyTo($reply_to); $mail->setReturnPath($reply_to); $mail->setSubject(sprintf("[RW: %s #%s]: %s", $is_inbound ? 'inbound' : 'outbound', $ticket->mask, $ticket->subject)); $hdrs = $mail->getHeaders(); if (null !== @($msgid = $headers['message-id'])) { $hdrs->addTextHeader('Message-Id', $msgid); } if (null !== @($in_reply_to = $headers['in-reply-to'])) { $hdrs->addTextHeader('References', $in_reply_to); $hdrs->addTextHeader('In-Reply-To', $in_reply_to); } $hdrs->addTextHeader('X-Mailer', 'Cerberus Helpdesk (Build ' . APP_BUILD . ')'); $hdrs->addTextHeader('Precedence', 'List'); $hdrs->addTextHeader('Auto-Submitted', 'auto-generated'); $mail->setBody($message->getContent()); // Send message attachments with watcher if (is_array($mime_attachments)) { foreach ($mime_attachments as $mime_attachment) { $mail->attach($mime_attachment); } } $result = $mailer->send($mail); } catch (Exception $e) { if (!empty($message_id)) { $fields = array(DAO_MessageNote::MESSAGE_ID => $message_id, DAO_MessageNote::CREATED => time(), DAO_MessageNote::WORKER_ID => 0, DAO_MessageNote::CONTENT => 'Exception thrown while sending watcher email: ' . $e->getMessage(), DAO_MessageNote::TYPE => Model_MessageNote::TYPE_ERROR); DAO_MessageNote::create($fields); } } }
function doBulkUpdate($filter, $do, $ids = array()) { @set_time_limit(600); // [TODO] Temp! $change_fields = array(); $custom_fields = array(); // Make sure we have actions if (empty($do)) { return; } // Make sure we have checked items if we want a checked list if (0 == strcasecmp($filter, "checks") && empty($ids)) { return; } if (is_array($do)) { foreach ($do as $k => $v) { switch ($k) { case 'status': switch (strtolower($v)) { case 'open': $change_fields[DAO_CrmOpportunity::IS_CLOSED] = 0; $change_fields[DAO_CrmOpportunity::IS_WON] = 0; $change_fields[DAO_CrmOpportunity::CLOSED_DATE] = 0; break; case 'won': $change_fields[DAO_CrmOpportunity::IS_CLOSED] = 1; $change_fields[DAO_CrmOpportunity::IS_WON] = 1; $change_fields[DAO_CrmOpportunity::CLOSED_DATE] = time(); break; case 'lost': $change_fields[DAO_CrmOpportunity::IS_CLOSED] = 1; $change_fields[DAO_CrmOpportunity::IS_WON] = 0; $change_fields[DAO_CrmOpportunity::CLOSED_DATE] = time(); break; } break; case 'closed_date': $change_fields[DAO_CrmOpportunity::CLOSED_DATE] = intval($v); break; case 'worker_id': $change_fields[DAO_CrmOpportunity::WORKER_ID] = intval($v); break; default: // Custom fields if (substr($k, 0, 3) == "cf_") { $custom_fields[substr($k, 3)] = $v; } } } } $pg = 0; if (empty($ids)) { do { list($objects, $null) = DAO_CrmOpportunity::search(array(), $this->params, 100, $pg++, SearchFields_CrmOpportunity::ID, true, false); $ids = array_merge($ids, array_keys($objects)); } while (!empty($objects)); } // Broadcast? if (isset($do['broadcast'])) { $tpl_builder = DevblocksPlatform::getTemplateBuilder(); $params = $do['broadcast']; if (!isset($params['worker_id']) || empty($params['worker_id']) || !isset($params['subject']) || empty($params['subject']) || !isset($params['message']) || empty($params['message'])) { break; } $is_queued = isset($params['is_queued']) && $params['is_queued'] ? true : false; if (is_array($ids)) { foreach ($ids as $opp_id) { try { CerberusContexts::getContext(CerberusContexts::CONTEXT_OPPORTUNITY, $opp_id, $tpl_labels, $tpl_tokens); $subject = $tpl_builder->build($params['subject'], $tpl_tokens); $body = $tpl_builder->build($params['message'], $tpl_tokens); $fields = array(DAO_MailQueue::TYPE => Model_MailQueue::TYPE_COMPOSE, DAO_MailQueue::TICKET_ID => 0, DAO_MailQueue::WORKER_ID => $params['worker_id'], DAO_MailQueue::UPDATED => time(), DAO_MailQueue::HINT_TO => $tpl_tokens['email_address'], DAO_MailQueue::SUBJECT => $subject, DAO_MailQueue::BODY => $body, DAO_MailQueue::PARAMS_JSON => json_encode(array('to' => $tpl_tokens['email_address'], 'group_id' => $params['group_id']))); if ($is_queued) { $fields[DAO_MailQueue::IS_QUEUED] = 1; } $draft_id = DAO_MailQueue::create($fields); } catch (Exception $e) { // [TODO] ... } } } } $batch_total = count($ids); for ($x = 0; $x <= $batch_total; $x += 100) { $batch_ids = array_slice($ids, $x, 100); DAO_CrmOpportunity::update($batch_ids, $change_fields); // Custom Fields self::_doBulkSetCustomFields(CrmCustomFieldSource_Opportunity::ID, $custom_fields, $batch_ids); unset($batch_ids); } unset($ids); }