Exemplo n.º 1
0
 public static function getTemplateHandler()
 {
     $tpl = DevblocksPlatform::getTemplateService();
     $tpl_path = dirname(__FILE__) . '/templates/';
     $tpl->assign('path', $tpl_path);
     $tpl->cache_lifetime = "0";
     $total_new_count = 0;
     foreach (DAO_WorkflowView::getGroupTotals() as $data) {
         $total_new_count += $data["total"];
     }
     $tpl->assign('total_new_count', $total_new_count);
     $newest = isset($_SESSION["fluid_latest_seen"]) ? $_SESSION["fluid_latest_seen"] : time() - 3600;
     $worker = CerberusApplication::getActiveWorker();
     $memberships = $worker->getMemberships();
     $params = array(SearchFields_Ticket::TICKET_TEAM_ID => new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_TEAM_ID, 'in', array_keys($memberships)), SearchFields_Ticket::TICKET_DELETED => new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_DELETED, 'eq', 0), SearchFields_Ticket::TICKET_WAITING => new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_WAITING, 'eq', 0), SearchFields_Ticket::TICKET_CLOSED => new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_CLOSED, 'eq', 0), SearchFields_Ticket::TICKET_UPDATED_DATE => new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_UPDATED_DATE, '>', $newest));
     list($results, $total) = DAO_Ticket::search(array(SearchFields_Ticket::TICKET_ID, SearchFields_Ticket::TICKET_MASK, SearchFields_Ticket::TICKET_SUBJECT, SearchFields_Ticket::TICKET_LAST_WROTE), $params, 5, 0, SearchFields_Ticket::TICKET_UPDATED_DATE, false, true);
     $tickets = array();
     foreach ($results as $ticket) {
         if ($ticket[SearchFields_Ticket::TICKET_UPDATED_DATE] > $newest) {
             $newest = $ticket[SearchFields_Ticket::TICKET_UPDATED_DATE];
         }
         $tickets[] = $ticket;
     }
     $_SESSION["fluid_latest_seen"] = $newest;
     $tpl->assign("recent_tickets_json", json_encode($tickets));
     $tpl->assign("recent_ticket_count", json_encode($total));
     return $tpl;
 }
Exemplo n.º 2
0
 /**
  * @param Model_DevblocksEvent $event
  */
 function handleEvent(Model_DevblocksEvent $event)
 {
     switch ($event->id) {
         case 'cron.maint':
             DAO_TicketAuditLog::maint();
             break;
         case 'ticket.merge':
             // Listen for ticket merges and update our internal ticket_id records
             @($new_ticket_id = $event->params['new_ticket_id']);
             @($old_ticket_ids = $event->params['old_ticket_ids']);
             if (empty($new_ticket_id) || empty($old_ticket_ids)) {
                 return;
             }
             $fields = array(DAO_TicketAuditLog::TICKET_ID => $new_ticket_id);
             DAO_TicketAuditLog::updateWhere($fields, sprintf("%s IN (%s)", DAO_TicketAuditLog::TICKET_ID, implode(',', $old_ticket_ids)));
             break;
         case 'ticket.property.pre_change':
             @($ticket_ids = $event->params['ticket_ids']);
             @($changed_fields = $event->params['changed_fields']);
             // Filter out any mandatory changes we could care less about
             unset($changed_fields[DAO_Ticket::UPDATED_DATE]);
             unset($changed_fields[DAO_Ticket::MASK]);
             unset($changed_fields[DAO_Ticket::FIRST_MESSAGE_ID]);
             unset($changed_fields[DAO_Ticket::FIRST_WROTE_ID]);
             unset($changed_fields[DAO_Ticket::LAST_WROTE_ID]);
             unset($changed_fields[DAO_Ticket::INTERESTING_WORDS]);
             @($tickets = DAO_Ticket::getTickets($ticket_ids));
             // Is a worker around to invoke this change?  0 = automatic
             @($worker_id = null != ($active_worker = CerberusApplication::getActiveWorker()) && !empty($active_worker->id) ? $active_worker->id : 0);
             if (is_array($tickets) && !empty($tickets) && is_array($changed_fields) && !empty($changed_fields)) {
                 foreach ($tickets as $ticket_id => $ticket) {
                     /* @var $ticket CerberusTicket */
                     foreach ($changed_fields as $changed_field => $changed_value) {
                         if (is_array($changed_value)) {
                             $changed_value = implode("\r\n", $changed_value);
                         }
                         // If different
                         if (isset($ticket->{$changed_field}) && 0 != strcmp($ticket->{$changed_field}, $changed_value)) {
                             $fields = array(DAO_TicketAuditLog::TICKET_ID => $ticket_id, DAO_TicketAuditLog::WORKER_ID => $worker_id, DAO_TicketAuditLog::CHANGE_DATE => time(), DAO_TicketAuditLog::CHANGE_FIELD => $changed_field, DAO_TicketAuditLog::CHANGE_VALUE => substr($changed_value, 0, 128));
                             $log_id = DAO_TicketAuditLog::create($fields);
                         }
                     }
                 }
             }
             break;
     }
 }
Exemplo n.º 3
0
 function handleRequest(DevblocksHttpRequest $request)
 {
     $translate = DevblocksPlatform::getTranslationService();
     $stack = $request->path;
     // URLS like: /files/10000/plaintext.txt
     array_shift($stack);
     // files
     $file_id = array_shift($stack);
     // 10000
     $file_name = array_shift($stack);
     // plaintext.txt
     // Security
     if (null == ($active_worker = CerberusApplication::getActiveWorker())) {
         die($translate->_('common.access_denied'));
     }
     if (empty($file_id) || empty($file_name) || null == ($file = DAO_Attachment::get($file_id))) {
         die($translate->_('files.not_found'));
     }
     // Security
     $message = DAO_Ticket::getMessage($file->message_id);
     if (null == ($ticket = DAO_Ticket::getTicket($message->ticket_id))) {
         die($translate->_('common.access_denied'));
     }
     // Security
     $active_worker_memberships = $active_worker->getMemberships();
     if (null == $active_worker_memberships[$ticket->team_id]) {
         die($translate->_('common.access_denied'));
     }
     // Set headers
     header("Expires: Mon, 26 Nov 1962 00:00:00 GMT\n");
     header("Last-Modified: " . gmdate("D,d M YH:i:s") . " GMT\n");
     header("Cache-control: private\n");
     header("Pragma: no-cache\n");
     header("Content-Type: " . $file->mime_type . "\n");
     header("Content-transfer-encoding: binary\n");
     header("Content-Length: " . $file->getFileSize() . "\n");
     echo $file->getFileContents();
     exit;
 }
Exemplo n.º 4
0
	function handleRequest(DevblocksHttpRequest $request) {
		$worker = CerberusApplication::getActiveWorker();
		if(empty($worker)) return;
		
		$stack = $request->path;
		array_shift($stack); // internal
		
		@$action = array_shift($stack) . 'Action';
		
		switch($action) {
			case NULL:
				// [TODO] Index/page render
				break;
				 
			default:
				// Default action, call arg as a method suffixed with Action
				if(method_exists($this,$action)) {
					call_user_func(array(&$this, $action));
				}
			break;
		}
	}
Exemplo n.º 5
0
Arquivo: App.php Projeto: Hildy/cerb5
 function saveWatcherPanelAction()
 {
     $translate = DevblocksPlatform::getTranslationService();
     @($id = DevblocksPlatform::importGPC($_REQUEST['id'], 'integer', 0));
     @($active_worker = CerberusApplication::getActiveWorker());
     //	    if(!$active_worker->is_superuser)
     //	    	return;
     /*****************************/
     @($name = DevblocksPlatform::importGPC($_POST['name'], 'string', ''));
     @($is_disabled = DevblocksPlatform::importGPC($_POST['is_disabled'], 'integer', 0));
     @($worker_id = DevblocksPlatform::importGPC($_POST['worker_id'], 'integer', 0));
     @($rules = DevblocksPlatform::importGPC($_POST['rules'], 'array', array()));
     @($do = DevblocksPlatform::importGPC($_POST['do'], 'array', array()));
     if (empty($name)) {
         $name = $translate->_('Watcher Filter');
     }
     $criterion = array();
     $actions = array();
     // Custom fields
     $custom_fields = DAO_CustomField::getAll();
     // Criteria
     if (is_array($rules)) {
         foreach ($rules as $rule) {
             $rule = DevblocksPlatform::strAlphaNumDash($rule);
             @($value = DevblocksPlatform::importGPC($_POST['value_' . $rule], 'string', ''));
             // [JAS]: Allow empty $value (null/blank checking)
             $criteria = array('value' => $value);
             // Any special rule handling
             switch ($rule) {
                 case 'dayofweek':
                     // days
                     $days = DevblocksPlatform::importGPC($_REQUEST['value_dayofweek'], 'array', array());
                     if (in_array(0, $days)) {
                         $criteria['sun'] = 'Sunday';
                     }
                     if (in_array(1, $days)) {
                         $criteria['mon'] = 'Monday';
                     }
                     if (in_array(2, $days)) {
                         $criteria['tue'] = 'Tuesday';
                     }
                     if (in_array(3, $days)) {
                         $criteria['wed'] = 'Wednesday';
                     }
                     if (in_array(4, $days)) {
                         $criteria['thu'] = 'Thursday';
                     }
                     if (in_array(5, $days)) {
                         $criteria['fri'] = 'Friday';
                     }
                     if (in_array(6, $days)) {
                         $criteria['sat'] = 'Saturday';
                     }
                     unset($criteria['value']);
                     break;
                 case 'timeofday':
                     $from = DevblocksPlatform::importGPC($_REQUEST['timeofday_from'], 'string', '');
                     $to = DevblocksPlatform::importGPC($_REQUEST['timeofday_to'], 'string', '');
                     $criteria['from'] = $from;
                     $criteria['to'] = $to;
                     unset($criteria['value']);
                     break;
                 case 'event':
                     @($events = DevblocksPlatform::importGPC($_REQUEST['value_event'], 'array', array()));
                     if (is_array($events)) {
                         foreach ($events as $event) {
                             $criteria[$event] = true;
                         }
                     }
                     unset($criteria['value']);
                     break;
                 case 'groups':
                     @($groups = DevblocksPlatform::importGPC($_REQUEST['value_groups'], 'array', array()));
                     if (is_array($groups) && !empty($groups)) {
                         $criteria['groups'] = array();
                         foreach ($groups as $group_id) {
                             @($all = DevblocksPlatform::importGPC($_REQUEST['value_group' . $group_id . '_all'], 'integer', 0));
                             // Did we only want to watch specific buckets in this group?
                             $bucket_ids = array();
                             if (!$all) {
                                 @($bucket_ids = DevblocksPlatform::importGPC($_REQUEST['value_group' . $group_id . '_buckets'], 'array', array()));
                             }
                             // Add to criteria (key=group id, val=array of bucket ids)
                             $criteria['groups'][$group_id] = $bucket_ids;
                         }
                     }
                     unset($criteria['value']);
                     break;
                 case 'next_worker_id':
                     break;
                 case 'subject':
                     break;
                 case 'from':
                     break;
                     //				case 'tocc':
                     //					break;
                 //				case 'tocc':
                 //					break;
                 case 'header1':
                 case 'header2':
                 case 'header3':
                 case 'header4':
                 case 'header5':
                     if (null != @($header = DevblocksPlatform::importGPC($_POST[$rule], 'string', null))) {
                         $criteria['header'] = strtolower($header);
                     }
                     break;
                 case 'body':
                     break;
                 default:
                     // ignore invalids // [TODO] Very redundant
                     // Custom fields
                     if ("cf_" == substr($rule, 0, 3)) {
                         $field_id = intval(substr($rule, 3));
                         if (!isset($custom_fields[$field_id])) {
                             continue;
                         }
                         // [TODO] Operators
                         switch ($custom_fields[$field_id]->type) {
                             case 'S':
                                 // string
                             // string
                             case 'T':
                                 // clob
                             // clob
                             case 'U':
                                 // URL
                                 @($oper = DevblocksPlatform::importGPC($_REQUEST['value_cf_' . $field_id . '_oper'], 'string', 'regexp'));
                                 $criteria['oper'] = $oper;
                                 break;
                             case 'D':
                                 // dropdown
                             // dropdown
                             case 'M':
                                 // multi-dropdown
                             // multi-dropdown
                             case 'X':
                                 // multi-checkbox
                             // multi-checkbox
                             case 'W':
                                 // worker
                                 @($in_array = DevblocksPlatform::importGPC($_REQUEST['value_cf_' . $field_id], 'array', array()));
                                 $out_array = array();
                                 // Hash key on the option for quick lookup later
                                 if (is_array($in_array)) {
                                     foreach ($in_array as $k => $v) {
                                         $out_array[$v] = $v;
                                     }
                                 }
                                 $criteria['value'] = $out_array;
                                 break;
                             case 'E':
                                 // date
                                 @($from = DevblocksPlatform::importGPC($_REQUEST['value_cf_' . $field_id . '_from'], 'string', '0'));
                                 @($to = DevblocksPlatform::importGPC($_REQUEST['value_cf_' . $field_id . '_to'], 'string', 'now'));
                                 $criteria['from'] = $from;
                                 $criteria['to'] = $to;
                                 unset($criteria['value']);
                                 break;
                             case 'N':
                                 // number
                                 @($oper = DevblocksPlatform::importGPC($_REQUEST['value_cf_' . $field_id . '_oper'], 'string', '='));
                                 $criteria['oper'] = $oper;
                                 $criteria['value'] = intval($value);
                                 break;
                             case 'C':
                                 // checkbox
                                 $criteria['value'] = intval($value);
                                 break;
                         }
                     } else {
                         continue;
                     }
                     break;
             }
             $criterion[$rule] = $criteria;
         }
     }
     // Actions
     if (is_array($do)) {
         foreach ($do as $act) {
             $action = array();
             switch ($act) {
                 // Forward a copy to...
                 case 'email':
                     @($emails = DevblocksPlatform::importGPC($_REQUEST['do_email'], 'array', array()));
                     if (!empty($emails)) {
                         $action = array('to' => $emails);
                     }
                     break;
                     // Watcher notification
                 // Watcher notification
                 case 'notify':
                     //@$emails = DevblocksPlatform::importGPC($_REQUEST['do_email'],'array',array());
                     //if(!empty($emails)) {
                     $action = array();
                     //}
                     break;
             }
             $actions[$act] = $action;
         }
     }
     $fields = array(DAO_WatcherMailFilter::NAME => $name, DAO_WatcherMailFilter::IS_DISABLED => $is_disabled, DAO_WatcherMailFilter::WORKER_ID => $worker_id, DAO_WatcherMailFilter::CRITERIA_SER => serialize($criterion), DAO_WatcherMailFilter::ACTIONS_SER => serialize($actions));
     // Create
     if (empty($id)) {
         $fields[DAO_WatcherMailFilter::POS] = 0;
         $id = DAO_WatcherMailFilter::create($fields);
         // Update
     } else {
         DAO_WatcherMailFilter::update($id, $fields);
     }
     exit;
     //DevblocksPlatform::redirect(new DevblocksHttpResponse(array('preferences','watchers')));
 }
