Example #1
0
    /**
    * Lists the reports.
    * @param int $page
    */
    function index($page = 1)
    {
        // If user doesn't have access, redirect to dashboard
        if ( ! admin::permissions($this->user, "reports_view"))
        {
            url::redirect(url::site().'admin/dashboard');
        }

        $this->template->content = new View('admin/reports');
        $this->template->content->title = Kohana::lang('ui_admin.reports');

		$r_from = "";
		if( isset($_GET['from']) )
		{
			$r_from = $this->input->xss_clean($_GET['from']);
		}
		$r_to = "";
		if( isset($_GET['to']) )
		{
			$r_to = $this->input->xss_clean($_GET['to']);
		}

		$filter_range = "";
		if( isset($r_from) && empty($r_to) )
		{
			$filter_range = "incident_date between \"".date("Y-m-d",strtotime($r_from))." 00:00:00\" and \"".date("Y-m-d")." 23:59:00\"";
		} elseif( isset($r_from) && isset($r_to) )
		{
			$filter_range = "incident_date between \"".date("Y-m-d",strtotime($r_from))." 00:00:00\" and \"".date("Y-m-d",strtotime($r_to))." 23:59:00\"";
		} elseif( empty($r_from) && isset($r_to) )
		{
			$filter_range = "incident_date between \"".date("Y-m-d",1)." 00:00:00\" and \"".date("Y-m-d",strtotime($r_to))." 23:59:00\"";
		}

		$filter = '';

		$status = "0";
		$filter_status = '';
        if (!empty($_GET['status']))
        {
			$status = strtolower($_GET['status']);
            if ($status == 'a')
            {
                $filter_status = 'incident_active = 0';
            }
            elseif ($status == 'v')
            {
                $filter_status = 'incident_verified = 0';
            }
			else
			{
				$status = "0";
				$filter_status = '';
			}
        }

		$filter_via = '';
		$via = "";
		if(!empty($_GET['via']))
		{
			$tmp_via = intval($this->input->xss_clean($_GET['via']));
			if ($tmp_via != 0)
			{
				$filter_via = 'incident_mode = '.$tmp_via;
			}
			$via = $tmp_via;
		}

        // Get Search Keywords (If Any)
		$filter_kw = '';
        if (isset($_GET['k']))
        {
            //  Brute force input sanitization
            
            // Phase 1 - Strip the search string of all non-word characters 
            $keyword_raw = preg_replace('/[^\w+]\w*/', '', $_GET['k']);
            
            // Strip any HTML tags that may have been missed in Phase 1
            $keyword_raw = strip_tags($keyword_raw);
            
            // Phase 3 - Invoke Kohana's XSS cleaning mechanism just incase an outlier wasn't caught
            // in the first 2 steps
            $keyword_raw = $this->input->xss_clean($keyword_raw);

			$filter_kw = "(".$this->_get_searchstring($keyword_raw).")";
        }

		// filter string build.
        $filter = $filter_status;
        $filter .= ((!empty($filter))? ((!empty($filter_via))? (" AND ".$filter_via):""):$filter_via);
        $filter .= ((!empty($filter))? ((!empty($filter_kw))? (" AND ".$filter_kw):""):$filter_kw);
        $filter .= ((!empty($filter))? ((!empty($filter_range))? (" AND ".$filter_range):""):$filter_range);
		if (empty($filter))
		{
			$filter = "1=1";
		}
        // check, has the form been submitted?
        $form_error = FALSE;
        $form_saved = FALSE;
        $form_action = "";
        
        if ($_POST)
        {
            $post = Validation::factory($_POST);

             //  Add some filters
            $post->pre_filter('trim', TRUE);

            // Add some rules, the input field, followed by a list of checks, carried out in order
            $post->add_rules('action','required', 'alpha', 'length[1,1]');
            $post->add_rules('incident_id.*','required','numeric');

            if ($post->validate())
            {
                if ($post->action == 'a')       // Approve Action
                {
                    foreach($post->incident_id as $item)
                    {
                        $update = new Incident_Model($item);
                        if ($update->loaded == true) 
                        {
                            if( $update->incident_active == 0 ) 
                            {
                                $update->incident_active = '1';
                            } 
                            else {
                                $update->incident_active = '0';
                            }

                            // Tag this as a report that needs to be sent out as an alert
                            if ($update->incident_alert_status != '2')
                            { // 2 = report that has had an alert sent
                                $update->incident_alert_status = '1';
                            }

                            $update->save();

                            $verify = new Verify_Model();
                            $verify->incident_id = $item;
                            $verify->verified_status = '1';
                            $verify->user_id = $_SESSION['auth_user']->id;          // Record 'Verified By' Action
                            $verify->verified_date = date("Y-m-d H:i:s",time());
                            $verify->save();

                            // Action::report_approve - Approve a Report
                            Event::run('ushahidi_action.report_approve', $update);
                        }
                    }
                    $form_action = strtoupper(Kohana::lang('ui_admin.approved'));
                }
                elseif ($post->action == 'u')   // Unapprove Action
                {
                    foreach($post->incident_id as $item)
                    {
                        $update = new Incident_Model($item);
                        if ($update->loaded == true) {
                            $update->incident_active = '0';

                            // If Alert hasn't been sent yet, disable it
                            if ($update->incident_alert_status == '1')
                            {
                                $update->incident_alert_status = '0';
                            }

                            $update->save();

                            $verify = new Verify_Model();
                            $verify->incident_id = $item;
                            $verify->verified_status = '0';
                            $verify->user_id = $_SESSION['auth_user']->id;          // Record 'Verified By' Action
                            $verify->verified_date = date("Y-m-d H:i:s",time());
                            $verify->save();

                            // Action::report_unapprove - Unapprove a Report
                            Event::run('ushahidi_action.report_unapprove', $update);
                        }
                    }
                    $form_action = strtoupper(Kohana::lang('ui_admin.unapproved'));
                }
                elseif ($post->action == 'v')   // Verify Action
                {
                    foreach($post->incident_id as $item)
                    {
                        $update = new Incident_Model($item);
                        $verify = new Verify_Model();
                        if ($update->loaded == true) {
                            if ($update->incident_verified == '1')
                            {
                                $update->incident_verified = '0';
                                $verify->verified_status = '0';
                            }
                            else {
                                $update->incident_verified = '1';
                                $verify->verified_status = '2';
                            }
                            $update->save();

                            $verify->incident_id = $item;
                            $verify->user_id = $_SESSION['auth_user']->id;          // Record 'Verified By' Action
                            $verify->verified_date = date("Y-m-d H:i:s",time());
                            $verify->save();
                        }
                    }
                    $form_action = "VERIFIED";
                }
                elseif ($post->action == 'd')   //Delete Action
                {
                    foreach($post->incident_id as $item)
                    {
                        $update = new Incident_Model($item);
                        if ($update->loaded == true)
                        {
                            $incident_id = $update->id;
                            $location_id = $update->location_id;
                            $update->delete();

                            // Delete Location
                            ORM::factory('location')->where('id',$location_id)->delete_all();

                            // Delete Categories
                            ORM::factory('incident_category')->where('incident_id',$incident_id)->delete_all();

                            // Delete Translations
                            ORM::factory('incident_lang')->where('incident_id',$incident_id)->delete_all();

                            // Delete Photos From Directory
                            foreach (ORM::factory('media')->where('incident_id',$incident_id)->where('media_type', 1) as $photo) {
                                deletePhoto($photo->id);
                            }

                            // Delete Media
                            ORM::factory('media')->where('incident_id',$incident_id)->delete_all();

                            // Delete Sender
                            ORM::factory('incident_person')->where('incident_id',$incident_id)->delete_all();

                            // Delete relationship to SMS message
                            $updatemessage = ORM::factory('message')->where('incident_id',$incident_id)->find();
                            if ($updatemessage->loaded == true) {
                                $updatemessage->incident_id = 0;
                                $updatemessage->save();
                            }

                            // Delete Comments
                            ORM::factory('comment')->where('incident_id',$incident_id)->delete_all();

                            // Action::report_delete - Deleted a Report
                            Event::run('ushahidi_action.report_delete', $update);
                        }
                    }
                    $form_action = strtoupper(Kohana::lang('ui_admin.deleted'));
                }
                $form_saved = TRUE;
            }
            else
            {
                $form_error = TRUE;
            }

        }

		$order = 0;
		$order_string = "desc";
		if( isset($_GET['order']) )
		{
			$order = intval($_GET['order']);
			if ( $order == 0 )
			{
				$order_string = "desc";
			} elseif ( $order == 1 ) {
				$order_string = "asc";
			} else {
				$order = 0;
				$order_string = "desc";
			}
		}

        // Pagination
        $pagination = new Pagination(array(
            'query_string'   => 'page',
            'items_per_page' => (int) Kohana::config('settings.items_per_page_admin'),
            'total_items'    => ORM::factory('incident')
				->join('location', 'incident.location_id', 'location.id','INNER')
				->where($filter)
				->count_all()
            ));
		$incidents = Incident_Model::get_incident_reports($filter,$order_string,$pagination->sql_offset);
        $location_ids = array();
        foreach ($incidents as $incident)
        {
            $location_ids[] = $incident->location_id;
        }
        foreach ($incidents as $incident)
        {
            $incident_ids[] = $incident->id;
        }
        //add_param_get
        $filter = " incident_id IN (".implode(',',$incident_ids).")";
        $incident_persons = Incident_Model::get_incident_persons($filter);
        $incident_messages = Incident_Model::get_incident_messages($filter);
		$incident_incident_langs = Incident_Model::get_incident_incident_langs($filter);
		$incident_incident_categories = Incident_Model::get_incident_incident_categories($filter);
        
        //check if location_ids is not empty
        if( count($location_ids ) > 0 ) 
        {
            $locations_result = ORM::factory('location')->in('id',implode(',',$location_ids))->find_all();
            $locations = array();
            foreach ($locations_result as $loc)
            {
                $locations[$loc->id] = $loc->location_name;
            }
        }
        else
        {
            $locations = array();
        }

        $this->template->content->locations = $locations;

        //GET countries
        $countries = array();
        foreach (ORM::factory('country')->orderby('country')->find_all() as $country)
        {
            // Create a list of all categories
            $this_country = $country->country;
            if (strlen($this_country) > 35)
            {
                $this_country = substr($this_country, 0, 35) . "...";
            }
            $countries[$country->id] = $this_country;
        }

		$this->template->content->from = $r_from;
		$this->template->content->to = $r_to;
		$this->template->content->order = $order;
		$this->template->content->filter = $filter_range;
        $this->template->content->countries = $countries;
        $this->template->content->incidents = $incidents;
        $this->template->content->pagination = $pagination;
        $this->template->content->form_error = $form_error;
        $this->template->content->form_saved = $form_saved;
		// ORM分離
        $this->template->content->incident_persons = $incident_persons;
        $this->template->content->incident_messages = $incident_messages;
        $this->template->content->incident_incident_langs = $incident_incident_langs;
        $this->template->content->incident_incident_categories = $incident_incident_categories;
        // Total Reports
        $this->template->content->total_items = $pagination->total_items;

		// via
		$this->template->content->via = $via;

        // Status Tab
        $this->template->content->status = $status;

        // Javascript Header
        $this->template->js = new View('admin/reports_js');
    }