private function processResult(&$data, $date_field, $issue_field) { $timezone = Date_Helper::getPreferredTimezone($this->usr_id); foreach ($data as &$res) { if (!Issue::canAccess($res[$issue_field], $this->usr_id)) { continue; } $res['customer'] = null; if ($this->crm) { try { $customer = $this->crm->getCustomer(Issue::getCustomerID($res[$issue_field])); $res['customer'] = $customer->getName(); } catch (CRMException $e) { } } $res['date'] = Date_Helper::getFormattedDate($res[$date_field], $timezone); // need to decode From:, To: mail headers if (isset($res['sup_from'])) { $res['sup_from'] = Mime_Helper::fixEncoding($res['sup_from']); } if (isset($res['sup_to'])) { $res['sup_to'] = Mime_Helper::fixEncoding($res['sup_to']); } } }
$tpl->assign("associate_result", $res); } @$tpl->assign('total_emails', count($HTTP_POST_VARS['item'])); } else { @$tpl->assign('emails', $HTTP_GET_VARS['item']); @$tpl->assign('total_emails', count($HTTP_GET_VARS['item'])); $prj_id = Issue::getProjectID($HTTP_GET_VARS['issue']); if (Customer::hasCustomerIntegration($prj_id)) { // check if the selected emails all have sender email addresses that are associated with the issue' customer $senders = Support::getSender($HTTP_GET_VARS['item']); $sender_emails = array(); for ($i = 0; $i < count($senders); $i++) { $email = Mail_API::getEmailAddress($senders[$i]); $sender_emails[$email] = $senders[$i]; } $customer_id = Issue::getCustomerID($HTTP_GET_VARS['issue']); if (!empty($customer_id)) { $contact_emails = array_keys(Customer::getContactEmailAssocList($prj_id, $customer_id)); $unknown_contacts = array(); foreach ($sender_emails as $email => $address) { if (!@in_array($email, $contact_emails)) { $usr_id = User::getUserIDByEmail($email); if (empty($usr_id)) { $unknown_contacts[] = $address; } else { // if we got a real user ID, check if the customer user is the correct one // (i.e. a contact from the customer associated with the selected issue) if (User::getRoleByUser($usr_id, $prj_id) == User::getRoleID('Customer')) { // also check if the associated customer ID, if any, matches the one in the issue $user_customer_id = User::getCustomerID($usr_id); if ($user_customer_id != $customer_id) {
/** * Method used to get an associative array of names and emails * that are associated with a given project and issue. * * @access public * @param integer $prj_id The project ID * @param integer $issue_id The issue ID * @return array List of names and emails */ function getAddressBookAssocList($prj_id, $issue_id = FALSE) { if ($issue_id) { $customer_id = Issue::getCustomerID($issue_id); } $stmt = "SELECT\n usr_full_name,\n usr_email\n FROM\n " . ETEL_USER_TABLE . ",\n " . APP_DEFAULT_DB . "." . APP_TABLE_PREFIX . "project_user\n WHERE\n pru_prj_id=" . Misc::escapeInteger($prj_id) . " AND\n pru_usr_id=usr_id AND\n usr_status='active' AND\n usr_id <> " . APP_SYSTEM_USER_ID; if (!empty($customer_id)) { $stmt .= " AND (usr_customer_id IS NULL OR usr_customer_id IN (0, " . Misc::escapeInteger($customer_id) . ")) "; } else { $stmt .= " AND (usr_customer_id IS NULL OR usr_customer_id=0) "; } $stmt .= "\n ORDER BY\n usr_customer_id DESC,\n usr_full_name ASC"; $res = $GLOBALS["db_api"]->dbh->getAssoc($stmt); if (PEAR::isError($res)) { Error_Handler::logError(array($res->getMessage(), $res->getDebugInfo()), __FILE__, __LINE__); return ""; } else { return $res; } }
function getIncidentTypes($p) { $email = XML_RPC_decode($p->getParam(0)); $password = XML_RPC_decode($p->getParam(1)); $auth = authenticate($email, $password); if (is_object($auth)) { return $auth; } $issue_id = XML_RPC_decode($p->getParam(2)); $redeemed_only = XML_RPC_decode($p->getParam(3)); $prj_id = Issue::getProjectID($issue_id); createFakeCookie($email, $prj_id); $customer_id = Issue::getCustomerID($issue_id); if (!Customer::hasCustomerIntegration($prj_id)) { // no customer integration return new XML_RPC_Response(0, $XML_RPC_erruser + 1, "No customer integration for issue #{$issue_id}"); } elseif (!Customer::hasPerIncidentContract($prj_id, $customer_id)) { // check if is per incident contract return new XML_RPC_Response(0, $XML_RPC_erruser + 1, "Customer for issue #{$issue_id} does not have a per-incident contract"); } $details = Customer::getDetails($prj_id, $customer_id); foreach ($details['incident_details'] as $type_id => $type_details) { $is_redeemed = Customer::isRedeemedIncident($prj_id, $issue_id, $type_id); if ($redeemed_only && !$is_redeemed || !$redeemed_only && $is_redeemed) { unset($details['incident_details'][$type_id]); } } return new XML_RPC_Response(XML_RPC_Encode($details['incident_details'])); }
/** * @param int $issue_id * @param bool $redeemed_only * @return array * @access protected */ public function getIncidentTypes($issue_id, $redeemed_only) { $prj_id = Issue::getProjectID($issue_id); AuthCookie::setProjectCookie($prj_id); // FIXME: $customer_id unused $customer_id = Issue::getCustomerID($issue_id); if (!CRM::hasCustomerIntegration($prj_id)) { // no customer integration throw new RemoteApiException("No customer integration for issue #{$issue_id}"); } $crm = CRM::getInstance($prj_id); // FIXME: $all_types unused $all_types = $crm->getIncidentTypes(); $contract = $crm->getContract(Issue::getContractID($issue_id)); if (!$contract->hasPerIncident()) { // check if is per incident contract throw new RemoteApiException("Customer for issue #{$issue_id} does not have a per-incident contract"); } $incidents = $contract->getIncidents(); foreach ($incidents as $type_id => $type_details) { $is_redeemed = $contract->isRedeemedIncident($issue_id, $type_id); if ($redeemed_only && !$is_redeemed || !$redeemed_only && $is_redeemed) { unset($incidents[$type_id]); } } return $incidents; }
/** * Checks whether the given email address is allowed to send emails in the * issue ID. * * @access public * @param integer $issue_id The issue ID * @param string $sender_email The email address * @return boolean */ function isAllowedToEmail($issue_id, $sender_email) { $prj_id = Issue::getProjectID($issue_id); // check the workflow $workflow_can_email = Workflow::canEmailIssue($prj_id, $issue_id, $sender_email); if ($workflow_can_email != null) { return $workflow_can_email; } $is_allowed = true; $sender_usr_id = User::getUserIDByEmail($sender_email); if (empty($sender_usr_id)) { if (Customer::hasCustomerIntegration($prj_id)) { // check for a customer contact with several email addresses $customer_id = Issue::getCustomerID($issue_id); $contact_emails = array_keys(Customer::getContactEmailAssocList($prj_id, $customer_id, Issue::getContractID($issue_id))); $contact_emails = array_map('strtolower', $contact_emails); if (!in_array(strtolower($sender_email), $contact_emails) && !Authorized_Replier::isAuthorizedReplier($issue_id, $sender_email)) { $is_allowed = false; } } else { if (!Authorized_Replier::isAuthorizedReplier($issue_id, $sender_email)) { $is_allowed = false; } } } else { // check if this user is not a customer and // also not in the assignment list for the current issue and // also not in the authorized repliers list // also not the reporter $details = Issue::getDetails($issue_id); if (!Issue::canAccess($issue_id, $sender_usr_id)) { $is_allowed = false; } if ($sender_usr_id != $details['iss_usr_id'] && !Authorized_Replier::isUserAuthorizedReplier($issue_id, $sender_usr_id) && !Issue::isAssignedToUser($issue_id, $sender_usr_id) && User::getRoleByUser($sender_usr_id, Issue::getProjectID($issue_id)) != User::getRoleID('Customer')) { $is_allowed = false; } elseif (User::getRoleByUser($sender_usr_id, Issue::getProjectID($issue_id)) == User::getRoleID('Customer') && User::getCustomerID($sender_usr_id) != Issue::getCustomerID($issue_id)) { $is_allowed = false; } } return $is_allowed; }
/** * Method used to get an associative array of names and emails * that are associated with a given project and issue. * * @param integer $prj_id The project ID * @param integer $issue_id The issue ID * @return array List of names and emails */ public static function getAddressBookAssocList($prj_id, $issue_id = false) { if ($issue_id) { $customer_id = Issue::getCustomerID($issue_id); } $stmt = "SELECT\n usr_full_name,\n usr_email\n FROM\n {{%user}},\n {{%project_user}}\n WHERE\n pru_prj_id=? AND\n pru_usr_id=usr_id AND\n usr_status='active' AND\n usr_id <> ?"; $params = array($prj_id, APP_SYSTEM_USER_ID); if (!empty($customer_id)) { $stmt .= ' AND (usr_customer_id IS NULL OR usr_customer_id IN (0, ?)) '; $params[] = $customer_id; } else { $stmt .= ' AND (usr_customer_id IS NULL OR usr_customer_id=0) '; } $stmt .= ' ORDER BY usr_customer_id DESC, usr_full_name ASC'; try { $res = DB_Helper::getInstance()->fetchAssoc($stmt, $params); } catch (DbException $e) { return ''; } return $res; }
/** * Updates the incident counts * * @access public * @param integer $prj_id The project ID * @param integer $issue_id The issue ID * @param array $data An array of data containing which incident types to update. * @return integer 1 if all updates were successful, -1 or -2 otherwise. */ function updateRedeemedIncidents($prj_id, $issue_id, $data) { $details = Customer::getDetails($prj_id, Issue::getCustomerID($issue_id)); foreach ($details['incident_details'] as $type_id => $type_details) { $is_redeemed = Customer::isRedeemedIncident($prj_id, $issue_id, $type_id); if ($is_redeemed && @$data[$type_id] != 1) { // un-redeem issue $res = Customer::unflagIncident($prj_id, $issue_id, $type_id); } elseif (!$is_redeemed && @$data[$type_id] == 1) { // redeem issue if ($type_details['total'] - $type_details['redeemed'] > 0) { $res = Customer::flagIncident($prj_id, $issue_id, $type_id); } else { $res = -1; } } else { $res = 1; } if ($res != 1) { return $res; } } return $res; }
function processResult($res, $date_field, $issue_field) { global $prj_id; global $usr_id; $data = array(); for ($i = 0; $i < count($res); $i++) { if (!Issue::canAccess($res[$i][$issue_field], $usr_id)) { continue; } if (Customer::hasCustomerIntegration($prj_id)) { $details = Customer::getDetails($prj_id, Issue::getCustomerID($res[$i][$issue_field])); $res[$i]["customer"] = @$details['customer_name']; } $res[$i]["date"] = Date_API::getFormattedDate($res[$i][$date_field], Date_API::getPreferredTimezone($usr_id)); // need to decode From:, To: mail headers if (isset($res[$i]["sup_from"])) { $res[$i]["sup_from"] = Mime_Helper::fixEncoding($res[$i]["sup_from"]); } if (isset($res[$i]["sup_to"])) { $res[$i]["sup_to"] = Mime_Helper::fixEncoding($res[$i]["sup_to"]); } $data[] = $res[$i]; } return $data; }
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | // | GNU General Public License for more details. | // | | // | You should have received a copy of the GNU General Public License | // | along with this program; if not, write to: | // | | // | Free Software Foundation, Inc. | // | 59 Temple Place - Suite 330 | // | Boston, MA 02111-1307, USA. | // +----------------------------------------------------------------------+ // | Authors: Bryan Alsdorf <*****@*****.**> | // +----------------------------------------------------------------------+ // // This page handles marking an issue as 'redeeming' an incident. include_once "config.inc.php"; include_once APP_INC_PATH . "class.template.php"; include_once APP_INC_PATH . "class.customer.php"; include_once APP_INC_PATH . "db_access.php"; Auth::checkAuthentication(APP_COOKIE, 'index.php?err=5', true); $prj_id = Auth::getCurrentProject(); $issue_id = $_REQUEST['iss_id']; $tpl = new Template_API(); $tpl->setTemplate('redeem_incident.tpl.html'); if (!empty($_REQUEST['submit'])) { // update counts $res = Customer::updateRedeemedIncidents($prj_id, $issue_id, @$_REQUEST['redeem']); $tpl->assign('res', $res); } $details = Customer::getDetails($prj_id, Issue::getCustomerID($issue_id), true); $tpl->assign(array('issue_id' => $issue_id, 'redeemed' => Customer::getRedeemedIncidentDetails($prj_id, $issue_id), 'incident_details' => $details['incident_details'])); $tpl->displayTemplate();
/** * Generates the specialized headers for an email. * * @access public * @param integer $issue_id The issue ID * @param string $type The type of message this is * @param string $headers The existing headers of this message. * @param integer $sender_usr_id The id of the user sending this email. * @return array An array of specialized headers */ function getSpecializedHeaders($issue_id, $type, $headers, $sender_usr_id) { $new_headers = array(); if (!empty($issue_id)) { $prj_id = Issue::getProjectID($issue_id); if (count(Group::getAssocList($prj_id)) > 0) { // group issue is currently assigned too $new_headers['X-Eventum-Group-Issue'] = Group::getName(Issue::getGroupID($issue_id)); // group of whoever is sending this message. if (empty($sender_usr_id)) { $new_headers['X-Eventum-Group-Replier'] = $new_headers['X-Eventum-Group-Issue']; } else { $new_headers['X-Eventum-Group-Replier'] = Group::getName(User::getGroupID($sender_usr_id)); } // group of current assignee $assignees = Issue::getAssignedUserIDs($issue_id); if (empty($assignees[0])) { $new_headers['X-Eventum-Group-Assignee'] = ''; } else { $new_headers['X-Eventum-Group-Assignee'] = @Group::getName(User::getGroupID($assignees[0])); } } if (Customer::hasCustomerIntegration($prj_id)) { if (empty($support_levels)) { $support_levels = Customer::getSupportLevelAssocList($prj_id); } $customer_id = Issue::getCustomerID($issue_id); if (!empty($customer_id)) { $customer_details = Customer::getDetails($prj_id, $customer_id); $new_headers['X-Eventum-Customer'] = $customer_details['customer_name']; } if (count($support_levels) > 0) { $new_headers['X-Eventum-Level'] = $support_levels[Customer::getSupportLevelID($prj_id, $customer_id)]; } } $new_headers['X-Eventum-Category'] = Category::getTitle(Issue::getCategory($issue_id)); $new_headers['X-Eventum-Project'] = Project::getName($prj_id); } $new_headers['X-Eventum-Type'] = $type; return $new_headers; }
/** * Generates the specialized headers for an email. * * @param integer $issue_id The issue ID * @param string $type The type of message this is * @param string $headers The existing headers of this message. * @param integer $sender_usr_id The id of the user sending this email. * @return array An array of specialized headers */ public static function getSpecializedHeaders($issue_id, $type, $headers, $sender_usr_id) { $new_headers = array(); if (!empty($issue_id)) { $prj_id = Issue::getProjectID($issue_id); if (count(Group::getAssocList($prj_id)) > 0) { // group issue is currently assigned too $new_headers['X-Eventum-Group-Issue'] = Group::getName(Issue::getGroupID($issue_id)); // group of whoever is sending this message. if (empty($sender_usr_id)) { $new_headers['X-Eventum-Group-Replier'] = $new_headers['X-Eventum-Group-Issue']; } else { $new_headers['X-Eventum-Group-Replier'] = Group::getName(User::getGroupID($sender_usr_id)); } // group of current assignee $assignees = Issue::getAssignedUserIDs($issue_id); if (empty($assignees[0])) { $new_headers['X-Eventum-Group-Assignee'] = ''; } else { $new_headers['X-Eventum-Group-Assignee'] = @Group::getName(User::getGroupID($assignees[0])); } } if (CRM::hasCustomerIntegration($prj_id)) { $crm = CRM::getInstance($prj_id); try { $customer = $crm->getCustomer(Issue::getCustomerID($issue_id)); $new_headers['X-Eventum-Customer'] = $customer->getName(); } catch (CustomerNotFoundException $e) { } try { $contract = $crm->getContract(Issue::getContractID($issue_id)); $support_level = $contract->getSupportLevel(); if (is_object($support_level)) { $new_headers['X-Eventum-Level'] = $support_level->getName(); } } catch (ContractNotFoundException $e) { } } // add assignee header $new_headers['X-Eventum-Assignee'] = implode(',', User::getEmail(Issue::getAssignedUserIDs($issue_id))); $new_headers['X-Eventum-Category'] = Category::getTitle(Issue::getCategory($issue_id)); $new_headers['X-Eventum-Project'] = Project::getName($prj_id); $new_headers['X-Eventum-Priority'] = Priority::getTitle(Issue::getPriority($issue_id)); // handle custom fields $cf_values = Custom_Field::getValuesByIssue($prj_id, $issue_id); $cf_titles = Custom_Field::getFieldsToBeListed($prj_id); foreach ($cf_values as $fld_id => $values) { // skip empty titles // TODO: why they are empty? if (!isset($cf_titles[$fld_id])) { continue; } // skip empty values if (empty($values)) { continue; } $cf_value = implode(', ', (array) $values); // value could be empty after multivalued field join if (empty($cf_value)) { continue; } // convert spaces for header fields $cf_title = str_replace(' ', '_', $cf_titles[$fld_id]); $new_headers['X-Eventum-CustomField-' . $cf_title] = $cf_value; } } $new_headers['X-Eventum-Type'] = $type; return $new_headers; }
include_once APP_INC_PATH . "class.notification.php"; include_once APP_INC_PATH . "db_access.php"; $tpl = new Template_API(); $tpl->setTemplate("close.tpl.html"); Auth::checkAuthentication(APP_COOKIE); $prj_id = Auth::getCurrentProject(); $issue_id = @$HTTP_POST_VARS["issue_id"] ? $HTTP_POST_VARS["issue_id"] : $HTTP_GET_VARS["id"]; $tpl->assign("extra_title", "Close Issue #{$issue_id}"); $notification_list = Notification::getSubscribers($issue_id, 'closed'); $tpl->assign("notification_list_all", $notification_list['all']); $notification_list_internal = Notification::getSubscribers($issue_id, 'closed', User::getRoleID("standard User")); $tpl->assign("notification_list_internal", $notification_list_internal['all']); if (@$HTTP_POST_VARS["cat"] == "close") { $res = Issue::close(Auth::getUserID(), $HTTP_POST_VARS["issue_id"], $HTTP_POST_VARS["send_notification"], $HTTP_POST_VARS["resolution"], $HTTP_POST_VARS["status"], $HTTP_POST_VARS["reason"], @$_REQUEST['notification_list']); if (!empty($HTTP_POST_VARS['time_spent'])) { $HTTP_POST_VARS['summary'] = 'Time entry inserted when closing issue.'; Time_Tracking::insertEntry(); } if (Customer::hasCustomerIntegration($prj_id) && Customer::hasPerIncidentContract($prj_id, Issue::getCustomerID($issue_id))) { Customer::updateRedeemedIncidents($prj_id, $issue_id, @$_REQUEST['redeem']); } $tpl->assign("close_result", $res); } $tpl->assign("statuses", Status::getClosedAssocList($prj_id)); $tpl->assign("resolutions", Resolution::getAssocList()); $tpl->assign("time_categories", Time_Tracking::getAssocCategories()); if (Customer::hasCustomerIntegration($prj_id) && Customer::hasPerIncidentContract($prj_id, Issue::getCustomerID($issue_id))) { $details = Issue::getDetails($issue_id); $tpl->assign(array('redeemed' => Customer::getRedeemedIncidentDetails($prj_id, $issue_id), 'incident_details' => $details['customer_info']['incident_details'])); } $tpl->displayTemplate();
/** * Method used to get the list of issues to be displayed in the grid layout. * * @access public * @param integer $prj_id The current project ID * @param array $options The search parameters * @param integer $current_row The current page number * @param integer $max The maximum number of rows per page * @return array The list of issues to be displayed */ function getListing($prj_id, $options, $current_row = 0, $max = 5, $get_reporter = FALSE) { if (strtoupper($max) == "ALL") { $max = 9999999; } $start = $current_row * $max; // get the current user's role $usr_id = Auth::getUserID(); $role_id = User::getRoleByUser($usr_id, $prj_id); // get any custom fields that should be displayed $custom_fields = Custom_Field::getFieldsToBeListed($prj_id); $stmt = "SELECT\n iss_id,\n iss_grp_id,\n iss_prj_id,\n iss_sta_id,\n iss_customer_id,\n iss_created_date,\n iss_updated_date,\n iss_last_response_date,\n iss_closed_date,\n iss_last_customer_action_date,\n iss_usr_id,\n iss_summary,\n pri_title,\n prc_title,\n sta_title,\n sta_color status_color,\n sta_id,\n iqu_status,\n grp_name `group`,\n pre_title,\n iss_last_public_action_date,\n iss_last_public_action_type,\n iss_last_internal_action_date,\n iss_last_internal_action_type,\n " . Issue::getLastActionFields() . ",\n IF(iss_last_internal_action_date > iss_last_public_action_date, 'internal', 'public') AS action_type,\n iss_private,\n CONCAT(en_firstname,' ', en_lastname) as usr_full_name,\n iss_percent_complete,\n iss_dev_time,\n iss_expected_resolution_date\n FROM\n (\n " . APP_DEFAULT_DB . "." . APP_TABLE_PREFIX . "issue,\n " . ETEL_USER_TABLE_NOSUB . ""; // join custom fields if we are searching by custom fields if (is_array($options['custom_field']) && count($options['custom_field']) > 0) { foreach ($options['custom_field'] as $fld_id => $search_value) { if (empty($search_value)) { continue; } $field = Custom_Field::getDetails($fld_id); if ($field['fld_type'] == 'date' && (empty($search_value['Year']) || empty($search_value['Month']) || empty($search_value['Day']))) { continue; } if ($field['fld_type'] == 'multiple') { $search_value = Misc::escapeInteger($search_value); foreach ($search_value as $cfo_id) { $stmt .= ",\n" . APP_DEFAULT_DB . "." . APP_TABLE_PREFIX . "issue_custom_field as cf" . $fld_id . '_' . $cfo_id . "\n"; } } else { $stmt .= ",\n" . APP_DEFAULT_DB . "." . APP_TABLE_PREFIX . "issue_custom_field as cf" . $fld_id . "\n"; } } } $stmt .= ")"; // check for the custom fields we want to sort by if (strstr($options['sort_by'], 'custom_field') !== false) { $fld_id = str_replace("custom_field_", '', $options['sort_by']); $stmt .= "\n LEFT JOIN \n" . APP_DEFAULT_DB . "." . APP_TABLE_PREFIX . "issue_custom_field as cf_sort\n ON\n (cf_sort.icf_iss_id = iss_id AND cf_sort.icf_fld_id = {$fld_id}) \n"; } // START ETEL MODIFIED if (!empty($options["show_authorized_issues"]) || $role_id <= User::getRoleID("Standard User") && Project::getSegregateReporters($prj_id)) { $stmt .= "\n LEFT JOIN\n " . APP_DEFAULT_DB . "." . APP_TABLE_PREFIX . "issue_user_replier\n ON\n iur_iss_id=iss_id\n LEFT JOIN\n " . APP_DEFAULT_DB . "." . APP_TABLE_PREFIX . "issue_user\n ON\n isu_iss_id=iss_id"; } else { if (!empty($options["users"])) { $stmt .= "\n LEFT JOIN\n " . APP_DEFAULT_DB . "." . APP_TABLE_PREFIX . "issue_user\n ON\n isu_iss_id=iss_id"; } } // END ETEL MODIFIED if (!empty($options["show_notification_list_issues"])) { $stmt .= "\n LEFT JOIN\n " . APP_DEFAULT_DB . "." . APP_TABLE_PREFIX . "subscription\n ON\n sub_iss_id=iss_id"; } $stmt .= "\n LEFT JOIN\n " . APP_DEFAULT_DB . ".`" . APP_TABLE_PREFIX . "group`\n ON\n iss_grp_id=grp_id\n LEFT JOIN\n " . APP_DEFAULT_DB . "." . APP_TABLE_PREFIX . "project_category\n ON\n iss_prc_id=prc_id\n LEFT JOIN\n " . APP_DEFAULT_DB . "." . APP_TABLE_PREFIX . "project_release\n ON\n iss_pre_id = pre_id\n LEFT JOIN\n " . APP_DEFAULT_DB . "." . APP_TABLE_PREFIX . "status\n ON\n iss_sta_id=sta_id\n LEFT JOIN\n " . APP_DEFAULT_DB . "." . APP_TABLE_PREFIX . "project_priority\n ON\n iss_pri_id=pri_id\n LEFT JOIN\n " . APP_DEFAULT_DB . "." . APP_TABLE_PREFIX . "issue_quarantine\n ON\n iss_id=iqu_iss_id AND\n (iqu_expiration > '" . Date_API::getCurrentDateGMT() . "' OR iqu_expiration IS NULL)\n WHERE\n iss_prj_id= " . Misc::escapeInteger($prj_id); $stmt .= Issue::buildWhereClause($options); //echo $stmt; if (strstr($options["sort_by"], 'custom_field') !== false) { $sort_by = 'cf_sort.icf_value'; } else { $sort_by = Misc::escapeString($options["sort_by"]); } $stmt .= "\n GROUP BY\n iss_id\n ORDER BY\n " . $sort_by . " " . Misc::escapeString($options["sort_order"]) . ",\n iss_id DESC"; $total_rows = Pager::getTotalRows($stmt); if ($max > 100) { $max = 100; } $stmt .= "\n LIMIT\n " . Misc::escapeInteger($start) . ", " . Misc::escapeInteger($max); $res = $GLOBALS["db_api"]->dbh->getAll($stmt, DB_FETCHMODE_ASSOC); // echo $stmt; if (PEAR::isError($res)) { Error_Handler::logError(array($res->getMessage(), $res->getDebugInfo()), __FILE__, __LINE__); return array("list" => "", "info" => ""); } else { if (count($res) > 0) { if ($get_reporter) { Issue::getReportersByIssues($res); } Issue::getAssignedUsersByIssues($res); Time_Tracking::getTimeSpentByIssues($res); // need to get the customer titles for all of these issues... if (Customer::hasCustomerIntegration($prj_id)) { Customer::getCustomerTitlesByIssues($prj_id, $res); } Issue::formatLastActionDates($res); Issue::getLastStatusChangeDates($prj_id, $res); } elseif ($current_row > 0) { // if there are no results, and the page is not the first page reset page to one and reload results Auth::redirect(APP_RELATIVE_URL . "list.php?pagerRow=0&rows={$max}"); } $groups = Group::getAssocList($prj_id); $categories = Category::getAssocList($prj_id); $column_headings = Issue::getColumnHeadings($prj_id); if (count($custom_fields) > 0) { $column_headings = array_merge($column_headings, $custom_fields); } $csv[] = @implode("\t", $column_headings); for ($i = 0; $i < count($res); $i++) { $res[$i]["time_spent"] = Misc::getFormattedTime($res[$i]["time_spent"]); $res[$i]["iss_expected_resolution_date"] = Date_API::getSimpleDate($res[$i]["iss_expected_resolution_date"], false); $fields = array($res[$i]['pri_title'], $res[$i]['iss_id']); // hide the group column from the output if no // groups are available in the database if (count($groups) > 0) { $fields[] = $res[$i]['group']; } $fields[] = $res[$i]['assigned_users']; $fields[] = $res[$i]['time_spent']; // hide the category column from the output if no // categories are available in the database if (count($categories) > 0) { $fields[] = $res[$i]['prc_title']; } if (Customer::hasCustomerIntegration($prj_id)) { $fields[] = @$res[$i]['customer_title']; // check if current user is acustomer and has a per incident contract. // if so, check if issue is redeemed. if (User::getRoleByUser($usr_id, $prj_id) == User::getRoleID('Customer')) { if (Customer::hasPerIncidentContract($prj_id, Issue::getCustomerID($res[$i]['iss_id'])) && Customer::isRedeemedIncident($prj_id, $res[$i]['iss_id'])) { $res[$i]['redeemed'] = true; } } } $fields[] = $res[$i]['sta_title']; $fields[] = $res[$i]["status_change_date"]; $fields[] = $res[$i]["last_action_date"]; $fields[] = $res[$i]['iss_summary']; if (count($custom_fields) > 0) { $res[$i]['custom_field'] = array(); $custom_field_values = Custom_Field::getListByIssue($prj_id, $res[$i]['iss_id']); foreach ($custom_field_values as $this_field) { if (!empty($custom_fields[$this_field['fld_id']])) { $res[$i]['custom_field'][$this_field['fld_id']] = $this_field['icf_value']; $fields[] = $this_field['icf_value']; } } } $csv[] = @implode("\t", $fields); } $total_pages = ceil($total_rows / $max); $last_page = $total_pages - 1; return array("list" => $res, "info" => array("current_page" => $current_row, "start_offset" => $start, "end_offset" => $start + count($res), "total_rows" => $total_rows, "total_pages" => $total_pages, "previous_page" => $current_row == 0 ? "-1" : $current_row - 1, "next_page" => $current_row == $last_page ? "-1" : $current_row + 1, "last_page" => $last_page, "custom_fields" => $custom_fields), "csv" => @implode("\n", $csv)); } }