Exemplo n.º 6
0
 function signoutAction()
 {
     $session = DevblocksPlatform::getSessionService();
     $visit = $session->getVisit();
     if (null != ($worker = CerberusApplication::getActiveWorker())) {
         DAO_Worker::logActivity($worker->id, new Model_Activity(null));
     }
     $session->clear();
     DevblocksPlatform::redirect(new DevblocksHttpResponse(array('login')));
 }
Exemplo n.º 7
0
 function doDeleteWorkspaceAction()
 {
     @($workspace = DevblocksPlatform::importGPC($_POST['workspace'], 'string', ''));
     $db = DevblocksPlatform::getDatabaseService();
     $active_worker = CerberusApplication::getActiveWorker();
     $lists = DAO_WorkerWorkspaceList::getWhere(sprintf("%s = %s AND %s = %d", DAO_WorkerWorkspaceList::WORKSPACE, $db->qstr($workspace), DAO_WorkerWorkspaceList::WORKER_ID, $active_worker->id));
     DAO_WorkerWorkspaceList::delete(array_keys($lists));
     DevblocksPlatform::redirect(new DevblocksHttpResponse(array('home')));
 }
Exemplo n.º 8
0
 function saveReplyTemplateAction()
 {
     @($id = DevblocksPlatform::importGPC($_REQUEST['id'], 'integer', 0));
     @($title = DevblocksPlatform::importGPC($_REQUEST['title'], 'string', ''));
     @($description = DevblocksPlatform::importGPC($_REQUEST['description'], 'string', ''));
     @($folder = DevblocksPlatform::importGPC($_REQUEST['folder'], 'string', ''));
     @($folder_new = DevblocksPlatform::importGPC($_REQUEST['folder_new'], 'string', ''));
     @($content = DevblocksPlatform::importGPC($_REQUEST['template'], 'string', ''));
     @($type = DevblocksPlatform::importGPC($_REQUEST['type'], 'integer', 0));
     @($delete = DevblocksPlatform::importGPC($_REQUEST['do_delete'], 'integer', 0));
     $worker = CerberusApplication::getActiveWorker();
     if (empty($delete)) {
         $fields = array(DAO_MailTemplate::TITLE => $title, DAO_MailTemplate::FOLDER => !empty($folder) ? $folder : $folder_new, DAO_MailTemplate::DESCRIPTION => $description, DAO_MailTemplate::CONTENT => $content, DAO_MailTemplate::TEMPLATE_TYPE => $type, DAO_MailTemplate::OWNER_ID => $worker->id);
         if (empty($id)) {
             // new
             $id = DAO_MailTemplate::create($fields);
         } else {
             // edit
             DAO_MailTemplate::update($id, $fields);
         }
     } else {
         // delete
         DAO_MailTemplate::delete($id);
     }
 }
Exemplo n.º 9
0
 function handleRequest(DevblocksHttpRequest $request)
 {
     $worker = CerberusApplication::getActiveWorker();
     if (empty($worker)) {
         return;
     }
     $stack = $request->path;
     array_shift($stack);
     // print
     @($object = strtolower(array_shift($stack)));
     // ticket|message|etc
     $tpl = DevblocksPlatform::getTemplateService();
     $tpl->assign('path', $this->_TPL_PATH);
     $settings = DevblocksPlatform::getPluginSettingsService();
     $tpl->assign('settings', $settings);
     $translate = DevblocksPlatform::getTranslationService();
     $tpl->assign('translate', $translate);
     $teams = DAO_Group::getAll();
     $tpl->assign('teams', $teams);
     $buckets = DAO_Bucket::getAll();
     $tpl->assign('buckets', $buckets);
     $workers = DAO_Worker::getAll();
     $tpl->assign('workers', $workers);
     // Security
     $active_worker = CerberusApplication::getActiveWorker();
     $active_worker_memberships = $active_worker->getMemberships();
     // [TODO] Make this pluggable
     // Subcontroller
     switch ($object) {
         case 'ticket':
             @($id = array_shift($stack));
             @($ticket = is_numeric($id) ? DAO_Ticket::getTicket($id) : DAO_Ticket::getTicketByMask($id));
             $convo_timeline = array();
             $messages = $ticket->getMessages();
             foreach ($messages as $message_id => $message) {
                 /* @var $message CerberusMessage */
                 $key = $message->created_date . '_m' . $message_id;
                 // build a chrono index of messages
                 $convo_timeline[$key] = array('m', $message_id);
             }
             @($mail_inline_comments = DAO_WorkerPref::get($active_worker->id, 'mail_inline_comments', 1));
             if ($mail_inline_comments) {
                 // if inline comments are enabled
                 $comments = DAO_TicketComment::getByTicketId($ticket->id);
                 arsort($comments);
                 $tpl->assign('comments', $comments);
                 // build a chrono index of comments
                 foreach ($comments as $comment_id => $comment) {
                     /* @var $comment Model_TicketComment */
                     $key = $comment->created . '_c' . $comment_id;
                     $convo_timeline[$key] = array('c', $comment_id);
                 }
             }
             ksort($convo_timeline);
             $tpl->assign('convo_timeline', $convo_timeline);
             // Comment parent addresses
             $comment_addresses = array();
             foreach ($comments as $comment) {
                 /* @var $comment Model_TicketComment */
                 $address_id = intval($comment->address_id);
                 if (!isset($comment_addresses[$address_id])) {
                     $address = DAO_Address::get($address_id);
                     $comment_addresses[$address_id] = $address;
                 }
             }
             $tpl->assign('comment_addresses', $comment_addresses);
             // Message Notes
             $notes = DAO_MessageNote::getByTicketId($ticket->id);
             $message_notes = array();
             // Index notes by message id
             if (is_array($notes)) {
                 foreach ($notes as $note) {
                     if (!isset($message_notes[$note->message_id])) {
                         $message_notes[$note->message_id] = array();
                     }
                     $message_notes[$note->message_id][$note->id] = $note;
                 }
             }
             $tpl->assign('message_notes', $message_notes);
             // Make sure we're allowed to view this ticket or message
             if (!isset($active_worker_memberships[$ticket->team_id])) {
                 echo "<H1>" . $translate->_('common.access_denied') . "</H1>";
                 return;
             }
             $tpl->assign('ticket', $ticket);
             $tpl->display('file:' . $this->_TPL_PATH . 'print/ticket.tpl');
             break;
         case 'message':
             @($id = array_shift($stack));
             @($message = DAO_Ticket::getMessage($id));
             @($ticket = DAO_Ticket::getTicket($message->ticket_id));
             // Make sure we're allowed to view this ticket or message
             if (!isset($active_worker_memberships[$ticket->team_id])) {
                 echo "<H1>" . $translate->_('common.access_denied') . "</H1>";
                 return;
             }
             // Message Notes
             $notes = DAO_MessageNote::getByTicketId($ticket->id);
             $message_notes = array();
             // Index notes by message id
             if (is_array($notes)) {
                 foreach ($notes as $note) {
                     if (!isset($message_notes[$note->message_id])) {
                         $message_notes[$note->message_id] = array();
                     }
                     $message_notes[$note->message_id][$note->id] = $note;
                 }
             }
             $tpl->assign('message_notes', $message_notes);
             $tpl->assign('message', $message);
             $tpl->assign('ticket', $ticket);
             $tpl->display('file:' . $this->_TPL_PATH . 'print/message.tpl');
             break;
     }
 }
Exemplo n.º 10
0
 function saveTabFieldsAction()
 {
     @($group_id = DevblocksPlatform::importGPC($_POST['team_id'], 'integer'));
     @($active_worker = CerberusApplication::getActiveWorker());
     if (!$active_worker->isTeamManager($group_id) && !$active_worker->is_superuser) {
         return;
     }
     @($ids = DevblocksPlatform::importGPC($_POST['ids'], 'array', array()));
     @($names = DevblocksPlatform::importGPC($_POST['names'], 'array', array()));
     @($orders = DevblocksPlatform::importGPC($_POST['orders'], 'array', array()));
     @($options = DevblocksPlatform::importGPC($_POST['options'], 'array', array()));
     @($allow_delete = DevblocksPlatform::importGPC($_POST['allow_delete'], 'integer', 0));
     @($deletes = DevblocksPlatform::importGPC($_POST['deletes'], 'array', array()));
     if (!empty($ids)) {
         foreach ($ids as $idx => $id) {
             @($name = $names[$idx]);
             @($order = intval($orders[$idx]));
             @($option = $options[$idx]);
             @($delete = false !== array_search($id, $deletes) ? 1 : 0);
             if ($allow_delete && $delete) {
                 DAO_CustomField::delete($id);
             } else {
                 $fields = array(DAO_CustomField::NAME => $name, DAO_CustomField::POS => $order, DAO_CustomField::OPTIONS => !is_null($option) ? $option : '');
                 DAO_CustomField::update($id, $fields);
             }
         }
     }
     // Add custom field
     @($add_name = DevblocksPlatform::importGPC($_POST['add_name'], 'string', ''));
     @($add_type = DevblocksPlatform::importGPC($_POST['add_type'], 'string', ''));
     @($add_options = DevblocksPlatform::importGPC($_POST['add_options'], 'string', ''));
     if (!empty($add_name) && !empty($add_type)) {
         $fields = array(DAO_CustomField::NAME => $add_name, DAO_CustomField::TYPE => $add_type, DAO_CustomField::GROUP_ID => $group_id, DAO_CustomField::SOURCE_EXTENSION => ChCustomFieldSource_Ticket::ID, DAO_CustomField::OPTIONS => $add_options);
         $id = DAO_CustomField::create($fields);
     }
     DevblocksPlatform::setHttpResponse(new DevblocksHttpResponse(array('groups', $group_id, 'fields')));
 }
