Your IP : 216.73.217.80


Current Path : /home/jlgagfroyt/www/administrator/components/com_acymailing/views/diagram/
Upload File :
Current File : /home/jlgagfroyt/www/administrator/components/com_acymailing/views/diagram/view.html.php

<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.11.3
 * @author	acyba.com
 * @copyright	(C) 2009-2022 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php


class DiagramViewDiagram extends acymailingView{
	var $ctrl = 'diagram';
	var $charttype = 'ColumnChart';
	var $interval = 'month';

	function display($tpl = null){
		acymailing_addScript(false, "https://www.google.com/jsapi");

		$function = $this->getLayout();
		if(method_exists($this, $function)) $this->$function();

		parent::display($tpl);
	}

	function listing(){

		$acyToolbar = acymailing_get('helper.toolbar');
		$acyToolbar->custom('export', acymailing_translation('ACY_EXPORT'), 'export', false, '');
		$acyToolbar->directPrint();
		$acyToolbar->link(acymailing_completeLink('subscriber'), acymailing_translation('ACY_CANCEL'), 'cancel');
		$acyToolbar->divider();
		$acyToolbar->help('charts');
		$acyToolbar->setTitle(acymailing_translation('CHARTS'), 'diagram');
		$acyToolbar->display();

		$where = array();


		$groupby = array();
		$groupingtype = array();
		$groupby[] = 'groupingdate';
		$groupby[] = 'groupingtype';
		$selectfield = 'sub.created';
		$listsneeded = false;

		$listClass = acymailing_get('class.list');
		$allLists = $listClass->getLists('listid');
		$this->lists = $allLists;

		$display = acymailing_getVar('array', 'display', array());
		$this->display = $display;
		foreach($display as $var => $val){
			$var = acymailing_securefield($var);
			$this->$var = acymailing_securefield($val);
		}

		if(empty($display)) return;


		$compares = acymailing_getVar('array', 'compares', array());
		$this->compares = $compares;
		if(!empty($compares['lists'])){
			$groupingtype[] = 'list.name';
			$listsneeded = true;
			$selectfield = 'listsub.subdate';
			$where[] = "list.type = 'list'";
			$filterLists = acymailing_getVar('array', 'filterlists', array());
			acymailing_arrayToInteger($filterLists);
			if(!empty($filterLists)){
				$where[] = "listsub.listid IN (".implode(',', $filterLists).")";
			}
			$this->filterlists = $filterLists;
		}

		if($this->interval == 'day'){
			$groupingdate = "DATE_FORMAT(FROM_UNIXTIME(".$selectfield."),'%Y-%m-%d')";
			$this->dateformat = '%d %B %Y';
		}elseif($this->interval == 'month'){
			$groupingdate = "DATE_FORMAT(FROM_UNIXTIME(".$selectfield."),'%Y-%m-01')";
			$this->dateformat = '%B %Y';
		}elseif($this->interval == 'year'){
			$groupingdate = "DATE_FORMAT(FROM_UNIXTIME(".$selectfield."),'%Y-01-01')";
			$this->dateformat = '%Y';
		}else{
			return;
		}

		if(!empty($compares['years'])){
			$groupingtype[] = "DATE_FORMAT(FROM_UNIXTIME(".$selectfield."),'%Y')";
			$this->dateformat = str_replace('%Y', '', $this->dateformat);
			$groupingdate = str_replace('%Y', '2000', $groupingdate);
		}

		$fieldtotal = 'COUNT(sub.subid)';
		$fieldtype = empty($groupingtype) ? "'Total'" : "CONCAT('Total - ',".implode(", ' - ' ,", $groupingtype).")";

		if(!empty($this->sumup)){
			$min = empty($this->datemin) ? 0 : acymailing_getTime($this->datemin);
			$max = empty($this->datemax) ? time() : acymailing_getTime($this->datemax);

			if(empty($min)){
				$min = acymailing_loadResult('SELECT min(created) FROM #__acymailing_subscriber WHERE created > 0 LIMIT 1');
			}

			$this->results = array();
			$maxInter = $min;
			$nbqueries = 0;
			while($maxInter < $max){
				$nbqueries++;
				if($nbqueries > 100){
					if($nbqueries == 101) acymailing_display('There are too many requests, please reduce the date range or change the interval');
					continue;
				}
				$previous = $maxInter;
				if($this->interval == 'day'){
					$maxInter = mktime(0, 0, 0, date("n", $maxInter), date("j", $maxInter) + 1, date("Y", $maxInter));
				}elseif($this->interval == 'month'){
					$maxInter = mktime(0, 0, 0, date("n", $maxInter) + 1, 1, date("Y", $maxInter));
				}elseif($this->interval == 'year'){
					$maxInter = mktime(0, 0, 0, 1, 1, date("Y", $maxInter) + 1);
				}

				$whereCond = array();
				if($listsneeded){
					$whereCond[] = 'listsub.status != 2';
					$whereCond[] = 'listsub.subdate > 0';
					$whereCond[] = 'listsub.subdate < '.$maxInter;
					$whereCond[] = '(listsub.status = 1 OR listsub.unsubdate >'.$maxInter.')';
					$query = "SELECT COUNT(listsub.subid) as total, ".$fieldtype." as groupingtype, '".acymailing_getDate($previous + 43200, '%Y-%m-%d')."' as groupingdate";
					$query .= " FROM #__acymailing_listsub as listsub ";
					$query .= " JOIN #__acymailing_list as list ON listsub.listid = list.listid ";
					$query .= " WHERE (".implode(") AND (", array_merge($where, $whereCond)).")";
					$query .= " GROUP BY listsub.listid";
				}else{
					$whereCond[] = 'sub.created < '.$maxInter;
					$whereCond[] = 'sub.created > 0';
					$query = "SELECT COUNT(sub.subid) as total, ".$fieldtype." as groupingtype, '".acymailing_getDate($previous + 43200, '%Y-%m-%d')."' as groupingdate";
					$query .= " FROM #__acymailing_subscriber as sub";
					$query .= " WHERE (".implode(") AND (", array_merge($where, $whereCond)).")";
				}
				$this->results = array_merge($this->results, acymailing_loadObjectList($query));
			}
		}else{
			if(!empty($this->datemin)){
				$where[] = $groupingdate.' >= '.acymailing_escapeDB($this->datemin);
			}

			if(!empty($this->datemax)){
				$where[] = $groupingdate.' < '.acymailing_escapeDB($this->datemax);
			}

			$where[] = 'sub.created > 0';

			$query = "SELECT ".$fieldtotal." as total, ".$fieldtype." as groupingtype, ".$groupingdate." as groupingdate";
			if($listsneeded){
				$query .= " FROM #__acymailing_listsub as listsub ";
				$query .= " JOIN #__acymailing_subscriber as sub ON listsub.subid = sub.subid ";
				$query .= " JOIN #__acymailing_list as list ON listsub.listid = list.listid ";
			}else{
				$query .= " FROM #__acymailing_subscriber as sub ";
			}

			if(!empty($where)) $query .= " WHERE (".implode(") AND (", $where).")";
			if(!empty($groupby)) $query .= " GROUP BY ".implode(',', $groupby);
			$query .= " ORDER BY groupingdate ASC";

			$this->results = acymailing_loadObjectList($query);
		}

		if(empty($this->results)) acymailing_enqueueMessage(acymailing_translation('NO_SUBSCRIBER'), 'notice');

		return $this->displayResult();
	}

