<?php

//
// Open Web Analytics - An Open Source Web Analytics Framework
//
// Copyright 2006 Peter Adams. All rights reserved.
//
// Licensed under GPL v2.0 http://www.gnu.org/copyleft/gpl.html
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// $Id$
//

require_once(OWA_BASE_DIR.'/owa_reportController.php');

/**
 * Goal Funnel Report Controller
 * 
 * @author      Peter Adams <peter@openwebanalytics.com>
 * @copyright   Copyright &copy; 2006 Peter Adams <peter@openwebanalytics.com>
 * @license     http://www.gnu.org/copyleft/gpl.html GPL v2.0
 * @category    owa
 * @package     owa
 * @version		$Revision$	      
 * @since		owa 1.4.0
 */

class owa_reportGoalFunnelController extends owa_reportController {
	
	function action() {
		
		$gm = owa_coreAPI::supportClassFactory('base', 'goalManager', $this->getParam( 'siteId' ) );
		
		$goal_number = $this->getParam('goalNumber');
		
		if ( ! $goal_number ) {
			$goal_number = 1;
		}
		
		$goal = $gm->getGoal($goal_number);
		$funnel = $gm->getGoalFunnel($goal_number);
		
		if ( $funnel ) {
			$goal = $gm->getGoal($goal_number);
			// find required steps. build a constraint string.
			$required_step_constraints = '';
			$steps_count = count($funnel);
			for ($i=1; $i <= $steps_count ;$i++ ) {
			
				if (array_key_exists('is_required', $funnel[$i]) && $funnel[$i]['is_required'] === true) {
				
					$required_step_constraints .= 'pagePath=='.$funnel[$i]['url'].',';
				}
			}
			$required_step_constraints = trim($required_step_constraints, ',');
			
			//print $required_step_constraints;
			// get total visits
			$total_visitors_rs = owa_coreAPI::executeApiCommand(array(
					'period' 	  => $this->get('period'),
					'startDate'	  => $this->get('startDate'),
					'endDate'	  => $this->get('endDate'),
					'constraints' => $required_step_constraints,
					'metrics' 	  => 'visitors',
					'do'		  => 'getResultSet',
					'siteId'	  => $this->getParam( 'siteId' )	
			));
			//print_r($total_visitors_rs);
			$total_visitors = $total_visitors_rs->getAggregateMetric( 'visitors' );
			//print "Total visits: $total_visitors";
			
			$this->set( 'total_visitors',  $total_visitors);
			// get visits for each step
			
			// add goal url to steps array
			$funnel[] = array('url' => $goal['details']['goal_url'], 'name' => $goal['goal_name'], 'step_number' => $steps_count + 1);
			foreach ( $funnel as $k => $step ) {
				$operator = '==';
				$rs = owa_coreAPI::executeApiCommand(array(
						'period' 	  => $this->get('period'),
						'startDate'	  => $this->get('startDate'),
						'endDate'	  => $this->get('endDate'),
						'metrics' 	  => 'visitors',
						'constraints' => 'pagePath'.$operator.$step['url'],
						'do'		  => 'getResultSet',
						'siteId'	  => $this->getParam( 'siteId' )		
				));
				
				$visitors = $rs->getAggregateMetric('visitors') ? $rs->getAggregateMetric('visitors'): 0;
				$funnel[$k]['visitors'] = $visitors;
				
				// backfill check in case there are more visitors to this step than were at prior step.
				if ($funnel[$k]['visitors'] <= $funnel[$k-1]['visitors']) {
					if ($funnel[$k-1]['visitors'] > 0 ) {
						$funnel[$k]['visitor_percentage'] = round($funnel[$k]['visitors'] / $funnel[$k-1]['visitors'], 4) * 100 . '%';
					} else {
						$funnel[$k]['visitor_percentage'] = '0.00%';
					}
				} else {
					$funnel[$k]['visitor_percentage'] = '100%';
				}
			}
			
			//print_r($funnel);
			
			$goal_step = end($funnel);
			$goal_conversion_rate = round($goal_step['visitors'] / $total_visitors, 2) * 100 . '%';
			$this->set('goal_conversion_rate', $goal_conversion_rate);
			$this->set('funnel', $funnel);	
			
		}			
		// set view stuff
		$this->setSubview('base.reportGoalFunnel');
		$this->setTitle('Funnel Visualization:', 'Goal ' . $goal_number);
		$this->set('goal_number', $goal_number);
	}
}
		
require_once(OWA_BASE_DIR.'/owa_view.php');

/**
 * Goal Funnel Report View
 * 
 * @author      Peter Adams <peter@openwebanalytics.com>
 * @copyright   Copyright &copy; 2006 Peter Adams <peter@openwebanalytics.com>
 * @license     http://www.gnu.org/copyleft/gpl.html GPL v2.0
 * @category    owa
 * @package     owa
 * @version		$Revision$	      
 * @since		owa 1.4.0
 */

class owa_reportGoalFunnelView extends owa_view {
	
	function render() {
		
		$this->body->set_template('report_goal_funnel.php');
		$this->body->set('funnel', $this->get('funnel'));
		$this->body->set('funnel_json', json_encode($this->get('funnel')));
		$this->body->set('goal_conversion_rate', $this->get('goal_conversion_rate'));
		$this->body->set('numGoals', owa_coreAPI::getSetting('base', 'numGoals') );
		$this->body->set('goal_number',  $this->get('goal_number') );
	}
}

?>