Exemplo n.º 11
0
 static function getGroupTotals()
 {
     $db = DevblocksPlatform::getDatabaseService();
     $active_worker = CerberusApplication::getActiveWorker();
     $memberships = $active_worker->getMemberships();
     if (empty($memberships)) {
         return array();
     }
     // Group Loads
     $sql = sprintf("SELECT count(t.id) AS hits, t.team_id, t.category_id " . "FROM ticket t " . "LEFT JOIN category c ON (t.category_id=c.id) " . "WHERE t.is_waiting = 0 AND t.is_closed = 0 AND t.is_deleted = 0 " . "AND t.next_worker_id = 0 " . "AND (c.id IS NULL OR c.is_assignable = 1) " . "GROUP BY t.team_id, c.pos ");
     $rs_buckets = $db->Execute($sql);
     $group_counts = array();
     while (!$rs_buckets->EOF) {
         $team_id = intval($rs_buckets->fields['team_id']);
         $category_id = intval($rs_buckets->fields['category_id']);
         $hits = intval($rs_buckets->fields['hits']);
         if (isset($memberships[$team_id])) {
             // If the group manager doesn't want this group inbox assignable (default to YES)
             if (empty($category_id) && !DAO_GroupSettings::get($team_id, DAO_GroupSettings::SETTING_INBOX_IS_ASSIGNABLE, 1)) {
                 // ...skip the unassignable inbox
             } else {
                 if (!isset($group_counts[$team_id])) {
                     $group_counts[$team_id] = array();
                 }
                 $group_counts[$team_id][$category_id] = $hits;
                 @($group_counts[$team_id]['total'] = intval($group_counts[$team_id]['total']) + $hits);
             }
         }
         $rs_buckets->MoveNext();
     }
     return $group_counts;
 }
Exemplo n.º 12
0
	function getChooserView() {
		$active_worker = CerberusApplication::getActiveWorker();

		// View
		$view_id = 'chooser_'.str_replace('.','_',$this->id).time().mt_rand(0,9999);
		$defaults = new C4_AbstractViewModel();
		$defaults->id = $view_id;
		$defaults->is_ephemeral = true;
		$defaults->class_name = $this->getViewClass();
		$view = C4_AbstractViewLoader::getView($view_id, $defaults);

		$view->addParams(array(
			SearchFields_Issue::STATE => new DevblocksSearchCriteria(SearchFields_Issue::STATE,'!=','closed'),
		), true);
		$view->renderSortBy = SearchFields_Issue::UPDATED_DATE;
		$view->renderSortAsc = false;
		$view->renderLimit = 10;
		$view->renderTemplate = 'contextlinks_chooser';

		C4_AbstractViewLoader::setView($view_id, $view);
		return $view;
	}
Exemplo n.º 13
0
 private function mergeTicket($event)
 {
     // Listen for ticket merges and update our internal ticket_id records
     @($new_ticket_id = $event->params['new_ticket_id']);
     @($old_ticket_ids = $event->params['old_ticket_ids']);
     $translate = DevblocksPlatform::getTranslationService();
     if (empty($new_ticket_id) || empty($old_ticket_ids)) {
         return;
     }
     $settings = DevblocksPlatform::getPluginSettingsService();
     $al_merge_enabled = intval($settings->get('cerb5blog.last_action_and_audit_log', 'al_merge_enabled', 0));
     $uf_merge_enabled = intval($settings->get('cerb5blog.last_action_and_audit_log', 'uf_merge_enabled', 0));
     if (!($al_merge_enabled || $uf_merge_enabled)) {
         return;
     }
     $active_worker = CerberusApplication::getActiveWorker();
     $worker_id = $active_worker->id;
     if (class_exists('DAO_TicketAuditLog', true)) {
         if ($al_merge_enabled) {
             foreach ($old_ticket_ids as $old_id) {
                 $old_ticket = DAO_Ticket::get($old_id);
                 $translate_str = $translate->_('cerb5blog.last_action_and_audit_log.post.merge.new_ticket');
                 $translated = sprintf($translate_str, $old_id, $old_ticket->mask);
                 $fields = array(DAO_TicketAuditLog::TICKET_ID => $new_ticket_id, DAO_TicketAuditLog::WORKER_ID => $worker_id, DAO_TicketAuditLog::CHANGE_DATE => time(), DAO_TicketAuditLog::CHANGE_FIELD => "cerb5blog.last_action_and_audit_log.type.merge", DAO_TicketAuditLog::CHANGE_VALUE => substr($translated, 0, 128));
                 $log_id = DAO_TicketAuditLog::create($fields);
             }
             unset($fields);
         }
     }
     if ($uf_merge_enabled) {
         $new_change_fields[DAO_Ticket::UPDATED_DATE] = time();
         DAO_Ticket::update($new_ticket_id, $new_change_fields);
         unset($new_change_fields);
     }
 }
Exemplo n.º 14
0
 function saveTab()
 {
     @($forward_bucket = DevblocksPlatform::importGPC($_REQUEST['forward_bucket'], 'string', ''));
     @($forward_address = DevblocksPlatform::importGPC($_REQUEST['forward_address'], 'string', ''));
     @($forward_event = DevblocksPlatform::importGPC($_REQUEST['forward_event'], 'string', ''));
     $worker = CerberusApplication::getActiveWorker();
     // Delete forwards
     @($forward_deletes = DevblocksPlatform::importGPC($_REQUEST['forward_deletes'], 'array', array()));
     if (!empty($forward_deletes)) {
         DAO_WorkerMailForward::delete($forward_deletes);
     }
     // Add forward
     if (!empty($forward_bucket) && !empty($forward_address) && !empty($forward_event)) {
         @(list($group_id, $bucket_id) = split('_', $forward_bucket));
         if (is_null($group_id) || is_null($bucket_id)) {
             break;
         }
         $fields = array(DAO_WorkerMailForward::WORKER_ID => $worker->id, DAO_WorkerMailForward::GROUP_ID => $group_id, DAO_WorkerMailForward::BUCKET_ID => $bucket_id, DAO_WorkerMailForward::EMAIL => $forward_address, DAO_WorkerMailForward::EVENT => $forward_event);
         DAO_WorkerMailForward::create($fields);
     }
     // Assignment notifications
     @($assign_notify_email = DevblocksPlatform::importGPC($_REQUEST['assign_notify_email'], 'string', ''));
     DAO_WorkerPref::set($worker->id, ChWatchersPlugin::WORKER_PREF_ASSIGN_EMAIL, $assign_notify_email);
     DevblocksPlatform::setHttpResponse(new DevblocksHttpResponse(array('preferences', 'notifications')));
 }
Exemplo n.º 15
0
 function saveRssAction()
 {
     @($id = DevblocksPlatform::importGPC($_POST['id']));
     $active_worker = CerberusApplication::getActiveWorker();
     if (null != ($feed = DAO_ViewRss::getId($id)) && $feed->worker_id == $active_worker->id) {
         DAO_ViewRss::delete($id);
     }
     DevblocksPlatform::setHttpResponse(new DevblocksHttpResponse(array('preferences', 'rss')));
 }
Exemplo n.º 16
0
 function doImportAction()
 {
     $active_worker = CerberusApplication::getActiveWorker();
     if (!$active_worker->hasPriv('crm.opp.actions.import')) {
         return;
     }
     @($pos = DevblocksPlatform::importGPC($_REQUEST['pos'], 'array', array()));
     @($field = DevblocksPlatform::importGPC($_REQUEST['field'], 'array', array()));
     @($sync_dupes = DevblocksPlatform::importGPC($_REQUEST['sync_dupes'], 'array', array()));
     @($include_first = DevblocksPlatform::importGPC($_REQUEST['include_first'], 'integer', 0));
     @($is_blank_unset = DevblocksPlatform::importGPC($_REQUEST['is_blank_unset'], 'integer', 0));
     @($opt_assign = DevblocksPlatform::importGPC($_REQUEST['opt_assign'], 'integer', 0));
     @($opt_assign_worker_id = DevblocksPlatform::importGPC($_REQUEST['opt_assign_worker_id'], 'integer', 0));
     $visit = CerberusApplication::getVisit();
     $db = DevblocksPlatform::getDatabaseService();
     $workers = DAO_Worker::getAllActive();
     $csv_file = $visit->get('crm.import.last.csv', '');
     $fp = fopen($csv_file, "rt");
     if (!$fp) {
         return;
     }
     // [JAS]: Do we need to consume a first row of headings?
     if (!$include_first) {
         @fgetcsv($fp, 8192, ',', '"');
     }
     while (!feof($fp)) {
         $parts = fgetcsv($fp, 8192, ',', '"');
         if (empty($parts) || 1 == count($parts) && is_null($parts[0])) {
             continue;
         }
         $fields = array();
         $custom_fields = array();
         $sync_fields = array();
         foreach ($pos as $idx => $p) {
             $key = $field[$idx];
             $val = $parts[$idx];
             // Special handling
             if (!empty($key)) {
                 switch ($key) {
                     case 'amount':
                         if (0 != strlen($val) && is_numeric($val)) {
                             @($val = floatval($val));
                         } else {
                             unset($key);
                         }
                         break;
                         // Translate e-mail address to ID
                     // Translate e-mail address to ID
                     case 'email':
                         if (null != ($addy = CerberusApplication::hashLookupAddress($val, true))) {
                             $key = 'primary_email_id';
                             $val = $addy->id;
                         } else {
                             unset($key);
                         }
                         break;
                         // Bools
                     // Bools
                     case 'is_won':
                     case 'is_closed':
                         if (0 != strlen($val)) {
                             @($val = !empty($val) ? 1 : 0);
                         } else {
                             unset($key);
                         }
                         break;
                         // Dates
                     // Dates
                     case 'created_date':
                     case 'updated_date':
                     case 'closed_date':
                         if (0 != strlen($val)) {
                             @($val = !is_numeric($val) ? strtotime($val) : $val);
                         } else {
                             unset($key);
                         }
                         break;
                         // Worker by name
                     // Worker by name
                     case 'worker':
                         unset($key);
                         if (is_array($workers)) {
                             foreach ($workers as $worker_id => $worker) {
                                 if (0 == strcasecmp($val, $worker->getName())) {
                                     $key = 'worker_id';
                                     $val = $worker_id;
                                 }
                             }
                         }
                         break;
                 }
                 if (!isset($key)) {
                     continue;
                 }
                 // Custom fields
                 if ('cf_' == substr($key, 0, 3)) {
                     $custom_fields[substr($key, 3)] = $val;
                 } elseif (!empty($key)) {
                     $fields[$key] = $val;
                 }
                 // Find dupe combos
                 if (in_array($idx, $sync_dupes)) {
                     $search_field = '';
                     $search_val = '';
                     switch ($key) {
                         case 'primary_email_id':
                             $search_field = SearchFields_CrmOpportunity::PRIMARY_EMAIL_ID;
                             $search_val = intval($val);
                             break;
                         case 'title':
                             $search_field = SearchFields_CrmOpportunity::NAME;
                             $search_val = $val;
                             break;
                         case 'amount':
                             $search_field = SearchFields_CrmOpportunity::AMOUNT;
                             $search_val = floatval($val);
                             break;
                         case 'is_won':
                             $search_field = SearchFields_CrmOpportunity::IS_WON;
                             $search_val = intval($val);
                             break;
                         case 'is_closed':
                             $search_field = SearchFields_CrmOpportunity::IS_CLOSED;
                             $search_val = intval($val);
                             break;
                         case 'created_date':
                             $search_field = SearchFields_CrmOpportunity::CREATED_DATE;
                             $search_val = intval($val);
                             break;
                         case 'updated_date':
                             $search_field = SearchFields_CrmOpportunity::UPDATED_DATE;
                             $search_val = intval($val);
                             break;
                         case 'closed_date':
                             $search_field = SearchFields_CrmOpportunity::CLOSED_DATE;
                             $search_val = intval($val);
                             break;
                         case 'worker_id':
                             $search_field = SearchFields_CrmOpportunity::WORKER_ID;
                             $search_val = intval($val);
                             break;
                         default:
                             // Custom field dupe
                             if ('cf_' == substr($key, 0, 3)) {
                                 $search_field = $key;
                                 // [TODO] Need to format this for proper custom fields
                                 $search_val = $val;
                             }
                             break;
                     }
                     if (!empty($search_field) && !empty($search_val)) {
                         $sync_fields[$search_field] = new DevblocksSearchCriteria($search_field, '=', $search_val);
                     }
                 }
             }
         }
         // end foreach($pos)
         // Dupe checking
         if (!empty($fields) && !empty($sync_fields)) {
             list($dupes, $null) = DAO_CrmOpportunity::search(array(), $sync_fields, 1, 0, null, false, false);
         }
         if (!empty($fields)) {
             if (isset($fields['primary_email_id'])) {
                 // Make sure a minimum amount of fields are provided
                 if (!isset($fields[DAO_CrmOpportunity::UPDATED_DATE])) {
                     $fields[DAO_CrmOpportunity::UPDATED_DATE] = time();
                 }
                 if ($opt_assign && !isset($fields[DAO_CrmOpportunity::WORKER_ID])) {
                     $fields[DAO_CrmOpportunity::WORKER_ID] = $opt_assign_worker_id;
                 }
                 if (empty($dupes)) {
                     // [TODO] Provide an import prefix for blank names
                     if (!isset($fields[DAO_CrmOpportunity::NAME]) && isset($addy)) {
                         $fields[DAO_CrmOpportunity::NAME] = $addy->email;
                     }
                     if (!isset($fields[DAO_CrmOpportunity::CREATED_DATE])) {
                         $fields[DAO_CrmOpportunity::CREATED_DATE] = time();
                     }
                     $id = DAO_CrmOpportunity::create($fields);
                 } else {
                     $id = key($dupes);
                     DAO_CrmOpportunity::update($id, $fields);
                 }
             }
         }
         if (!empty($custom_fields) && !empty($id)) {
             // Format (typecast) and set the custom field types
             $source_ext_id = CrmCustomFieldSource_Opportunity::ID;
             DAO_CustomFieldValue::formatAndSetFieldValues($source_ext_id, $id, $custom_fields, $is_blank_unset);
         }
     }
     @unlink($csv_file);
     // nuke the imported file
     $visit->set('crm.import.last.csv', null);
     DevblocksPlatform::redirect(new DevblocksHttpResponse(array('activity', 'opps')));
 }
