v7‰PNG  IHDR Ÿ f Õ†C1 sRGB ®Îé gAMA ± üa pHYs à ÃÇo¨d GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT getDi()->uploadTable->defineUsage(self::ATTACHMENT_UPLOAD_PREFIX, 'helpdesk_message', 'attachments', UploadTable::STORE_IMPLODE, "Ticket [%ticket_id%]", '/helpdesk/admin/p/index/index'); $this->getDi()->uploadTable->defineUsage(self::ADMIN_ATTACHMENT_UPLOAD_PREFIX, 'helpdesk_message', 'attachments', UploadTable::STORE_IMPLODE, "Ticket [%ticket_id%]", '/helpdesk/admin/p/index/index'); } function renderNotification() { if ($user_id = $this->getDi()->auth->getUserId()) { $cnt = $this->getDi()->db->selectCell("SELECT COUNT(ticket_id) FROM ?_helpdesk_ticket WHERE has_new=? AND user_id=?", 1, $user_id); if ($cnt) return '
' . ___('You have %s%d ticket(s)%s that require your attention', sprintf('', REL_ROOT_URL . '/helpdesk?_user_has_new=1'), $cnt, '') . '
'; } } function onSetupEmailTemplateTypes(Am_Event $event) { $ticket = array( 'ticket.ticket_mask' => 'Ticket Mask', 'ticket.subject' => 'Ticket Subject', ); $event->addReturn(array( 'id' => 'helpdesk.notify_new_message', 'title' => 'Notify New Message', 'mailPeriodic' => Am_Mail::USER_REQUESTED, 'vars' => $ticket + array('url' => 'Url of Page with Message', 'user'), ), 'helpdesk.notify_new_message'); $event->addReturn(array( 'id' => 'helpdesk.notify_new_message', 'title' => 'Notify New Message', 'mailPeriodic' => Am_Mail::USER_REQUESTED, 'isAdmin' => true, 'vars' => $ticket + array('url' => 'Url of Page with Message', 'user'), ), 'helpdesk.notify_new_message_admin'); $event->addReturn(array( 'id' => 'helpdesk.new_ticket', 'title' => 'Autoresponder New Ticket', 'mailPeriodic' => Am_Mail::USER_REQUESTED, 'vars' => $ticket + array('url' => 'Url of Page with Ticket', 'user'), ), 'helpdesk.new_ticket'); $event->addReturn(array( 'id' => 'helpdesk.notify_assign', 'title' => 'Notify Ticket is Assigned to Admin', 'mailPeriodic' => Am_Mail::ADMIN_REQUESTED, 'vars' => $ticket + array('url' => 'Url of Page with Ticket', 'admin'), 'isAdmin' => true, ), 'helpdesk.notify_assign'); $event->addReturn(array( 'id' => 'helpdesk.notify_autoclose', 'title' => 'Notify User about Ticket Autoclose', 'mailPeriodic' => Am_Mail::USER_REQUESTED, 'vars' => array('user') + $ticket + array('url' => 'Url of Page with Ticket'), ), 'helpdesk.notify_autoclose'); } function onGetUploadPrefixList(Am_Event $event) { $event->addReturn(array( Am_Upload_Acl::IDENTITY_TYPE_ADMIN => array( self::ADMIN_PERM_ID => Am_Upload_Acl::ACCESS_ALL ) ), self::ADMIN_ATTACHMENT_UPLOAD_PREFIX); if (!$this->getConfig('does_not_allow_attachments')) { $event->addReturn(array( Am_Upload_Acl::IDENTITY_TYPE_ADMIN => array( self::ADMIN_PERM_ID => Am_Upload_Acl::ACCESS_ALL ), Am_Upload_Acl::IDENTITY_TYPE_USER => Am_Upload_Acl::ACCESS_WRITE | Am_Upload_Acl::ACCESS_READ_OWN ), self::ATTACHMENT_UPLOAD_PREFIX); } } function onLoadAdminDashboardWidgets(Am_Event $event) { $event->addReturn(new Am_Widget('helpdesk-messages', ___('Last Messages in Helpdesk'), array($this, 'renderWidget'), Am_Widget::TARGET_ANY, array($this, 'createWidgetConfigForm'), self::ADMIN_PERM_ID)); } function onAdminAfterDelete(Am_Event $e) { $this->getDi()->db->query("UPDATE ?_helpdesk_ticket SET owner_id = NULL WHERE owner_id=?", $e->getAdmin()->pk()); $this->getDi()->db->query("UPDATE ?_helpdesk_ticket SET lock_admin_id = NULL, lock_admin = NULL, lock_until = NULL WHERE lock_admin_id=?", $e->getAdmin()->pk()); } function createWidgetConfigForm() { $form = new Am_Form_Admin(); $form->addInteger('num') ->setLabel(___('Number of Messages to display')) ->setValue(5); return $form; } function renderWidget(Am_View $view, $config = null) { $view->num = is_null($config) ? 5 : $config['num']; return $view->render('admin/helpdesk/widget/messages.phtml'); } function onClearItems(Am_Event $event) { $event->addReturn(array( 'method' => array($this->getDi()->helpdeskTicketTable, 'clearOld'), 'title' => 'Helpdesk Tickets', 'desc' => 'records with last update date early than Date to Purge' ), 'helpdesk_tickets'); } function onAdminWarnings(Am_Event $event) { /* @var $admin Admin */ $admin = $this->getDi()->authAdmin->getUser(); if (!$admin->hasPermission(self::ADMIN_PERM_ID)) return; $cnt = $this->getDi()->db->selectCell("SELECT COUNT(ticket_id) FROM ?_helpdesk_ticket WHERE status IN (?a)", array(HelpdeskTicket::STATUS_AWAITING_ADMIN_RESPONSE, HelpdeskTicket::STATUS_NEW)); if ($cnt) $event->addReturn(___('You have %s%d ticket(s)%s that require your attention', sprintf('', REL_ROOT_URL . '/helpdesk/admin/?_admin_filter_s[]=new&_admin_filter_s[]=awaiting_admin_response'), $cnt, '')); } function onUserMerge(Am_Event $event) { $target = $event->getTarget(); $source = $event->getSource(); $this->getDi()->db->query('UPDATE ?_helpdesk_ticket SET user_id=? WHERE user_id=?', $target->pk(), $source->pk()); } function onAdminMenu(Am_Event $event) { $cntMy = $this->getDi()->helpdeskTicketTable->countBy(array( 'owner_id' => $this->getDi()->authAdmin->getUserId(), 'status' => '<>' . HelpdeskTicket::STATUS_CLOSED )); $cntDashboard = $this->getDi()->helpdeskTicketTable->countBy(array( 'status' => '<>' . HelpdeskTicket::STATUS_CLOSED )); $event->getMenu()->addPage(array( 'label' => ___('Helpdesk'), 'uri' => '#', 'id' => 'helpdesk', 'resource' => self::ADMIN_PERM_ID, 'pages' => array( array( 'label' => ___('Dashboard') . ($cntDashboard ? " (($cntDashboard))" : ''), 'controller' => 'admin', 'action' => 'index', 'module' => 'helpdesk', 'id' => 'helpdesk-ticket', 'resource' => self::ADMIN_PERM_ID ), array( 'label' => ___('My Tickets') . ($cntMy ? " (($cntMy))" : ''), 'controller' => 'admin-my', 'action' => 'index', 'module' => 'helpdesk', 'id' => 'helpdesk-ticket-my', 'resource' => self::ADMIN_PERM_ID ), array( 'label' => ___('Categories'), 'controller' => 'admin-category', 'action' => 'index', 'module' => 'helpdesk', 'id' => 'helpdesk-category', 'resource' => self::ADMIN_PERM_CATEGORY ), array( 'label' => ___('Fields'), 'controller' => 'admin-fields', 'action' => 'index', 'module' => 'helpdesk', 'id' => 'helpdesk-fields', 'resource' => self::ADMIN_PERM_CATEGORY ), array( 'label' => ___('FAQ'), 'controller' => 'admin-faq', 'action' => 'index', 'module' => 'helpdesk', 'id' => 'helpdesk-faq', 'resource' => self::ADMIN_PERM_FAQ )) )); } function onUserMenu(Am_Event $event) { $page = $helpdeskPage = array( 'id' => 'helpdesk', 'label' => ___('Helpdesk'), 'controller' => 'index', 'action' => 'index', 'module' => 'helpdesk', 'order' => 600, ); if (!$this->getConfig('does_not_show_faq_tab') && $this->getDi()->helpdeskFaqTable->countBy()) { $page = array( 'id' => 'helpdesk-root', 'label' => ___('Support'), 'uri' => 'javascript:;', 'order' => 600, 'pages' => array( $helpdeskPage, array( 'id' => 'helpdesk-faq', 'label' => ___('FAQ'), 'controller' => 'faq', 'action' => 'index', 'module' => 'helpdesk', 'order' => 601, ) ) ); } $event->getMenu()->addPage($page); } function onUserTabs(Am_Event_UserTabs $event) { extract($this->getDi()->db->selectRow("SELECT COUNT(*) AS cnt_all, COUNT(IF(status IN ('new', 'awaiting_admin_response'), ticket_id, NULL)) AS cnt_open FROM ?_helpdesk_ticket WHERE user_id=?", $event->getUserId())); $event->getTabs()->addPage(array( 'id' => 'helpdesk', 'module' => 'helpdesk', 'controller' => 'admin-user', 'action' => 'index', 'params' => array( 'user_id' => $event->getUserId() ), 'label' => ___('Tickets') . sprintf(' (%s)', $cnt_all ? $cnt_open . '/' . $cnt_all: 0), 'order' => 1000, 'resource' => self::ADMIN_PERM_ID, )); } function onGetPermissionsList(Am_Event $event) { $event->addReturn(___('Helpdesk: Can operate with helpdesk tickets'), self::ADMIN_PERM_ID); $event->addReturn(___('Helpdesk: FAQ'), self::ADMIN_PERM_FAQ); $event->addReturn(___('Helpdesk: Categories'), self::ADMIN_PERM_CATEGORY); } function onUserAfterDelete(Am_Event_UserAfterDelete $event) { $this->getDi()->db->query("DELETE FROM ?_helpdesk_message WHERE ticket_id IN (SELECT ticket_id FROM ?_helpdesk_ticket WHERE user_id=?)", $event->getUser()->user_id); $this->getDi()->db->query("DELETE FROM ?_helpdesk_ticket WHERE user_id=?", $event->getUser()->user_id); } function onHourly() { if ($this->getConfig('autoclose')) { $period = $this->getConfig('autoclose_period', 72); $thresholdDate = sqlTime("-$period hours"); foreach($this->getDi()->db->selectPage($total, " SELECT * FROM ?_helpdesk_ticket WHERE status=? AND updated < ? ", HelpdeskTicket::STATUS_AWAITING_USER_RESPONSE, $thresholdDate) as $row) { $ticket = $this->getDi()->helpdeskTicketRecord->fromRow($row); $ticket->status = HelpdeskTicket::STATUS_CLOSED; $ticket->updated = $this->getDi()->sqlDateTime; $ticket->save(); $user = $ticket->getUser(); if($this->getConfig('notify_autoclose')) { $et = Am_Mail_Template::load('helpdesk.notify_autoclose', $user->lang); $et->setUser($user); $et->setTicket($ticket); $et->setUrl(sprintf('%s/helpdesk/ticket/%s', $this->getDi()->config->get('root_surl'), $ticket->ticket_mask)); $et->send($user); } } } } function onInitFinished() { $this->getDi()->blocks->add(new Am_Block('member/main/top', null, 'helpdesk-notification', null, array($this, 'renderNotification'))); $this->getDi()->register('helpdeskStrategy', 'Am_Helpdesk_Strategy_Abstract') ->setConstructor('create') ->setArguments(array($this->getDi())); $router = $this->getDi()->router;; $router->addRoute('helpdesk-item', new Am_Mvc_Router_Route( 'helpdesk/faq/i/:title', array( 'module' => 'helpdesk', 'controller' => 'faq', 'action' => 'item' ) )); $router->addRoute('helpdesk-category', new Am_Mvc_Router_Route( 'helpdesk/faq/c/:cat', array( 'module' => 'helpdesk', 'controller' => 'faq', 'action' => 'index' ) )); $router->addRoute('helpdesk-ticket', new Am_Mvc_Router_Route( 'helpdesk/ticket/:ticket', array( 'module' => 'helpdesk', 'controller' => 'index', 'action' => 'view', 'page_id' => 'view' ) )); $router->addRoute('helpdesk-ticket-admin', new Am_Mvc_Router_Route( 'helpdesk/admin/ticket/:ticket', array( 'module' => 'helpdesk', 'controller' => 'admin', 'action' => 'view', 'page_id' => 'view' ) )); $router->addRoute('helpdesk-new', new Am_Mvc_Router_Route( 'helpdesk/ticket/new', array( 'module' => 'helpdesk', 'controller' => 'index', 'action' => 'new', 'page_id' => 'view' ) )); $router->addRoute('helpdesk-new-admin', new Am_Mvc_Router_Route( 'helpdesk/admin/ticket/new', array( 'module' => 'helpdesk', 'controller' => 'admin', 'action' => 'new', 'page_id' => 'view' ) )); } function onBuildDemo(Am_Event $event) { $subjects = array( 'Please help', 'Urgent question', 'I have a problem', 'Important question', 'Pre-sale inquiry', ); $questions = array( "My website is now working. Can you help?", "I have a problem with website script.\nWhere can I find documentation?", "I am unable to place an order, my credit card is not accepted.", ); $answers = array( "Please call us to phone# 1-800-222-3334", "We are looking to your problem, and it will be resolved within 4 hours", ); $user = $event->getUser(); $now = $this->getDi()->time; $added = amstrtotime($user->added); /* @var $user User */ while (rand(0, 10) < 4) { $created = min($now, $added + rand(60, $now - $added)); $ticket = $this->getDi()->helpdeskTicketRecord; $ticket->status = HelpdeskTicket::STATUS_AWAITING_ADMIN_RESPONSE; $ticket->subject = $subjects[rand(0, count($subjects) - 1)]; $ticket->user_id = $user->pk(); $ticket->created = sqlTime($created); $ticket->updated = sqlTime($created); $ticket->insert(); // $msg = $this->getDi()->helpdeskMessageRecord; $msg->content = $questions[rand(0, count($questions) - 1)]; $msg->type = 'message'; $msg->ticket_id = $ticket->pk(); $msg->dattm = sqlTime($created); $msg->insert(); // if (rand(0, 10) < 6) { $msg = $this->getDi()->helpdeskMessageRecord; $msg->content = $answers[rand(0, count($answers) - 1)]; $msg->type = 'message'; $msg->ticket_id = $ticket->pk(); $msg->dattm = sqlTime(min($created + rand(60, 3600 * 24), $now)); $msg->admin_id = $this->getDi()->adminTable->findFirstBy()->pk(); $msg->insert(); if (rand(0, 10) < 6) $ticket->status = HelpdeskTicket::STATUS_AWAITING_USER_RESPONSE; else $ticket->status = HelpdeskTicket::STATUS_CLOSED; $ticket->updated = $msg->dattm; $ticket->update(); } } } function onLoadReports() { require_once 'Am/Report/Helpdesk.php'; } function onDbUpgrade(Am_Event $e) { if (version_compare($e->getVersion(), '4.2.20') < 0) { echo "Fix FAQ categories..."; if (ob_get_level ()) ob_end_flush(); $this->getDi()->db->query("UPDATE ?_helpdesk_faq SET category=? WHERE category=?", null, ''); echo "Done
\n"; echo "Add default Order to Helpdesk FAQ..."; $this->getDi()->db->query("SET @i = 0"); $this->getDi()->db->query("UPDATE ?_helpdesk_faq SET sort_order=(@i:=@i+1)"); echo "Done
\n"; echo "Add default Order to Helpdesk Categories..."; $this->getDi()->db->query("SET @i = 0"); $this->getDi()->db->query("UPDATE ?_helpdesk_category SET sort_order=(@i:=@i+1)"); echo "Done
\n"; } if (version_compare($e->getVersion(), '5.0.5') <= 0) { echo "Update Ticket Status..."; $this->getDi()->db->query("UPDATE ?_helpdesk_ticket SET has_new=1 WHERE status IN (?a)", array(HelpdeskTicket::STATUS_AWAITING_USER_RESPONSE)); echo "Done
\n"; } } }