private function build_view($request)
 {
     $config = BugtrackerConfig::load();
     $versions = $config->get_versions();
     $display_versions = count($versions);
     $stats_cache = BugtrackerStatsCache::load();
     $bugs_number_per_version = $stats_cache->get_bugs_number_per_version_list();
     $top_posters = $stats_cache->get_top_posters_list();
     $this->view->put_all(array('C_BUGS' => $stats_cache->get_bugs_number('total'), 'C_FIXED_BUGS' => !empty($bugs_number_per_version), 'C_POSTERS' => !empty($top_posters), 'C_DISPLAY_VERSIONS' => $display_versions, 'C_DISPLAY_TOP_POSTERS' => $config->are_stats_top_posters_enabled(), 'C_ROADMAP_ENABLED' => $config->is_roadmap_enabled()));
     foreach ($stats_cache->get_bugs_number_list() as $status => $bugs_number) {
         if ($status != 'total') {
             $this->view->assign_block_vars('status', array('NAME' => $this->lang['status.' . $status], 'NUMBER' => $bugs_number));
         }
     }
     foreach ($bugs_number_per_version as $version_id => $bugs_number) {
         $release_date = !empty($versions[$version_id]['release_date']) && is_numeric($versions[$version_id]['release_date']) ? new Date($versions[$version_id]['release_date'], Timezone::SERVER_TIMEZONE) : null;
         $this->view->assign_block_vars('fixed_version', array('NAME' => stripslashes($versions[$version_id]['name']), 'RELEASE_DATE' => !empty($release_date) ? $release_date->format(Date::FORMAT_DAY_MONTH_YEAR) : $this->lang['notice.not_defined_e_date'], 'LINK_VERSION_ROADMAP' => BugtrackerUrlBuilder::roadmap($version_id, Url::encode_rewrite($versions[$version_id]['name']))->rel(), 'NUMBER' => $bugs_number['all']));
     }
     foreach ($top_posters as $id => $poster) {
         if (isset($poster['user'])) {
             $author_group_color = User::get_group_color($poster['user']->get_groups(), $poster['user']->get_level(), true);
             $this->view->assign_block_vars('top_poster', array('C_AUTHOR_GROUP_COLOR' => !empty($author_group_color), 'ID' => $id, 'AUTHOR' => $poster['user']->get_display_name(), 'AUTHOR_LEVEL_CLASS' => UserService::get_level_class($poster['user']->get_level()), 'AUTHOR_GROUP_COLOR' => $author_group_color, 'LINK_AUTHOR_PROFILE' => UserUrlBuilder::profile($poster['user']->get_id())->rel(), 'USER_BUGS' => $poster['bugs_number']));
         }
     }
     return $this->view;
 }
 private function save()
 {
     $request = AppContext::get_request();
     $types = $this->config->get_types();
     $categories = $this->config->get_categories();
     $severities = $this->config->get_severities();
     $priorities = $this->config->get_priorities();
     $versions = $this->config->get_versions();
     foreach ($types as $key => $type) {
         $new_type_name = $request->get_value('type' . $key, '');
         $types[$key] = !empty($new_type_name) && $new_type_name != $type ? $new_type_name : $type;
     }
     $nb_types = count($types);
     for ($i = 1; $i <= $this->max_input; $i++) {
         $type = 'type_' . $i;
         if ($request->has_postparameter($type) && $request->get_poststring($type)) {
             if (empty($nb_types)) {
                 $types[1] = addslashes($request->get_poststring($type));
             } else {
                 $types[] = addslashes($request->get_poststring($type));
             }
             $nb_types++;
         }
     }
     foreach ($categories as $key => $category) {
         $new_category_name = $request->get_value('category' . $key, '');
         $categories[$key] = !empty($new_category_name) && $new_category_name != $category ? $new_category_name : $category;
     }
     $nb_categories = count($categories);
     for ($i = 1; $i <= $this->max_input; $i++) {
         $category = 'category_' . $i;
         if ($request->has_postparameter($category) && $request->get_poststring($category)) {
             if (empty($nb_categories)) {
                 $categories[1] = addslashes($request->get_poststring($category));
             } else {
                 $categories[] = addslashes($request->get_poststring($category));
             }
             $nb_categories++;
         }
     }
     foreach ($severities as $key => $severity) {
         $new_severity_name = $request->get_value('severity' . $key, '');
         $new_severity_color = $request->get_value('color' . $key, '');
         $severities[$key]['name'] = !empty($new_severity_name) && $new_severity_name != $severity['name'] ? $new_severity_name : $severity['name'];
         $severities[$key]['color'] = $new_severity_color != $severity['color'] ? $new_severity_color : $severity['color'];
     }
     foreach ($priorities as $key => $priority) {
         $new_priority_name = $request->get_value('priority' . $key, '');
         $priorities[$key] = !empty($new_priority_name) && $new_priority_name != $priority ? $new_priority_name : $priority;
     }
     foreach ($versions as $key => $version) {
         $new_version_name = $request->get_value('version' . $key, '');
         $new_version_release_date = $request->get_value('release_date' . $key, '');
         $new_version_detected_in = (bool) $request->get_value('detected_in' . $key, '');
         $versions[$key]['name'] = !empty($new_version_name) && $new_version_name != $version['name'] ? $new_version_name : $version['name'];
         $release_date = $new_version_release_date ? new Date($new_version_release_date) : '';
         $versions[$key]['release_date'] = $release_date ? $release_date->get_timestamp() : '';
         $versions[$key]['detected_in'] = $new_version_detected_in != $version['detected_in'] ? $new_version_detected_in : $version['detected_in'];
     }
     $nb_versions = count($versions);
     for ($i = 1; $i <= $this->max_input; $i++) {
         $version = 'version_' . $i;
         if ($request->has_postparameter($version) && $request->get_poststring($version)) {
             $version_release_date = $request->get_value('release_date_' . $i, '');
             $release_date = $version_release_date ? new Date($version_release_date) : '';
             $release_date = $release_date ? $release_date->get_timestamp() : '';
             if (empty($nb_versions)) {
                 $versions[1] = array('name' => addslashes($request->get_poststring($version)), 'release_date' => $release_date, 'detected_in' => (bool) $request->get_value('detected_in' . $i, ''));
             } else {
                 $versions[] = array('name' => addslashes($request->get_poststring($version)), 'release_date' => $release_date, 'detected_in' => (bool) $request->get_value('detected_in' . $i, ''));
             }
             $nb_versions++;
         }
     }
     $this->config->set_items_per_page($this->form->get_value('items_per_page'));
     $this->config->set_rejected_bug_color($this->form->get_value('rejected_bug_color'));
     $this->config->set_fixed_bug_color($this->form->get_value('fixed_bug_color'));
     if ($this->form->get_value('roadmap_enabled')) {
         $this->config->enable_roadmap();
     } else {
         $this->config->disable_roadmap();
     }
     if ($this->form->get_value('progress_bar_displayed')) {
         $this->config->display_progress_bar();
         $status_list = array();
         foreach ($this->config->get_status_list() as $key => $value) {
             $status_list[$key] = $this->form->get_value($key);
         }
         $this->config->set_status_list($status_list);
     } else {
         $this->config->hide_progress_bar();
     }
     if ($this->form->get_value('admin_alerts_enabled')) {
         $this->config->enable_admin_alerts();
         $this->config->set_admin_alerts_fix_action($this->form->get_value('admin_alerts_fix_action')->get_raw_value());
         $admin_alerts_levels = array();
         foreach ($this->form->get_value('admin_alerts_levels') as $level => $value) {
             $admin_alerts_levels[] = (string) $value->get_id();
         }
         $this->config->set_admin_alerts_levels($admin_alerts_levels);
     } else {
         $this->config->disable_admin_alerts();
     }
     if ($this->form->get_value('stats_enabled')) {
         $this->config->enable_stats();
         if ($this->form->get_value('stats_top_posters_enabled')) {
             $this->config->enable_stats_top_posters();
             $this->config->set_stats_top_posters_number($this->form->get_value('stats_top_posters_number'));
         } else {
             $this->config->disable_stats_top_posters();
         }
     } else {
         $this->config->disable_stats();
     }
     if ($this->form->get_value('pm_enabled')) {
         $this->config->enable_pm();
         if ($this->form->get_value('pm_comment_enabled')) {
             $this->config->enable_pm_comment();
         } else {
             $this->config->disable_pm_comment();
         }
         if ($this->form->get_value('pm_in_progress_enabled')) {
             $this->config->enable_pm_in_progress();
         } else {
             $this->config->disable_pm_in_progress();
         }
         if ($this->form->get_value('pm_fix_enabled')) {
             $this->config->enable_pm_fix();
         } else {
             $this->config->disable_pm_fix();
         }
         if ($this->form->get_value('pm_pending_enabled')) {
             $this->config->enable_pm_pending();
         } else {
             $this->config->disable_pm_pending();
         }
         if ($this->form->get_value('pm_assign_enabled')) {
             $this->config->enable_pm_assign();
         } else {
             $this->config->disable_pm_assign();
         }
         if ($this->form->get_value('pm_edit_enabled')) {
             $this->config->enable_pm_edit();
         } else {
             $this->config->disable_pm_edit();
         }
         if ($this->form->get_value('pm_reject_enabled')) {
             $this->config->enable_pm_reject();
         } else {
             $this->config->disable_pm_reject();
         }
         if ($this->form->get_value('pm_reopen_enabled')) {
             $this->config->enable_pm_reopen();
         } else {
             $this->config->disable_pm_reopen();
         }
         if ($this->form->get_value('pm_delete_enabled')) {
             $this->config->enable_pm_delete();
         } else {
             $this->config->disable_pm_delete();
         }
     } else {
         $this->config->disable_pm();
     }
     $this->config->set_contents_value($this->form->get_value('contents_value'));
     if ($this->form->get_value('type_mandatory')) {
         $this->config->type_mandatory();
     } else {
         $this->config->type_not_mandatory();
     }
     if ($this->form->get_value('display_type_column')) {
         $this->config->display_type_column();
     } else {
         $this->config->hide_type_column();
     }
     $this->config->set_types($types);
     $this->config->set_default_type($request->get_value('default_type', 0));
     if ($this->form->get_value('category_mandatory')) {
         $this->config->category_mandatory();
     } else {
         $this->config->category_not_mandatory();
     }
     if ($this->form->get_value('display_category_column')) {
         $this->config->display_category_column();
     } else {
         $this->config->hide_category_column();
     }
     $this->config->set_categories($categories);
     $this->config->set_default_category($request->get_value('default_category', 0));
     if ($this->form->get_value('severity_mandatory')) {
         $this->config->severity_mandatory();
     } else {
         $this->config->severity_not_mandatory();
     }
     $this->config->set_severities($severities);
     $this->config->set_default_severity($request->get_value('default_severity', 0));
     if ($this->form->get_value('priority_mandatory')) {
         $this->config->priority_mandatory();
     } else {
         $this->config->priority_not_mandatory();
     }
     if ($this->form->get_value('display_priority_column')) {
         $this->config->display_priority_column();
     } else {
         $this->config->hide_priority_column();
     }
     $this->config->set_priorities($priorities);
     $this->config->set_default_priority($request->get_value('default_priority', 0));
     if ($this->form->get_value('detected_in_version_mandatory')) {
         $this->config->detected_in_version_mandatory();
     } else {
         $this->config->detected_in_version_not_mandatory();
     }
     if ($this->form->get_value('display_detected_in_column')) {
         $this->config->display_detected_in_column();
     } else {
         $this->config->hide_detected_in_column();
     }
     $this->config->set_versions($versions);
     $this->config->set_default_version($request->get_value('default_version', 0));
     BugtrackerConfig::save();
     BugtrackerStatsCache::invalidate();
 }
 private function save()
 {
     $now = new Date();
     $pm_recipients_list = array();
     $send_pm = true;
     $versions = array_reverse($this->config->get_versions_fix(), true);
     $status = $this->form->get_value('status')->get_raw_value();
     if (count($versions)) {
         if (!$this->form->field_is_disabled('fixed_in')) {
             $fixed_in = $this->form->get_value('fixed_in')->get_raw_value() ? $this->form->get_value('fixed_in')->get_raw_value() : 0;
             if ($fixed_in != $this->bug->get_fixed_in()) {
                 //Bug history update
                 BugtrackerService::add_history(array('bug_id' => $this->bug->get_id(), 'updater_id' => $this->current_user->get_id(), 'update_date' => $now->get_timestamp(), 'updated_field' => 'fixed_in', 'old_value' => $this->bug->get_fixed_in(), 'new_value' => $fixed_in));
                 $this->bug->set_fixed_in($fixed_in);
             }
         } else {
             if (in_array($status, array(Bug::NEW_BUG, Bug::REJECTED))) {
                 $this->bug->set_fixed_in(0);
             }
         }
     }
     if (!$this->form->field_is_disabled('assigned_to')) {
         $assigned_to = $this->form->get_value('assigned_to');
         $assigned_to_id = UserService::user_exists("WHERE display_name = :display_name", array('display_name' => $assigned_to));
         if ($this->bug->get_assigned_to_id()) {
             $old_user_assigned_id = UserService::user_exists("WHERE user_id = :user_id", array('user_id' => $this->bug->get_assigned_to_id()));
             $old_user_assigned = !empty($old_user_assigned_id) ? UserService::get_user($old_user_assigned_id) : 0;
         } else {
             $old_user_assigned = 0;
         }
         $new_user_assigned = !empty($assigned_to) && !empty($assigned_to_id) ? UserService::get_user($assigned_to_id) : 0;
         $new_assigned_to_id = !empty($new_user_assigned) ? $new_user_assigned->get_id() : 0;
         if ($new_assigned_to_id != $this->bug->get_assigned_to_id()) {
             //Bug history update
             BugtrackerService::add_history(array('bug_id' => $this->bug->get_id(), 'updater_id' => $this->current_user->get_id(), 'update_date' => $now->get_timestamp(), 'updated_field' => 'assigned_to_id', 'old_value' => $old_user_assigned ? $old_user_assigned->get_display_name() : $this->lang['notice.no_one'], 'new_value' => $new_user_assigned ? $new_user_assigned->get_display_name() : $this->lang['notice.no_one']));
             //Bug update
             $this->bug->set_assigned_to_id($new_assigned_to_id);
             //The PM will only be sent to the assigned user
             if ($new_assigned_to_id != $this->current_user->get_id()) {
                 $pm_recipients_list[] = $new_assigned_to_id;
             } else {
                 $send_pm = false;
             }
         }
     }
     if ($status != $this->bug->get_status()) {
         //Bug history update
         BugtrackerService::add_history(array('bug_id' => $this->bug->get_id(), 'updater_id' => $this->current_user->get_id(), 'update_date' => $now->get_timestamp(), 'updated_field' => 'status', 'old_value' => $this->bug->get_status(), 'new_value' => $status));
         //Bug update
         $this->bug->set_status($status);
         if ($this->bug->is_fixed() || $this->bug->is_rejected()) {
             $this->bug->set_fix_date($now);
         } else {
             $this->bug->set_fix_date(0);
         }
     }
     BugtrackerService::update($this->bug);
     Feed::clear_cache('bugtracker');
     switch ($status) {
         case Bug::IN_PROGRESS:
             $is_pm_enabled = $this->config->are_pm_in_progress_enabled();
             break;
         case Bug::PENDING:
             $is_pm_enabled = $this->config->are_pm_pending_enabled();
             break;
         case Bug::ASSIGNED:
             $is_pm_enabled = $this->config->are_pm_assign_enabled();
             break;
         case Bug::FIXED:
             $is_pm_enabled = $this->config->are_pm_fix_enabled();
             break;
         case Bug::REOPEN:
             $is_pm_enabled = $this->config->are_pm_reopen_enabled();
             break;
         case Bug::REJECTED:
             $is_pm_enabled = $this->config->are_pm_reject_enabled();
             break;
         default:
             $is_pm_enabled = false;
             break;
     }
     //Add comment if needed
     $comment = $this->form->get_value('comments_message', '');
     if (!empty($comment)) {
         $comments_topic = new BugtrackerCommentsTopic();
         $comments_topic->set_id_in_module($this->bug->get_id());
         $comments_topic->set_url(BugtrackerUrlBuilder::detail($this->bug->get_id() . '-' . $this->bug->get_rewrited_title()));
         CommentsManager::add_comment($comments_topic->get_module_id(), $comments_topic->get_id_in_module(), $comments_topic->get_topic_identifier(), $comments_topic->get_path(), $comment);
         //New line in the bug history
         BugtrackerService::add_history(array('bug_id' => $this->bug->get_id(), 'updater_id' => $this->current_user->get_id(), 'update_date' => $now->get_timestamp(), 'change_comment' => $this->lang['notice.new_comment']));
     }
     //Send PM with comment to updaters if the option is enabled
     if (!$this->bug->is_new() && $this->config->are_pm_enabled() && $is_pm_enabled && $send_pm) {
         BugtrackerPMService::send_PM_to_updaters($status, $this->bug->get_id(), $comment, $pm_recipients_list);
     }
     if (in_array($status, array(Bug::NEW_BUG, Bug::REOPEN, Bug::REJECTED, Bug::FIXED)) && $this->config->are_admin_alerts_enabled() && in_array($this->bug->get_severity(), $this->config->get_admin_alerts_levels())) {
         $alerts = AdministratorAlertService::find_by_criteria($this->bug->get_id(), 'bugtracker');
         if (!empty($alerts)) {
             $alert = $alerts[0];
             if ($this->bug->is_new() || $this->bug->is_reopen()) {
                 $alert->set_status(AdministratorAlert::ADMIN_ALERT_STATUS_UNREAD);
                 AdministratorAlertService::save_alert($alert);
             } else {
                 if ($this->config->is_admin_alerts_fix_action_fix()) {
                     $alert->set_status(AdministratorAlert::ADMIN_ALERT_STATUS_PROCESSED);
                     AdministratorAlertService::save_alert($alert);
                 } else {
                     AdministratorAlertService::delete_alert($alert);
                 }
             }
         }
     }
     BugtrackerStatsCache::invalidate();
 }
 private function move_into_another($new_id)
 {
     switch ($this->parameter) {
         case 'type':
             //Update the type for the bugs of this type
             BugtrackerService::update_parameter(array('type' => $new_id), 'WHERE type=:id', array('id' => $this->id));
             if (empty($new_id)) {
                 //Delete history lines containing this type
                 BugtrackerService::delete_history("WHERE updated_field='type' AND (old_value=:id OR new_value=:id)", array('id' => $this->id));
             } else {
                 //Update history lines containing this type
                 BugtrackerService::update_history(array('old_value' => $new_id), "WHERE updated_field='type' AND old_value=:id", array('id' => $this->id));
                 BugtrackerService::update_history(array('new_value' => $new_id), "WHERE updated_field='type' AND new_value=:id", array('id' => $this->id));
             }
             break;
         case 'category':
             //Update the category for the bugs of this category
             BugtrackerService::update_parameter(array('category' => $new_id), 'WHERE category=:id', array('id' => $this->id));
             if (empty($new_id)) {
                 //Delete history lines containing this type
                 BugtrackerService::delete_history("WHERE updated_field='category' AND (old_value=:id OR new_value=:id)", array('id' => $this->id));
             } else {
                 //Update history lines containing this category
                 BugtrackerService::update_history(array('old_value' => $new_id), "WHERE updated_field='category' AND old_value=:id", array('id' => $this->id));
                 BugtrackerService::update_history(array('new_value' => $new_id), "WHERE updated_field='category' AND new_value=:id", array('id' => $this->id));
             }
             break;
         case 'version':
             //Update the version for the bugs of this version
             BugtrackerService::update_parameter(array('detected_in' => $new_id), 'WHERE detected_in=:id', array('id' => $this->id));
             BugtrackerService::update_parameter(array('fixed_in' => $new_id), 'WHERE fixed_in=:id', array('id' => $this->id));
             if (empty($new_id)) {
                 //Delete history lines containing this type
                 BugtrackerService::delete_history("WHERE updated_field='detected_in' OR updated_field='fixed_in' AND (old_value=:id OR new_value=:id)", array('id' => $this->id));
             } else {
                 //Update history lines containing this version
                 BugtrackerService::update_history(array('old_value' => $new_id), "WHERE updated_field='detected_in' AND old_value=:id", array('id' => $this->id));
                 BugtrackerService::update_history(array('new_value' => $new_id), "WHERE updated_field='detected_in' AND new_value=:id", array('id' => $this->id));
                 BugtrackerService::update_history(array('old_value' => $new_id), "WHERE updated_field='fixed_in' AND old_value=:id", array('id' => $this->id));
                 BugtrackerService::update_history(array('new_value' => $new_id), "WHERE updated_field='fixed_in' AND new_value=:id", array('id' => $this->id));
             }
             BugtrackerStatsCache::invalidate();
             break;
     }
 }
    private function save()
    {
        $bug = $this->get_bug();
        if ($bug->get_id() === null) {
            $title = $this->form->get_value('title');
            $bug->set_title($title);
            $bug->set_rewrited_title(Url::encode_rewrite($title));
            $bug->set_contents($this->form->get_value('contents'));
            $bug->set_type($this->form->get_value('type') ? $this->form->get_value('type')->get_raw_value() : $this->config->get_default_type());
            $bug->set_category($this->form->get_value('category') ? $this->form->get_value('category')->get_raw_value() : $this->config->get_default_category());
            $bug->set_severity($this->form->get_value('severity') ? $this->form->get_value('severity')->get_raw_value() : $this->config->get_default_severity());
            $bug->set_priority($this->form->get_value('priority') ? $this->form->get_value('priority')->get_raw_value() : $this->config->get_default_priority());
            $bug->set_detected_in($this->form->get_value('detected_in') ? $this->form->get_value('detected_in')->get_raw_value() : $this->config->get_default_version());
            $bug->set_reproductible($this->form->get_value('reproductible') ? true : 0);
            if ($bug->is_reproductible()) {
                $bug->set_reproduction_method($this->form->get_value('reproduction_method'));
            }
            //Bug creation
            $bug->set_id(BugtrackerService::add($bug));
            if ($this->config->are_admin_alerts_enabled() && in_array($bug->get_severity(), $this->config->get_admin_alerts_levels())) {
                $alert = new AdministratorAlert();
                $alert->set_entitled('[' . $this->lang['module_title'] . '] ' . $bug->get_title());
                $alert->set_fixing_url(BugtrackerUrlBuilder::detail($bug->get_id() . '-' . $bug->get_rewrited_title())->relative());
                switch ($bug->get_priority()) {
                    case 1:
                        switch ($bug->get_severity()) {
                            case 1:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_VERY_LOW_PRIORITY;
                                break;
                            case 2:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_LOW_PRIORITY;
                                break;
                            default:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_MEDIUM_PRIORITY;
                                break;
                        }
                        break;
                    case 2:
                        switch ($bug->get_severity()) {
                            case 1:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_LOW_PRIORITY;
                                break;
                            default:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_MEDIUM_PRIORITY;
                                break;
                        }
                        break;
                    case 3:
                        switch ($bug->get_severity()) {
                            case 1:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_LOW_PRIORITY;
                                break;
                            case 2:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_MEDIUM_PRIORITY;
                                break;
                            case 3:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_HIGH_PRIORITY;
                                break;
                            default:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_MEDIUM_PRIORITY;
                                break;
                        }
                        break;
                    case 4:
                        switch ($bug->get_severity()) {
                            case 2:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_MEDIUM_PRIORITY;
                                break;
                            case 3:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_HIGH_PRIORITY;
                                break;
                            default:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_LOW_PRIORITY;
                                break;
                        }
                        break;
                    case 5:
                        switch ($bug->get_severity()) {
                            case 2:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_HIGH_PRIORITY;
                                break;
                            case 3:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_VERY_HIGH_PRIORITY;
                                break;
                            default:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_MEDIUM_PRIORITY;
                                break;
                        }
                        break;
                    default:
                        switch ($bug->get_severity()) {
                            case 1:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_LOW_PRIORITY;
                                break;
                            case 2:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_MEDIUM_PRIORITY;
                                break;
                            case 3:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_HIGH_PRIORITY;
                                break;
                            default:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_MEDIUM_PRIORITY;
                                break;
                        }
                        break;
                }
                $alert->set_priority($alert_priority);
                $alert->set_id_in_module($bug->get_id());
                $alert->set_type('bugtracker');
                AdministratorAlertService::save_alert($alert);
            }
        } else {
            $old_values = clone $bug;
            $now = new Date();
            $types = $this->config->get_types();
            $categories = $this->config->get_categories();
            $severities = $this->config->get_severities();
            $priorities = $this->config->get_priorities();
            $versions = $this->config->get_versions();
            $display_versions = count($versions) > 1;
            $status_list = $this->config->get_status_list();
            $common_lang = LangLoader::get('common');
            $title = $this->form->get_value('title', $old_values->get_title());
            $bug->set_title($title);
            $bug->set_rewrited_title(Url::encode_rewrite($title));
            $bug->set_contents($this->form->get_value('contents', $old_values->get_contents()));
            $bug->set_type($this->form->get_value('type') ? $this->form->get_value('type')->get_raw_value() : $old_values->get_type());
            $bug->set_category($this->form->get_value('category') ? $this->form->get_value('category')->get_raw_value() : $old_values->get_category());
            $bug->set_severity($this->form->get_value('severity') ? $this->form->get_value('severity')->get_raw_value() : $old_values->get_severity());
            $bug->set_priority($this->form->get_value('priority') ? $this->form->get_value('priority')->get_raw_value() : $old_values->get_priority());
            $bug->set_detected_in($this->form->get_value('detected_in') ? $this->form->get_value('detected_in')->get_raw_value() : $old_values->get_detected_in());
            $bug->set_reproductible($this->form->get_value('reproductible') ? true : 0);
            if ($bug->is_reproductible()) {
                $bug->set_reproduction_method($this->form->get_value('reproduction_method', $old_values->get_reproduction_method()));
            }
            $pm_comment = '';
            $modification = false;
            $fields = array('title', 'contents', 'type', 'category', 'severity', 'priority', 'detected_in', 'reproductible', 'reproduction_method');
            $n_values = $bug->get_properties();
            $o_values = $old_values->get_properties();
            foreach ($fields as $field) {
                if ($o_values[$field] != $n_values[$field]) {
                    $modification = true;
                    $comment = '';
                    switch ($field) {
                        case 'title':
                            $new_value = stripslashes($n_values[$field]);
                            $o_values[$field] = addslashes($o_values[$field]);
                            $comment = '';
                            break;
                        case 'contents':
                            $o_values[$field] = '';
                            $n_values[$field] = '';
                            $comment = $this->lang['notice.contents_update'];
                            break;
                        case 'reproduction_method':
                            $o_values[$field] = '';
                            $n_values[$field] = '';
                            $comment = $this->lang['notice.reproduction_method_update'];
                            break;
                        case 'type':
                            $new_value = !empty($n_values[$field]) ? stripslashes($types[$n_values[$field]]) : $this->lang['notice.none'];
                            break;
                        case 'category':
                            $new_value = !empty($n_values[$field]) ? stripslashes($categories[$n_values[$field]]) : $this->lang['notice.none_e'];
                            break;
                        case 'priority':
                            $new_value = !empty($n_values[$field]) ? stripslashes($priorities[$n_values[$field]]) : $this->lang['notice.none_e'];
                            break;
                        case 'severity':
                            $new_value = !empty($n_values[$field]) ? stripslashes($severities[$n_values[$field]]['name']) : $this->lang['notice.none'];
                            break;
                        case 'detected_in':
                            $new_value = !empty($n_values[$field]) ? stripslashes($versions[$n_values[$field]]['name']) : $this->lang['notice.none_e'];
                            break;
                        case 'status':
                            $new_value = $this->lang['status.' . $n_values[$field]];
                            break;
                        case 'reproductible':
                            $new_value = $n_values[$field] ? $common_lang['yes'] : $common_lang['no'];
                            break;
                        default:
                            $new_value = $n_values[$field];
                            $comment = '';
                    }
                    $pm_comment .= $field != 'contents' && $field != 'reproduction_method' ? $this->lang['labels.fields.' . $field] . ' : ' . stripslashes($new_value) . '
	' : '';
                    //Bug history update
                    BugtrackerService::add_history(array('bug_id' => $bug->get_id(), 'updater_id' => $this->current_user->get_id(), 'update_date' => $now->get_timestamp(), 'updated_field' => $field, 'old_value' => $o_values[$field], 'new_value' => $n_values[$field], 'change_comment' => $comment));
                }
            }
            if ($modification) {
                //Bug update
                BugtrackerService::update($bug);
                //Send PM to updaters if the option is enabled
                if ($this->config->are_pm_enabled() && $this->config->are_pm_edit_enabled() && !empty($pm_comment)) {
                    BugtrackerPMService::send_PM_to_updaters('edit', $bug->get_id(), $pm_comment);
                }
            }
        }
        Feed::clear_cache('bugtracker');
        BugtrackerStatsCache::invalidate();
        AppContext::get_response()->redirect($this->form->get_value('referrer') ? $this->form->get_value('referrer') : BugtrackerUrlBuilder::unsolved(), StringVars::replace_vars($this->is_new_bug ? $this->lang['success.add'] : $this->lang['success.edit'], array('id' => $bug->get_id())));
    }
 private function build_view($request)
 {
     //Configuration load
     $config = BugtrackerConfig::load();
     $severities = $config->get_severities();
     $field = $request->get_value('field', 'date');
     $sort = $request->get_value('sort', 'desc');
     $current_page = $request->get_getint('page', 1);
     $filter = $request->get_value('filter', '');
     $filter_id = $request->get_value('filter_id', '');
     if (!empty($filter) && empty($filter_id)) {
         $filter = $filter_id = '';
     }
     $filters = !empty($filter) ? explode('-', $filter) : array();
     $nb_filters = count($filters);
     $filters_ids = !empty($filter_id) ? explode('-', $filter_id) : array();
     $nb_filters_ids = count($filters_ids);
     if ($nb_filters != $nb_filters_ids) {
         for ($i = $nb_filters_ids; $i < $nb_filters; $i++) {
             $filters_ids[] = 0;
         }
     }
     $mode = $sort == 'top' ? 'ASC' : 'DESC';
     switch ($field) {
         case 'id':
             $field_bdd = 'id';
             break;
         case 'title':
             $field_bdd = 'title';
             break;
         case 'status':
             $field_bdd = 'status';
             break;
         default:
             $field_bdd = 'submit_date';
             break;
     }
     $select_filters = '';
     foreach ($filters as $key => $f) {
         $select_filters .= in_array($f, array('type', 'category', 'severity', 'status', 'detected_in')) && $filters_ids[$key] ? "AND " . $f . " = '" . $filters_ids[$key] . "'" : '';
     }
     $stats_cache = BugtrackerStatsCache::load();
     $bugs_number = BugtrackerService::count("WHERE status <> '" . Bug::FIXED . "' AND status <> '" . Bug::REJECTED . "'" . $select_filters);
     $pagination = $this->get_pagination($bugs_number, $current_page, $field, $sort, $filter, $filter_id);
     $result = PersistenceContext::get_querier()->select("SELECT b.*, member.*\n\t\tFROM " . BugtrackerSetup::$bugtracker_table . " b\n\t\tLEFT JOIN " . DB_TABLE_MEMBER . " member ON member.user_id = b.author_id\n\t\tWHERE status <> '" . Bug::FIXED . "' AND status <> '" . Bug::REJECTED . "'" . $select_filters . "\n\t\tORDER BY " . $field_bdd . " " . $mode . "\n\t\tLIMIT :number_items_per_page OFFSET :display_from", array('number_items_per_page' => $pagination->get_number_items_per_page(), 'display_from' => $pagination->get_display_from()));
     $displayed_severities = array();
     while ($row = $result->fetch()) {
         $bug = new Bug();
         $bug->set_properties($row);
         if (!in_array($bug->get_severity(), $displayed_severities)) {
             $displayed_severities[] = $bug->get_severity();
         }
         $this->view->assign_block_vars('bug', array_merge($bug->get_array_tpl_vars(), array('C_LINE_COLOR' => $bug->get_severity() && isset($severities[$bug->get_severity()]), 'LINE_COLOR' => stripslashes($severities[$bug->get_severity()]['color']), 'U_CHANGE_STATUS' => BugtrackerUrlBuilder::change_status($bug->get_id())->rel(), 'U_EDIT' => BugtrackerUrlBuilder::edit($bug->get_id(), 'unsolved', $current_page, $filter, $filter_id)->rel(), 'U_DELETE' => BugtrackerUrlBuilder::delete($bug->get_id(), 'unsolved', $current_page, $filter, $filter_id)->rel())));
     }
     $result->dispose();
     $bugs_colspan = BugtrackerAuthorizationsService::check_authorizations()->moderation() ? 5 : 4;
     if ($config->is_type_column_displayed()) {
         $bugs_colspan++;
     }
     if ($config->is_category_column_displayed()) {
         $bugs_colspan++;
     }
     if ($config->is_priority_column_displayed()) {
         $bugs_colspan++;
     }
     if ($config->is_detected_in_column_displayed()) {
         $bugs_colspan++;
     }
     $this->view->put_all(array('C_IS_ADMIN' => BugtrackerAuthorizationsService::check_authorizations()->moderation(), 'C_UNSOLVED' => true, 'C_BUGS' => $result->get_rows_count() > 0, 'C_DISPLAY_AUTHOR' => true, 'C_DISPLAY_TYPE_COLUMN' => $config->is_type_column_displayed(), 'C_DISPLAY_CATEGORY_COLUMN' => $config->is_category_column_displayed(), 'C_DISPLAY_PRIORITY_COLUMN' => $config->is_priority_column_displayed(), 'C_DISPLAY_DETECTED_IN_COLUMN' => $config->is_detected_in_column_displayed(), 'C_PAGINATION' => $pagination->has_several_pages(), 'PAGINATION' => $pagination->display(), 'BUGS_COLSPAN' => $bugs_colspan, 'L_NO_BUG' => empty($filters) ? $this->lang['notice.no_bug'] : (count($filters) > 1 ? $this->lang['notice.no_bug_matching_filters'] : $this->lang['notice.no_bug_matching_filter']), 'FILTER_LIST' => BugtrackerViews::build_filters('unsolved', $bugs_number), 'LEGEND' => BugtrackerViews::build_legend($displayed_severities, 'unsolved'), 'LINK_BUG_ID_TOP' => BugtrackerUrlBuilder::unsolved('id', 'top', $current_page, $filter, $filter_id)->rel(), 'LINK_BUG_ID_BOTTOM' => BugtrackerUrlBuilder::unsolved('id', 'bottom', $current_page, $filter, $filter_id)->rel(), 'LINK_BUG_TITLE_TOP' => BugtrackerUrlBuilder::unsolved('title', 'top', $current_page, $filter, $filter_id)->rel(), 'LINK_BUG_TITLE_BOTTOM' => BugtrackerUrlBuilder::unsolved('title', 'bottom', $current_page, $filter, $filter_id)->rel(), 'LINK_BUG_STATUS_TOP' => BugtrackerUrlBuilder::unsolved('status', 'top', $current_page, $filter, $filter_id)->rel(), 'LINK_BUG_STATUS_BOTTOM' => BugtrackerUrlBuilder::unsolved('status', 'bottom', $current_page, $filter, $filter_id)->rel(), 'LINK_BUG_DATE_TOP' => BugtrackerUrlBuilder::unsolved('date', 'top', $current_page, $filter, $filter_id)->rel(), 'LINK_BUG_DATE_BOTTOM' => BugtrackerUrlBuilder::unsolved('date', 'bottom', $current_page, $filter, $filter_id)->rel()));
     return $this->view;
 }
 private function save()
 {
     $now = new Date();
     $current_user = AppContext::get_current_user();
     if ($this->config->are_pm_enabled() && $this->config->are_pm_delete_enabled()) {
         //Add comment if needed
         $comment = !$this->form->field_is_disabled('comments_message') ? $this->form->get_value('comments_message', '') : '';
         //Send PM with comment to updaters if the option is enabled
         BugtrackerPMService::send_PM_to_updaters('delete', $this->bug->get_id(), $comment);
     }
     //Delete bug
     BugtrackerService::delete("WHERE id=:id", array('id' => $this->bug->get_id()));
     //Delete bug history
     BugtrackerService::delete_history("WHERE bug_id=:id", array('id' => $this->bug->get_id()));
     //Delete comments
     CommentsService::delete_comments_topic_module('bugtracker', $this->bug->get_id());
     //Delete admin alert
     if ($this->config->are_admin_alerts_enabled()) {
         $alerts = AdministratorAlertService::find_by_criteria($this->bug->get_id(), 'bugtracker');
         if (!empty($alerts)) {
             AdministratorAlertService::delete_alert($alerts[0]);
         }
     }
     BugtrackerStatsCache::invalidate();
     Feed::clear_cache('bugtracker');
 }
 private function build_view($request)
 {
     $severities = $this->config->get_severities();
     $versions = array_reverse($this->config->get_versions(), true);
     if (!empty($versions)) {
         $roadmap_version = $request->get_int('id_version', 0);
         $roadmap_version_name = $request->get_value('version', '');
         $roadmap_status = $request->get_value('status', 'all');
         if ($roadmap_status !== 'all' && $roadmap_status !== Bug::FIXED && $roadmap_status !== Bug::IN_PROGRESS) {
             $error_controller = PHPBoostErrors::unexisting_page();
             DispatchManager::redirect($error_controller);
         }
         if (empty($roadmap_version) && empty($roadmap_version_name)) {
             $roadmap_version = key($versions);
             $roadmap_version_name = Url::encode_rewrite($versions[key($versions)]['name']);
         } else {
             if (!isset($versions[$roadmap_version])) {
                 $error_controller = PHPBoostErrors::unexisting_page();
                 DispatchManager::redirect($error_controller);
             }
         }
         $field = $request->get_value('field', BugtrackerUrlBuilder::DEFAULT_SORT_FIELD);
         $sort = $request->get_value('sort', BugtrackerUrlBuilder::DEFAULT_SORT_MODE);
         $current_page = $request->get_int('page', 1);
         $mode = $sort == 'top' ? 'ASC' : 'DESC';
         switch ($field) {
             case 'id':
                 $field_bdd = 'id';
                 break;
             case 'title':
                 $field_bdd = 'title';
                 break;
             case 'severity':
                 $field_bdd = 'severity';
                 break;
             case 'status':
                 $field_bdd = 'status';
                 break;
             default:
                 $field_bdd = 'fix_date';
                 break;
         }
         $stats_cache = BugtrackerStatsCache::load();
         $bugs_number = $stats_cache->get_bugs_number_per_version($roadmap_version);
         $pagination = $this->get_pagination($bugs_number[$roadmap_status], $current_page, $roadmap_version, $roadmap_version_name, $roadmap_status, $field, $sort);
         $result = PersistenceContext::get_querier()->select("SELECT b.*, member.*\n\t\t\tFROM " . BugtrackerSetup::$bugtracker_table . " b\n\t\t\tLEFT JOIN " . DB_TABLE_MEMBER . " member ON member.user_id = b.author_id\n\t\t\tWHERE fixed_in = " . $roadmap_version . "\n\t\t\t" . ($roadmap_status != 'all' ? $roadmap_status == Bug::IN_PROGRESS ? "AND (b.status = '" . Bug::IN_PROGRESS . "' OR b.status = '" . Bug::REOPEN . "')" : "AND b.status = '" . Bug::FIXED . "'" : "") . "\n\t\t\tORDER BY " . $field_bdd . " " . $mode . "\n\t\t\tLIMIT :number_items_per_page OFFSET :display_from", array('number_items_per_page' => $pagination->get_number_items_per_page(), 'display_from' => $pagination->get_display_from()));
         $displayed_severities = array();
         while ($row = $result->fetch()) {
             $bug = new Bug();
             $bug->set_properties($row);
             if (!in_array($bug->get_severity(), $displayed_severities)) {
                 $displayed_severities[] = $bug->get_severity();
             }
             $this->view->assign_block_vars('bug', array_merge($bug->get_array_tpl_vars(), array('C_LINE_COLOR' => !empty($row['severity']) && isset($severities[$row['severity']]), 'LINE_COLOR' => stripslashes($severities[$row['severity']]['color']))));
         }
         $result->dispose();
         $bugs_colspan = 4;
         if ($this->config->is_type_column_displayed()) {
             $bugs_colspan++;
         }
         if ($this->config->is_category_column_displayed()) {
             $bugs_colspan++;
         }
         if ($this->config->is_priority_column_displayed()) {
             $bugs_colspan++;
         }
         if ($this->config->is_detected_in_column_displayed()) {
             $bugs_colspan++;
         }
         $this->view->put_all(array('C_VERSIONS_AVAILABLE' => true, 'C_BUGS' => $bugs_number[$roadmap_status], 'C_STATUS_IN_PROGRESS' => $roadmap_status == Bug::IN_PROGRESS, 'C_DISPLAY_TYPE_COLUMN' => $this->config->is_type_column_displayed(), 'C_DISPLAY_CATEGORY_COLUMN' => $this->config->is_category_column_displayed(), 'C_DISPLAY_PRIORITY_COLUMN' => $this->config->is_priority_column_displayed(), 'C_DISPLAY_DETECTED_IN_COLUMN' => $this->config->is_detected_in_column_displayed(), 'C_PAGINATION' => $pagination->has_several_pages(), 'PAGINATION' => $pagination->display(), 'BUGS_COLSPAN' => $bugs_colspan, 'SELECT_VERSION' => $this->build_form(isset($versions[$roadmap_version]) ? $roadmap_version : 0, isset($versions[$roadmap_version]) ? Url::encode_rewrite($versions[$roadmap_version]['name']) : '', $roadmap_status, (int) $bugs_number[$roadmap_status], isset($versions[$roadmap_version]) ? $versions[$roadmap_version]['release_date'] : 0)->display(), 'LEGEND' => BugtrackerViews::build_legend($displayed_severities, 'roadmap'), 'LINK_BUG_ID_TOP' => BugtrackerUrlBuilder::roadmap($roadmap_version, $roadmap_version_name, $roadmap_status, 'id', 'top', $current_page)->rel(), 'LINK_BUG_ID_BOTTOM' => BugtrackerUrlBuilder::roadmap($roadmap_version, $roadmap_version_name, $roadmap_status, 'id', 'bottom', $current_page)->rel(), 'LINK_BUG_TITLE_TOP' => BugtrackerUrlBuilder::roadmap($roadmap_version, $roadmap_version_name, $roadmap_status, 'title', 'top', $current_page)->rel(), 'LINK_BUG_TITLE_BOTTOM' => BugtrackerUrlBuilder::roadmap($roadmap_version, $roadmap_version_name, $roadmap_status, 'title', 'bottom', $current_page)->rel(), 'LINK_BUG_SEVERITY_TOP' => BugtrackerUrlBuilder::roadmap($roadmap_version, $roadmap_version_name, $roadmap_status, 'severity', 'top', $current_page)->rel(), 'LINK_BUG_SEVERITY_BOTTOM' => BugtrackerUrlBuilder::roadmap($roadmap_version, $roadmap_version_name, $roadmap_status, 'severity', 'bottom', $current_page)->rel(), 'LINK_BUG_STATUS_TOP' => BugtrackerUrlBuilder::roadmap($roadmap_version, $roadmap_version_name, $roadmap_status, 'status', 'top', $current_page)->rel(), 'LINK_BUG_STATUS_BOTTOM' => BugtrackerUrlBuilder::roadmap($roadmap_version, $roadmap_version_name, $roadmap_status, 'status', 'bottom', $current_page)->rel(), 'LINK_BUG_DATE_TOP' => BugtrackerUrlBuilder::roadmap($roadmap_version, $roadmap_version_name, $roadmap_status, 'date', 'top', $current_page)->rel(), 'LINK_BUG_DATE_BOTTOM' => BugtrackerUrlBuilder::roadmap($roadmap_version, $roadmap_version_name, $roadmap_status, 'date', 'bottom', $current_page)->rel()));
     }
     return $this->view;
 }