Exemplo n.º 17
0
 function render()
 {
     $tpl = DevblocksPlatform::getTemplateService();
     $active_worker = CerberusApplication::getActiveWorker();
     $memberships = $active_worker->getMemberships();
     $response = DevblocksPlatform::getHttpResponse();
     @($section = $response->path[1]);
     //print_r($_REQUEST);exit();
     //@$page = DevblocksPlatform::importGPC($_GET['password']);
     @($page = DevblocksPlatform::importGPC($_REQUEST['page'], 'integer'));
     if ($page == NULL) {
         $page = 0;
     }
     if (isset($_POST['a2'])) {
         @($section = $_POST['a2']);
     } else {
         @($section = $response->path[2]);
     }
     //print_r($section);
     //echo $section;
     switch ($section) {
         case 'search':
             $title = 'Search';
             $query = $_POST['query'];
             if ($query && false === strpos($query, '*')) {
                 $query = '*' . $query . '*';
             }
             if (!is_null($query)) {
                 $params = array();
                 $type = $_POST['type'];
                 switch ($type) {
                     case "mask":
                         $params[SearchFields_Ticket::TICKET_MASK] = new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_MASK, DevblocksSearchCriteria::OPER_LIKE, strtoupper($query));
                         break;
                     case "sender":
                         $params[SearchFields_Ticket::TICKET_FIRST_WROTE] = new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_FIRST_WROTE, DevblocksSearchCriteria::OPER_LIKE, strtolower($query));
                         break;
                     case "subject":
                         $params[SearchFields_Ticket::TICKET_SUBJECT] = new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_SUBJECT, DevblocksSearchCriteria::OPER_LIKE, $query);
                         break;
                     case "content":
                         $params[SearchFields_Ticket::TICKET_MESSAGE_CONTENT] = new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_MESSAGE_CONTENT, DevblocksSearchCriteria::OPER_LIKE, $query);
                         break;
                 }
             } else {
                 //show the search form because no search has been submitted
                 $tpl->display('file:' . dirname(__FILE__) . '/templates/tickets/search.tpl');
                 return;
             }
             break;
         case 'sidebar':
             $groups = DAO_Group::getAll();
             $tpl->assign('groups', $groups);
             $group_buckets = DAO_Bucket::getTeams();
             $tpl->assign('group_buckets', $group_buckets);
             $workers = DAO_Worker::getAll();
             $tpl->assign('workers', $workers);
             $group_counts = DAO_Overview::getGroupTotals();
             $tpl->assign('group_counts', $group_counts);
             $waiting_counts = DAO_Overview::getWaitingTotals();
             $tpl->assign('waiting_counts', $waiting_counts);
             $worker_counts = DAO_Overview::getWorkerTotals();
             $tpl->assign('worker_counts', $worker_counts);
             $tpl->display('file:' . dirname(__FILE__) . '/templates/tickets/sidebar.tpl');
             return;
             break;
         case 'overview':
         default:
             $workers = DAO_Worker::getAll();
             $group_buckets = DAO_Bucket::getTeams();
             $groups = DAO_Group::getAll();
             @($filter = $response->path[3]);
             switch ($filter) {
                 case 'group':
                     @($filter_group_id = $response->path[4]);
                     $params = array(SearchFields_Ticket::TICKET_CLOSED => new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_CLOSED, '=', CerberusTicketStatus::OPEN), SearchFields_Ticket::TICKET_WAITING => new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_WAITING, '=', 0), SearchFields_Ticket::TICKET_NEXT_WORKER_ID => new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_NEXT_WORKER_ID, '=', 0));
                     if (!is_null($filter_group_id) && isset($groups[$filter_group_id])) {
                         $tpl->assign('filter_group_id', $filter_group_id);
                         $title = $groups[$filter_group_id]->name;
                         $params[SearchFields_Ticket::TICKET_TEAM_ID] = new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_TEAM_ID, '=', $filter_group_id);
                         @($filter_bucket_id = $response->path[5]);
                         if (!is_null($filter_bucket_id)) {
                             $tpl->assign('filter_bucket_id', $filter_bucket_id);
                             @($title .= ': ' . ($filter_bucket_id == 0 ? 'Inbox' : $group_buckets[$filter_group_id][$filter_bucket_id]->name));
                             $params[SearchFields_Ticket::TICKET_CATEGORY_ID] = new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_CATEGORY_ID, '=', $filter_bucket_id);
                         } else {
                             @($title .= ' (Spam Filtered)');
                             $params[SearchFields_Ticket::TICKET_SPAM_SCORE] = new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_SPAM_SCORE, '<=', '0.9000');
                         }
                     }
                     break;
                 case 'waiting':
                     @($filter_waiting_id = $response->path[4]);
                     $params = array(SearchFields_Ticket::TICKET_CLOSED => new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_CLOSED, '=', CerberusTicketStatus::OPEN), SearchFields_Ticket::TICKET_WAITING => new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_WAITING, '=', 1));
                     if (!is_null($filter_waiting_id) && isset($groups[$filter_waiting_id])) {
                         $tpl->assign('filter_waiting_id', $filter_waiting_id);
                         $title = '[Waiting] ' . $groups[$filter_waiting_id]->name;
                         $params[SearchFields_Ticket::TICKET_TEAM_ID] = new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_TEAM_ID, '=', $filter_waiting_id);
                         @($filter_bucket_id = $response->path[5]);
                         if (!is_null($filter_bucket_id)) {
                             $tpl->assign('filter_bucket_id', $filter_bucket_id);
                             @($title .= ': ' . ($filter_bucket_id == 0 ? 'Inbox' : $group_buckets[$filter_waiting_id][$filter_bucket_id]->name));
                             $params[SearchFields_Ticket::TICKET_CATEGORY_ID] = new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_CATEGORY_ID, '=', $filter_bucket_id);
                         }
                     }
                     break;
                 case 'worker':
                     @($filter_worker_id = $response->path[4]);
                     $params = array(SearchFields_Ticket::TICKET_CLOSED => new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_CLOSED, '=', CerberusTicketStatus::OPEN), SearchFields_Ticket::TICKET_WAITING => new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_WAITING, '=', 0), $params[SearchFields_Ticket::TICKET_TEAM_ID] = new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_TEAM_ID, 'in', array_keys($memberships)));
                     if (!is_null($filter_worker_id)) {
                         $tpl->assign('filter_bucket_id', $filter_bucket_id);
                         $title = "For " . $workers[$filter_worker_id]->getName();
                         $params[SearchFields_Ticket::TICKET_NEXT_WORKER_ID] = new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_NEXT_WORKER_ID, '=', $filter_worker_id);
                         @($filter_group_id = $response->path[5]);
                         if (!is_null($filter_group_id) && isset($groups[$filter_group_id])) {
                             $title .= ' in ' . $groups[$filter_group_id]->name;
                             $params[SearchFields_Ticket::TICKET_TEAM_ID] = new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_TEAM_ID, '=', $filter_group_id);
                         }
                     }
                     break;
                 case 'all':
                 default:
                     $title = 'All (Spam Filtered)';
                     $params = array(SearchFields_Ticket::TICKET_CLOSED => new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_CLOSED, '=', CerberusTicketStatus::OPEN), SearchFields_Ticket::TICKET_WAITING => new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_WAITING, '=', 0), SearchFields_Ticket::TICKET_NEXT_WORKER_ID => new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_NEXT_WORKER_ID, '=', 0), SearchFields_Ticket::TICKET_SPAM_SCORE => new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_SPAM_SCORE, '<=', '0.9000'), SearchFields_Ticket::TICKET_TEAM_ID => new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_TEAM_ID, 'in', array_keys($memberships)));
                     break;
             }
             //				$params = array(
             //						new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_CLOSED,'=',CerberusTicketStatus::OPEN),
             //						new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_NEXT_WORKER_ID,'=',0),
             //						new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_SPAM_SCORE,'<=','0.9000'),
             //						new DevblocksSearchCriteria(SearchFields_Ticket::TICKET_TEAM_ID,'in',array_keys($memberships))
             //				);
             //				$title = "Overview";
             break;
     }
     $mobileView = C4_AbstractViewLoader::getView('', "VIEW_MOBILE");
     //print_r($mobileView);
     if ($mobileView == NULL) {
         $mobileView = new C4_MobileTicketView();
         //C4_TicketView();
     }
     $mobileView->id = "VIEW_MOBILE";
     $mobileView->name = $title;
     $mobileView->view_columns = array(SearchFields_Ticket::TICKET_LAST_ACTION_CODE);
     $mobileView->params = $params;
     $mobileView->renderLimit = 10;
     //$overViewDefaults->renderLimit;
     $mobileView->renderPage = $page;
     $mobileView->renderSortBy = SearchFields_Ticket::TICKET_UPDATED_DATE;
     $mobileView->renderSortAsc = 0;
     C4_AbstractViewLoader::setView($mobileView->id, $mobileView);
     $views[] = $mobileView;
     $tpl->assign('views', $views);
     if ($filter == null) {
         $filter = 'all';
     }
     $tpl->assign('filter', $filter);
     $fid = $response->path[4];
     if ($fid == null) {
         $fid = '0';
     }
     $tpl->assign('fid', $fid);
     $bucket_id = $response->path[5];
     if ($bucket_id == null) {
         $buket_id = 0;
     }
     $tpl->assign('bid', $bucket_id);
     $tpl->assign('title', $title);
     $tpl->assign('tickets', $tickets[0]);
     $tpl->assign('next_page', $page + 1);
     $tpl->assign('prev_page', $page - 1);
     //print_r($tickets);exit();
     $tpl->display('file:' . dirname(__FILE__) . '/templates/tickets.tpl');
 }
Exemplo n.º 18
0
 function viewAssignThreadsAction()
 {
     @($row_ids = DevblocksPlatform::importGPC($_POST['row_id'], 'array', array()));
     @($worker_id = DevblocksPlatform::importGPC($_REQUEST['assign_worker_id'], 'integer', 0));
     @($view_id = DevblocksPlatform::importGPC($_REQUEST['view_id'], 'string', ''));
     $active_worker = CerberusApplication::getActiveWorker();
     if (is_array($row_ids) && !empty($row_ids)) {
         // Do assignments
         $fields = array(DAO_ForumsThread::WORKER_ID => $worker_id);
         DAO_ForumsThread::update($row_ids, $fields);
         // Only send notifications if not assigning to self (or unassigning)
         if (!empty($worker_id) && $active_worker->id != $worker_id) {
             $url_writer = DevblocksPlatform::getUrlService();
             // Load threads for notifications
             $forum_threads = DAO_ForumsThread::getWhere(sprintf("%s IN (%s)", DAO_ForumsThread::ID, implode(',', $row_ids)));
             // Send notifications about assigned forum threads
             if (is_array($forum_threads) && !empty($forum_threads)) {
                 foreach ($forum_threads as $forum_thread) {
                     /* @var $forum_thread Model_ForumsThread */
                     $fields = array(DAO_WorkerEvent::CREATED_DATE => time(), DAO_WorkerEvent::WORKER_ID => $worker_id, DAO_WorkerEvent::URL => $url_writer->write('c=forums&a=explorer', true) . '?start=' . $forum_thread->id, DAO_WorkerEvent::TITLE => 'New Forum Assignment', DAO_WorkerEvent::CONTENT => sprintf("%s assigned: %s", $active_worker->getName(), $forum_thread->title), DAO_WorkerEvent::IS_READ => 0);
                     DAO_WorkerEvent::create($fields);
                 }
             }
         }
     }
     if (!empty($view_id) && null != ($view = C4_AbstractViewLoader::getView($view_id))) {
         $view->render();
     }
 }
