Example #1
0
 /**
  * Method used to get the details for a specific issue.
  *
  * @param   integer $issue_id The issue ID
  * @param   boolean $force_refresh If the cache should not be used.
  * @return  array The details for the specified issue
  */
 public static function getDetails($issue_id, $force_refresh = false)
 {
     static $returns;
     if (empty($issue_id)) {
         return '';
     }
     if (!empty($returns[$issue_id]) && $force_refresh != true) {
         return $returns[$issue_id];
     }
     $stmt = 'SELECT
                 {{%issue}}.*,
                 prj_title,
                 prc_title,
                 pre_title,
                 pri_title,
                 sev_title,
                 sta_title,
                 sta_abbreviation,
                 sta_color status_color,
                 sta_is_closed
              FROM
                 (
                 {{%issue}},
                 {{%project}}
                 )
              LEFT JOIN
                 {{%project_priority}}
              ON
                 iss_pri_id=pri_id
              LEFT JOIN
                 {{%project_severity}}
              ON
                 iss_sev_id=sev_id
              LEFT JOIN
                 {{%status}}
              ON
                 iss_sta_id=sta_id
              LEFT JOIN
                 {{%project_category}}
              ON
                 iss_prc_id=prc_id
              LEFT JOIN
                 {{%project_release}}
              ON
                 iss_pre_id=pre_id
              WHERE
                 iss_id=? AND
                 iss_prj_id=prj_id';
     try {
         $res = DB_Helper::getInstance()->getRow($stmt, array($issue_id));
     } catch (DbException $e) {
         return '';
     }
     if (empty($res)) {
         return '';
     }
     $created_date_ts = Date_Helper::getUnixTimestamp($res['iss_created_date'], Date_Helper::getDefaultTimezone());
     // get customer information, if any
     if (!empty($res['iss_customer_id']) && CRM::hasCustomerIntegration($res['iss_prj_id'])) {
         $crm = CRM::getInstance($res['iss_prj_id']);
         try {
             $customer = $crm->getCustomer($res['iss_customer_id']);
             $contract = $crm->getContract($res['iss_customer_contract_id']);
             $res['contact_local_time'] = Date_Helper::getFormattedDate(Date_Helper::getCurrentDateGMT(), $res['iss_contact_timezone']);
             $res['customer'] = $customer;
             $res['contract'] = $contract;
             $res['contact'] = $crm->getContact($res['iss_customer_contact_id']);
             // TODOCRM: Deal with incidents
             //                    $res['redeemed_incidents'] = Customer::getRedeemedIncidentDetails($res['iss_prj_id'], $res['iss_id']);
             $max_first_response_time = $contract->getMaximumFirstResponseTime($issue_id);
             $res['max_first_response_time'] = Misc::getFormattedTime($max_first_response_time / 60);
             if (empty($res['iss_first_response_date'])) {
                 $first_response_deadline = $created_date_ts + $max_first_response_time;
                 if (time() <= $first_response_deadline) {
                     $res['max_first_response_time_left'] = Date_Helper::getFormattedDateDiff($first_response_deadline, time());
                 } else {
                     $res['overdue_first_response_time'] = Date_Helper::getFormattedDateDiff(time(), $first_response_deadline);
                 }
             }
         } catch (CRMException $e) {
             // TODOCRM: Log exception?
         }
     }
     $res['iss_original_description'] = $res['iss_description'];
     $res['iss_original_percent_complete'] = $res['iss_percent_complete'];
     $res['iss_description'] = nl2br(htmlspecialchars($res['iss_description']));
     $res['iss_resolution'] = Resolution::getTitle($res['iss_res_id']);
     $res['iss_impact_analysis'] = nl2br(htmlspecialchars($res['iss_impact_analysis']));
     $res['iss_created_date_ts'] = $created_date_ts;
     $res['assignments'] = @implode(', ', array_values(self::getAssignedUsers($res['iss_id'])));
     list($res['authorized_names'], $res['authorized_repliers']) = Authorized_Replier::getAuthorizedRepliers($res['iss_id']);
     $temp = self::getAssignedUsersStatus($res['iss_id']);
     $res['has_inactive_users'] = 0;
     $res['assigned_users'] = array();
     $res['assigned_inactive_users'] = array();
     foreach ($temp as $usr_id => $usr_status) {
         if (!User::isActiveStatus($usr_status)) {
             $res['assigned_inactive_users'][] = $usr_id;
             $res['has_inactive_users'] = 1;
         } else {
             $res['assigned_users'][] = $usr_id;
         }
     }
     if (@in_array(Auth::getUserID(), $res['assigned_users'])) {
         $res['is_current_user_assigned'] = 1;
     } else {
         $res['is_current_user_assigned'] = 0;
     }
     $res['associated_issues_details'] = self::getAssociatedIssuesDetails($res['iss_id']);
     $res['associated_issues'] = self::getAssociatedIssues($res['iss_id']);
     $res['reporter'] = User::getFullName($res['iss_usr_id']);
     if (empty($res['iss_updated_date'])) {
         $res['iss_updated_date'] = $res['iss_created_date'];
     }
     $res['estimated_formatted_time'] = Misc::getFormattedTime($res['iss_dev_time']);
     if (Release::isAssignable($res['iss_pre_id'])) {
         $release = Release::getDetails($res['iss_pre_id']);
         $res['pre_title'] = $release['pre_title'];
         $res['pre_status'] = $release['pre_status'];
     }
     // need to return the list of issues that are duplicates of this one
     $res['duplicates'] = self::getDuplicateList($res['iss_id']);
     $res['duplicates_details'] = self::getDuplicateDetailsList($res['iss_id']);
     // also get the issue title of the duplicated issue
     if (!empty($res['iss_duplicated_iss_id'])) {
         $res['duplicated_issue'] = self::getDuplicatedDetails($res['iss_duplicated_iss_id']);
     }
     // get group information
     if (!empty($res['iss_grp_id'])) {
         $res['group'] = Group::getDetails($res['iss_grp_id']);
     }
     // get quarantine issue
     $res['quarantine'] = self::getQuarantineInfo($res['iss_id']);
     $res['products'] = Product::getProductsByIssue($res['iss_id']);
     $returns[$issue_id] = $res;
     return $res;
 }
 /**
  * Method used to send an email notification to users that want
  * to be alerted when new issues are created in the system.
  *
  * @param   integer $prj_id The project ID
  * @param   integer $issue_id The issue ID
  * @param   array   $exclude_list The list of users NOT to notify.
  * @return  void
  */
 public static function notifyNewIssue($prj_id, $issue_id, $exclude_list = array())
 {
     // get all users associated with this project
     $stmt = "SELECT\n                    usr_id,\n                    usr_full_name,\n                    usr_email,\n                    pru_role,\n                    usr_customer_id,\n                    usr_customer_contact_id\n                 FROM\n                    {{%user}},\n                    {{%project_user}}\n                 WHERE\n                    pru_prj_id=? AND\n                    usr_id=pru_usr_id AND\n                    usr_status = 'active' AND\n                    pru_role > ?";
     $params = array($prj_id, User::ROLE_CUSTOMER);
     if (count($exclude_list) > 0) {
         $stmt .= ' AND
                 usr_id NOT IN (' . DB_Helper::buildList($exclude_list) . ')';
         $params = array_merge($params, $exclude_list);
     }
     $res = DB_Helper::getInstance()->getAll($stmt, $params);
     $emails = array();
     foreach ($res as $row) {
         $subscriber = Mail_Helper::getFormattedName($row['usr_full_name'], $row['usr_email']);
         // don't send these emails to customers
         if ($row['pru_role'] == User::ROLE_CUSTOMER || !empty($row['usr_customer_id']) || !empty($row['usr_customer_contact_id'])) {
             continue;
         }
         $prefs = Prefs::get($row['usr_id']);
         if (!empty($prefs['receive_new_issue_email'][$prj_id]) && @$prefs['receive_new_issue_email'][$prj_id] && !in_array($subscriber, $emails)) {
             $emails[] = $subscriber;
         }
     }
     // get assignees
     $stmt = "SELECT\n                    usr_id,\n                    usr_full_name,\n                    usr_email\n                 FROM\n                    {{%user}},\n                    {{%issue_user}}\n                 WHERE\n                    isu_iss_id=? AND\n                    usr_id=isu_usr_id AND\n                    usr_status = 'active'";
     $res = DB_Helper::getInstance()->getAll($stmt, array($issue_id));
     foreach ($res as $row) {
         $subscriber = Mail_Helper::getFormattedName($row['usr_full_name'], $row['usr_email']);
         $prefs = Prefs::get($row['usr_id']);
         if (!empty($prefs['receive_assigned_email'][$prj_id]) && @$prefs['receive_assigned_email'][$prj_id] && !in_array($subscriber, $emails)) {
             $emails[] = $subscriber;
         }
     }
     // get any email addresses from products
     $products = Product::getProductsByIssue($issue_id);
     if (count($products) > 0) {
         foreach ($products as $product) {
             $emails[] = $product['pro_email'];
         }
     }
     // get notification list members
     $emails = array_merge($emails, self::getSubscribedNameEmails($issue_id));
     // get any additional emails
     $emails = array_merge($emails, Workflow::getAdditionalEmailAddresses($prj_id, $issue_id, 'new_issue'));
     $data = Issue::getDetails($issue_id, true);
     $data['attachments'] = Attachment::getList($issue_id);
     // notify new issue to irc channel
     $irc_notice = "New Issue #{$issue_id} (";
     $quarantine = Issue::getQuarantineInfo($issue_id);
     if (!empty($quarantine)) {
         $irc_notice .= 'Quarantined; ';
     }
     $irc_notice .= 'Priority: ' . $data['pri_title'];
     // also add information about the assignee, if any
     $assignment = Issue::getAssignedUsers($issue_id);
     if (count($assignment) > 0) {
         $irc_notice .= '; Assignment: ' . implode(', ', $assignment);
     }
     if (!empty($data['iss_grp_id'])) {
         $irc_notice .= '; Group: ' . Group::getName($data['iss_grp_id']);
     }
     $irc_notice .= '), ';
     if (@isset($data['customer'])) {
         $irc_notice .= $data['customer']['name'] . ', ';
     }
     $irc_notice .= $data['iss_summary'];
     self::notifyIRC($prj_id, $irc_notice, $issue_id, false, false, 'new_issue');
     $data['custom_fields'] = array();
     // empty place holder so notifySubscribers will fill it in with appropriate data for the user
     $subject = ev_gettext('New Issue');
     // generate new Message-ID
     $message_id = Mail_Helper::generateMessageID();
     $headers = array('Message-ID' => $message_id);
     self::notifySubscribers($issue_id, $emails, 'new_issue', $data, $subject, false, false, $headers);
 }