	function displayResult(){
		if(empty($this->results)) return;
		?>
		<script language="JavaScript" type="text/javascript">
			function drawChart(){
				var dataTable = new google.visualization.DataTable();
				dataTable.addColumn('string');
				<?php
				$dates = array();
				$types = array();
				$allVals = array();
				$i = 0;
				$a = 1;
				foreach($this->results as $oneResult){
					if(!isset($dates[$oneResult->groupingdate])){
						$dates[$oneResult->groupingdate] = $i;
						$i++;
						echo "dataTable.addRows(1);"."\n";
						echo "dataTable.setValue(".$dates[$oneResult->groupingdate].", 0, '".acymailing_getDate($oneResult->groupingdate, $this->dateformat)."');";
					}
					if(!isset($types[$oneResult->groupingtype])){
						$types[$oneResult->groupingtype] = $a;
						echo "dataTable.addColumn('number','".str_replace("'", "\'", $oneResult->groupingtype)."');"."\n";
						$a++;
					}
					echo "dataTable.setValue(".$dates[$oneResult->groupingdate].", ".$types[$oneResult->groupingtype].", ".$oneResult->total.");";
					$allVals[$oneResult->groupingdate][$oneResult->groupingtype] = $oneResult->total;
				}
				if(count($dates) < 2) $this->charttype = 'ColumnChart';

				$export = array();
				$export[] = acymailing_translation('FIELD_DATE').','.implode(',', array_keys($types));
				foreach($dates as $oneDate => $datenum){
					$exportLine = array();
					foreach($types as $oneType => $typenum){
						if(!isset($allVals[$oneDate][$oneType])){
							echo "dataTable.setValue(".$datenum.", ".$typenum.",0);";
						}
						$exportLine[] = intval(@$allVals[$oneDate][$oneType]);
					}
					$export[] = strftime($this->dateformat, strtotime($oneDate)).','.implode(',', $exportLine);
				}
				$this->export = $export;
				?>

				var vis = new google.visualization.<?php echo $this->charttype; ?>(document.getElementById('chart'));
				var options = {
					height: 500, legend: 'right', is3D: true, title: '<?php echo acymailing_translation('USERS', true)?>', legendTextStyle: {color: '#333333'}
				};
				vis.draw(dataTable, options);
			}

			document.addEventListener("DOMContentLoaded", function() {
				google.charts.load('45', {packages: ['corechart']});
				google.load("visualization", "1", {packages: ["corechart"]});
				google.setOnLoadCallback(drawChart);
			});

			function exportData(){
				if(document.getElementById('exporteddata').style.display == 'none'){
					document.getElementById('exporteddata').style.display = '';
				}else{
					document.getElementById('exporteddata').style.display = 'none';
				}
			}

		</script>
		<?php

		if(acymailing_getVar('cmd', 'task') == 'export'){
			$config = acymailing_config();
			$encodingClass = acymailing_get('helper.encoding');

			$exportHelper = acymailing_get('helper.export');
			$exportHelper->addHeaders('acymailingexport');

			$eol = "\r\n";
			$before = '"';
			$separator = '"'.str_replace(array('semicolon', 'comma'), array(';', ','), $config->get('export_separator', ';')).'"';
			$exportFormat = $config->get('export_format', 'UTF-8');
			$after = '"';

			for($i = 0, $a = count($export); $i < $a; $i++){
				echo $before.$encodingClass->change(str_replace(',', $separator, $export[$i]), 'UTF-8', $exportFormat).$after.$eol;
			}

			exit;
		}
	}