Exemplo n.º 19
0
 function deleteOppNoteAction()
 {
     @($id = DevblocksPlatform::importGPC($_REQUEST['id'], 'integer', 0));
     @($opp_id = DevblocksPlatform::importGPC($_REQUEST['opp_id'], 'integer', 0));
     $active_worker = CerberusApplication::getActiveWorker();
     if (null != ($note = DAO_Note::get($id))) {
         if ($note->worker_id == $active_worker->id || $active_worker->is_superuser) {
             DAO_Note::delete($id);
         }
     }
     DevblocksPlatform::redirect(new DevblocksHttpResponse(array('crm', 'opp', $opp_id)));
 }
Exemplo n.º 20
0
 function AnswernetMetlifeReportDRReport($RunFromCron = 0)
 {
     $db = DevblocksPlatform::getDatabaseService();
     $translate = DevblocksPlatform::getTranslationService();
     if ($RunFromCron) {
         $logger = DevblocksPlatform::getConsoleLog();
     }
     $radius = 12;
     $start_time = 0;
     date_default_timezone_set('Etc/UTC');
     // Security
     if (null == ($active_worker = CerberusApplication::getActiveWorker())) {
         die($translate->_('common.access_denied'));
     }
     // import dates from form
     @($start = DevblocksPlatform::importGPC($_REQUEST['start'], 'string', ''));
     if (empty($start)) {
         $start = "Yesterday";
     }
     $start_time = strtotime($start);
     if ($start_time === false) {
         $start = "Yesterday";
         $start_time = strtotime($start);
     }
     if (empty($start_time) || !is_numeric($start_time)) {
         return;
     }
     $start_ofday = mktime(0, 0, 0, date("m", $start_time), date("d", $start_time), date("Y", $start_time));
     $end_ofday = $start_ofday + 86400;
     if ($RunFromCron) {
         $logger->info("[Answernet.com] Gerating the Metlife DR Report.");
         $logger->info("[Answernet.com] " . $translate->_('answernet.er.metlife.report.dr.date.from.text') . date(" Y-m-d H:i:s ", $start_ofday) . $translate->_('answernet.er.metlife.report.dr.date.to.text') . date(" Y-m-d H:i:s T", $end_ofday));
         $logger->info("[Answernet.com] " . $translate->_('answernet.er.metlife.generate.report'));
     } else {
         print '<br><br><br>';
         print $translate->_('answernet.er.metlife.report.dr.date.from.text');
         print date(" Y-m-d H:i:s ", $start_ofday);
         print $translate->_('answernet.er.metlife.report.dr.date.to.text');
         print date(" Y-m-d H:i:s T", $end_ofday);
         print '<br>';
         print $translate->_('answernet.er.metlife.generate.report');
     }
     $filename = "report-metlife-dr-" . date("Ymd", $start_time) . ".xls";
     $full_filename = getcwd() . '/storage/answernet/' . $filename;
     if ($RunFromCron) {
         $logger->info("[Answernet.com] " . $translate->_('answernet.er.metlife.generating'));
     } else {
         print '<br>';
         print $translate->_('answernet.er.metlife.generating');
     }
     // Create new Excel Spreadsheet.
     $workbook = new Spreadsheet_Excel_Writer($full_filename);
     // Create Open Status Tab and set Column Width and Row Hight.
     $worksheet_transaction =& $workbook->addWorksheet('Transaction Report');
     $worksheet_transaction->setColumn(0, 0, $radius * 0.85);
     $worksheet_transaction->setColumn(1, 1, $radius * 0.85);
     $worksheet_transaction->setColumn(2, 2, $radius * 0.35);
     $worksheet_transaction->setColumn(3, 3, $radius * 1.65);
     $worksheet_transaction->setColumn(4, 4, $radius * 1.85);
     $worksheet_transaction->setColumn(5, 5, $radius * 1.16);
     $worksheet_transaction->setColumn(6, 6, $radius * 2.6);
     $worksheet_transaction->setColumn(7, 8, $radius * 0.87);
     $worksheet_transaction->setColumn(9, 9, $radius * 3.28);
     $worksheet_transaction->setColumn(10, 10, $radius * 1.34);
     //    $worksheet_open_status->setRow(0, 28);
     //    $worksheet_open_status->setRow(2, 32);
     // Create Open Status Tab and set Column Width and Row Hight.
     $worksheet_open_status =& $workbook->addWorksheet('Open DR Report');
     $worksheet_open_status->setColumn(0, 0, $radius * 0.85);
     $worksheet_open_status->setColumn(1, 1, $radius * 0.35);
     $worksheet_open_status->setColumn(2, 2, $radius * 0.7);
     $worksheet_open_status->setColumn(3, 3, $radius * 1.65);
     $worksheet_open_status->setColumn(4, 4, $radius * 1.85);
     $worksheet_open_status->setColumn(5, 5, $radius * 1.16);
     $worksheet_open_status->setColumn(6, 6, $radius * 2.6);
     $worksheet_open_status->setColumn(7, 8, $radius * 0.87);
     $worksheet_open_status->setColumn(9, 9, $radius * 3.28);
     $worksheet_open_status->setColumn(10, 10, $radius * 1.34);
     //    $worksheet_open_status->setRow(0, 28);
     //    $worksheet_open_status->setRow(2, 32);
     // Create monthly Tab and set Column Width and Row Hight.
     $worksheet_monthly =& $workbook->addWorksheet('Month DR Summary');
     $worksheet_monthly->setColumn(0, 0, $radius * 2.46);
     $worksheet_monthly->setColumn(1, 1, $radius * 0.47);
     $worksheet_monthly->setColumn(2, 2, $radius * 0.63);
     $worksheet_monthly->setColumn(3, 3, $radius * 0.6899999999999999);
     $worksheet_monthly->setColumn(4, 4, $radius * 0.6899999999999999);
     $worksheet_monthly->setColumn(5, 5, $radius * 0.6899999999999999);
     //    $worksheet_monthly->setRow(0, 56);
     // Formats used thoughout the workbook.
     $format_general =& $workbook->addFormat();
     $format_general->setBorder(1);
     $format_general->setHAlign('left');
     $format_general->setTextWrap();
     $format_general_title =& $workbook->addFormat();
     $format_general_title->setBorder(1);
     $format_general_title->setColor('black');
     $format_general_title->setFgColor('silver');
     $format_general_title->setHAlign('left');
     $format_general_title->setVAlign('vjustify');
     $format_general_title->setVAlign('top');
     $format_general_nowrap =& $workbook->addFormat();
     $format_general_nowrap->setBorder(1);
     // Setup templating for the formating of certain cells in the Monthly Group.
     $format_monthly_title =& $workbook->addFormat();
     $format_monthly_title->setColor(8);
     $format_monthly_title->setFgColor(35);
     $format_monthly_title->setBorder(1);
     $format_monthly_title->setBold();
     $format_monthly_title->setHAlign('center');
     $format_monthly_title->setVAlign('vjustify');
     $format_monthly_title->setVAlign('top');
     $format_monthly_title->setTextWrap();
     $format_monthly_title->setAlign('merge');
     // Added headers since they never change in the transaction Group.
     $worksheet_transaction->write(0, 0, 'Status', $format_general_title);
     $worksheet_transaction->write(0, 1, 'Due Date', $format_general_title);
     $worksheet_transaction->write(0, 2, 'SLA', $format_general_title);
     $worksheet_transaction->write(0, 3, 'Date Received', $format_general_title);
     $worksheet_transaction->write(0, 4, 'RM Name', $format_general_title);
     $worksheet_transaction->write(0, 5, 'RM Employee id', $format_general_title);
     $worksheet_transaction->write(0, 6, 'Request Type', $format_general_title);
     $worksheet_transaction->write(0, 7, 'MetLife Staff', $format_general_title);
     $worksheet_transaction->write(0, 8, 'New Hire', $format_general_title);
     $worksheet_transaction->write(0, 9, 'Nates (email body)', $format_general_title);
     $worksheet_transaction->write(0, 10, 'Ticket Mask', $format_general_title);
     // Added headers since they never change in the Open Status Group.
     $worksheet_open_status->write(0, 0, 'Due Date', $format_general_title);
     $worksheet_open_status->write(0, 1, 'SLA', $format_general_title);
     $worksheet_open_status->write(0, 2, 'Overdue', $format_general_title);
     $worksheet_open_status->write(0, 3, 'Date Received', $format_general_title);
     $worksheet_open_status->write(0, 4, 'RM Name', $format_general_title);
     $worksheet_open_status->write(0, 5, 'RM Employee id', $format_general_title);
     $worksheet_open_status->write(0, 6, 'Request Type', $format_general_title);
     $worksheet_open_status->write(0, 7, 'MetLife Staff', $format_general_title);
     $worksheet_open_status->write(0, 8, 'New Hire', $format_general_title);
     $worksheet_open_status->write(0, 9, 'Nates (email body)', $format_general_title);
     $worksheet_open_status->write(0, 10, 'Ticket Mask', $format_general_title);
     // Added headers since they never change in the monthly Group.
     $month_text = date("F-y", $start_time);
     $worksheet_monthly->write(0, 0, $month_text, $format_monthly_title);
     $worksheet_monthly->write(0, 1, '', $format_monthly_title);
     $worksheet_monthly->write(0, 2, '', $format_monthly_title);
     $worksheet_monthly->write(0, 3, '', $format_monthly_title);
     $worksheet_monthly->write(0, 4, '', $format_monthly_title);
     $worksheet_monthly->write(0, 5, '', $format_monthly_title);
     $worksheet_monthly->write(1, 0, 'DR Summary', $format_general_title);
     $worksheet_monthly->write(1, 1, '', $format_general_title);
     $worksheet_monthly->write(2, 0, 'All DRs incoming*', $format_general);
     $worksheet_monthly->write(3, 0, 'DRs Sent to MetLife', $format_general);
     $worksheet_monthly->write(4, 0, 'DRs Completed', $format_general);
     $worksheet_monthly->write(5, 0, 'Average time to reply (day)', $format_general);
     $worksheet_monthly->write(6, 0, 'Missed DR SLA', $format_general);
     $worksheet_monthly->write(7, 0, 'DR escalations', $format_general);
     $worksheet_monthly->write(8, 0, 'DR Unique Users', $format_general);
     $worksheet_monthly->write(9, 0, 'New Hires (30 Days)', $format_general);
     $worksheet_monthly->write(10, 0, '', $format_general);
     $worksheet_monthly->write(10, 1, '', $format_general);
     $worksheet_monthly->write(11, 0, 'DR Categories', $format_general_title);
     $worksheet_monthly->write(11, 1, '#s', $format_general_title);
     $worksheet_monthly->write(11, 2, 'Avg SLA', $format_general_title);
     $worksheet_monthly->write(11, 3, 'Linda #s', $format_general_title);
     $worksheet_monthly->write(11, 4, 'Colin #s', $format_general_title);
     $worksheet_monthly->write(11, 5, 'Sarfraz #s', $format_general_title);
     $worksheet_monthly->write(12, 0, 'Import Contacts - New hire', $format_general);
     $worksheet_monthly->write(13, 0, 'Import Contacts', $format_general);
     $worksheet_monthly->write(14, 0, 'Create mailing list from exiting date', $format_general);
     $worksheet_monthly->write(15, 0, 'Update existing contacts - batch', $format_general);
     $worksheet_monthly->write(16, 0, 'Missing or incorrect customer info', $format_general);
     $worksheet_monthly->write(17, 0, 'Fix duplicate contacts', $format_general);
     $worksheet_monthly->write(18, 0, 'Export third party file', $format_general);
     $worksheet_monthly->write(19, 0, 'Other', $format_general);
     $worksheet_monthly->write(20, 0, 'Total', $format_general_title);
     $worksheet_monthly->write(20, 1, '', $format_general_title);
     $worksheet_monthly->write(20, 2, '', $format_general_title);
     $worksheet_monthly->write(20, 3, '', $format_general_title);
     $worksheet_monthly->write(20, 4, '', $format_general_title);
     $worksheet_monthly->write(20, 5, '', $format_general_title);
     $worksheet_monthly->write(22, 0, '* Some DRs will be deemed normal care and should use other reporting codes, remove from DR reporting', $format_general_nowrap);
     $worksheet_monthly->write(23, 0, '** Days should be tracked as business days', $format_general_nowrap);
     $worksheet_monthly->write(25, 0, 'SLA Goals', $format_general_title);
     $worksheet_monthly->write(25, 1, '', $format_general_title);
     $worksheet_monthly->write(26, 0, 'Import Contacts - New hire', $format_general);
     $worksheet_monthly->write(27, 0, 'Import Contacts', $format_general);
     $worksheet_monthly->write(28, 0, 'Create mailing list from exiting date', $format_general);
     $worksheet_monthly->write(29, 0, 'Update existing contacts - batch', $format_general);
     $worksheet_monthly->write(30, 0, 'Missing or incorrect customer info', $format_general);
     $worksheet_monthly->write(31, 0, 'Fix duplicate contacts', $format_general);
     $worksheet_monthly->write(32, 0, 'Export third party file', $format_general);
     $worksheet_monthly->write(33, 0, 'Other', $format_general);
     $worksheet_monthly->write(34, 0, 'Avgerage', $format_general_title);
     $worksheet_monthly->write(34, 1, '', $format_general_title);
     if ($RunFromCron) {
         $logger->info("[Answernet.com] " . $translate->_('answernet.er.metlife.metlife.done'));
         $logger->info("[Answernet.com] " . $translate->_('answernet.er.metlife.generating.dr.daily.report'));
     } else {
         print $translate->_('answernet.er.metlife.metlife.done');
         print '<br>';
         print $translate->_('answernet.er.metlife.generating.dr.daily.report');
     }
     //SELECT t.id, t.mask, t.created_date ticket_created_date, mc.content, t.is_closed
     //FROM ticket t
     //INNER JOIN message_content mc on t.first_message_id = mc.message_id
     //INNER JOIN message m on t.first_message_id = m.id
     //and team_id = 1721
     //ORDER BY t.id
     $sql = "SELECT t.id, t.mask, ";
     $sql .= "t.created_date ticket_created_date, mc.content ";
     $sql .= "FROM ticket t ";
     $sql .= "INNER JOIN message_content mc on t.first_message_id = mc.message_id ";
     $sql .= "WHERE t.is_closed = 0 ";
     $sql .= "and t.team_id = 1721 ";
     $sql .= "ORDER BY t.id ";
     $rs = $db->Execute($sql);
     $row = 1;
     if (is_a($rs, 'ADORecordSet')) {
         while (!$rs->EOF) {
             $worksheet_open_status->setRow($row, 12);
             $custom_fields = DAO_CustomFieldValue::getValuesBySourceIds(ChCustomFieldSource_Ticket::ID, $rs->fields['id']);
             //print "<pre>";
             //print_r($custom_fields);
             //print "</pre>";
             // Due Date, SLA, Date Recived, RM Name, RM Employee ID, Topic, Staff, New Hire, Notes/Email Body
             // Due Date Column 0
             $due_date_int = intval($custom_fields[$rs->fields['id']][1]);
             if ($due_date_int) {
                 $ticket_due_date = date("n/j/y", $due_date_int);
             } else {
                 $ticket_due_date = "";
             }
             $worksheet_open_status->writeString($row, 0, $ticket_due_date, $format_general);
             // SLA Column 1
             $worksheet_open_status->write($row, 1, $custom_fields[$rs->fields['id']][5], $format_general);
             // Overdue Column 2
             if (date("U", $due_date_int) >= time()) {
                 $worksheet_open_status->write($row, 2, "No", $format_general);
             } else {
                 $worksheet_open_status->write($row, 2, "Yes", $format_general);
             }
             // Date Recieved Column 3
             $ticket_created_date = date("n/j/y g:i:s A", intval($rs->fields['ticket_created_date']));
             $worksheet_open_status->writeString($row, 3, $ticket_created_date, $format_general);
             // RM Name Column 4
             $worksheet_open_status->write($row, 4, $custom_fields[$rs->fields['id']][3], $format_general);
             // RM Employee ID Column 5
             $worksheet_open_status->write($row, 5, $custom_fields[$rs->fields['id']][2], $format_general);
             // Topic / Request Type Column 6
             $worksheet_open_status->write($row, 6, $custom_fields[$rs->fields['id']][4], $format_general);
             // Staff Column 7
             $worksheet_open_status->write($row, 7, $custom_fields[$rs->fields['id']][8], $format_general);
             // New Hire Column 8
             $worksheet_open_status->write($row, 8, $custom_fields[$rs->fields['id']][6], $format_general);
             // Email Body Column 9
             $message_content = $rs->fields['content'];
             $worksheet_open_status->write($row, 9, trim($message_content), $format_general_nowrap);
             // Ticket Mask Column 10
             $mask = $rs->fields['mask'];
             $worksheet_open_status->write($row, 10, $mask, $format_general);
             $row++;
             $rs->MoveNext();
         }
     }
     if ($RunFromCron) {
         $logger->info("[Answernet.com] " . $translate->_('answernet.er.metlife.metlife.done'));
         $logger->info("[Answernet.com] " . $translate->_('answernet.er.metlife.generating.dr.transaction.report'));
     } else {
         print $translate->_('answernet.er.metlife.metlife.done');
         print '<br>';
         print $translate->_('answernet.er.metlife.generating.dr.transaction.report');
     }
     //SELECT t.mask, t.created_date ticket_created_date,
     //m.created_date message_created_date, mc.content,
     //m.is_outgoing
     //FROM message m
     //INNER JOIN ticket t ON m.ticket_id = t.id
     //INNER JOIN address a ON m.address_id = a.id
     //INNER JOIN message_content mc on m.id = mc.message_id
     //WHERE t.team_id = 1721
     //ORDER BY m.id;
     $sql = "SELECT t.id, t.mask, t.created_date ticket_created_date, ";
     $sql .= "m.created_date message_created_date, mc.content, m.is_outgoing ";
     $sql .= "FROM message m ";
     $sql .= "INNER JOIN ticket t ON m.ticket_id = t.id ";
     $sql .= "INNER JOIN address a ON m.address_id = a.id ";
     $sql .= "INNER JOIN message_content mc on m.id = mc.message_id ";
     $sql .= sprintf("WHERE m.created_date > %d AND m.created_date <= %d ", $start_ofday, $end_ofday);
     $sql .= "and t.team_id = 1721 ";
     $sql .= "ORDER BY t.id ";
     $rs = $db->Execute($sql);
     $row = 1;
     if (is_a($rs, 'ADORecordSet')) {
         while (!$rs->EOF) {
             $worksheet_transaction->setRow($row, 12);
             $custom_fields = DAO_CustomFieldValue::getValuesBySourceIds(ChCustomFieldSource_Ticket::ID, $rs->fields['id']);
             // Status, Due Date, SLA, SLA Age, Date Recived, RM Name, RM Employee ID, Topic, Staff, New Hire, Notes/Email Body
             if (intval($rs->fields['is_outgoing'])) {
                 $worksheet_transaction->write($row, 0, "Recieved", $format_general);
             } else {
                 $worksheet_transaction->write($row, 0, "Sent", $format_general);
             }
             // Due Date Column 1
             $due_date_int = intval($custom_fields[$rs->fields['id']][1]);
             if ($due_date_int) {
                 $ticket_due_date = date("n/j/y", $due_date_int);
             } else {
                 $ticket_due_date = "";
             }
             $worksheet_transaction->writeString($row, 1, $ticket_due_date, $format_general);
             // SLA Column 2
             $worksheet_transaction->write($row, 2, $custom_fields[$rs->fields['id']][5], $format_general);
             // Date Recieved Column 3
             $ticket_created_date = date("n/j/y g:i:s A", intval($rs->fields['ticket_created_date']));
             $worksheet_transaction->writeString($row, 3, $ticket_created_date, $format_general);
             // RM Name Column 4
             $worksheet_transaction->write($row, 4, $custom_fields[$rs->fields['id']][3], $format_general);
             // RM Employee ID Column 5
             $worksheet_transaction->write($row, 5, $custom_fields[$rs->fields['id']][2], $format_general);
             // Topic / Request Type Column 6
             $worksheet_transaction->write($row, 6, $custom_fields[$rs->fields['id']][4], $format_general);
             // Staff Column 7
             $worksheet_transaction->write($row, 7, $custom_fields[$rs->fields['id']][8], $format_general);
             // New Hire Column 8
             $worksheet_transaction->write($row, 8, $custom_fields[$rs->fields['id']][6], $format_general);
             // Email Body Column 9
             $message_content = $rs->fields['content'];
             $worksheet_transaction->write($row, 9, trim($message_content), $format_general_nowrap);
             // Ticket Mask Column 10
             $mask = $rs->fields['mask'];
             $worksheet_transaction->write($row, 10, $mask, $format_general);
             $row++;
             $rs->MoveNext();
         }
     }
     if ($RunFromCron) {
         $logger->info("[Answernet.com] " . $translate->_('answernet.er.metlife.metlife.done'));
         $logger->info("[Answernet.com] " . $translate->_('answernet.er.metlife.generating.dr.monthly.report'));
     } else {
         print $translate->_('answernet.er.metlife.metlife.done');
         print '<br>';
         print $translate->_('answernet.er.metlife.generating.dr.monthly.report');
     }
     /*
         print $translate->_('answernet.er.metlife.metlife.done');
         print '<br>';
         print $translate->_('answernet.er.metlife.generating.email.count');
     
         $worksheet_in_count->setRow(1, 24);
         $row_count = 2;
         foreach ($in_count_admin as $record) {
           $worksheet_in_count->write($row_count, 0, $record['email'], $format_general);
           $worksheet_in_count->write($row_count, 1, $record['count'], $format_general);
           $row_count++;
         }
         $worksheet_in_count->write(1, 0, 'Total Admin Email', $format_in_count_total);
         $worksheet_in_count->writeFormula(1, 1, "=SUM(B3:B".$row_count.")", $format_general);
         $row_count = 2;
         foreach ($in_count_other as $record) {
           $worksheet_in_count->write($row_count, 2, $record['email'], $format_general);
           $worksheet_in_count->write($row_count, 3, '', $format_general);
           $worksheet_in_count->write($row_count, 4, $record['count'], $format_general);
           $row_count++;
         }
         $worksheet_in_count->write(1, 2, 'Total Field Email', $format_in_count_total);
         $worksheet_in_count->write(1, 3, '', $format_in_count_total);
         $worksheet_in_count->writeFormula(1, 4, "=SUM(E3:E".$row_count.")", $format_general);
         // Grand Total
         $worksheet_in_count->write(1, 5, 'Grand Total Email', $format_general);
         $worksheet_in_count->writeFormula(1, 6, "=SUM(B2,E2)", $format_general);
     
         $worksheet_out_count->setRow(1, 24);
         $row_count = 2;
         foreach ($out_count_admin as $record) {
           $worksheet_out_count->write($row_count, 0, $record['email'], $format_general);
           $worksheet_out_count->write($row_count, 1, $record['count'], $format_general);
           $row_count++;
         }
         $worksheet_out_count->write(1, 0, 'Total Admin Email', $format_general);
         $worksheet_out_count->writeFormula(1, 1, "=SUM(B3:B".$row_count.")", $format_general);
         $row_count = 2;
         foreach ($out_count_other as $record) {
           $worksheet_out_count->write($row_count, 2, $record['email'], $format_general);
           $worksheet_out_count->write($row_count, 3, '', $format_general);
           $worksheet_out_count->write($row_count, 4, $record['count'], $format_general);
           $row_count++;
         }
         $worksheet_out_count->write(1, 2, 'Total Field Email', $format_general);
         $worksheet_out_count->write(1, 3, '', $format_out_count_total);
         $worksheet_out_count->writeFormula(1, 4, "=SUM(E3:E".$row_count.")", $format_general);
         // Grand Total
         $worksheet_out_count->write(1, 5, 'Grand Total Email', $format_general);
         $worksheet_out_count->writeFormula(1, 6, "=SUM(B2,E2)", $format_general);
     */
     $workbook->close();
     return $filename;
 }
