예제 #1
0
 /**
  * Method used to send a diff-style notification email to the issue
  * subscribers about updates to its attributes.
  *
  * @param   integer $issue_id The issue ID
  * @param   array $old The old issue details
  * @param   array $new The new issue details
  * @param   array $updated_custom_fields An array of the custom fields that were changed.
  */
 public static function notifyIssueUpdated($issue_id, $old, $new, $updated_custom_fields)
 {
     $prj_id = Issue::getProjectID($issue_id);
     $diffs = array();
     if (@$new['keep_assignments'] == 'no') {
         if (empty($new['assignments'])) {
             $new['assignments'] = array();
         }
         $assign_diff = Misc::arrayDiff($old['assigned_users'], $new['assignments']);
         if (count($assign_diff) > 0) {
             $diffs[] = '-' . ev_gettext('Assignment List') . ': ' . $old['assignments'];
             @($diffs[] = '+' . ev_gettext('Assignment List') . ': ' . implode(', ', User::getFullName($new['assignments'])));
         }
     }
     if (isset($new['expected_resolution_date']) && @$old['iss_expected_resolution_date'] != $new['expected_resolution_date']) {
         $diffs[] = '-' . ev_gettext('Expected Resolution Date') . ': ' . $old['iss_expected_resolution_date'];
         $diffs[] = '+' . ev_gettext('Expected Resolution Date') . ': ' . $new['expected_resolution_date'];
     }
     if (isset($new['category']) && $old['iss_prc_id'] != $new['category']) {
         $diffs[] = '-' . ev_gettext('Category') . ': ' . Category::getTitle($old['iss_prc_id']);
         $diffs[] = '+' . ev_gettext('Category') . ': ' . Category::getTitle($new['category']);
     }
     if (isset($new['release']) && $old['iss_pre_id'] != $new['release']) {
         $diffs[] = '-' . ev_gettext('Release') . ': ' . Release::getTitle($old['iss_pre_id']);
         $diffs[] = '+' . ev_gettext('Release') . ': ' . Release::getTitle($new['release']);
     }
     if (isset($new['priority']) && $old['iss_pri_id'] != $new['priority']) {
         $diffs[] = '-' . ev_gettext('Priority') . ': ' . Priority::getTitle($old['iss_pri_id']);
         $diffs[] = '+' . ev_gettext('Priority') . ': ' . Priority::getTitle($new['priority']);
     }
     if (isset($new['severity']) && $old['iss_sev_id'] != $new['severity']) {
         $diffs[] = '-' . ev_gettext('Severity') . ': ' . Severity::getTitle($old['iss_sev_id']);
         $diffs[] = '+' . ev_gettext('Severity') . ': ' . Severity::getTitle($new['severity']);
     }
     if (isset($new['status']) && $old['iss_sta_id'] != $new['status']) {
         $diffs[] = '-' . ev_gettext('Status') . ': ' . Status::getStatusTitle($old['iss_sta_id']);
         $diffs[] = '+' . ev_gettext('Status') . ': ' . Status::getStatusTitle($new['status']);
     }
     if (isset($new['resolution']) && $old['iss_res_id'] != $new['resolution']) {
         $diffs[] = '-' . ev_gettext('Resolution') . ': ' . Resolution::getTitle($old['iss_res_id']);
         $diffs[] = '+' . ev_gettext('Resolution') . ': ' . Resolution::getTitle($new['resolution']);
     }
     if (isset($new['estimated_dev_time']) && $old['iss_dev_time'] != $new['estimated_dev_time']) {
         $diffs[] = '-' . ev_gettext('Estimated Dev. Time') . ': ' . Misc::getFormattedTime($old['iss_dev_time'] * 60);
         $diffs[] = '+' . ev_gettext('Estimated Dev. Time') . ': ' . Misc::getFormattedTime($new['estimated_dev_time'] * 60);
     }
     if (isset($new['summary']) && $old['iss_summary'] != $new['summary']) {
         $diffs[] = '-' . ev_gettext('Summary') . ': ' . $old['iss_summary'];
         $diffs[] = '+' . ev_gettext('Summary') . ': ' . $new['summary'];
     }
     if (isset($new['percent_complete']) && $old['iss_original_percent_complete'] != $new['percent_complete']) {
         $diffs[] = '-' . ev_gettext('Percent complete') . ': ' . $old['iss_original_percent_complete'];
         $diffs[] = '+' . ev_gettext('Percent complete') . ': ' . $new['percent_complete'];
     }
     if (isset($new['description']) && $old['iss_description'] != $new['description']) {
         $old['iss_description'] = explode("\n", $old['iss_original_description']);
         $new['description'] = explode("\n", $new['description']);
         $diff = new Text_Diff($old['iss_description'], $new['description']);
         $renderer = new Text_Diff_Renderer_unified();
         $desc_diff = explode("\n", trim($renderer->render($diff)));
         $diffs[] = 'Description:';
         foreach ($desc_diff as $diff) {
             $diffs[] = $diff;
         }
     }
     $data = Issue::getDetails($issue_id);
     $data['diffs'] = implode("\n", $diffs);
     $data['updated_by'] = User::getFullName(Auth::getUserID());
     $all_emails = array();
     $role_emails = array(User::ROLE_VIEWER => array(), User::ROLE_REPORTER => array(), User::ROLE_CUSTOMER => array(), User::ROLE_USER => array(), User::ROLE_DEVELOPER => array(), User::ROLE_MANAGER => array(), User::ROLE_ADMINISTRATOR => array());
     $users = self::getUsersByIssue($issue_id, 'updated');
     foreach ($users as $user) {
         if (empty($user['sub_usr_id'])) {
             $email = $user['sub_email'];
             // non users are treated as "Viewers" for permission checks
             $role = User::ROLE_VIEWER;
         } else {
             $prefs = Prefs::get($user['sub_usr_id']);
             if (Auth::getUserID() == $user['sub_usr_id'] && (empty($prefs['receive_copy_of_own_action'][$prj_id]) || $prefs['receive_copy_of_own_action'][$prj_id] == false)) {
                 continue;
             }
             $email = User::getFromHeader($user['sub_usr_id']);
             $role = $user['pru_role'];
         }
         // now add it to the list of emails
         if (!empty($email) && !in_array($email, $all_emails)) {
             $all_emails[] = $email;
             $role_emails[$role][] = $email;
         }
     }
     // get additional email addresses to notify
     $additional_emails = Workflow::getAdditionalEmailAddresses($prj_id, $issue_id, 'issue_updated', array('old' => $old, 'new' => $new));
     $data['custom_field_diffs'] = implode("\n", Custom_Field::formatUpdatesToDiffs($updated_custom_fields, User::ROLE_VIEWER));
     foreach ($additional_emails as $email) {
         if (!in_array($email, $all_emails)) {
             $role_emails[User::ROLE_VIEWER][] = $email;
         }
     }
     // send email to each role separately due to custom field restrictions
     foreach ($role_emails as $role => $emails) {
         if (count($emails) > 0) {
             $data['custom_field_diffs'] = implode("\n", Custom_Field::formatUpdatesToDiffs($updated_custom_fields, $role));
             if (!empty($data['custom_field_diffs']) || !empty($data['diffs'])) {
                 self::notifySubscribers($issue_id, $emails, 'updated', $data, ev_gettext('Updated'), false);
             }
         }
     }
 }