	function mailing(){
		acymailing_addStyle(false, ACYMAILING_CSS.'frontendedition.css?v='.filemtime(ACYMAILING_MEDIA.'css'.DS.'frontendedition.css'));
		acymailing_addStyle(false, ACYMAILING_CSS.'acyprint.css', 'text/css', 'print');

		$mailid = acymailing_getVar('int', 'mailid');
		if(empty($mailid)) return;


		$mailingstats = acymailing_loadObject('SELECT * FROM '.acymailing_table('stats').' WHERE mailid = '.intval($mailid));

		if(empty($mailingstats->mailid)) return;

		$browserstats = acymailing_loadObjectList('SELECT COUNT(browser) as nbBrowser, browser FROM '.acymailing_table('userstats').' WHERE browser IS NOT NULL AND mailid = '.intval($mailid).' GROUP BY browser ORDER BY nbBrowser DESC', 'browser');
		$ismobilestats = acymailing_loadObjectList('SELECT COUNT(*) as nbMobile, is_mobile FROM '.acymailing_table('userstats').' WHERE is_mobile IS NOT NULL AND mailid = '.intval($mailid).' GROUP BY is_mobile', 'is_mobile');
		$mobileosstats = acymailing_loadObjectList('SELECT COUNT(mobile_os) as nbOS, mobile_os FROM '.acymailing_table('userstats').' WHERE mobile_os IS NOT NULL AND mobile_os <> \'\' AND mailid = '.intval($mailid).' GROUP BY mobile_os ORDER BY nbOS DESC', 'mobile_os');

		$mailClass = acymailing_get('class.mail');
		$mailing = $mailClass->get($mailid);

		acymailing_setPageTitle($mailing->subject);

		$mailingstats->queue = acymailing_loadResult('SELECT COUNT(*) FROM `#__acymailing_queue` WHERE `mailid` = '.$mailingstats->mailid.' GROUP BY `mailid`');


		$datesOpen = acymailing_loadObject('SELECT min(opendate) as minval, max(opendate) as maxval FROM '.acymailing_table('userstats').' WHERE opendate > 0 AND mailid = '.intval($mailid));
		$datesClick = acymailing_loadObject('SELECT min(`date`) as minval, max(`date`) as maxval FROM '.acymailing_table('urlclick').' WHERE  mailid = '.intval($mailid));
		$spaces = array();
		$intervals = 10;
		$minDate = min($datesOpen->minval, $datesClick->minval);
		if(empty($minDate)) $minDate = max($datesOpen->minval, $datesClick->minval);
		$maxDate = max($datesOpen->maxval, $datesClick->maxval) + 1;

		$delay = ($maxDate - $minDate) / $intervals;

		for($i = 0; $i < $intervals; $i++){
			$spaces[$i] = (int)($minDate + $delay * $i);
		}
		$spaces[$intervals] = $maxDate;

		$openclick = new stdClass();
		$openclick->open = array();
		$openclick->click = array();
		$openclick->legend = array();
		$dateFormat = '%d %B %Y';

		if(date('Y', $maxDate) == date('Y', $minDate)){
			$dateFormat = '%d %B';
			if(date('m', $maxDate) == date('m', $minDate)){
				$dateFormat = '%A %d';
				if($delay < 172800){
					$dateFormat = '%a %d %H:%M';
				}
			}
		}

		if(acymailing_isAdmin()){
			$acyToolbar = acymailing_get('helper.toolbar');
			$acyToolbar->directPrint();
			$acyToolbar->setTitle(acymailing_translation('DETAILED_STATISTICS'));
			$acyToolbar->topfixed = false;
			$acyToolbar->display();
		}

		for($i = 0; $i <= $intervals; $i++){
			if($i % 2 == 0) $openclick->legend[$i] = acymailing_getDate($spaces[$i], $dateFormat);
			$openclick->open[$i] = (int)acymailing_loadResult('SELECT count(subid) FROM '.acymailing_table('userstats').' WHERE opendate < '.$spaces[$i].' AND opendate > 0 AND mailid = '.intval($mailid));
			$openclick->click[$i] = (int)acymailing_loadResult('SELECT count(subid) FROM '.acymailing_table('urlclick').' WHERE date < '.$spaces[$i].' AND mailid = '.intval($mailid));
		}

		$timeoffset = acymailing_getCMSConfig('offset');
		
		if(!is_numeric($timeoffset)) {       
			$timezone = new DateTimeZone($timeoffset);
			$timeoffset = $timezone->getOffset(new DateTime);
		}

		$diffTime = $timeoffset - date('Z');

		$groupingFormat = '%Y %j';
		$phpformat = '%d %B';
		$diff = 86400;
		if($delay < 3600){
			$groupingFormat = '%Y %j %H';
			$phpformat = '%a %d %H';
			$diff = 3600;
		}
		$query = "SELECT DATE_FORMAT(FROM_UNIXTIME(a.opendate + $diffTime),'$groupingFormat') AS openday, a.opendate, COUNT(a.subid) AS totalopen ";
		$query .= 'FROM #__acymailing_userstats AS a WHERE opendate > 0 AND mailid = '.intval($mailid);
		$query .= ' GROUP BY openday ORDER BY openday DESC LIMIT 10';

		$datesOpen = acymailing_loadObjectList($query, 'openday');

		$query = "SELECT DATE_FORMAT(FROM_UNIXTIME(a.date + $diffTime),'$groupingFormat') AS clickday, a.date, COUNT(a.subid) AS totalclick ";
		$query .= 'FROM #__acymailing_urlclick AS a WHERE mailid = '.intval($mailid);
		$query .= ' GROUP BY clickday ORDER BY clickday DESC LIMIT 10';

		$datesClick = acymailing_loadObjectList($query, 'clickday');

		$openclickday = array();
		foreach($datesOpen as $time => $oneDate){
			$openclickday[$time] = array();
			$openclickday[$time]['date'] = acymailing_getDate($oneDate->opendate, $phpformat);
			$openclickday[$time]['nextdate'] = acymailing_getDate($oneDate->opendate - $diff, $phpformat);
			$openclickday[$time]['open'] = $oneDate;
		}
		foreach($datesClick as $time => $oneDate){
			if(!isset($openclickday[$time])){
				$openclickday[$time] = array();
				$openclickday[$time]['date'] = acymailing_getDate($oneDate->date, $phpformat);
				$openclickday[$time]['nextdate'] = acymailing_getDate($oneDate->date - $diff, $phpformat);
			}
			$openclickday[$time]['click'] = $oneDate;
		}

		krsort($openclickday);

		$query = 'SELECT c.*, COUNT(a.click) as uniqueclick, SUM(a.click) as totalclick  FROM #__acymailing_urlclick as a';
		$query .= ' JOIN '.acymailing_table('url').' as c on a.urlid = c.urlid';
		$query .= ' WHERE a.mailid = '.intval($mailid).' GROUP BY a.urlid ORDER BY uniqueclick DESC LIMIT 5';
		$mailinglinks = acymailing_loadObjectList($query);

		$query = 'SELECT opendate FROM #__acymailing_userstats WHERE mailid='.intval($mailid).' AND opendate!=0';
		$openDay = acymailing_loadResultArray($query);

		$openDayData = array();
		for($i = 0; $i < 56; $i++){
			$openDayData[$i] = 0;
		}
		foreach($openDay as $oneDate){
			$span = (intval(acymailing_getDate($oneDate, 'N')) - 1) * 8 + intval(acymailing_getDate($oneDate, 'H') / 3);
			$openDayData[$span] += 1;
		}
		$openDayLabel = array('0h-3h', '3h-6h', '6h-9h', '9h-12h', '12h-15h', '15h-18h', '18h-21h', '21h-24h', '0h-3h', '3h-6h', '6h-9h', '9h-12h', '12h-15h', '15h-18h', '18h-21h', '21h-24h', '0h-3h', '3h-6h', '6h-9h', '9h-12h', '12h-15h', '15h-18h', '18h-21h', '21h-24h', '0h-3h', '3h-6h', '6h-9h', '9h-12h', '12h-15h', '15h-18h', '18h-21h', '21h-24h', '0h-3h', '3h-6h', '6h-9h', '9h-12h', '12h-15h', '15h-18h', '18h-21h', '21h-24h', '0h-3h', '3h-6h', '6h-9h', '9h-12h', '12h-15h', '15h-18h', '18h-21h', '21h-24h', '0h-3h', '3h-6h', '6h-9h', '9h-12h', '12h-15h', '15h-18h', '18h-21h', '21h-24h');
		$openDayAnnotation = array(acymailing_translation('ACY_MONDAY'), '', '', '', '', '', '', '', acymailing_translation('ACY_TUESDAY'), '', '', '', '', '', '', '', acymailing_translation('ACY_WEDNESDAY'), '', '', '', '', '', '', '', acymailing_translation('ACY_THURSDAY'), '', '', '', '', '', '', '', acymailing_translation('ACY_FRIDAY'), '', '', '', '', '', '', '', acymailing_translation('ACY_SATURDAY'), '', '', '', '', '', '', '', acymailing_translation('ACY_SUNDAY'), '', '', '', '', '', '', '');

		$js = '
			function iframeLoaded() {
				var iFrameID = document.getElementById(\'click_stats_overview\');
				if(iFrameID){
					iFrameID.height = "";
					document.getElementById("statistics_clickoverview").className += " active";
					iFrameID.height = iFrameID.contentWindow.document.body.scrollHeight + "px";
					document.getElementById("statistics_clickoverview").className = document.getElementById("statistics_clickoverview").className.replace(" active", "");
				}   
			}';
		acymailing_addScript(true, $js);

		$this->mailinglinks = $mailinglinks;
		$this->mailing = $mailing;
		$this->mailingstats = $mailingstats;
		$this->openclick = $openclick;
		$this->openclickday = $openclickday;
		$this->config = acymailing_config();
		$this->browserstats = $browserstats;
		$this->ismobilestats = $ismobilestats;
		$this->mobileosstats = $mobileosstats;
		$this->opendaydata = $openDayData;
		$this->opendaylabel = $openDayLabel;
		$this->opendayannotation = $openDayAnnotation;
		$this->setLayout('mailing');
	}
}