Exemplo n.º 21
0
 function viewSaveCustomizeAction()
 {
     $translate = DevblocksPlatform::getTranslationService();
     @($id = DevblocksPlatform::importGPC($_REQUEST['id']));
     @($columns = DevblocksPlatform::importGPC($_REQUEST['columns'], 'array', array()));
     @($num_rows = DevblocksPlatform::importGPC($_REQUEST['num_rows'], 'integer', 10));
     $num_rows = max($num_rows, 1);
     // make 1 the minimum
     $view = C4_AbstractViewLoader::getView($id);
     $view->doCustomize($columns, $num_rows);
     $active_worker = CerberusApplication::getActiveWorker();
     // Conditional Persist
     if (substr($id, 0, 5) == "cust_") {
         // custom workspace
         $list_view_id = intval(substr($id, 5));
         // Special custom view fields
         @($title = DevblocksPlatform::importGPC($_REQUEST['title'], 'string', $translate->_('views.new_list')));
         $view->name = $title;
         // Persist Object
         $list_view = new Model_WorkerWorkspaceListView();
         $list_view->title = $title;
         $list_view->columns = $view->view_columns;
         $list_view->num_rows = $view->renderLimit;
         $list_view->params = $view->params;
         $list_view->sort_by = $view->renderSortBy;
         $list_view->sort_asc = $view->renderSortAsc;
         DAO_WorkerWorkspaceList::update($list_view_id, array(DAO_WorkerWorkspaceList::LIST_VIEW => serialize($list_view)));
     } else {
         $prefs = new C4_AbstractViewModel();
         $prefs->class_name = get_class($view);
         $prefs->view_columns = $view->view_columns;
         $prefs->renderLimit = $view->renderLimit;
         $prefs->renderSortBy = $view->renderSortBy;
         $prefs->renderSortAsc = $view->renderSortAsc;
         DAO_WorkerPref::set($active_worker->id, 'view' . $view->id, serialize($prefs));
     }
     C4_AbstractViewLoader::setView($id, $view);
     $view->render();
 }
Exemplo n.º 22
0
 public function getRenderedContent($message_id)
 {
     $raw = $this->content;
     $replace = array();
     $with = array();
     $replace[] = '#timestamp#';
     $with[] = date('r');
     if (!empty($message_id)) {
         $message = DAO_Ticket::getMessage($message_id);
         $ticket = DAO_Ticket::getTicket($message->ticket_id);
         $sender = DAO_Address::get($message->address_id);
         $sender_org = DAO_ContactOrg::get($sender->contact_org_id);
         $replace[] = '#sender_first_name#';
         $replace[] = '#sender_last_name#';
         $replace[] = '#sender_org#';
         $with[] = $sender->first_name;
         $with[] = $sender->last_name;
         $with[] = !empty($sender_org) ? $sender_org->name : "";
         $replace[] = '#ticket_id#';
         $replace[] = '#ticket_mask#';
         $replace[] = '#ticket_subject#';
         $with[] = $ticket->id;
         $with[] = $ticket->mask;
         $with[] = $ticket->subject;
     }
     if (null != ($active_worker = CerberusApplication::getActiveWorker())) {
         $worker = DAO_Worker::getAgent($active_worker->id);
         // most recent info (not session)
         $replace[] = '#worker_first_name#';
         $replace[] = '#worker_last_name#';
         $replace[] = '#worker_title#';
         $with[] = $worker->first_name;
         $with[] = $worker->last_name;
         $with[] = $worker->title;
     }
     return str_replace($replace, $with, $raw);
 }
Exemplo n.º 23
0
 function getCommunityToolAction()
 {
     $worker = CerberusApplication::getActiveWorker();
     if (!$worker || !$worker->is_superuser) {
         echo "Access denied.";
         return;
     }
     @($portal = DevblocksPlatform::importGPC($_REQUEST['portal'], 'string', ''));
     @($is_submitted = DevblocksPlatform::importGPC($_POST['is_submitted'], 'integer', 0));
     UmPortalHelper::setCode($portal);
     if (!empty($is_submitted)) {
         $is_submitted = time();
     }
     $tpl = DevblocksPlatform::getTemplateService();
     $tpl->cache_lifetime = "0";
     $tpl_path = dirname(__FILE__) . '/templates/';
     $tpl->assign('path', $tpl_path);
     $tpl->assign('portal', $portal);
     $tpl->assign('is_submitted', $is_submitted);
     if (null != ($instance = DAO_CommunityTool::getByCode($portal))) {
         $tpl->assign('instance', $instance);
         $manifest = DevblocksPlatform::getExtension($instance->extension_id, false, true);
         if (null != ($tool = $manifest->createInstance())) {
             /* @var $app Extension_UsermeetTool */
             $tpl->assign('tool', $tool);
         }
     }
     // Community Record
     $community_id = $instance->community_id;
     $community = DAO_Community::get($community_id);
     $tpl->assign('community', $community);
     // Install
     $url_writer = DevblocksPlatform::getUrlService();
     $url = $url_writer->write('c=portal&a=' . $portal, true);
     $url_parts = parse_url($url);
     $host = $url_parts['host'];
     @($port = $_SERVER['SERVER_PORT']);
     $base = substr(DEVBLOCKS_WEBPATH, 0, -1);
     // consume trailing
     $path = substr($url_parts['path'], strlen(DEVBLOCKS_WEBPATH) - 1);
     // consume trailing slash
     @($parts = explode('/', $path));
     if ($parts[1] == 'index.php') {
         // 0 is null from /part1/part2 paths.
         unset($parts[1]);
     }
     $path = implode('/', $parts);
     $tpl->assign('host', $host);
     $tpl->assign('is_ssl', $url_writer->isSSL() ? 1 : 0);
     $tpl->assign('port', $port);
     $tpl->assign('base', $base);
     $tpl->assign('path', $path);
     $tpl->display('file:' . $tpl_path . 'community/config/tab/tool_config.tpl');
 }
Exemplo n.º 24
0
 function saveOrgPeekAction()
 {
     $active_worker = CerberusApplication::getActiveWorker();
     @($id = DevblocksPlatform::importGPC($_REQUEST['id'], 'integer', 0));
     @($view_id = DevblocksPlatform::importGPC($_REQUEST['view_id'], 'string', ''));
     @($org_name = DevblocksPlatform::importGPC($_REQUEST['org_name'], 'string', ''));
     @($street = DevblocksPlatform::importGPC($_REQUEST['street'], 'string', ''));
     @($city = DevblocksPlatform::importGPC($_REQUEST['city'], 'string', ''));
     @($province = DevblocksPlatform::importGPC($_REQUEST['province'], 'string', ''));
     @($postal = DevblocksPlatform::importGPC($_REQUEST['postal'], 'string', ''));
     @($country = DevblocksPlatform::importGPC($_REQUEST['country'], 'string', ''));
     @($phone = DevblocksPlatform::importGPC($_REQUEST['phone'], 'string', ''));
     @($website = DevblocksPlatform::importGPC($_REQUEST['website'], 'string', ''));
     @($delete = DevblocksPlatform::importGPC($_REQUEST['do_delete'], 'integer', 0));
     if (!empty($id) && !empty($delete)) {
         // delete
         if ($active_worker->hasPriv('core.addybook.org.actions.delete')) {
             DAO_ContactOrg::delete($id);
         }
     } else {
         // create/edit
         if ($active_worker->hasPriv('core.addybook.org.actions.update')) {
             $fields = array(DAO_ContactOrg::NAME => $org_name, DAO_ContactOrg::STREET => $street, DAO_ContactOrg::CITY => $city, DAO_ContactOrg::PROVINCE => $province, DAO_ContactOrg::POSTAL => $postal, DAO_ContactOrg::COUNTRY => $country, DAO_ContactOrg::PHONE => $phone, DAO_ContactOrg::WEBSITE => $website);
             if ($id == 0) {
                 $id = DAO_ContactOrg::create($fields);
             } else {
                 DAO_ContactOrg::update($id, $fields);
             }
             // Custom field saves
             @($field_ids = DevblocksPlatform::importGPC($_POST['field_ids'], 'array', array()));
             DAO_CustomFieldValue::handleFormPost(ChCustomFieldSource_Org::ID, $id, $field_ids);
         }
     }
     $view = C4_AbstractViewLoader::getView($view_id);
     $view->render();
 }
Exemplo n.º 25
0
 static function shouldLoadExtension(DevblocksExtensionManifest $extension_manifest)
 {
     // Always allow core
     if ("cerberusweb.core" == $extension_manifest->plugin_id) {
         return true;
     }
     // [TODO] This should limit to just things we can run with no session
     // Community Tools, Cron/Update.  They are still limited by their own
     // isVisible() otherwise.
     if (null == ($active_worker = CerberusApplication::getActiveWorker())) {
         return true;
     }
     return $active_worker->hasPriv('plugin.' . $extension_manifest->plugin_id);
 }
Exemplo n.º 26
0
 function saveTaskPeekAction()
 {
     @($id = DevblocksPlatform::importGPC($_REQUEST['id'], 'integer', ''));
     @($view_id = DevblocksPlatform::importGPC($_REQUEST['view_id'], 'string', ''));
     @($link_namespace = DevblocksPlatform::importGPC($_REQUEST['link_namespace'], 'string', ''));
     @($link_object_id = DevblocksPlatform::importGPC($_REQUEST['link_object_id'], 'integer', 0));
     @($do_delete = DevblocksPlatform::importGPC($_REQUEST['do_delete'], 'integer', 0));
     $active_worker = CerberusApplication::getActiveWorker();
     if (!empty($id) && !empty($do_delete)) {
         // delete
         $task = DAO_Task::get($id);
         // Check privs
         if ($active_worker->hasPriv('core.tasks.actions.create') && $active_worker->id == $task->worker_id || $active_worker->hasPriv('core.tasks.actions.update_nobody') && empty($task->worker_id) || $active_worker->hasPriv('core.tasks.actions.update_all')) {
             DAO_Task::delete($id);
         }
     } else {
         // create|update
         $fields = array();
         // Title
         @($title = DevblocksPlatform::importGPC($_REQUEST['title'], 'string', ''));
         if (!empty($title)) {
             $fields[DAO_Task::TITLE] = $title;
         }
         // Completed
         @($completed = DevblocksPlatform::importGPC($_REQUEST['completed'], 'integer', 0));
         $fields[DAO_Task::IS_COMPLETED] = intval($completed);
         // [TODO] This shouldn't constantly update the completed date (it should compare)
         if ($completed) {
             $fields[DAO_Task::COMPLETED_DATE] = time();
         } else {
             $fields[DAO_Task::COMPLETED_DATE] = 0;
         }
         // Due Date
         @($due_date = DevblocksPlatform::importGPC($_REQUEST['due_date'], 'string', ''));
         @($fields[DAO_Task::DUE_DATE] = empty($due_date) ? 0 : intval(strtotime($due_date)));
         // Worker
         @($worker_id = DevblocksPlatform::importGPC($_REQUEST['worker_id'], 'integer', 0));
         @($fields[DAO_Task::WORKER_ID] = intval($worker_id));
         // Content
         @($content = DevblocksPlatform::importGPC($_REQUEST['content'], 'string', ''));
         @($fields[DAO_Task::CONTENT] = $content);
         // Link to object (optional)
         if (!empty($link_namespace) && !empty($link_object_id)) {
             @($fields[DAO_Task::SOURCE_EXTENSION] = $link_namespace);
             @($fields[DAO_Task::SOURCE_ID] = $link_object_id);
         }
         // Save
         if (!empty($id)) {
             DAO_Task::update($id, $fields);
         } else {
             $id = DAO_Task::create($fields);
             // Write a notification (if not assigned to ourselves)
             //				$url_writer = DevblocksPlatform::getUrlService();
             $source_extensions = DevblocksPlatform::getExtensions('cerberusweb.task.source', true);
             if (!empty($worker_id)) {
                 // && $active_worker->id != $worker_id (Temporarily allow self notifications)
                 if (null != @($source_renderer = $source_extensions[$link_namespace])) {
                     /* @var $source_renderer Extension_TaskSource */
                     $source_info = $source_renderer->getSourceInfo($link_object_id);
                     $source_name = $source_info['name'];
                     $source_url = $source_info['url'];
                     if (empty($source_name) || empty($source_url)) {
                         break;
                     }
                     $fields = array(DAO_WorkerEvent::CREATED_DATE => time(), DAO_WorkerEvent::WORKER_ID => $worker_id, DAO_WorkerEvent::URL => $source_url, DAO_WorkerEvent::TITLE => 'New Task Assignment', DAO_WorkerEvent::CONTENT => sprintf("%s\n%s says: %s", $source_name, $active_worker->getName(), $title), DAO_WorkerEvent::IS_READ => 0);
                     DAO_WorkerEvent::create($fields);
                 }
             }
         }
         // Custom field saves
         @($field_ids = DevblocksPlatform::importGPC($_POST['field_ids'], 'array', array()));
         DAO_CustomFieldValue::handleFormPost(ChCustomFieldSource_Task::ID, $id, $field_ids);
     }
     if (!empty($view_id) && null != ($view = C4_AbstractViewLoader::getView('', $view_id))) {
         $view->render();
     }
     exit;
 }
Exemplo n.º 27
0
 public function writeResponse(DevblocksHttpResponse $response)
 {
     $path = $response->path;
     // [JAS]: Ajax? // [TODO] Explore outputting whitespace here for Safari
     //	    if(empty($path))
     //			return;
     $tpl = DevblocksPlatform::getTemplateService();
     $session = DevblocksPlatform::getSessionService();
     $settings = CerberusSettings::getInstance();
     $translate = DevblocksPlatform::getTranslationService();
     $active_worker = CerberusApplication::getActiveWorker();
     $visit = $session->getVisit();
     $page_manifests = $this->_getAllowedPages();
     $controller = array_shift($path);
     // Default page [TODO] This is supposed to come from framework.config.php
     if (empty($controller)) {
         $controller = 'home';
     }
     // [JAS]: Require us to always be logged in for Cerberus pages
     if (empty($visit) && 0 != strcasecmp($controller, 'login')) {
         $query = array();
         if (!empty($response->path)) {
             $query = array('url' => urlencode(implode('/', $response->path)));
         }
         DevblocksPlatform::redirect(new DevblocksHttpRequest(array('login'), $query));
     }
     $page_id = $this->_getPageIdByUri($controller);
     @($page = DevblocksPlatform::getExtension($page_id, true));
     /* @var $page CerberusPageExtension */
     if (empty($page)) {
         header("Status: 404");
         return;
         // [TODO] 404
     }
     // [JAS]: Listeners (Step-by-step guided tour, etc.)
     $listenerManifests = DevblocksPlatform::getExtensions('devblocks.listener.http');
     foreach ($listenerManifests as $listenerManifest) {
         /* @var $listenerManifest DevblocksExtensionManifest */
         $inst = $listenerManifest->createInstance();
         /* @var $inst DevblocksHttpRequestListenerExtension */
         $inst->run($response, $tpl);
     }
     $tpl->assign('active_worker', $active_worker);
     $tour_enabled = false;
     if (!empty($visit) && !is_null($active_worker)) {
         $tour_enabled = intval(DAO_WorkerPref::get($active_worker->id, 'assist_mode', 1));
         if (DEMO_MODE) {
             $tour_enabled = 1;
         }
         // override for DEMO
         $keyboard_shortcuts = intval(DAO_WorkerPref::get($active_worker->id, 'keyboard_shortcuts', 1));
         $tpl->assign('pref_keyboard_shortcuts', $keyboard_shortcuts);
         $active_worker_memberships = $active_worker->getMemberships();
         $tpl->assign('active_worker_memberships', $active_worker_memberships);
         $unread_notifications = DAO_WorkerEvent::getUnreadCountByWorker($active_worker->id);
         $tpl->assign('active_worker_notify_count', $unread_notifications);
         DAO_Worker::logActivity($active_worker->id, $page->getActivity());
     }
     $tpl->assign('tour_enabled', $tour_enabled);
     // [JAS]: Variables provided to all page templates
     $tpl->assign('settings', $settings);
     $tpl->assign('session', $_SESSION);
     $tpl->assign('translate', $translate);
     $tpl->assign('visit', $visit);
     $tpl->assign('license', CerberusLicense::getInstance());
     $tpl->assign('page_manifests', $page_manifests);
     $tpl->assign('page', $page);
     $tpl->assign('response_uri', implode('/', $response->path));
     $core_tpl = DEVBLOCKS_PLUGIN_PATH . 'cerberusweb.core/templates/';
     $tpl->assign('core_tpl', $core_tpl);
     // Prebody Renderers
     $preBodyRenderers = DevblocksPlatform::getExtensions('cerberusweb.renderer.prebody', true);
     if (!empty($preBodyRenderers)) {
         $tpl->assign('prebody_renderers', $preBodyRenderers);
     }
     // Postbody Renderers
     $postBodyRenderers = DevblocksPlatform::getExtensions('cerberusweb.renderer.postbody', true);
     if (!empty($postBodyRenderers)) {
         $tpl->assign('postbody_renderers', $postBodyRenderers);
     }
     // Timings
     $tpl->assign('render_time', microtime(true) - DevblocksPlatform::getStartTime());
     if (function_exists('memory_get_usage') && function_exists('memory_get_peak_usage')) {
         $tpl->assign('render_memory', memory_get_usage() - DevblocksPlatform::getStartMemory());
         $tpl->assign('render_peak_memory', memory_get_peak_usage() - DevblocksPlatform::getStartPeakMemory());
     }
     $tpl->display($core_tpl . 'border.tpl');
     //		$cache = DevblocksPlatform::getCacheService();
     //		$cache->printStatistics();
 }
Exemplo n.º 28
0
Arquivo: App.php Projeto: Hildy/cerb5
 function saveEntryAction()
 {
     $active_worker = CerberusApplication::getActiveWorker();
     // Make sure we're an active worker
     if (empty($active_worker) || empty($active_worker->id)) {
         return;
     }
     @($id = DevblocksPlatform::importGPC($_REQUEST['id'], 'integer', 0));
     @($do_delete = DevblocksPlatform::importGPC($_REQUEST['do_delete'], 'integer', 0));
     @($email = DevblocksPlatform::importGPC($_POST['email'], 'string', ''));
     @($mood = DevblocksPlatform::importGPC($_POST['mood'], 'integer', 0));
     @($quote = DevblocksPlatform::importGPC($_POST['quote'], 'string', ''));
     @($url = DevblocksPlatform::importGPC($_POST['url'], 'string', ''));
     @($source_extension_id = DevblocksPlatform::importGPC($_POST['source_extension_id'], 'string', ''));
     @($source_id = DevblocksPlatform::importGPC($_POST['source_id'], 'integer', 0));
     // Translate email string into addy id, if exists
     $address_id = 0;
     if (!empty($email)) {
         if (null != ($author_address = DAO_Address::lookupAddress($email, true))) {
             $address_id = $author_address->id;
         }
     }
     // Delete entries
     if (!empty($id) && !empty($do_delete)) {
         if (null != ($entry = DAO_FeedbackEntry::get($id))) {
             // Only superusers and owners can delete entries
             if ($active_worker->is_superuser || $active_worker->id == $entry->worker_id) {
                 DAO_FeedbackEntry::delete($id);
             }
         }
         return;
     }
     // New or modify
     $fields = array(DAO_FeedbackEntry::QUOTE_MOOD => intval($mood), DAO_FeedbackEntry::QUOTE_TEXT => $quote, DAO_FeedbackEntry::QUOTE_ADDRESS_ID => intval($address_id), DAO_FeedbackEntry::SOURCE_URL => $url);
     // Only on new
     if (empty($id)) {
         $fields[DAO_FeedbackEntry::LOG_DATE] = time();
         $fields[DAO_FeedbackEntry::WORKER_ID] = $active_worker->id;
     }
     if (empty($id)) {
         // create
         $id = DAO_FeedbackEntry::create($fields);
         // Post-create actions
         if (!empty($source_extension_id) && !empty($source_id)) {
             switch ($source_extension_id) {
                 case 'feedback.source.ticket':
                     // Create a ticket comment about the feedback (to prevent dupes)
                     if (null == ($worker_address = DAO_Address::lookupAddress($active_worker->email))) {
                         break;
                     }
                     $comment_text = sprintf("== Capture Feedback ==\n" . "Author: %s\n" . "Mood: %s\n" . "\n" . "%s\n", !empty($author_address) ? $author_address->email : 'Anonymous', empty($mood) ? 'Neutral' : (1 == $mood ? 'Praise' : 'Criticism'), $quote);
                     $fields = array(DAO_TicketComment::ADDRESS_ID => $worker_address->id, DAO_TicketComment::COMMENT => $comment_text, DAO_TicketComment::CREATED => time(), DAO_TicketComment::TICKET_ID => intval($source_id));
                     DAO_TicketComment::create($fields);
                     break;
             }
         }
     } else {
         // modify
         DAO_FeedbackEntry::update($id, $fields);
     }
     // Custom field saves
     @($field_ids = DevblocksPlatform::importGPC($_POST['field_ids'], 'array', array()));
     DAO_CustomFieldValue::handleFormPost(ChCustomFieldSource_FeedbackEntry::ID, $id, $field_ids);
 }
Exemplo n.º 29
0
 function savePluginsAction()
 {
     $translate = DevblocksPlatform::getTranslationService();
     $worker = CerberusApplication::getActiveWorker();
     if (!$worker || !$worker->is_superuser) {
         echo $translate->_('common.access_denied');
         return;
     }
     if (DEMO_MODE) {
         DevblocksPlatform::setHttpResponse(new DevblocksHttpResponse(array('config', 'plugins')));
         return;
     }
     @($plugins_enabled = DevblocksPlatform::importGPC($_REQUEST['plugins_enabled'], 'array'));
     $pluginStack = DevblocksPlatform::getPluginRegistry();
     if (is_array($plugins_enabled)) {
         foreach ($plugins_enabled as $plugin_id) {
             $plugin = $pluginStack[$plugin_id];
             $plugin->setEnabled(true);
             unset($pluginStack[$plugin_id]);
         }
     }
     // [JAS]: Clear unchecked plugins
     foreach ($pluginStack as $plugin) {
         // [JAS]: We can't force disable core here [TODO] Improve
         if ($plugin->id == 'cerberusweb.core') {
             continue;
         }
         $plugin->setEnabled(false);
     }
     DevblocksPlatform::clearCache();
     // Run any enabled plugin patches
     // [TODO] Should the platform do this automatically on enable in order?
     $patchMgr = DevblocksPlatform::getPatchService();
     $patches = DevblocksPlatform::getExtensions("devblocks.patch.container", false, true);
     if (is_array($patches)) {
         foreach ($patches as $patch_manifest) {
             /* @var $patch_manifest DevblocksExtensionManifest */
             $container = $patch_manifest->createInstance();
             /* @var $container DevblocksPatchContainerExtension */
             $patchMgr->registerPatchContainer($container);
         }
     }
     if (!$patchMgr->run()) {
         // fail
         die("Failed updating plugins.");
         // [TODO] Make this more graceful
     }
     // Reload plugin translations
     DAO_Translation::reloadPluginStrings();
     DevblocksPlatform::redirect(new DevblocksHttpResponse(array('config', 'plugins')));
 }
Exemplo n.º 30
0
 function saveKbCategoryEditPanelAction()
 {
     $active_worker = CerberusApplication::getActiveWorker();
     if (!$active_worker->hasPriv('core.kb.categories.modify')) {
         return;
     }
     @($id = DevblocksPlatform::importGPC($_REQUEST['id'], 'integer', 0));
     @($name = DevblocksPlatform::importGPC($_REQUEST['name'], 'string'));
     @($parent_id = DevblocksPlatform::importGPC($_REQUEST['parent_id'], 'integer', 0));
     @($delete = DevblocksPlatform::importGPC($_REQUEST['delete_box'], 'integer', 0));
     @($return = DevblocksPlatform::importGPC($_REQUEST['return']));
     if (!empty($id) && !empty($delete)) {
         $ids = DAO_KbCategory::getDescendents($id);
         DAO_KbCategory::delete($ids);
         // Change $return to category parent
         $return = "research/kb/" . sprintf("%06d", $parent_id);
     } elseif (empty($id)) {
         // create
         $fields = array(DAO_KbCategory::NAME => $name, DAO_KbCategory::PARENT_ID => $parent_id);
         DAO_KbCategory::create($fields);
     } else {
         // update
         $fields = array(DAO_KbCategory::NAME => $name, DAO_KbCategory::PARENT_ID => $parent_id);
         DAO_KbCategory::update($id, $fields);
     }
     if (!empty($return)) {
         $return_path = explode('/', $return);
         DevblocksPlatform::redirect(new DevblocksHttpResponse($return_path));
     }
 }